4
4
package sets_test
5
5
6
6
import (
7
+ "encoding/json"
7
8
"testing"
8
9
9
10
"fortio.org/assert"
@@ -13,6 +14,10 @@ import (
13
14
func TestSetToString (t * testing.T ) {
14
15
s := sets.Set [string ]{"z" : {}, "a" : {}, "c" : {}, "b" : {}}
15
16
assert .Equal (t , "a,b,c,z" , s .String ())
17
+ assert .Equal (t , s .Len (), 4 )
18
+ s .Clear ()
19
+ assert .Equal (t , "" , s .String ())
20
+ assert .Equal (t , s .Len (), 0 )
16
21
}
17
22
18
23
func TestArrayToSet (t * testing.T ) {
@@ -34,6 +39,10 @@ func TestRemoveCommon(t *testing.T) {
34
39
// also check clone is not modifying the original etc
35
40
setAA = setB .Clone () // putting B in AA on purpose and vice versa
36
41
setBB = setA .Clone ()
42
+ assert .True (t , setAA .Equals (setB ))
43
+ assert .True (t , setB .Equals (setAA ))
44
+ assert .False (t , setAA .Equals (setA ))
45
+ assert .False (t , setB .Equals (setBB ))
37
46
sets .XOR (setAA , setBB )
38
47
assert .Equal (t , "a,c" , setBB .String ())
39
48
assert .Equal (t , "e,f,g" , setAA .String ())
@@ -42,6 +51,24 @@ func TestRemoveCommon(t *testing.T) {
42
51
assert .False (t , setBB .Has ("c" ))
43
52
}
44
53
54
+ func TestMinus (t * testing.T ) {
55
+ setA := sets .New ("a" , "b" , "c" , "d" )
56
+ setB := sets .New ("b" , "d" , "e" , "f" , "g" )
57
+ setAB := setA .Clone ().Minus (setB )
58
+ setBA := setB .Clone ().Minus (setA )
59
+ assert .Equal (t , "a,c" , setAB .String ())
60
+ assert .Equal (t , "e,f,g" , setBA .String ())
61
+ }
62
+
63
+ func TestPlus (t * testing.T ) {
64
+ setA := sets .New ("a" , "b" , "c" , "d" )
65
+ setB := sets .New ("b" , "d" , "e" , "f" , "g" )
66
+ setAB := setA .Clone ().Plus (setB )
67
+ setBA := setB .Clone ().Plus (setA )
68
+ assert .Equal (t , "a,b,c,d,e,f,g" , setAB .String ())
69
+ assert .Equal (t , "a,b,c,d,e,f,g" , setBA .String ())
70
+ }
71
+
45
72
func TestUnion (t * testing.T ) {
46
73
setA := sets .New ("a" , "b" , "c" , "d" )
47
74
setB := sets .New ("b" , "d" , "e" , "f" , "g" )
@@ -64,3 +91,83 @@ func TestIntersection2(t *testing.T) {
64
91
setC := sets .Intersection (setA , setB , setA )
65
92
assert .Equal (t , "" , setC .String ())
66
93
}
94
+
95
+ func TestSubset (t * testing.T ) {
96
+ setA := sets .New ("a" , "b" , "c" , "d" )
97
+ setB := sets .New ("b" , "d" , "e" , "f" , "g" )
98
+ setC := sets .New ("b" , "d" )
99
+ assert .True (t , setC .Subset (setA ))
100
+ assert .True (t , setA .Subset (setA ))
101
+ assert .False (t , setA .Subset (setC ))
102
+ assert .False (t , setA .Subset (setB ))
103
+ assert .False (t , setB .Subset (setA ))
104
+ }
105
+
106
+ func TestJSON (t * testing.T ) {
107
+ setA := sets .New ("c,d" , "a b" , "y\000 z" , "mno" )
108
+ b , err := json .Marshal (setA )
109
+ assert .NoError (t , err )
110
+ assert .Equal (t , `["a b","c,d","mno","y\u0000z"]` , string (b ))
111
+ jsonStr := `[
112
+ "a,b",
113
+ "c,d"
114
+ ]`
115
+ setB := sets .New [string ]()
116
+ err = json .Unmarshal ([]byte (jsonStr ), & setB )
117
+ assert .NoError (t , err )
118
+ assert .Equal (t , setB .Len (), 2 )
119
+ assert .True (t , setB .Has ("a,b" ))
120
+ assert .True (t , setB .Has ("c,d" ))
121
+ setI := sets .New (3 , 42 , 7 , 10 )
122
+ b , err = json .Marshal (setI )
123
+ assert .NoError (t , err )
124
+ assert .Equal (t , `[3,7,10,42]` , string (b ))
125
+ smallIntSet := sets .New [int8 ](66 , 65 , 67 ) // if using byte, aka uint8, one gets base64("ABC")
126
+ b , err = json .Marshal (smallIntSet )
127
+ assert .NoError (t , err )
128
+ t .Logf ("smallIntSet: %q" , string (b ))
129
+ assert .Equal (t , `[65,66,67]` , string (b ))
130
+ floatSet := sets .New [float64 ](2.3 , 1.1 , - 7.6 , 42 )
131
+ b , err = json .Marshal (floatSet )
132
+ assert .NoError (t , err )
133
+ t .Logf ("floatSet: %q" , string (b ))
134
+ assert .Equal (t , `[-7.6,1.1,2.3,42]` , string (b ))
135
+ i64Set := sets .New [int64 ](2 , 1 , - 7 , 42 )
136
+ b , err = json .Marshal (i64Set )
137
+ assert .NoError (t , err )
138
+ t .Logf ("i64Set: %q" , string (b ))
139
+ assert .Equal (t , `[-7,1,2,42]` , string (b ))
140
+ }
141
+
142
+ type foo struct {
143
+ X int
144
+ }
145
+
146
+ func TestNonOrderedJSON (t * testing.T ) {
147
+ s := sets .New (
148
+ foo {3 },
149
+ foo {1 },
150
+ foo {2 },
151
+ foo {4 },
152
+ )
153
+ b , err := json .Marshal (s )
154
+ t .Logf ("b: %s" , string (b ))
155
+ assert .NoError (t , err )
156
+ // though I guess given it could be in any order it could be accidentally sorted too
157
+ assert .NotEqual (t , `[{"X":1},{"X":2},{"X":3},{"X":4}]` , string (b ))
158
+ u := sets .New [foo ]()
159
+ json .Unmarshal (b , & u )
160
+ assert .NoError (t , err )
161
+ assert .Equal (t , 4 , u .Len ())
162
+ assert .True (t , s .Equals (u ))
163
+ }
164
+
165
+ func TestBadJson (t * testing.T ) {
166
+ jsonStr := `[
167
+ "a,b",
168
+ "c,d"
169
+ ]`
170
+ s := sets .New [int ]()
171
+ err := json .Unmarshal ([]byte (jsonStr ), & s )
172
+ assert .Error (t , err )
173
+ }
0 commit comments