From c2e3c9f0900df5b64088c822fe9541e016d5e0ea Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 11:26:08 +0100 Subject: [PATCH 1/2] Reject move commands in non-cardinal directions --- cmd/rove/main.go | 2 +- pkg/maths/bearing.go | 16 ++++++++++++++-- pkg/maths/bearing_test.go | 8 ++++---- pkg/rove/world.go | 6 ++++-- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 8a19e68..75d4e3a 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -215,7 +215,7 @@ func InnerMain(command string, args ...string) error { i++ if len(args) == i { return fmt.Errorf("move command must be passed bearing") - } else if _, err := maths.FromString(args[i]); err != nil { + } else if _, err := maths.BearingFromString(args[i]); err != nil { return err } commands = append(commands, diff --git a/pkg/maths/bearing.go b/pkg/maths/bearing.go index 002b06a..de4014d 100644 --- a/pkg/maths/bearing.go +++ b/pkg/maths/bearing.go @@ -55,8 +55,8 @@ func (d Bearing) ShortString() string { return bearingStrings[d].Short } -// FromString gets the Direction from a string -func FromString(s string) (Bearing, error) { +// BearingFromString gets the Direction from a string +func BearingFromString(s string) (Bearing, error) { for i, d := range bearingStrings { if strings.EqualFold(d.Long, s) || strings.EqualFold(d.Short, s) { return Bearing(i), nil @@ -80,3 +80,15 @@ var bearingVectors = []Vector{ func (d Bearing) Vector() Vector { return bearingVectors[d] } + +// IsCardinal returns if this is a cardinal (NESW) +func (d Bearing) IsCardinal() bool { + switch d { + case North: + case East: + case South: + case West: + return true + } + return false +} diff --git a/pkg/maths/bearing_test.go b/pkg/maths/bearing_test.go index bb97043..e0de345 100644 --- a/pkg/maths/bearing_test.go +++ b/pkg/maths/bearing_test.go @@ -13,19 +13,19 @@ func TestDirection(t *testing.T) { assert.Equal(t, "N", dir.ShortString()) assert.Equal(t, Vector{X: 0, Y: 1}, dir.Vector()) - dir, err := FromString("N") + dir, err := BearingFromString("N") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = FromString("n") + dir, err = BearingFromString("n") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = FromString("north") + dir, err = BearingFromString("north") assert.NoError(t, err) assert.Equal(t, North, dir) - dir, err = FromString("NorthWest") + dir, err = BearingFromString("NorthWest") assert.NoError(t, err) assert.Equal(t, NorthWest, dir) } diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 04cad81..157c636 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -426,8 +426,10 @@ func (w *World) Enqueue(rover string, commands ...Command) error { for _, c := range commands { switch c.Command { case roveapi.CommandType_move: - if _, err := maths.FromString(c.Bearing); err != nil { + if b, err := maths.BearingFromString(c.Bearing); err != nil { return fmt.Errorf("unknown bearing: %s", c.Bearing) + } else if !b.IsCardinal() { + return fmt.Errorf("bearing must be cardinal") } case roveapi.CommandType_broadcast: if len(c.Message) > 3 { @@ -505,7 +507,7 @@ func (w *World) ExecuteCommand(c *Command, rover string) (err error) { switch c.Command { case roveapi.CommandType_move: - if dir, err := maths.FromString(c.Bearing); err != nil { + if dir, err := maths.BearingFromString(c.Bearing); err != nil { return err } else if _, err := w.MoveRover(rover, dir); err != nil { return err From 5814ac95b87ed625baa1d7bf93735b04a2057be3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 19 Jul 2020 11:29:28 +0100 Subject: [PATCH 2/2] Make sure we fallthrough for the NES cases --- pkg/maths/bearing.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/maths/bearing.go b/pkg/maths/bearing.go index de4014d..e72148b 100644 --- a/pkg/maths/bearing.go +++ b/pkg/maths/bearing.go @@ -85,8 +85,11 @@ func (d Bearing) Vector() Vector { func (d Bearing) IsCardinal() bool { switch d { case North: + fallthrough case East: + fallthrough case South: + fallthrough case West: return true }