Skip to content

Commit 5a216d8

Browse files
committed
test bool set
1 parent 29baead commit 5a216d8

File tree

3 files changed

+162
-0
lines changed

3 files changed

+162
-0
lines changed

Taskfile.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,16 @@ tasks:
99

1010
test:
1111
desc: Run go tests with coverage and timeout and without cache
12+
cmds:
13+
- task: test:go
14+
- task: test:py
15+
16+
test:go:
1217
cmds:
1318
- go test -count 1 -cover -timeout 1s ./...
19+
20+
test:py:
21+
cmds:
1422
- python3 -m pytest ./scripts
1523

1624
docs:

sets/bool_test.go

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package sets_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/life4/genesis/sets"
7+
"github.com/matryer/is"
8+
)
9+
10+
var (
11+
nilSet map[int]struct{} = nil
12+
emptySet map[int]struct{} = map[int]struct{}{}
13+
)
14+
15+
func TestContains(t *testing.T) {
16+
is := is.NewRelaxed(t)
17+
is.True(sets.Contains(sets.Set(3, 4, 5), 3))
18+
is.True(sets.Contains(sets.Set(3, 4, 5), 4))
19+
is.True(sets.Contains(sets.Set(3, 4, 5), 5))
20+
is.True(!sets.Contains(sets.Set(3, 4, 5), 6))
21+
is.True(!sets.Contains(emptySet, 3))
22+
is.True(!sets.Contains(nilSet, 3))
23+
}
24+
25+
func TestDisjoint(t *testing.T) {
26+
is := is.NewRelaxed(t)
27+
is.True(!sets.Disjoint(sets.Set(3, 4, 5), sets.Set(3, 4, 5)))
28+
is.True(!sets.Disjoint(sets.Set(3, 4, 5), sets.Set(5, 6, 7)))
29+
is.True(sets.Disjoint(sets.Set(3, 4, 5), sets.Set(6, 7)))
30+
is.True(sets.Disjoint(emptySet, emptySet))
31+
is.True(sets.Disjoint(emptySet, sets.Set(6)))
32+
is.True(sets.Disjoint(sets.Set(6), emptySet))
33+
is.True(sets.Disjoint(sets.Set(6), nilSet))
34+
is.True(sets.Disjoint(nilSet, sets.Set(6)))
35+
is.True(sets.Disjoint(nilSet, nilSet))
36+
}
37+
38+
func TestDisjointMany(t *testing.T) {
39+
is := is.NewRelaxed(t)
40+
41+
// two sets
42+
is.True(!sets.DisjointMany(sets.Set(3, 4, 5), sets.Set(3, 4, 5)))
43+
is.True(!sets.DisjointMany(sets.Set(3, 4, 5), sets.Set(5, 6, 7)))
44+
is.True(sets.DisjointMany(sets.Set(3, 4, 5), sets.Set(6, 7)))
45+
is.True(sets.DisjointMany(emptySet, emptySet))
46+
is.True(sets.DisjointMany(emptySet, sets.Set(6)))
47+
is.True(sets.DisjointMany(sets.Set(6), emptySet))
48+
is.True(sets.DisjointMany(sets.Set(6), nilSet))
49+
is.True(sets.DisjointMany(nilSet, sets.Set(6)))
50+
is.True(sets.DisjointMany(nilSet, nilSet))
51+
52+
// three and more sets
53+
is.True(sets.DisjointMany(sets.Set(3), sets.Set(4), sets.Set(5)))
54+
is.True(!sets.DisjointMany(sets.Set(3), sets.Set(4), sets.Set(4, 5)))
55+
is.True(!sets.DisjointMany(sets.Set(3), sets.Set(4), sets.Set(3, 5)))
56+
57+
// one and zero sets
58+
is.True(sets.DisjointMany(nilSet))
59+
is.True(sets.DisjointMany(emptySet))
60+
is.True(sets.DisjointMany[map[int]struct{}]())
61+
}
62+
63+
func TestEmpty(t *testing.T) {
64+
is := is.NewRelaxed(t)
65+
is.True(sets.Empty(nilSet))
66+
is.True(sets.Empty(emptySet))
67+
is.True(!sets.Empty(sets.Set(3)))
68+
is.True(!sets.Empty(sets.Set(3, 4)))
69+
}
70+
71+
func TestEqual(t *testing.T) {
72+
is := is.NewRelaxed(t)
73+
is.True(sets.Equal(nilSet, nilSet))
74+
is.True(sets.Equal(emptySet, emptySet))
75+
is.True(sets.Equal(nilSet, emptySet))
76+
is.True(sets.Equal(sets.Set(3, 4, 5), sets.Set(3, 4, 5)))
77+
is.True(!sets.Equal(sets.Set(3, 4, 5), sets.Set(3, 4)))
78+
is.True(!sets.Equal(sets.Set(3, 4), sets.Set(3, 4, 5)))
79+
is.True(!sets.Equal(sets.Set(3, 4, 6), sets.Set(3, 4, 5)))
80+
is.True(!sets.Equal(sets.Set(3), emptySet))
81+
is.True(!sets.Equal(emptySet, sets.Set(3)))
82+
}
83+
84+
func TestEqualMany(t *testing.T) {
85+
is := is.NewRelaxed(t)
86+
87+
// two sets
88+
is.True(sets.EqualMany(nilSet, nilSet))
89+
is.True(sets.EqualMany(emptySet, emptySet))
90+
is.True(sets.EqualMany(nilSet, emptySet))
91+
is.True(sets.EqualMany(sets.Set(3, 4, 5), sets.Set(3, 4, 5)))
92+
is.True(!sets.EqualMany(sets.Set(3, 4, 5), sets.Set(3, 4)))
93+
is.True(!sets.EqualMany(sets.Set(3, 4), sets.Set(3, 4, 5)))
94+
is.True(!sets.EqualMany(sets.Set(3, 4, 6), sets.Set(3, 4, 5)))
95+
is.True(!sets.EqualMany(sets.Set(3), emptySet))
96+
is.True(!sets.EqualMany(emptySet, sets.Set(3)))
97+
98+
// one or zero sets
99+
is.True(sets.EqualMany(emptySet))
100+
is.True(sets.EqualMany(nilSet))
101+
is.True(sets.EqualMany[map[int]struct{}]())
102+
}
103+
104+
func TestIntersect(t *testing.T) {
105+
is := is.NewRelaxed(t)
106+
is.True(sets.Intersect(sets.Set(3, 4, 5), sets.Set(3, 4, 5)))
107+
is.True(sets.Intersect(sets.Set(3, 4, 5), sets.Set(5, 6, 7)))
108+
is.True(!sets.Intersect(sets.Set(3, 4, 5), sets.Set(6, 7)))
109+
is.True(!sets.Intersect(emptySet, emptySet))
110+
is.True(!sets.Intersect(emptySet, sets.Set(6)))
111+
is.True(!sets.Intersect(sets.Set(6), emptySet))
112+
is.True(!sets.Intersect(sets.Set(6), nilSet))
113+
is.True(!sets.Intersect(nilSet, sets.Set(6)))
114+
is.True(!sets.Intersect(nilSet, nilSet))
115+
}
116+
117+
func TestSubset(t *testing.T) {
118+
is := is.NewRelaxed(t)
119+
is.True(sets.Subset(sets.Set(3, 4, 5), sets.Set(3, 4, 5)))
120+
is.True(sets.Subset(sets.Set(3, 4), sets.Set(3, 4, 5)))
121+
is.True(sets.Subset(sets.Set(4), sets.Set(3, 4, 5)))
122+
is.True(sets.Subset(emptySet, sets.Set(3, 4, 5)))
123+
is.True(sets.Subset(emptySet, emptySet))
124+
is.True(sets.Subset(emptySet, nilSet))
125+
is.True(sets.Subset(nilSet, emptySet))
126+
127+
is.True(!sets.Subset(sets.Set(4), emptySet))
128+
is.True(!sets.Subset(sets.Set(4), nilSet))
129+
is.True(!sets.Subset(sets.Set(4), sets.Set(5, 6)))
130+
is.True(!sets.Subset(sets.Set(4, 5), sets.Set(5, 6)))
131+
is.True(!sets.Subset(sets.Set(4, 5, 6), sets.Set(5, 6)))
132+
}
133+
134+
func TestSuperset(t *testing.T) {
135+
is := is.NewRelaxed(t)
136+
is.True(sets.Superset(sets.Set(3, 4, 5), sets.Set(3, 4, 5)))
137+
is.True(sets.Superset(sets.Set(3, 4, 5), sets.Set(3, 4)))
138+
is.True(sets.Superset(sets.Set(3, 4, 5), sets.Set(4)))
139+
is.True(sets.Superset(sets.Set(3, 4, 5), emptySet))
140+
is.True(sets.Superset(emptySet, emptySet))
141+
is.True(sets.Superset(nilSet, emptySet))
142+
is.True(sets.Superset(emptySet, nilSet))
143+
144+
is.True(!sets.Superset(emptySet, sets.Set(4)))
145+
is.True(!sets.Superset(nilSet, sets.Set(4)))
146+
is.True(!sets.Superset(sets.Set(5, 6), sets.Set(4)))
147+
is.True(!sets.Superset(sets.Set(5, 6), sets.Set(4, 5)))
148+
is.True(!sets.Superset(sets.Set(5, 6), sets.Set(4, 5, 6)))
149+
}

sets/set.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ func Map[S ~map[K]Z, K, R comparable](set S, f func(K) R) map[R]Z {
6464
return result
6565
}
6666

67+
// Set is a convenience function for constructing a set from a list of values.
68+
func Set[K comparable](values ...K) map[K]Z {
69+
return FromSlice(values)
70+
}
71+
6772
// SymmetricDifference returns a set containing elements that appear only in one set but not both.
6873
func SymmetricDifference[S1, S2 ~map[K]Z, K comparable](first S1, second S2) map[K]Z {
6974
result := make(map[K]Z)

0 commit comments

Comments
 (0)