package main import ( "bytes" "io" "strconv" "testing" ) func TestOps(t *testing.T) { tests := []struct { ops []int expected []int }{ { ops: []int{3, 0, 4, 0, 99}, expected: []int{1, 0, 4, 0, 99}, }, { ops: []int{1002, 4, 3, 4, 33}, expected: []int{1002, 4, 3, 4, 99}, }, { ops: []int{1, 5, 6, 7, 99, 3, 4, 0}, expected: []int{1, 5, 6, 7, 99, 3, 4, 7}, }, { ops: []int{1101, 5, 6, 7, 99, 0, 0, 0}, expected: []int{1101, 5, 6, 7, 99, 0, 0, 11}, }, } test_loop: for _, test := range tests { got, err := ExecuteProgram(test.ops, func() int { return 1 }, nil, false) if err != nil { t.Errorf("Error while executing test: %s", err.Error()) continue test_loop } if len(got) != len(test.expected) { t.Errorf("Got %+v, expected %+v", got, test.expected) continue test_loop } for i := range got { if test.expected[i] != got[i] { t.Errorf("Got %+v, expected %+v", got, test.expected) continue test_loop } } } } func TestLogical(t *testing.T) { tests := []struct { ops []int input int output int }{ { ops: []int{3, 9, 8, 9, 10, 9, 4, 9, 99, -1, 8}, input: 8, output: 1, }, { ops: []int{3, 9, 8, 9, 10, 9, 4, 9, 99, -1, 8}, input: 7, output: 0, }, { ops: []int{3, 9, 7, 9, 10, 9, 4, 9, 99, -1, 8}, input: 7, output: 1, }, { ops: []int{3, 9, 7, 9, 10, 9, 4, 9, 99, -1, 8}, input: 8, output: 0, }, { ops: []int{3, 3, 1108, -1, 8, 3, 4, 3, 99}, input: 8, output: 1, }, { ops: []int{3, 3, 1108, -1, 8, 3, 4, 3, 99}, input: 7, output: 0, }, { ops: []int{3, 3, 1107, -1, 8, 3, 4, 3, 99}, input: 7, output: 1, }, { ops: []int{3, 3, 1107, -1, 8, 3, 4, 3, 99}, input: 8, output: 0, }, { ops: []int{3, 12, 6, 12, 15, 1, 13, 14, 13, 4, 13, 99, -1, 0, 1, 9}, input: 0, output: 0, }, { ops: []int{3, 12, 6, 12, 15, 1, 13, 14, 13, 4, 13, 99, -1, 0, 1, 9}, input: 8, output: 1, }, { ops: []int{3, 3, 1105, -1, 9, 1101, 0, 0, 12, 4, 12, 99, 1}, input: 0, output: 0, }, { ops: []int{3, 3, 1105, -1, 9, 1101, 0, 0, 12, 4, 12, 99, 1}, input: 8, output: 1, }, { ops: []int{3, 21, 1008, 21, 8, 20, 1005, 20, 22, 107, 8, 21, 20, 1006, 20, 31, 1106, 0, 36, 98, 0, 0, 1002, 21, 125, 20, 4, 20, 1105, 1, 46, 104, 999, 1105, 1, 46, 1101, 1000, 1, 20, 4, 20, 1105, 1, 46, 98, 99}, input: 1, output: 999, }, { ops: []int{3, 21, 1008, 21, 8, 20, 1005, 20, 22, 107, 8, 21, 20, 1006, 20, 31, 1106, 0, 36, 98, 0, 0, 1002, 21, 125, 20, 4, 20, 1105, 1, 46, 104, 999, 1105, 1, 46, 1101, 1000, 1, 20, 4, 20, 1105, 1, 46, 98, 99}, input: 8, output: 1000, }, { ops: []int{3, 21, 1008, 21, 8, 20, 1005, 20, 22, 107, 8, 21, 20, 1006, 20, 31, 1106, 0, 36, 98, 0, 0, 1002, 21, 125, 20, 4, 20, 1105, 1, 46, 104, 999, 1105, 1, 46, 1101, 1000, 1, 20, 4, 20, 1105, 1, 46, 98, 99}, input: 10, output: 1001, }, } for _, test := range tests { var b bytes.Buffer _, err := ExecuteProgram(test.ops, func() int { return test.input }, io.Writer(&b), false) if err != nil { t.Errorf("Error while executing test: %s", err.Error()) continue } got, _ := strconv.Atoi(b.String()) if got != test.output { t.Errorf("%+v: Got %+v, expected %+v", test.ops, got, test.output) } } }