Implement a test for transfer and fix bugs

This commit is contained in:
Marc Di Luzio 2020-07-24 22:50:47 +01:00
parent fdfcc88540
commit 57621d169a
2 changed files with 66 additions and 13 deletions

View file

@ -1,6 +1,7 @@
package rove package rove
import ( import (
"encoding/json"
"testing" "testing"
"github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/pkg/maths"
@ -159,6 +160,57 @@ func TestCommand_Salvage(t *testing.T) {
assert.Equal(t, roveapi.Object_ObjectUnknown, obj.Type) assert.Equal(t, roveapi.Object_ObjectUnknown, obj.Type)
} }
func TestCommand_Transfer(t *testing.T) {
w := NewWorld(8)
acc, err := w.Accountant.RegisterAccount("tmp")
assert.NoError(t, err)
nameA, err := w.SpawnRover(acc.Name)
assert.NoError(t, err)
infoA, err := w.GetRover(nameA)
assert.NoError(t, err)
// Drop a dormant rover on the current position
infoB := DefaultRover()
infoB.Name = "abc"
infoB.Pos = infoA.Pos
data, err := json.Marshal(infoB)
assert.NoError(t, err)
w.Atlas.SetObject(infoA.Pos, Object{Type: roveapi.Object_RoverDormant, Data: data})
// Enqueue a transfer as well as a dud command
err = w.Enqueue(nameA,
&roveapi.Command{Command: roveapi.CommandType_transfer},
&roveapi.Command{Command: roveapi.CommandType_broadcast, Data: []byte("xyz")})
assert.NoError(t, err)
w.Tick()
// Ensure both command queues are empty
assert.Empty(t, w.CommandQueue[nameA])
assert.Empty(t, w.CommandQueue[infoB.Name])
// Verify the account now controls the new rover
accountRover, err := w.Accountant.GetValue(acc.Name, "rover")
assert.NoError(t, err)
assert.Equal(t, infoB.Name, accountRover)
// Verify the position now has a dormant rover
_, obj := w.Atlas.QueryPosition(infoA.Pos)
assert.Equal(t, roveapi.Object_RoverDormant, obj.Type)
// Verify the stored data matches
var stored Rover
err = json.Unmarshal(obj.Data, &stored)
assert.NoError(t, err)
assert.Equal(t, infoA.Name, stored.Name)
// Verify the new rover data matches what we put in
infoB2, err := w.GetRover(infoB.Name)
assert.NoError(t, err)
assert.Equal(t, infoB.Name, infoB2.Name)
}
func TestCommand_Invalid(t *testing.T) { func TestCommand_Invalid(t *testing.T) {
w := NewWorld(8) w := NewWorld(8)
name, err := w.SpawnRover("tmp") name, err := w.SpawnRover("tmp")

View file

@ -378,28 +378,26 @@ func (w *World) RoverTransfer(rover string) (string, error) {
oldRover.AddLogEntryf("transferring to dormant rover %s", newRover.Name) oldRover.AddLogEntryf("transferring to dormant rover %s", newRover.Name)
newRover.AddLogEntryf("transferred from rover %s", oldRover.Name) newRover.AddLogEntryf("transferred from rover %s", oldRover.Name)
// Clear the old owner // Transfer the ownership
w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name)
newRover.Owner = oldRover.Owner
oldRover.Owner = "" oldRover.Owner = ""
// Marshal old rover // Place the old rover in the world
oldRoverData, err := json.Marshal(oldRover) oldRoverData, err := json.Marshal(oldRover)
if err != nil { if err != nil {
return "", err return "", err
} }
// Add this new rover to tracking
w.Rovers[newRover.Name] = &newRover
// Swap account rover to the dormant one
newRover.Owner = oldRover.Owner
w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name)
// Place the old rover into the world
w.Atlas.SetObject(oldRover.Pos, Object{Type: roveapi.Object_RoverDormant, Data: oldRoverData}) w.Atlas.SetObject(oldRover.Pos, Object{Type: roveapi.Object_RoverDormant, Data: oldRoverData})
// Remove old rover from current tracking // Swap the rovers in the tracking
w.Rovers[newRover.Name] = &newRover
delete(w.Rovers, oldRover.Name) delete(w.Rovers, oldRover.Name)
// Clear the command queues for both rovers
delete(w.CommandQueue, oldRover.Name)
delete(w.CommandQueue, newRover.Name)
return newRover.Name, nil return newRover.Name, nil
} }
@ -599,7 +597,10 @@ func (w *World) Tick() {
} }
// Extract the first command in the queue // Extract the first command in the queue
w.CommandQueue[rover] = cmds[1:] // Only if the command queue still has entries
if _, ok := w.CommandQueue[rover]; ok {
w.CommandQueue[rover] = cmds[1:]
}
} else { } else {
// Clean out the empty entry // Clean out the empty entry