295 lines
8.1 KiB
Julia
295 lines
8.1 KiB
Julia
# This file is a part of Julia. License is MIT: https://julialang.org/license
|
|
|
|
# Test functionality of IntSet
|
|
|
|
@testset "Construction, collect" begin
|
|
data_in = (1,5,100)
|
|
s = IntSet(data_in)
|
|
data_out = collect(s)
|
|
@test all(map(d->in(d,data_out), data_in))
|
|
@test length(data_out) === length(data_in)
|
|
end
|
|
|
|
@testset "eltype, similar" begin
|
|
@test eltype(IntSet()) === Int
|
|
@test eltype(IntSet) === Int
|
|
@test isequal(similar(IntSet([1,2,3])), IntSet())
|
|
end
|
|
|
|
@testset "show" begin
|
|
@test sprint(show, IntSet()) == "IntSet([])"
|
|
@test sprint(show, IntSet([1,2,3])) == "IntSet([1, 2, 3])"
|
|
show(IOBuffer(), IntSet())
|
|
end
|
|
|
|
@testset "in, hashing" begin
|
|
s = IntSet([1,2,10,20,200,300,1000,10000,10002])
|
|
@test last(s) === 10002
|
|
@test first(s) === 1
|
|
@test length(s) === 9
|
|
@test pop!(s) === 10002
|
|
@test_throws KeyError pop!(s, -1)
|
|
@test length(s) === 8
|
|
@test shift!(s) === 1
|
|
@test length(s) === 7
|
|
@test !in(0,s)
|
|
@test !in(1,s)
|
|
@test in(2,s)
|
|
@test !in(10002,s)
|
|
@test in(10000,s)
|
|
@test in(10000.0,s)
|
|
@test !in(10002.0,s)
|
|
@test_throws ArgumentError first(IntSet())
|
|
@test_throws ArgumentError last(IntSet())
|
|
t = copy(s)
|
|
sizehint!(t, 20000) #check that hash does not depend on size of internal storage
|
|
@test hash(s) === hash(t)
|
|
push!(t, 20000)
|
|
@test 20000 in t
|
|
sizehint!(t, 200) # ensure that sizehint!'ing a small amount isn't destructive
|
|
@test 20000 in t
|
|
@test pop!(t, 20000) === 20000
|
|
@test hash(s) === hash(t)
|
|
# Ensure empty chunks don't affect hash
|
|
@test hash(IntSet([1])) != hash(IntSet([17]))
|
|
@test hash(IntSet([1])) != hash(IntSet([33]))
|
|
@test hash(IntSet([1])) != hash(IntSet([65]))
|
|
@test hash(IntSet([1])) != hash(IntSet([129]))
|
|
|
|
# issue #7851
|
|
@test_throws ArgumentError IntSet(-1)
|
|
@test !(-1 in IntSet(1:10))
|
|
end
|
|
|
|
# # issue #8570
|
|
# This requires 2^29 bytes of storage, which is too much for a simple test
|
|
# s = IntSet(typemax(Int32))
|
|
# @test length(s) === 1
|
|
# for b in s; b; end
|
|
|
|
@testset "union!, symdiff!" begin
|
|
i = IntSet([1, 2, 3])
|
|
union!(i, [1, 2])
|
|
@test length(i) === 3
|
|
union!(i, [3, 4, 5])
|
|
@test length(i) === 5
|
|
|
|
@test_throws KeyError pop!(i, 10)
|
|
|
|
empty!(i)
|
|
@test length(i) === 0
|
|
|
|
@test_throws ArgumentError symdiff!(i, -3)
|
|
@test symdiff!(i, 3) == IntSet([3])
|
|
@test symdiff!(i, 257) == IntSet([3, 257])
|
|
@test symdiff!(i, [3, 6]) == IntSet([6, 257])
|
|
|
|
i = IntSet(1:6)
|
|
@test symdiff!(i, IntSet([6, 513])) == IntSet([1:5; 513])
|
|
|
|
# issue #23099 : these tests should not segfault
|
|
@test_throws ArgumentError symdiff!(IntSet(rand(1:100, 30)), 0)
|
|
@test_throws ArgumentError symdiff!(IntSet(rand(1:100, 30)), [0, 2, 4])
|
|
end
|
|
|
|
@testset "copy, copy!, similar" begin
|
|
s1 = IntSet([1,2,3])
|
|
s2 = similar(s1)
|
|
copy!(s2, s1)
|
|
s3 = copy(s2)
|
|
@test s3 == s2 == s1
|
|
@test collect(s3) == collect(s2) == [1,2,3]
|
|
end
|
|
|
|
@testset "push!, union" begin
|
|
i = IntSet([1, 2, 3])
|
|
j = union(i)
|
|
@test j == i
|
|
@test !(j === i)
|
|
|
|
j = IntSet([4, 5, 6])
|
|
@test union(i, j) == IntSet(1:6)
|
|
|
|
k = IntSet([7, 8, 9])
|
|
@test union(i, j, k) == IntSet(1:9)
|
|
i = IntSet([1, 2, 3])
|
|
j = union(i)
|
|
@test j == i
|
|
@test !(j === i)
|
|
|
|
j = IntSet([4, 5, 6])
|
|
@test union(i, j) == IntSet(1:6)
|
|
|
|
k = IntSet([7, 8, 9])
|
|
@test union(i, j, k) == IntSet(1:9)
|
|
|
|
s1 = IntSet()
|
|
@test_throws ArgumentError push!(s1, -1)
|
|
push!(s1, 1, 10, 100, 1000)
|
|
@test collect(s1) == [1, 10, 100, 1000]
|
|
push!(s1, 606)
|
|
@test collect(s1) == [1, 10, 100, 606, 1000]
|
|
s2 = IntSet()
|
|
@test s2 === union!(s2, s1)
|
|
s3 = IntSet([1, 10, 100])
|
|
union!(s3, [1, 606, 1000])
|
|
s4 = union(IntSet([1, 100, 1000]), IntSet([10, 100, 606]))
|
|
@test s1 == s2 == s3 == s4
|
|
end
|
|
|
|
@testset "pop!, delete!" begin
|
|
s = IntSet(1:2:10)
|
|
@test pop!(s, 1) === 1
|
|
@test !(1 in s)
|
|
@test_throws KeyError pop!(s, 1)
|
|
@test_throws KeyError pop!(s, -1)
|
|
@test pop!(s, -1, 1) === 1
|
|
@test pop!(s, 1, 0) === 0
|
|
@test s === delete!(s, 1)
|
|
for i in s; pop!(s, i); end
|
|
@test isempty(s)
|
|
push!(s, 100)
|
|
@test pop!(s, 100) == 100
|
|
push!(s, 1:2:10...)
|
|
@test pop!(s) === 9
|
|
@test pop!(s) === 7
|
|
@test shift!(s) === 1
|
|
@test shift!(s) === 3
|
|
@test collect(s) == [5]
|
|
empty!(s)
|
|
@test isempty(s)
|
|
end
|
|
|
|
@testset "intersect" begin
|
|
i = IntSet([1, 2, 3])
|
|
j = IntSet([4, 5, 6])
|
|
|
|
@test intersect(i) == i
|
|
@test !(intersect(i) === i)
|
|
@test intersect(i, j) == IntSet([])
|
|
push!(j, 257)
|
|
@test intersect(i, j) == IntSet([])
|
|
push!(j, 2, 3, 17)
|
|
@test intersect(i, j) == IntSet([2, 3])
|
|
k = IntSet([1, 2, 3, 4, 5, 6, 7])
|
|
@test intersect(i, j, k) == IntSet([2, 3])
|
|
|
|
@test isempty(intersect(IntSet()))
|
|
@test isempty(intersect(IntSet(1:10), IntSet()))
|
|
@test isempty(intersect(IntSet(), IntSet(1:10)))
|
|
|
|
@test intersect(IntSet([1,2,3])) == IntSet([1,2,3])
|
|
@test intersect(IntSet(1:7), IntSet(3:10)) ==
|
|
intersect(IntSet(3:10), IntSet(1:7)) == IntSet(3:7)
|
|
@test intersect(IntSet(1:10), IntSet(1:4), 1:5, [2,3,10]) == [2,3]
|
|
end
|
|
|
|
@testset "setdiff, symdiff" begin
|
|
@test setdiff(IntSet([1, 2, 3, 4]), IntSet([2, 4, 5, 6])) == IntSet([1, 3])
|
|
@test symdiff(IntSet([1, 2, 3, 4]), IntSet([2, 4, 5, 6])) == IntSet([1, 3, 5, 6])
|
|
|
|
s2 = IntSet([1, 2, 3, 4])
|
|
setdiff!(s2, IntSet([2, 4, 5, 6]))
|
|
@test s2 == IntSet([1, 3])
|
|
|
|
s1 = IntSet(1:100)
|
|
setdiff!(s1, IntSet(1:2:100))
|
|
s2 = setdiff(IntSet(1:100), IntSet(1:2:100))
|
|
@test s1 == s2 == IntSet(2:2:100)
|
|
@test collect(s1) == collect(2:2:100)
|
|
|
|
@test symdiff(IntSet([1, 2, 3, 4]), IntSet([2, 4, 5, 6])) ==
|
|
symdiff(IntSet([2, 4, 5, 6]), IntSet([1, 2, 3, 4])) ==
|
|
symdiff(IntSet([1, 2, 3, 4]), [2, 4, 5, 6]) ==
|
|
symdiff(IntSet([2, 4, 5, 6]), [1, 2, 3, 4]) == IntSet([1, 3, 5, 6])
|
|
end
|
|
|
|
@testset "subsets, equality" begin
|
|
i = IntSet([1, 2, 3])
|
|
k = IntSet([4, 5])
|
|
copy!(k, i)
|
|
@test k == i
|
|
@test !(k === i)
|
|
copy!(k, k)
|
|
@test k == i
|
|
|
|
i = IntSet([1, 2, 3])
|
|
j = IntSet([1, 2, 4])
|
|
@test i != j
|
|
|
|
push!(j, 257)
|
|
pop!(j, 257)
|
|
@test i != j
|
|
@test j != i
|
|
|
|
@test issubset(IntSet([1, 2, 4]), IntSet(1:10))
|
|
@test issubset(IntSet([]), IntSet([]))
|
|
@test IntSet([1, 2, 4]) < IntSet(1:10)
|
|
@test !(IntSet([]) < IntSet([]))
|
|
@test IntSet([1, 2, 4]) <= IntSet(1:10)
|
|
@test IntSet([1, 2, 4]) <= IntSet([1, 2, 4])
|
|
@test IntSet([]) <= IntSet([])
|
|
|
|
@test IntSet(2:2:10) < IntSet(1:10)
|
|
@test !(IntSet(2:2:10) < IntSet(2:2:10))
|
|
@test IntSet(2:2:10) <= IntSet(2:10)
|
|
@test IntSet(2:2:10) <= IntSet(2:2:10)
|
|
|
|
# == with last-bit set (groups.google.com/forum/#!topic/julia-users/vZNjiIEG_sY)
|
|
s = IntSet(255)
|
|
@test s == s
|
|
end
|
|
|
|
@testset "setlike" begin
|
|
p = IntSet([1,2,5,6])
|
|
resize!(p.bits, 6)
|
|
q = IntSet([1,3,5,7])
|
|
resize!(q.bits, 8)
|
|
a = Set(p)
|
|
b = Set(q)
|
|
for f in (union, intersect, setdiff, symdiff)
|
|
@test collect(f(p, p)) == sort(collect(f(a, a)))
|
|
@test collect(f(q, q)) == sort(collect(f(b, b)))
|
|
@test collect(f(p, q)) == sort(collect(f(a, b)))
|
|
@test collect(f(q, p)) == sort(collect(f(b, a)))
|
|
end
|
|
end
|
|
|
|
@testset "misc" begin
|
|
s = IntSet()
|
|
push!(s, 1, 2, 100)
|
|
@test !(0 in s)
|
|
@test 1 in s
|
|
@test 2 in s
|
|
@test !(3 in s)
|
|
@test 100 in s
|
|
@test !(101 in s)
|
|
@test !(1000 in s)
|
|
@test first(s) === 1
|
|
@test last(s) === 100
|
|
@test s == IntSet([1, 2, 100])
|
|
push!(s, 1000)
|
|
@test [i for i in s] == [1, 2, 100, 1000]
|
|
@test pop!(s) === 1000
|
|
@test s == IntSet([1, 2, 100])
|
|
@test hash(s) === hash(IntSet([1, 2, 100]))
|
|
|
|
b = 1:1000
|
|
s = IntSet(b)
|
|
@test collect(s) == collect(b)
|
|
@test length(s) === length(b)
|
|
@test pop!(s, 100) === 100
|
|
@test collect(s) == [1:99; 101:1000]
|
|
@test_throws KeyError pop!(s, 100)
|
|
@test_throws KeyError pop!(s, 0)
|
|
@test pop!(s, 100, 0) === 0
|
|
@test pop!(s, 99, 0) === 99
|
|
end
|
|
|
|
@testset "unsigned overflow" begin
|
|
@test IntSet(UInt8(2^8-1)) == IntSet(2^8-1)
|
|
@test [x for x in IntSet(UInt8(2^8-1))] == [UInt8(2^8-1)]
|
|
@test IntSet(UInt16(2^16-1)) == IntSet(2^16-1)
|
|
@test [x for x in IntSet(UInt16(2^16-1))] == [UInt16(2^16-1)]
|
|
end
|