package main

import (
	"testing"
)

func TestRelative(t *testing.T) {
	tests := []struct {
		ops      []int
		expected []int
	}{
		{
			ops:      []int{109, 1, 204, -1, 1001, 100, 1, 100, 1008, 100, 16, 101, 1006, 101, 0, 99},
			expected: []int{109, 1, 204, -1, 1001, 100, 1, 100, 1008, 100, 16, 101, 1006, 101, 0, 99},
		},
		{
			ops:      []int{1102, 34915192, 34915192, 7, 4, 7, 99, 0},
			expected: []int{1219070632396864},
		},
		{
			ops:      []int{104, 1125899906842624, 99},
			expected: []int{1125899906842624},
		},
		{
			ops:      []int{109, 1, 204, -1, 99},
			expected: []int{109},
		},
	}

	for _, test := range tests {
		com := NewComputer(test.ops)
		got := make([]int, 0)
		for !com.Halted {
			out, halt, err := com.Iterate(func() int {
				return 0
			}, false, false)
			if err != nil {
				t.Errorf("Error while executing test: %s", err.Error())
				break
			}
			if !halt {
				got = append(got, out)
			}
		}
		if len(got) != len(test.expected) {
			t.Errorf("%+v: Got %+v, expected %+v (incorrect lengths)", test.ops, got, test.expected)
			break
		}
		for i := range got {
			if got[i] != test.expected[i] {
				t.Errorf("%+v: Got %+v, expected %+v", test.ops, got, test.expected)
				break
			}
		}
	}
}