package main
import (
"fmt"
"testing"
)
func TestAlgorithm(t *testing.T) {
tests := []struct {
grid [][]rune
expectedGrid [][]rune
}{
{
grid: [][]rune{
[]rune{'.', '#', '.', '.', '#'},
[]rune{'.', '.', '.', '.', '.'},
[]rune{'#', '#', '#', '#', '#'},
[]rune{'.', '.', '.', '.', '#'},
[]rune{'.', '.', '.', '#', '#'},
},
expectedGrid: [][]rune{
[]rune{'.', '7', '.', '.', '7'},
[]rune{'.', '.', '.', '.', '.'},
[]rune{'6', '7', '7', '7', '5'},
[]rune{'.', '.', '.', '.', '7'},
[]rune{'.', '.', '.', '8', '7'},
},
},
}
for _, test := range tests {
FindBestPosition(test.grid, true)
fmt.Println("Got:")
for y := range test.grid {
for x := range test.grid[y] {
if test.grid[y][x] == '.' {
fmt.Printf(".")
} else {
fmt.Printf("%d", test.grid[y][x])
}
}
fmt.Println()
}
fmt.Println("Expected:")
for y := range test.expectedGrid {
for x := range test.expectedGrid[y] {
fmt.Printf("%c", test.expectedGrid[y][x])
}
fmt.Println()
}
fmt.Println()
}
}
func TestFindPosition(t *testing.T) {
tests := []struct {
grid [][]rune
expected Point
}{
{
grid: [][]rune{
[]rune{'.', '#', '.', '.', '#'},
[]rune{'.', '.', '.', '.', '.'},
[]rune{'#', '#', '#', '#', '#'},
[]rune{'.', '.', '.', '.', '#'},
[]rune{'.', '.', '.', '#', '#'},
},
expected: Point{x: 3, y: 4},
},
{
grid: [][]rune{
[]rune{'.', '.', '.', '.', '.', '.', '#', '.', '#', '.'},
[]rune{'#', '.', '.', '#', '.', '#', '.', '.', '.', '.'},
[]rune{'.', '.', '#', '#', '#', '#', '#', '#', '#', '.'},
[]rune{'.', '#', '.', '#', '.', '#', '#', '#', '.', '.'},
[]rune{'.', '#', '.', '.', '#', '.', '.', '.', '.', '.'},
[]rune{'.', '.', '#', '.', '.', '.', '.', '#', '.', '#'},
[]rune{'#', '.', '.', '#', '.', '.', '.', '.', '#', '.'},
[]rune{'.', '#', '#', '.', '#', '.', '.', '#', '#', '#'},
[]rune{'#', '#', '.', '.', '.', '#', '.', '.', '#', '.'},
[]rune{'.', '#', '.', '.', '.', '.', '#', '#', '#', '#'},
},
expected: Point{x: 5, y: 8},
},
{
grid: [][]rune{
[]rune{'#', '.', '#', '.', '.', '.', '#', '.', '#', '.'},
[]rune{'.', '#', '#', '#', '.', '.', '.', '.', '#', '.'},
[]rune{'.', '#', '.', '.', '.', '.', '#', '.', '.', '.'},
[]rune{'#', '#', '.', '#', '.', '#', '.', '#', '.', '#'},
[]rune{'.', '.', '.', '.', '#', '.', '#', '.', '#', '.'},
[]rune{'.', '#', '#', '.', '.', '#', '#', '#', '.', '#'},
[]rune{'.', '.', '#', '.', '.', '.', '#', '#', '.', '.'},
[]rune{'.', '.', '#', '#', '.', '.', '.', '.', '#', '#'},
[]rune{'.', '.', '.', '.', '.', '.', '#', '.', '.', '.'},
[]rune{'.', '#', '#', '#', '#', '.', '#', '#', '#', '.'},
},
expected: Point{x: 1, y: 2},
},
{
grid: [][]rune{
[]rune{'.', '#', '.', '.', '#', '.', '.', '#', '#', '#'},
[]rune{'#', '#', '#', '#', '.', '#', '#', '#', '.', '#'},
[]rune{'.', '.', '.', '.', '#', '#', '#', '.', '#', '.'},
[]rune{'.', '.', '#', '#', '#', '.', '#', '#', '.', '#'},
[]rune{'#', '#', '.', '#', '#', '.', '#', '.', '#', '.'},
[]rune{'.', '.', '.', '.', '#', '#', '#', '.', '.', '#'},
[]rune{'.', '.', '#', '.', '#', '.', '.', '#', '.', '#'},
[]rune{'#', '.', '.', '#', '.', '#', '.', '#', '#', '#'},
[]rune{'.', '#', '#', '.', '.', '.', '#', '#', '.', '#'},
[]rune{'.', '.', '.', '.', '.', '#', '.', '#', '.', '.'},
},
expected: Point{x: 6, y: 3},
},
{
grid: [][]rune{
[]rune{'.', '#', '.', '.', '#', '#', '.', '#', '#', '#', '.', '.', '.', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'#', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '.', '.', '#', '#', '.'},
[]rune{'.', '#', '.', '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '.', '#'},
[]rune{'.', '#', '#', '#', '.', '#', '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '#', '.', '#', '.'},
[]rune{'#', '#', '#', '#', '#', '.', '#', '#', '.', '#', '.', '#', '#', '.', '#', '#', '#', '.', '#', '#'},
[]rune{'.', '.', '#', '#', '#', '#', '#', '.', '.', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'#', '.', '#', '#', '#', '#', '.', '.', '.', '.', '#', '#', '#', '.', '#', '.', '#', '.', '#', '#'},
[]rune{'#', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'#', '#', '#', '#', '#', '.', '#', '#', '.', '#', '#', '#', '.', '.', '#', '#', '#', '#', '.', '.'},
[]rune{'.', '.', '#', '#', '#', '#', '#', '#', '.', '.', '#', '#', '.', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'#', '#', '#', '#', '.', '#', '#', '.', '#', '#', '#', '#', '.', '.', '.', '#', '#', '.', '.', '#'},
[]rune{'.', '#', '#', '#', '#', '#', '.', '.', '#', '.', '#', '#', '#', '#', '#', '#', '.', '#', '#', '#'},
[]rune{'#', '#', '.', '.', '.', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '.', '.', '.'},
[]rune{'#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'.', '#', '#', '#', '#', '.', '#', '.', '#', '#', '#', '.', '#', '#', '#', '.', '#', '.', '#', '#'},
[]rune{'.', '.', '.', '.', '#', '#', '.', '#', '#', '.', '#', '#', '#', '.', '.', '#', '#', '#', '#', '#'},
[]rune{'.', '#', '.', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '.', '#', '#', '#'},
[]rune{'#', '.', '#', '.', '#', '.', '#', '#', '#', '#', '#', '.', '#', '#', '#', '#', '.', '#', '#', '#'},
[]rune{'#', '#', '#', '.', '#', '#', '.', '#', '#', '#', '#', '.', '#', '#', '.', '#', '.', '.', '#', '#'},
},
expected: Point{x: 11, y: 13},
},
}
for i, test := range tests {
got, _ := FindBestPosition(test.grid, true)
if got != test.expected {
t.Errorf("%d: Got %+v, expected %+v", i, got, test.expected)
}
}
}
func TestVaporize(t *testing.T) {
tests := []struct {
grid [][]rune
expected Point
}{
{
grid: [][]rune{
[]rune{'.', '#', '.', '.', '#', '#', '.', '#', '#', '#', '.', '.', '.', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'#', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '.', '.', '#', '#', '.'},
[]rune{'.', '#', '.', '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '.', '#'},
[]rune{'.', '#', '#', '#', '.', '#', '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '#', '.', '#', '.'},
[]rune{'#', '#', '#', '#', '#', '.', '#', '#', '.', '#', '.', '#', '#', '.', '#', '#', '#', '.', '#', '#'},
[]rune{'.', '.', '#', '#', '#', '#', '#', '.', '.', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'#', '.', '#', '#', '#', '#', '.', '.', '.', '.', '#', '#', '#', '.', '#', '.', '#', '.', '#', '#'},
[]rune{'#', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'#', '#', '#', '#', '#', '.', '#', '#', '.', '#', '#', '#', '.', '.', '#', '#', '#', '#', '.', '.'},
[]rune{'.', '.', '#', '#', '#', '#', '#', '#', '.', '.', '#', '#', '.', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'#', '#', '#', '#', '.', '#', '#', '.', '#', '#', '#', '#', '.', '.', '.', '#', '#', '.', '.', '#'},
[]rune{'.', '#', '#', '#', '#', '#', '.', '.', '#', '.', '#', '#', '#', '#', '#', '#', '.', '#', '#', '#'},
[]rune{'#', '#', '.', '.', '.', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '.', '.', '.'},
[]rune{'#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '#', '#', '#', '#'},
[]rune{'.', '#', '#', '#', '#', '.', '#', '.', '#', '#', '#', '.', '#', '#', '#', '.', '#', '.', '#', '#'},
[]rune{'.', '.', '.', '.', '#', '#', '.', '#', '#', '.', '#', '#', '#', '.', '.', '#', '#', '#', '#', '#'},
[]rune{'.', '#', '.', '#', '.', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '.', '#', '#', '#'},
[]rune{'#', '.', '#', '.', '#', '.', '#', '#', '#', '#', '#', '.', '#', '#', '#', '#', '.', '#', '#', '#'},
[]rune{'#', '#', '#', '.', '#', '#', '.', '#', '#', '#', '#', '.', '#', '#', '.', '#', '.', '.', '#', '#'},
},
expected: Point{x: 8, y: 2},
},
}
for i, test := range tests {
got := VaporizeAsteroids(test.grid, Point{x: 11, y: 13}, true)
if got != test.expected {
t.Errorf("%d: Got %+v, expected %+v", i, got, test.expected)
}
}
}