-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathg_set_test.go
110 lines (91 loc) · 2.61 KB
/
g_set_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package crdt
import (
"encoding/json"
"reflect"
"testing"
)
func TestGSetAddContains(t *testing.T) {
gset := NewGSet()
elem := "some-test-element"
if gset.Contains(elem) {
t.Errorf("set should not contain %q element", elem)
}
gset.Add(elem)
if !gset.Contains(elem) {
t.Errorf("set should contain %q element", elem)
}
expectedCount := 1
if gset.Len() != expectedCount {
t.Errorf("set expected to contain %d elements, actual: %d", expectedCount, gset.Len())
}
}
func TestGSetElems(t *testing.T) {
for _, tt := range []struct {
add []interface{}
}{
{[]interface{}{}},
{[]interface{}{1}},
{[]interface{}{1, 2, 3}},
{[]interface{}{1, 100, 1000, -1}},
{[]interface{}{"alpha"}},
{[]interface{}{"alpha", "beta"}},
{[]interface{}{"alpha", "beta", 1, 2}},
} {
gset := NewGSet()
expectedElems := map[interface{}]struct{}{}
for _, i := range tt.add {
expectedElems[i] = struct{}{}
gset.Add(i)
}
actualElems := map[interface{}]struct{}{}
for _, i := range gset.Elems() {
actualElems[i] = struct{}{}
}
if !reflect.DeepEqual(expectedElems, actualElems) {
t.Errorf("expected set to contain: %v, actual: %v", expectedElems, actualElems)
}
}
}
func TestGSetMarshalJSON(t *testing.T) {
for _, tt := range []struct {
add []interface{}
expected string
}{
{[]interface{}{}, `{"type":"g-set","e":[]}`},
{[]interface{}{1}, `{"type":"g-set","e":[1]}`},
{[]interface{}{1, 2, 3}, `{"type":"g-set","e":[3,2,1]}`},
{[]interface{}{1, 2, 3}, `{"type":"g-set","e":[1,2,3]}`},
{[]interface{}{"alpha"}, `{"type":"g-set","e":["alpha"]}`},
{[]interface{}{"alpha", "beta", "gamma"}, `{"type":"g-set","e":["alpha","beta","gamma"]}`},
{[]interface{}{"alpha", 1, "beta", 2}, `{"type":"g-set","e":[1,2,"alpha","beta"]}`},
} {
gset := NewGSet()
for _, e := range tt.add {
gset.Add(e)
}
out, err := json.Marshal(gset)
if err != nil {
t.Fatalf("unexpected error on marshalling gset: %s", err)
}
a := struct {
E []interface{} `json:"e"`
}{}
if err = json.Unmarshal(out, &a); err != nil {
t.Fatalf("unexpected error on unmarshalling serialized %q: %s", tt.expected, err)
}
expectedMap := map[interface{}]struct{}{}
for _, i := range a.E {
expectedMap[i] = struct{}{}
}
if err = json.Unmarshal([]byte(tt.expected), &a); err != nil {
t.Fatalf("unexpected error on unmarshalling serialized %q: %s", tt.expected, err)
}
actualMap := map[interface{}]struct{}{}
for _, i := range a.E {
actualMap[i] = struct{}{}
}
if !reflect.DeepEqual(expectedMap, actualMap) {
t.Errorf("expected set to contain: %v, actual: %v", expectedMap, actualMap)
}
}
}