diff --git a/ruleset.go b/ruleset.go index f62b550..e1fa9bb 100644 --- a/ruleset.go +++ b/ruleset.go @@ -1,4 +1,4 @@ -package rulesets +package rules const ( MoveUp = "up" diff --git a/standard.go b/standard.go index 7701ee7..d412f28 100644 --- a/standard.go +++ b/standard.go @@ -1,4 +1,4 @@ -package rulesets +package rules import ( "errors" @@ -183,6 +183,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++ { @@ -190,6 +197,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 93691ec..788b1ea 100644 --- a/standard_test.go +++ b/standard_test.go @@ -1,4 +1,4 @@ -package rulesets +package rules import ( "errors" @@ -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 for move")) +} + +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