Skip to content

Commit 45e39d1

Browse files
committed
✅ Add basic fuzz tests for SequenceSet operators
I almost accidentally committed a big bug for `#xor`. Yikes! I decided to take that opportunity to simply add some randomized tests on all of the set operators, based on set identities that should always hold true. These can also be used for microbenchmarks and profiling of SequenceSet.
1 parent 4b3270c commit 45e39d1

File tree

1 file changed

+76
-2
lines changed

1 file changed

+76
-2
lines changed

test/net/imap/test_sequence_set.rb

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def compare_to_reference_set(nums, set, seqset)
2323
assert seqset.cover? sorted.sample 100
2424
end
2525

26-
test "compared to reference Set, add many random values" do
26+
test "fuzz test: add numbers and compare to reference Set" do
2727
set = Set.new
2828
seqset = SequenceSet.new
2929
10.times do
@@ -32,7 +32,7 @@ def compare_to_reference_set(nums, set, seqset)
3232
end
3333
end
3434

35-
test "compared to reference Set, add many large ranges" do
35+
test "fuzz test: add ranges and compare to reference Set" do
3636
set = Set.new
3737
seqset = SequenceSet.new
3838
(1..10_000).each_slice(250) do
@@ -41,6 +41,80 @@ def compare_to_reference_set(nums, set, seqset)
4141
end
4242
end
4343

44+
test "fuzz test: set union identities" do
45+
10.times do
46+
lhs = SequenceSet[Array.new(100) { rand(1..300) }]
47+
rhs = SequenceSet[Array.new(100) { rand(1..300) }]
48+
union = lhs | rhs
49+
assert_equal union, rhs | lhs # commutative
50+
assert_equal union, ~(~lhs & ~rhs) # De Morgan's Law
51+
assert_equal union, lhs | (lhs ^ rhs)
52+
assert_equal union, lhs | (rhs - lhs)
53+
assert_equal union, (lhs & rhs) ^ (lhs ^ rhs)
54+
mutable = lhs.dup
55+
assert_equal union, mutable.merge(rhs)
56+
assert_equal union, mutable
57+
end
58+
end
59+
60+
test "fuzz test: set intersection identities" do
61+
10.times do
62+
lhs = SequenceSet[Array.new(100) { rand(1..300) }]
63+
rhs = SequenceSet[Array.new(100) { rand(1..300) }]
64+
intersection = lhs & rhs
65+
assert_equal intersection, rhs & lhs # commutative
66+
assert_equal intersection, ~(~lhs | ~rhs) # De Morgan's Law
67+
assert_equal intersection, lhs - ~rhs
68+
assert_equal intersection, lhs - (lhs - rhs)
69+
assert_equal intersection, lhs - (lhs ^ rhs)
70+
assert_equal intersection, lhs ^ (lhs - rhs)
71+
end
72+
end
73+
74+
test "fuzz test: set subtraction identities" do
75+
10.times do
76+
lhs = SequenceSet[Array.new(100) { rand(1..300) }]
77+
rhs = SequenceSet[Array.new(100) { rand(1..300) }]
78+
difference = lhs - rhs
79+
assert_equal difference, ~rhs - ~lhs
80+
assert_equal difference, ~(~lhs | rhs)
81+
assert_equal difference, lhs & (lhs ^ rhs)
82+
assert_equal difference, lhs ^ (lhs & rhs)
83+
assert_equal difference, rhs ^ (lhs | rhs)
84+
mutable = lhs.dup
85+
assert_equal difference, mutable.subtract(rhs)
86+
assert_equal difference, mutable
87+
end
88+
end
89+
90+
test "fuzz test: set xor identities" do
91+
10.times do
92+
lhs = SequenceSet[Array.new(100) { rand(1..300) }]
93+
rhs = SequenceSet[Array.new(100) { rand(1..300) }]
94+
mid = SequenceSet[Array.new(100) { rand(1..300) }]
95+
xor = lhs ^ rhs
96+
assert_equal xor, rhs ^ lhs # commutative
97+
assert_equal xor, (lhs | rhs) - (lhs & rhs)
98+
assert_equal xor, (lhs ^ mid) ^ (mid ^ rhs)
99+
assert_equal xor, ~lhs ^ ~rhs
100+
end
101+
end
102+
103+
test "fuzz test: set complement identities" do
104+
10.times do
105+
set = SequenceSet[Array.new(100) { rand(1..300) }]
106+
complement = ~set
107+
assert_equal set, ~complement
108+
assert_equal complement, ~set.dup
109+
assert_equal complement, SequenceSet.full - set
110+
mutable = set.dup
111+
assert_equal complement, mutable.complement!
112+
assert_equal complement, mutable
113+
assert_equal set, mutable.complement!
114+
assert_equal set, mutable
115+
end
116+
end
117+
44118
test "#== equality by value (not by identity or representation)" do
45119
assert_equal SequenceSet.new, SequenceSet.new
46120
assert_equal SequenceSet.new("1"), SequenceSet[1]

0 commit comments

Comments
 (0)