package main
import (
"testing"
)
func TestMotion(t *testing.T) {
tests := []struct {
steps int
moons []Moon
expected []Moon
}{
{
steps: 10,
moons: []Moon{
{
x: -1, y: 0, z: 2,
},
{
x: 2, y: -10, z: -7,
},
{
x: 4, y: -8, z: 8,
},
{
x: 3, y: 5, z: -1,
},
},
expected: []Moon{
{
x: 2, y: 1, z: -3,
vx: -3, vy: -2, vz: 1,
},
{
x: 1, y: -8, z: 0,
vx: -1, vy: 1, vz: 3,
},
{
x: 3, y: -6, z: 1,
vx: 3, vy: 2, vz: -3,
},
{
x: 2, y: 0, z: 4,
vx: 1, vy: -1, vz: -1,
},
},
},
{
steps: 100,
moons: []Moon{
{
x: -8, y: -10, z: 0,
},
{
x: 5, y: 5, z: 10,
},
{
x: 2, y: -7, z: 3,
},
{
x: 9, y: -8, z: -3,
},
},
expected: []Moon{
{
x: 8, y: -12, z: -9,
vx: -7, vy: 3, vz: 0,
},
{
x: 13, y: 16, z: -3,
vx: 3, vy: -11, vz: -5,
},
{
x: -29, y: -11, z: -1,
vx: -3, vy: 7, vz: 4,
},
{
x: 16, y: -13, z: 23,
vx: 7, vy: 1, vz: 1,
},
},
},
}
for i, test := range tests {
IterateMoons(test.moons, test.steps, true)
for j := range test.moons {
if test.moons[j] != test.expected[j] {
t.Errorf("%d: Got %+v, expected %+v", i, test.moons, test.expected)
}
}
}
}
func TestEnergy(t *testing.T) {
tests := []struct {
steps int
moons []Moon
expected int
}{
{
steps: 10,
moons: []Moon{
{
x: -1, y: 0, z: 2,
},
{
x: 2, y: -10, z: -7,
},
{
x: 4, y: -8, z: 8,
},
{
x: 3, y: 5, z: -1,
},
},
expected: 179,
},
{
steps: 100,
moons: []Moon{
{
x: -8, y: -10, z: 0,
},
{
x: 5, y: 5, z: 10,
},
{
x: 2, y: -7, z: 3,
},
{
x: 9, y: -8, z: -3,
},
},
expected: 1940,
},
}
for i, test := range tests {
got := IterateMoons(test.moons, test.steps, false)
if got != test.expected {
t.Errorf("%d: Got %+v, expected %+v", i, got, test.expected)
}
}
}
func TestSteps(t *testing.T) {
tests := []struct {
steps int
moons []Moon
expected int
}{
{
steps: 10,
moons: []Moon{
{
x: -1, y: 0, z: 2,
},
{
x: 2, y: -10, z: -7,
},
{
x: 4, y: -8, z: 8,
},
{
x: 3, y: 5, z: -1,
},
},
expected: 2772,
},
{
steps: 100,
moons: []Moon{
{
x: -8, y: -10, z: 0,
},
{
x: 5, y: 5, z: 10,
},
{
x: 2, y: -7, z: 3,
},
{
x: 9, y: -8, z: -3,
},
},
expected: 4686774924,
},
}
for i, test := range tests {
got := FindSteps(test.moons, true)
if got != test.expected {
t.Errorf("%d: Got %+v, expected %+v", i, got, test.expected)
}
}
}