package memoize import ( "testing" ) var intData = []struct { in int calls int }{ {0, 1}, {1, 2}, {0, 2}, {2, 3}, {2, 3}, } func TestInt1(t *testing.T) { numCalls := 0 var f1 func(int) int f2 := func(i int) int { numCalls++ return i } Memoize(&f1, f2) for _, d := range intData { out := f1(d.in) if out != d.in { t.Errorf("Got %d, want %d", out, d.in) } if numCalls != d.calls { t.Errorf("Num calls = %d, want %d", numCalls, d.calls) } } } func TestReassign(t *testing.T) { numCalls := 0 f := func(i int) int { numCalls++ return i } Memoize(&f, f) for _, d := range intData { out := f(d.in) if out != d.in { t.Errorf("Got %d, want %d", out, d.in) } if numCalls != d.calls { t.Errorf("Num calls = %d, want %d", numCalls, d.calls) } } } var int2Data = []struct { in1, in2 int calls int }{ {0, 0, 1}, {0, 1, 2}, {1, 0, 3}, {0, 0, 3}, {0, 1, 3}, {1, 0, 3}, } func TestInt2(t *testing.T) { numCalls := 0 f := func(a, b int) int { numCalls++ return a + b } Memoize(&f, f) for _, d := range int2Data { out := f(d.in1, d.in2) if out != d.in1+d.in2 { t.Errorf("Got %d, want %d + %d", out, d.in1, d.in2) } if numCalls != d.calls { t.Errorf("Num calls = %d, want %d", numCalls, d.calls) } } } var int22Data = []struct { in1, in2 int calls int }{ {0, 0, 1}, {1, 0, 2}, {0, 1, 3}, {0, 1, 3}, {1, 0, 3}, {0, 0, 3}, } func TestInt22(t *testing.T) { numCalls := 0 f := func(a, b int) (int, int) { numCalls++ return b, a } Memoize(&f, f) for _, d := range int22Data { out1, out2 := f(d.in1, d.in2) if out1 != d.in2 || out2 != d.in1 { t.Errorf("Got (%d, %d) from (%d, %d)", out1, out2, d.in1, d.in2) } if numCalls != d.calls { t.Errorf("Num calls = %d, want %d", numCalls, d.calls) } } } var mixedData = []struct { in1 int in2 string calls int }{ {0, "zero", 1}, {1, "zero", 2}, {0, "one", 3}, {1, "one", 4}, {0, "zero", 4}, {1, "zero", 4}, {0, "one", 4}, {1, "one", 4}, } func TestMixed(t *testing.T) { numCalls := 0 f := func(a int, b string) (string, int) { numCalls++ return b, a } Memoize(&f, f) for _, d := range mixedData { out1, out2 := f(d.in1, d.in2) if out1 != d.in2 || out2 != d.in1 { t.Errorf("Got (%s, %d) from (%d, %s)", out1, out2, d.in1, d.in2) } if numCalls != d.calls { t.Errorf("Num calls = %d, want %d", numCalls, d.calls) } } }