aboutsummaryrefslogtreecommitdiff
path: root/ops_test.go
blob: c02c0dd966c755c4520ac17a163ecaa367e1451f (plain)
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
package add

import (
	"math"
	"testing"
	"testing/quick"
)

func TestOp(t *testing.T) {
	testCases := map[string]struct {
		f          func(Element, Element) Element
		ref        func(int, int) int
		maxm, maxn int
		ordered    bool
	}{
		"+": {
			f:       Add,
			ref:     func(m, n int) int { return m + n },
			maxm:    100,
			maxn:    100,
			ordered: false,
		},
		"*": {
			f:       Mul,
			ref:     func(m, n int) int { return m * n },
			maxm:    10,
			maxn:    10,
			ordered: false,
		},
		"^": {
			f:       Pow,
			ref:     func(m, n int) int { return int(math.Pow(float64(m), float64(n))) },
			maxm:    10,
			maxn:    3,
			ordered: false,
		},
		"-": {
			f:       Sub,
			ref:     func(m, n int) int { return m - n },
			maxm:    100,
			maxn:    100,
			ordered: true,
		},
	}

	for op, tc := range testCases {
		t.Run(op, func(t *testing.T) {
			f := func(x, y uint8) bool {
				m := int(x) % tc.maxm
				n := int(y) % tc.maxn
				if tc.ordered && n > m {
					m, n = n, m
				}
				ref := tc.ref(m, n)
				me, ne, ee := Index(m), Index(n), Index(ref)
				re := tc.f(me, ne)
				ok := re.Equals(ee)
				if !ok {
					t.Errorf("%v %v %v: got %v, want %v", me, op, ne, re, ee)
				}
				return ok
			}
			if err := quick.Check(f, nil); err != nil {
				t.Error(err)
			}
		})
	}
}