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) } }) } }