package main

import (
	"testing"
)

func TestRayShouldFindOccupiedSeats(t *testing.T) {
	seatMap := SeatMap{
		'#', '.', '.', '#', '.', '.', '#',
		'.', '#', '.', '.', '.', '.', '.',
		'.', '.', '.', '.', '.', '.', '.',
		'#', '.', '.', 'L', '.', '.', '#',
		'.', '.', '.', '.', '#', '.', '.',
		'.', '.', '.', '.', '.', '.', '.',
		'#', '.', '.', '#', '.', '.', '#',
	}
	tests := [][2]int{
		{-1, -1},
		{0, -1},
		{1, -1},
		{1, 0},
		{1, 1},
		{0, 1},
		{-1, 1},
		{-1, 0},
	}

	for _, test := range tests {
		if _, ok := seatMap.ray(7, 3, 3, test); !ok {
			t.Errorf("%+v did not find occupied seat", test)
		}
	}
}

func TestRayShouldNotFindOccupiedSeat(t *testing.T) {
	seatMap := SeatMap{
		'#', '.', '.', '#', '.', '.', '#',
		'.', 'L', '.', '.', '.', 'L', '.',
		'.', '.', '.', 'L', '.', '.', '.',
		'.', '.', '.', 'L', '.', '.', '.',
		'.', '.', 'L', '.', 'L', '.', '.',
		'.', '.', '.', '.', '.', '.', '.',
		'#', '.', '.', '.', '.', '.', '#',
	}
	tests := [][2]int{
		{-1, -1},
		{0, -1},
		{1, -1},
		{1, 0},
		{1, 1},
		{0, 1},
		{-1, 1},
		{-1, 0},
	}

	for _, test := range tests {
		if _, ok := seatMap.ray(7, 3, 3, test); ok {
			t.Errorf("%+v found occupied seat", test)
		}
	}
}

func TestTask1ShouldFindResult(t *testing.T) {
	seatMap := SeatMap{
		'L', '.', 'L', 'L', '.', 'L', 'L', '.', 'L', 'L',
		'L', 'L', 'L', 'L', 'L', 'L', 'L', '.', 'L', 'L',
		'L', '.', 'L', '.', 'L', '.', '.', 'L', '.', '.',
		'L', 'L', 'L', 'L', '.', 'L', 'L', '.', 'L', 'L',
		'L', '.', 'L', 'L', '.', 'L', 'L', '.', 'L', 'L',
		'L', '.', 'L', 'L', 'L', 'L', 'L', '.', 'L', 'L',
		'.', '.', 'L', '.', 'L', '.', '.', '.', '.', '.',
		'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
		'L', '.', 'L', 'L', 'L', 'L', 'L', 'L', '.', 'L',
		'L', '.', 'L', 'L', 'L', 'L', 'L', '.', 'L', 'L',
	}
	expected := 37

	result := Task1(seatMap, 10, !testing.Short())
	if result != expected {
		t.Errorf("got %d, expected %d", result, expected)
	}
}

func TestTask2ShouldFindResult(t *testing.T) {
	seatMap := SeatMap{
		'L', '.', 'L', 'L', '.', 'L', 'L', '.', 'L', 'L',
		'L', 'L', 'L', 'L', 'L', 'L', 'L', '.', 'L', 'L',
		'L', '.', 'L', '.', 'L', '.', '.', 'L', '.', '.',
		'L', 'L', 'L', 'L', '.', 'L', 'L', '.', 'L', 'L',
		'L', '.', 'L', 'L', '.', 'L', 'L', '.', 'L', 'L',
		'L', '.', 'L', 'L', 'L', 'L', 'L', '.', 'L', 'L',
		'.', '.', 'L', '.', 'L', '.', '.', '.', '.', '.',
		'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
		'L', '.', 'L', 'L', 'L', 'L', 'L', 'L', '.', 'L',
		'L', '.', 'L', 'L', 'L', 'L', 'L', '.', 'L', 'L',
	}
	expected := 26

	result := Task2(seatMap, 10, !testing.Short())
	if result != expected {
		t.Errorf("got %d, expected %d", result, expected)
	}
}