Implement sailing tests and fix into-the-wind bug
This commit is contained in:
parent
c89c5f6e74
commit
5d80cb2596
2 changed files with 79 additions and 1 deletions
|
@ -552,7 +552,7 @@ func (w *World) Tick() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we've incremented over the current move ticks on the rover, we can try and make the move
|
// If we've incremented over the current move ticks on the rover, we can try and make the move
|
||||||
if r.MoveTicks >= ticksToMove {
|
if ticksToMove != 0 && r.MoveTicks >= ticksToMove {
|
||||||
_, err := w.TryMoveRover(n, r.Bearing)
|
_, err := w.TryMoveRover(n, r.Bearing)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
|
|
|
@ -388,3 +388,81 @@ func TestWorld_Broadcast(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "HJK", "Rover A should have logged it's broadcast")
|
assert.Contains(t, rb.Logs[len(rb.Logs)-1].Text, "HJK", "Rover A should have logged it's broadcast")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWorld_Sailing(t *testing.T) {
|
||||||
|
world := NewWorld(8)
|
||||||
|
world.Tick() // One initial tick to set the wind direction the first time
|
||||||
|
world.Wind = roveapi.Bearing_North // Set the wind direction to north
|
||||||
|
|
||||||
|
name, err := world.SpawnRover()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
// Warp the rover to 0,0 after clearing it
|
||||||
|
world.Atlas.SetObject(maths.Vector{X: 0, Y: 0}, Object{Type: roveapi.Object_ObjectUnknown})
|
||||||
|
assert.NoError(t, world.WarpRover(name, maths.Vector{X: 0, Y: 0}))
|
||||||
|
|
||||||
|
s, err := world.RoverToggle(name)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, roveapi.SailPosition_CatchingWind, s)
|
||||||
|
|
||||||
|
b, err := world.RoverTurn(name, roveapi.Bearing_North)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, roveapi.Bearing_North, b)
|
||||||
|
|
||||||
|
// Clear the space to the north
|
||||||
|
world.Atlas.SetObject(maths.Vector{X: 0, Y: 1}, Object{Type: roveapi.Object_ObjectUnknown})
|
||||||
|
|
||||||
|
// Tick the world and check we've moved not moved
|
||||||
|
world.Tick()
|
||||||
|
info, err := world.GetRover(name)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, maths.Vector{Y: 0}, info.Pos)
|
||||||
|
|
||||||
|
// Loop a few more times
|
||||||
|
for i := 0; i < TicksPerNormalMove-2; i++ {
|
||||||
|
world.Tick()
|
||||||
|
info, err := world.GetRover(name)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, maths.Vector{Y: 0}, info.Pos)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now check we've moved (after the TicksPerNormalMove number of ticks)
|
||||||
|
world.Tick()
|
||||||
|
info, err = world.GetRover(name)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, maths.Vector{Y: 1}, info.Pos)
|
||||||
|
|
||||||
|
// Reset the world ticks back to stop any wind changes etc.
|
||||||
|
world.CurrentTicks = 1
|
||||||
|
|
||||||
|
// Face the rover south, into the wind
|
||||||
|
b, err = world.RoverTurn(name, roveapi.Bearing_South)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, roveapi.Bearing_South, b)
|
||||||
|
|
||||||
|
// Tick a bunch, we should never move
|
||||||
|
for i := 0; i < TicksPerNormalMove*2; i++ {
|
||||||
|
world.Tick()
|
||||||
|
info, err := world.GetRover(name)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, maths.Vector{Y: 1}, info.Pos)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the world ticks back to stop any wind changes etc.
|
||||||
|
world.CurrentTicks = 1
|
||||||
|
world.Wind = roveapi.Bearing_SouthEast // Set up a south easternly wind
|
||||||
|
|
||||||
|
// Turn the rover perpendicular
|
||||||
|
b, err = world.RoverTurn(name, roveapi.Bearing_NorthEast)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, roveapi.Bearing_NorthEast, b)
|
||||||
|
|
||||||
|
// Clear a space
|
||||||
|
world.Atlas.SetObject(maths.Vector{X: 1, Y: 2}, Object{Type: roveapi.Object_ObjectUnknown})
|
||||||
|
|
||||||
|
// Now check we've moved immediately
|
||||||
|
world.Tick()
|
||||||
|
info, err = world.GetRover(name)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, maths.Vector{X: 1, Y: 2}, info.Pos)
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue