1 package test
2
3 import "testing"
4
5
6
7 func TestLogic64(t *testing.T) {
8
9 values := [...]int64{-1 << 63, 1<<63 - 1, -4, -3, -2, -1, 0, 1, 2, 3, 4}
10
11
12 zero := func(x int64) int64 { return 0 }
13 id := func(x int64) int64 { return x }
14 or := func(x, y int64) int64 { return x | y }
15 and := func(x, y int64) int64 { return x & y }
16 y := func(x, y int64) int64 { return y }
17
18 for _, test := range [...]struct {
19 name string
20 f func(int64) int64
21 golden func(int64) int64
22 }{
23 {"x|x", func(x int64) int64 { return x | x }, id},
24 {"x|0", func(x int64) int64 { return x | 0 }, id},
25 {"x|-1", func(x int64) int64 { return x | -1 }, func(x int64) int64 { return -1 }},
26 {"x&x", func(x int64) int64 { return x & x }, id},
27 {"x&0", func(x int64) int64 { return x & 0 }, zero},
28 {"x&-1", func(x int64) int64 { return x & -1 }, id},
29 {"x^x", func(x int64) int64 { return x ^ x }, zero},
30 {"x^0", func(x int64) int64 { return x ^ 0 }, id},
31 {"x^-1", func(x int64) int64 { return x ^ -1 }, func(x int64) int64 { return ^x }},
32 {"x+0", func(x int64) int64 { return x + 0 }, id},
33 {"x-x", func(x int64) int64 { return x - x }, zero},
34 {"x*0", func(x int64) int64 { return x * 0 }, zero},
35 {"^^x", func(x int64) int64 { return ^^x }, id},
36 } {
37 for _, v := range values {
38 got := test.f(v)
39 want := test.golden(v)
40 if want != got {
41 t.Errorf("[%s](%d)=%d, want %d", test.name, v, got, want)
42 }
43 }
44 }
45 for _, test := range [...]struct {
46 name string
47 f func(int64, int64) int64
48 golden func(int64, int64) int64
49 }{
50 {"x|(x|y)", func(x, y int64) int64 { return x | (x | y) }, or},
51 {"x|(y|x)", func(x, y int64) int64 { return x | (y | x) }, or},
52 {"(x|y)|x", func(x, y int64) int64 { return (x | y) | x }, or},
53 {"(y|x)|x", func(x, y int64) int64 { return (y | x) | x }, or},
54 {"x&(x&y)", func(x, y int64) int64 { return x & (x & y) }, and},
55 {"x&(y&x)", func(x, y int64) int64 { return x & (y & x) }, and},
56 {"(x&y)&x", func(x, y int64) int64 { return (x & y) & x }, and},
57 {"(y&x)&x", func(x, y int64) int64 { return (y & x) & x }, and},
58 {"x^(x^y)", func(x, y int64) int64 { return x ^ (x ^ y) }, y},
59 {"x^(y^x)", func(x, y int64) int64 { return x ^ (y ^ x) }, y},
60 {"(x^y)^x", func(x, y int64) int64 { return (x ^ y) ^ x }, y},
61 {"(y^x)^x", func(x, y int64) int64 { return (y ^ x) ^ x }, y},
62 {"-(y-x)", func(x, y int64) int64 { return -(y - x) }, func(x, y int64) int64 { return x - y }},
63 {"(x+y)-x", func(x, y int64) int64 { return (x + y) - x }, y},
64 {"(y+x)-x", func(x, y int64) int64 { return (y + x) - x }, y},
65 } {
66 for _, v := range values {
67 for _, w := range values {
68 got := test.f(v, w)
69 want := test.golden(v, w)
70 if want != got {
71 t.Errorf("[%s](%d,%d)=%d, want %d", test.name, v, w, got, want)
72 }
73 }
74 }
75 }
76 }
77
78 func TestLogic32(t *testing.T) {
79
80 values := [...]int32{-1 << 31, 1<<31 - 1, -4, -3, -2, -1, 0, 1, 2, 3, 4}
81
82
83 zero := func(x int32) int32 { return 0 }
84 id := func(x int32) int32 { return x }
85 or := func(x, y int32) int32 { return x | y }
86 and := func(x, y int32) int32 { return x & y }
87 y := func(x, y int32) int32 { return y }
88
89 for _, test := range [...]struct {
90 name string
91 f func(int32) int32
92 golden func(int32) int32
93 }{
94 {"x|x", func(x int32) int32 { return x | x }, id},
95 {"x|0", func(x int32) int32 { return x | 0 }, id},
96 {"x|-1", func(x int32) int32 { return x | -1 }, func(x int32) int32 { return -1 }},
97 {"x&x", func(x int32) int32 { return x & x }, id},
98 {"x&0", func(x int32) int32 { return x & 0 }, zero},
99 {"x&-1", func(x int32) int32 { return x & -1 }, id},
100 {"x^x", func(x int32) int32 { return x ^ x }, zero},
101 {"x^0", func(x int32) int32 { return x ^ 0 }, id},
102 {"x^-1", func(x int32) int32 { return x ^ -1 }, func(x int32) int32 { return ^x }},
103 {"x+0", func(x int32) int32 { return x + 0 }, id},
104 {"x-x", func(x int32) int32 { return x - x }, zero},
105 {"x*0", func(x int32) int32 { return x * 0 }, zero},
106 {"^^x", func(x int32) int32 { return ^^x }, id},
107 } {
108 for _, v := range values {
109 got := test.f(v)
110 want := test.golden(v)
111 if want != got {
112 t.Errorf("[%s](%d)=%d, want %d", test.name, v, got, want)
113 }
114 }
115 }
116 for _, test := range [...]struct {
117 name string
118 f func(int32, int32) int32
119 golden func(int32, int32) int32
120 }{
121 {"x|(x|y)", func(x, y int32) int32 { return x | (x | y) }, or},
122 {"x|(y|x)", func(x, y int32) int32 { return x | (y | x) }, or},
123 {"(x|y)|x", func(x, y int32) int32 { return (x | y) | x }, or},
124 {"(y|x)|x", func(x, y int32) int32 { return (y | x) | x }, or},
125 {"x&(x&y)", func(x, y int32) int32 { return x & (x & y) }, and},
126 {"x&(y&x)", func(x, y int32) int32 { return x & (y & x) }, and},
127 {"(x&y)&x", func(x, y int32) int32 { return (x & y) & x }, and},
128 {"(y&x)&x", func(x, y int32) int32 { return (y & x) & x }, and},
129 {"x^(x^y)", func(x, y int32) int32 { return x ^ (x ^ y) }, y},
130 {"x^(y^x)", func(x, y int32) int32 { return x ^ (y ^ x) }, y},
131 {"(x^y)^x", func(x, y int32) int32 { return (x ^ y) ^ x }, y},
132 {"(y^x)^x", func(x, y int32) int32 { return (y ^ x) ^ x }, y},
133 {"-(y-x)", func(x, y int32) int32 { return -(y - x) }, func(x, y int32) int32 { return x - y }},
134 {"(x+y)-x", func(x, y int32) int32 { return (x + y) - x }, y},
135 {"(y+x)-x", func(x, y int32) int32 { return (y + x) - x }, y},
136 } {
137 for _, v := range values {
138 for _, w := range values {
139 got := test.f(v, w)
140 want := test.golden(v, w)
141 if want != got {
142 t.Errorf("[%s](%d,%d)=%d, want %d", test.name, v, w, got, want)
143 }
144 }
145 }
146 }
147 }
148
149 func TestLogic16(t *testing.T) {
150
151 values := [...]int16{-1 << 15, 1<<15 - 1, -4, -3, -2, -1, 0, 1, 2, 3, 4}
152
153
154 zero := func(x int16) int16 { return 0 }
155 id := func(x int16) int16 { return x }
156 or := func(x, y int16) int16 { return x | y }
157 and := func(x, y int16) int16 { return x & y }
158 y := func(x, y int16) int16 { return y }
159
160 for _, test := range [...]struct {
161 name string
162 f func(int16) int16
163 golden func(int16) int16
164 }{
165 {"x|x", func(x int16) int16 { return x | x }, id},
166 {"x|0", func(x int16) int16 { return x | 0 }, id},
167 {"x|-1", func(x int16) int16 { return x | -1 }, func(x int16) int16 { return -1 }},
168 {"x&x", func(x int16) int16 { return x & x }, id},
169 {"x&0", func(x int16) int16 { return x & 0 }, zero},
170 {"x&-1", func(x int16) int16 { return x & -1 }, id},
171 {"x^x", func(x int16) int16 { return x ^ x }, zero},
172 {"x^0", func(x int16) int16 { return x ^ 0 }, id},
173 {"x^-1", func(x int16) int16 { return x ^ -1 }, func(x int16) int16 { return ^x }},
174 {"x+0", func(x int16) int16 { return x + 0 }, id},
175 {"x-x", func(x int16) int16 { return x - x }, zero},
176 {"x*0", func(x int16) int16 { return x * 0 }, zero},
177 {"^^x", func(x int16) int16 { return ^^x }, id},
178 } {
179 for _, v := range values {
180 got := test.f(v)
181 want := test.golden(v)
182 if want != got {
183 t.Errorf("[%s](%d)=%d, want %d", test.name, v, got, want)
184 }
185 }
186 }
187 for _, test := range [...]struct {
188 name string
189 f func(int16, int16) int16
190 golden func(int16, int16) int16
191 }{
192 {"x|(x|y)", func(x, y int16) int16 { return x | (x | y) }, or},
193 {"x|(y|x)", func(x, y int16) int16 { return x | (y | x) }, or},
194 {"(x|y)|x", func(x, y int16) int16 { return (x | y) | x }, or},
195 {"(y|x)|x", func(x, y int16) int16 { return (y | x) | x }, or},
196 {"x&(x&y)", func(x, y int16) int16 { return x & (x & y) }, and},
197 {"x&(y&x)", func(x, y int16) int16 { return x & (y & x) }, and},
198 {"(x&y)&x", func(x, y int16) int16 { return (x & y) & x }, and},
199 {"(y&x)&x", func(x, y int16) int16 { return (y & x) & x }, and},
200 {"x^(x^y)", func(x, y int16) int16 { return x ^ (x ^ y) }, y},
201 {"x^(y^x)", func(x, y int16) int16 { return x ^ (y ^ x) }, y},
202 {"(x^y)^x", func(x, y int16) int16 { return (x ^ y) ^ x }, y},
203 {"(y^x)^x", func(x, y int16) int16 { return (y ^ x) ^ x }, y},
204 {"-(y-x)", func(x, y int16) int16 { return -(y - x) }, func(x, y int16) int16 { return x - y }},
205 {"(x+y)-x", func(x, y int16) int16 { return (x + y) - x }, y},
206 {"(y+x)-x", func(x, y int16) int16 { return (y + x) - x }, y},
207 } {
208 for _, v := range values {
209 for _, w := range values {
210 got := test.f(v, w)
211 want := test.golden(v, w)
212 if want != got {
213 t.Errorf("[%s](%d,%d)=%d, want %d", test.name, v, w, got, want)
214 }
215 }
216 }
217 }
218 }
219
220 func TestLogic8(t *testing.T) {
221
222 values := [...]int8{-1 << 7, 1<<7 - 1, -4, -3, -2, -1, 0, 1, 2, 3, 4}
223
224
225 zero := func(x int8) int8 { return 0 }
226 id := func(x int8) int8 { return x }
227 or := func(x, y int8) int8 { return x | y }
228 and := func(x, y int8) int8 { return x & y }
229 y := func(x, y int8) int8 { return y }
230
231 for _, test := range [...]struct {
232 name string
233 f func(int8) int8
234 golden func(int8) int8
235 }{
236 {"x|x", func(x int8) int8 { return x | x }, id},
237 {"x|0", func(x int8) int8 { return x | 0 }, id},
238 {"x|-1", func(x int8) int8 { return x | -1 }, func(x int8) int8 { return -1 }},
239 {"x&x", func(x int8) int8 { return x & x }, id},
240 {"x&0", func(x int8) int8 { return x & 0 }, zero},
241 {"x&-1", func(x int8) int8 { return x & -1 }, id},
242 {"x^x", func(x int8) int8 { return x ^ x }, zero},
243 {"x^0", func(x int8) int8 { return x ^ 0 }, id},
244 {"x^-1", func(x int8) int8 { return x ^ -1 }, func(x int8) int8 { return ^x }},
245 {"x+0", func(x int8) int8 { return x + 0 }, id},
246 {"x-x", func(x int8) int8 { return x - x }, zero},
247 {"x*0", func(x int8) int8 { return x * 0 }, zero},
248 {"^^x", func(x int8) int8 { return ^^x }, id},
249 } {
250 for _, v := range values {
251 got := test.f(v)
252 want := test.golden(v)
253 if want != got {
254 t.Errorf("[%s](%d)=%d, want %d", test.name, v, got, want)
255 }
256 }
257 }
258 for _, test := range [...]struct {
259 name string
260 f func(int8, int8) int8
261 golden func(int8, int8) int8
262 }{
263 {"x|(x|y)", func(x, y int8) int8 { return x | (x | y) }, or},
264 {"x|(y|x)", func(x, y int8) int8 { return x | (y | x) }, or},
265 {"(x|y)|x", func(x, y int8) int8 { return (x | y) | x }, or},
266 {"(y|x)|x", func(x, y int8) int8 { return (y | x) | x }, or},
267 {"x&(x&y)", func(x, y int8) int8 { return x & (x & y) }, and},
268 {"x&(y&x)", func(x, y int8) int8 { return x & (y & x) }, and},
269 {"(x&y)&x", func(x, y int8) int8 { return (x & y) & x }, and},
270 {"(y&x)&x", func(x, y int8) int8 { return (y & x) & x }, and},
271 {"x^(x^y)", func(x, y int8) int8 { return x ^ (x ^ y) }, y},
272 {"x^(y^x)", func(x, y int8) int8 { return x ^ (y ^ x) }, y},
273 {"(x^y)^x", func(x, y int8) int8 { return (x ^ y) ^ x }, y},
274 {"(y^x)^x", func(x, y int8) int8 { return (y ^ x) ^ x }, y},
275 {"-(y-x)", func(x, y int8) int8 { return -(y - x) }, func(x, y int8) int8 { return x - y }},
276 {"(x+y)-x", func(x, y int8) int8 { return (x + y) - x }, y},
277 {"(y+x)-x", func(x, y int8) int8 { return (y + x) - x }, y},
278 } {
279 for _, v := range values {
280 for _, w := range values {
281 got := test.f(v, w)
282 want := test.golden(v, w)
283 if want != got {
284 t.Errorf("[%s](%d,%d)=%d, want %d", test.name, v, w, got, want)
285 }
286 }
287 }
288 }
289 }
290
View as plain text