diff --git a/standard.go b/standard.go index ed1c1f5..f5b147c 100644 --- a/standard.go +++ b/standard.go @@ -181,6 +181,13 @@ func (r *StandardRuleset) ResolveMoves(prevState *BoardState, moves []SnakeMove) } func (r *StandardRuleset) moveSnakes(b *BoardState, moves []SnakeMove) error { + if len(moves) < len(b.Snakes) { + return errors.New("not enough snake moves") + } + if len(moves) > len(b.Snakes) { + return errors.New("too many snake moves") + } + for _, move := range moves { var snake *Snake for i := 0; i < len(b.Snakes); i++ { @@ -188,6 +195,9 @@ func (r *StandardRuleset) moveSnakes(b *BoardState, moves []SnakeMove) error { snake = &b.Snakes[i] } } + if snake == nil { + return errors.New("snake not found for move") + } // Do not move eliminated snakes if snake.EliminatedCause != NotEliminated { diff --git a/standard_test.go b/standard_test.go index fe4dca2..be2b016 100644 --- a/standard_test.go +++ b/standard_test.go @@ -340,6 +340,77 @@ func TestMoveSnakes(t *testing.T) { } } +func TestMoveSnakesWrongID(t *testing.T) { + b := &BoardState{ + Snakes: []Snake{ + { + ID: "one", + Body: []Point{{1, 1}}, + }, + }, + } + moves := []SnakeMove{ + { + ID: "not found", + Move: MoveUp, + }, + } + + r := StandardRuleset{} + err := r.moveSnakes(b, moves) + require.Equal(t, err, errors.New("snake not found")) +} + +func TestMoveSnakesNotEnoughMoves(t *testing.T) { + b := &BoardState{ + Snakes: []Snake{ + { + ID: "one", + Body: []Point{{1, 1}}, + }, + { + ID: "two", + Body: []Point{{2, 2}}, + }, + }, + } + moves := []SnakeMove{ + { + ID: "two", + Move: MoveUp, + }, + } + + r := StandardRuleset{} + err := r.moveSnakes(b, moves) + require.Equal(t, err, errors.New("not enough snake moves")) +} + +func TestMoveSnakesTooManyMoves(t *testing.T) { + b := &BoardState{ + Snakes: []Snake{ + { + ID: "one", + Body: []Point{{1, 1}}, + }, + }, + } + moves := []SnakeMove{ + { + ID: "one", + Move: MoveUp, + }, + { + ID: "two", + Move: MoveUp, + }, + } + + r := StandardRuleset{} + err := r.moveSnakes(b, moves) + require.Equal(t, err, errors.New("too many snake moves")) +} + func TestIsKnownBoardSize(t *testing.T) { tests := []struct { Width int32