package main

import (
	"testing"
)

func TestShouldIncreaseAccumulator(t *testing.T) {
	elf := ElfCPU{
		Ops: []Op{
			{InstrAcc, 42},
		},
	}
	expected := 42

	elf.Step()
	if elf.Acc != expected {
		t.Errorf("got %d, expected %d", elf.Acc, expected)
	}
}

func TestShouldJump(t *testing.T) {
	elf := ElfCPU{
		Ops: []Op{
			{InstrAcc, 42},
			{InstrJmp, 2},
			{InstrAcc, -42},
			{InstrNop, 0},
		},
	}
	expected := 42

	elf.Step()
	elf.Step()
	elf.Step()

	if elf.Acc != expected {
		t.Errorf("got %d, expected %d", elf.Acc, expected)
	}
}

func TestTask1ShouldFindResult(t *testing.T) {
	elf := ElfCPU{
		Ops: []Op{
			{InstrNop, 0},
			{InstrAcc, 1},
			{InstrJmp, 4},
			{InstrAcc, 3},
			{InstrJmp, -3},
			{InstrAcc, -99},
			{InstrAcc, +1},
			{InstrJmp, -4},
			{InstrAcc, 6},
		},
	}
	expected := 5

	result := Task1(&elf)
	if result != expected {
		t.Errorf("got %d, expected %d", result, expected)
	}
}

func TestTask2ShouldFindResult(t *testing.T) {
	elf := ElfCPU{
		Ops: []Op{
			{InstrNop, 0},
			{InstrAcc, 1},
			{InstrJmp, 4},
			{InstrAcc, 3},
			{InstrJmp, -3},
			{InstrAcc, -99},
			{InstrAcc, +1},
			{InstrJmp, -4},
			{InstrAcc, 6},
		},
	}
	expected := 8

	result := Task2(&elf)
	if result != expected {
		t.Errorf("got %d, expected %d", result, expected)
	}
}