@@ -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 ]
@@ -573,6 +647,16 @@ def obj.to_sequence_set; 192_168.001_255 end
573647 assert_equal seqset [ "1,5,11:99" ] , seqset [ "1,5:6,8:9,11:99" ] . subtract ( "6:9" )
574648 end
575649
650+ test "#xor" do
651+ seqset = -> { SequenceSet . new ( _1 ) }
652+ assert_equal seqset [ "1:5,11:15" ] , seqset [ "1:10" ] ^ seqset [ "6:15" ]
653+ assert_equal seqset [ "1,3,5:6" ] , seqset [ 1 ..5 ] ^ [ 2 , 4 , 6 ]
654+ assert_equal SequenceSet . empty , seqset [ 1 ..5 ] ^ seqset [ 1 ..5 ]
655+ assert_equal seqset [ "1:100" ] , seqset [ "1:50" ] ^ seqset [ "51:100" ]
656+ assert_equal seqset [ "1:50" ] , seqset [ "1:50" ] ^ SequenceSet . empty
657+ assert_equal seqset [ "1:50" ] , SequenceSet . empty ^ seqset [ "1:50" ]
658+ end
659+
576660 test "#min" do
577661 assert_equal 3 , SequenceSet . new ( "34:3" ) . min
578662 assert_equal 345 , SequenceSet . new ( "345,678" ) . min
0 commit comments