-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrouping_test.go
111 lines (103 loc) · 2.01 KB
/
grouping_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
111
package vaddie
import (
"testing"
)
type groupTestThing struct {
X int
Y int
}
var groupingTests = []GroupTestCase[groupTestThing]{
{
Name: "join and all of",
ValidValues: []groupTestThing{
{X: 10, Y: 10},
},
InvalidValues: []groupTestThing{
{X: 5, Y: 5},
},
Validation: func(v groupTestThing) error {
return Join(
AllOf(v.X, "x", OrderedEq(10)),
AllOf(v.Y, "y", OrderedEq(10)),
)
},
},
{
Name: "join and one of",
ValidValues: []groupTestThing{
{X: 10, Y: 10},
},
InvalidValues: []groupTestThing{
{X: 5, Y: 5},
},
Validation: func(v groupTestThing) error {
return Join(
OneOf(v.X, "x", OrderedEq(11), OrderedEq(10)),
OneOf(v.Y, "y", OrderedEq(15), OrderedEq(10)),
)
},
},
{
Name: "with and",
ValidValues: []groupTestThing{
{X: 10, Y: 10},
},
InvalidValues: []groupTestThing{
{X: 3, Y: 50},
},
Validation: func(v groupTestThing) error {
return Join(
AllOf(v.X, "x", And(OrderedGte(5), OrderedLte(15))),
AllOf(v.Y, "y", And(OrderedGte(5), OrderedLte(15))),
)
},
},
{
Name: "with or",
ValidValues: []groupTestThing{
{X: 3, Y: 50},
},
InvalidValues: []groupTestThing{
{X: 10, Y: 10},
},
Validation: func(v groupTestThing) error {
return Join(
AllOf(v.X, "x", Or(OrderedGte(15), OrderedLte(5))),
AllOf(v.Y, "y", Or(OrderedGte(15), OrderedLte(5))),
)
},
},
}
type optionalTestThing struct {
X *int
Y *int
}
func toPtr[T any](value T) *T {
return &value
}
var optionalTests = []GroupTestCase[optionalTestThing]{
{
Name: "optionals",
ValidValues: []optionalTestThing{
{X: toPtr(5), Y: toPtr(50)},
{X: nil, Y: nil},
},
InvalidValues: []optionalTestThing{
{X: toPtr(10), Y: toPtr(10)},
},
Validation: func(v optionalTestThing) error {
return Join(
Optional(v.X, "x", OrderedGte(5)),
Optional(v.Y, "y", OrderedGte(25)),
)
},
},
}
func Test_Grouping(t *testing.T) {
for _, tc := range groupingTests {
tc.Run(t)
}
for _, tc := range optionalTests {
tc.Run(t)
}
}