package game import ( "strings" "testing" "golang.org/x/exp/slices" ) func assertPosSliceEqual(is, exp []Position, t *testing.T) { if len(is) != len(exp) { t.Fatal("Unexpected number of calculated positions:", is, exp) } for _, p := range exp { if !slices.Contains(is, p) { t.Fatalf("Position %v not in calculated positions", p) } } } func TestPositionsInRange(t *testing.T) { origin := Position{0, 0} positionsInRange1 := []Position{{0, 1}, {1, 0}, {1, 1}} calculatedPositions := PositionsInRange(origin, 1, false) assertPosSliceEqual(calculatedPositions, positionsInRange1, t) origin = Position{1, 0} positionsInRange1 = []Position{{0, 0}, {0, 1}, {1, 1}, {2, 0}, {2, 1}} calculatedPositions = PositionsInRange(origin, 1, false) assertPosSliceEqual(calculatedPositions, positionsInRange1, t) origin = Position{0, 2} positionsInRange1 = []Position{{0, 1}, {1, 1}, {1, 2}, {0, 3}, {1, 3}} calculatedPositions = PositionsInRange(origin, 1, false) assertPosSliceEqual(calculatedPositions, positionsInRange1, t) origin = Position{2, 2} positionsInRange2 := []Position{ {0, 1}, {0, 2}, {0, 3}, {1, 0}, {1, 1}, {1, 2}, {1, 3}, {1, 4}, {2, 0}, {2, 1}, {2, 3}, {2, 4}, {3, 0}, {3, 1}, {3, 2}, {3, 3}, {3, 4}, {4, 1}, {4, 2}, {4, 3}, } calculatedPositions = PositionsInRange(origin, 2, false) assertPosSliceEqual(calculatedPositions, positionsInRange2, t) } func TestPositionNotInRange(t *testing.T) { o := Position{5, 0} p := Position{6, 3} if IsPositionInRange(o, p, 2) { t.Fatalf("Invalid range inclusion %v not in %v", o, PositionsInRange(o, 2, false)) } } func TestDistanceBetweenPos(t *testing.T) { o := Position{0, 0} p := Position{2, 0} d := DistanceBetweenPositions(o, p) d2 := DistanceBetweenPositions(p, o) if d != 2 { t.Fatal("Incorrect distance", d) } if d != d2 { t.Fatal("Distance direction discrepance", d, d2) } } func TestDistanceBetweenPerms(t *testing.T) { mapDef := `map: |1- H T symbols: T: tower H: house S: street ` s := NewLocalState() r := strings.NewReader(mapDef) m, _ := readMap(r) s.SetMap(m) p := s.AddNewPlayer("player", NewDeck()) o := s.AddNewPlayer("opponent", NewDeck()) p1 := s.addNewUnit(NewCard("base/fighter"), Position{0, 0}, o) p2 := s.addNewUnit(NewCard("base/fighter"), Position{2, 0}, p) d := DistanceBetweenPermanents(p1, p2) d2 := DistanceBetweenPermanents(p2, p1) if d != 2 { t.Fatal("Incorrect distance", d) } if d2 != 2 { t.Fatal("Incorrect distance", d2) } }