-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathintervalmap_test.go
132 lines (116 loc) · 5.61 KB
/
intervalmap_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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package bandit_test
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/ginkgo/extensions/table"
. "github.com/onsi/gomega"
. "github.com/iancmcc/bandit"
)
func doIntervalMapOp(op string, a, b *IntervalMap) *IntervalMap {
switch op {
case "&":
return a.Intersection(a, b)
case "|":
return a.Union(a, b)
case "^":
return a.SymmetricDifference(a, b)
case "-":
return a.Difference(a, b)
}
return a
}
func imap(v interface{}, ivals ...Interval) *IntervalMap {
return NewIntervalMapWithCapacity(1, 4).Add(nil, v, ivals...)
}
var _ = Describe("IntervalMap", func() {
var (
b = NewIntervalMapWithCapacity(1, 2).Add(nil, "", AtOrAbove(1))
c = NewIntervalMapWithCapacity(1, 2).Add(nil, "", Closed(1, 1))
d = NewIntervalMapWithCapacity(1, 2).Add(nil, "", Below(1), Above(1))
)
DescribeTable("interval map operations",
func(op string, other, expected *IntervalMap) {
a := imap("", Above(1))
actual := doIntervalMapOp(op, a, other)
Ω(actual.Equals(expected)).Should(BeTrue(), "%s != %s", actual.Get(""), expected.Get(""))
},
Entry("(1, ∞) | [1, ∞)", "|", b, imap("", AtOrAbove(1))),
Entry("(1, ∞) & [1, ∞)", "&", b, imap("", Above(1))),
Entry("(1, ∞) ^ [1, ∞)", "^", b, imap("", Point(1))),
Entry("(1, ∞) - [1, ∞)", "-", b, imap("", Empty())),
Entry("(1, ∞) | [1]", "|", c, imap("", AtOrAbove(1))),
Entry("(1, ∞) & [1]", "&", c, imap("", Empty())),
Entry("(1, ∞) ^ [1]", "^", c, imap("", AtOrAbove(1))),
Entry("(1, ∞) - [1]", "-", c, imap("", Above(1))),
Entry("(1, ∞) | ]1[", "|", d, imap("", Below(1), Above(1))),
Entry("(1, ∞) & ]1[", "&", d, imap("", Above(1))),
Entry("(1, ∞) ^ ]1[", "^", d, imap("", Below(1))),
Entry("(1, ∞) - ]1[", "-", d, imap("", Empty())),
)
operatorTest := func(astr string, operator string, bstr string, expectedstr ...string) {
ivals := make([]Interval, len(expectedstr))
for i, s := range expectedstr {
ivals[i] = MustParseIntervalString(s)
}
expected := imap("", ivals...)
left := imap("", MustParseIntervalString(astr))
right := imap("", MustParseIntervalString(bstr))
actual := doIntervalMapOp(operator, left, right)
Ω(actual.Equals(expected)).Should(BeTrue(), "%s != %s", actual.Get(""), expected.Get(""))
left = imap("", MustParseIntervalString(astr))
right = imap("", MustParseIntervalString(bstr))
// Everything except Difference is a commutative
// operation, so test the other direction
if operator != "-" {
inverse := doIntervalMapOp(operator, right, left)
Ω(inverse.Equals(expected)).Should(BeTrue())
}
}
DescribeTable("(a, b) & (c, d)", operatorTest,
Entry("a < b < c < d", "(100, 200)", "&", "(300, 400)", "(0, 0)"),
Entry("a < b = c < d", "(100, 200)", "&", "(200, 300)", "(0, 0)"),
Entry("a < c < b < d", "(100, 300)", "&", "(200, 400)", "(200, 300)"),
Entry("a < c < d < b", "(100, 400)", "&", "(200, 300)", "(200, 300)"),
Entry("a = c < b = d", "(100, 200)", "&", "(100, 200)", "(100, 200)"),
Entry("a = c < d < b", "(100, 400)", "&", "(100, 300)", "(100, 300)"),
Entry("a < c < b = d", "(100, 400)", "&", "(300, 400)", "(300, 400)"),
Entry("(c, d) = Ø", "(100, 400)", "&", "(1, 0)", "(0, 0)"),
Entry("(a, b) = Ø", "(1, 0)", "&", "(100, 400)", "(0, 0)"),
Entry("(a, b) = Ø, (c, d) = Ø", "(1, 0)", "&", "(1, 0)", "(0, 0)"),
)
DescribeTable("(a, b) | (c, d)", operatorTest,
Entry("a < b < c < d", "(100, 200)", "|", "(300, 400)", "(100, 200)", "(300, 400)"),
Entry("a < b = c < d", "(100, 200)", "|", "(200, 300)", "(100, 200)", "(200, 300)"),
Entry("a < c < b < d", "(100, 300)", "|", "(200, 400)", "(100, 400)"),
Entry("a < c < d < b", "(100, 400)", "|", "(200, 300)", "(100, 400)"),
Entry("a = c < b = d", "(100, 200)", "|", "(100, 200)", "(100, 200)"),
Entry("a = c < d < b", "(100, 400)", "|", "(100, 300)", "(100, 400)"),
Entry("a < c < b = d", "(100, 400)", "|", "(300, 400)", "(100, 400)"),
Entry("(c, d) = Ø", "(100, 400)", "|", "(1, 0)", "(100, 400)"),
Entry("(a, b) = Ø", "(1, 0)", "|", "(100, 400)", "(100, 400)"),
Entry("(a, b) = Ø, (c, d) = Ø", "(1, 0)", "|", "(1, 0)", "(0, 0)"),
)
DescribeTable("(a, b) ^ (c, d)", operatorTest,
Entry("a < b < c < d", "(100, 200)", "^", "(300, 400)", "(100, 200)", "(300, 400)"),
Entry("a < b = c < d", "(100, 200)", "^", "(200, 300)", "(100, 200)", "(200, 300)"),
Entry("a < c < b < d", "(100, 300)", "^", "(200, 400)", "(100, 200]", "[300, 400)"),
Entry("a < c < d < b", "(100, 400)", "^", "(200, 300)", "(100, 200]", "[300, 400)"),
Entry("a = c < b = d", "(100, 200)", "^", "(100, 200)", "(0, 0)"),
Entry("a = c < d < b", "(100, 400)", "^", "(100, 300)", "[300, 400)"),
Entry("a < c < b = d", "(100, 400)", "^", "(300, 400)", "(100, 300]"),
Entry("(c, d) = Ø", "(100, 400)", "^", "(0, 0)", "(100, 400)"),
Entry("(a, b) = Ø", "(1, 0)", "^", "(100, 400)", "(100, 400)"),
Entry("(a, b) = Ø, (c, d) = Ø", "(1, 0)", "^", "(1, 0)", "(0, 0)"),
)
DescribeTable("(a, b) - (c, d)", operatorTest,
Entry("a < b < c < d", "(100, 200)", "-", "(300, 400)", "(100, 200)"),
Entry("a < b = c < d", "(100, 200)", "-", "(200, 300)", "(100, 200)"),
Entry("a < c < b < d", "(100, 300)", "-", "(200, 400)", "(100, 200]"),
Entry("a < c < d < b", "(100, 400)", "-", "(200, 300)", "(100, 200]", "[300, 400)"),
Entry("a = c < b = d", "(100, 200)", "-", "(100, 200)", "(0, 0)"),
Entry("a = c < d < b", "(100, 400)", "-", "(100, 300)", "[300, 400)"),
Entry("a < c < b = d", "(100, 400)", "-", "(300, 400)", "(100, 300]"),
Entry("(c, d) = Ø", "(100, 400)", "-", "(1, 0)", "(100, 400)"),
Entry("(a, b) = Ø", "(1, 0)", "-", "(100, 400)", "(0, 0)"),
Entry("(a, b) = Ø, (c, d) = Ø", "(1, 0)", "-", "(1, 0)", "(0, 0)"),
)
})