Skip to content

Commit c6e2520

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 17e50b7 commit c6e2520

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
@@ -22,7 +22,7 @@ def compare_to_reference_set(nums, set, seqset)
2222
assert seqset.cover? sorted.sample 100
2323
end
2424

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

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

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

0 commit comments

Comments
 (0)