Skip to content

Commit d70f7fd

Browse files
authored
πŸ”€ Merge pull request #464 from ruby/sequence_set/set_op_fuzz_tests
βœ… Test `SequenceSet#xor` and fuzz test all set operations
2 parents e1e0ecb + c6e2520 commit d70f7fd

File tree

1 file changed

+86
-2
lines changed

1 file changed

+86
-2
lines changed

β€Žtest/net/imap/test_sequence_set.rb

Lines changed: 86 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]
@@ -612,6 +686,16 @@ def obj.to_sequence_set; 192_168.001_255 end
612686
assert_equal seqset["1,5,11:99"], seqset["1,5:6,8:9,11:99"].subtract("6:9")
613687
end
614688

689+
test "#xor" do
690+
seqset = -> { SequenceSet.new(_1) }
691+
assert_equal seqset["1:5,11:15"], seqset["1:10"] ^ seqset["6:15"]
692+
assert_equal seqset["1,3,5:6"], seqset[1..5] ^ [2, 4, 6]
693+
assert_equal SequenceSet.empty, seqset[1..5] ^ seqset[1..5]
694+
assert_equal seqset["1:100"], seqset["1:50"] ^ seqset["51:100"]
695+
assert_equal seqset["1:50"], seqset["1:50"] ^ SequenceSet.empty
696+
assert_equal seqset["1:50"], SequenceSet.empty ^ seqset["1:50"]
697+
end
698+
615699
test "#min" do
616700
assert_equal 3, SequenceSet.new("34:3").min
617701
assert_equal 345, SequenceSet.new("345,678").min

0 commit comments

Comments
Β (0)