freego/game_test.go

220 lines
4.3 KiB
Go

package freego
import (
"errors"
"fmt"
"testing"
)
func dummyMiniGame() (*Game, error) {
g := &Game{
Board: NewBoard(4),
State: gameSetup,
}
//Setup terrain
terrain := []struct {
x, y, t int
}{
{1, 1, 1},
{2, 2, 1},
}
for _, tt := range terrain {
res, err := g.Board.AddTerrain(tt.x, tt.y, tt.t)
if err != nil {
return nil, err
}
if !res {
return nil, errors.New("Error creating terrain")
}
}
pieces := []struct {
x, y int
p *Piece
}{
{0, 0, NewPiece(Flag, Blue)},
{3, 0, NewPiece(Spy, Blue)},
{2, 0, NewPiece(Captain, Blue)},
{3, 1, NewPiece(Marshal, Blue)},
{0, 1, NewPiece(Bomb, Blue)},
{1, 2, NewPiece(Flag, Red)},
{3, 2, NewPiece(Spy, Red)},
{2, 3, NewPiece(Captain, Red)},
{0, 2, NewPiece(Marshal, Red)},
{0, 3, NewPiece(Bomb, Red)},
}
for _, tt := range pieces {
res, err := g.SetupPiece(tt.x, tt.y, tt.p)
if err != nil {
return nil, fmt.Errorf("Piece %v,%v:%v", tt.x, tt.y, err)
}
if !res {
return nil, errors.New("error placing dummy piece")
}
}
_, err := g.SetupPiece(0, 0, NewPiece(Flag, Blue))
if err != nil {
return nil, err
}
return g, nil
}
func TestNewGame(t *testing.T) {
g := NewGame()
if g == nil {
t.Fatal("couldn't create game")
}
if g.State != gameLobby {
t.Error("Game created with weird state")
}
}
func TestSetupPiece(t *testing.T) {
g := NewGame()
p1 := NewPieceFromInt(0, Blue)
p2 := NewPieceFromInt(0, Red)
res, err := g.SetupPiece(0, 0, p1)
if err == nil || res == true {
t.Errorf("Expected to fail setup piece but didn't")
}
g.State = gameSetup
res, err = g.SetupPiece(0, 0, p2)
if err == nil || res == true {
t.Error("Expected to fail putting red piece on blue board")
}
res, err = g.SetupPiece(0, 0, p1)
if err != nil {
t.Fatal(err)
}
res, err = g.SetupPiece(9, 9, p2)
if err == nil {
t.Error("expected to fail setting up piece in invalid spot")
}
res, err = g.SetupPiece(4, 5, p2)
if err != nil {
t.Fatal(err)
}
}
func TestStart(t *testing.T) {
g := NewGame()
res := g.Start()
if res {
t.Fatal("expected to fail starting game due to state")
}
g.State = gameSetup
res = g.Start()
if !res {
t.Fatal("expected game to start")
}
}
func TestMiniCreation(t *testing.T) {
g, err := dummyMiniGame()
if err != nil {
t.Fatalf("mini game not created: %v", err)
}
if g.State != gameSetup {
t.Fatal("mini game not in right state")
}
}
func TestMiniGameDemo(t *testing.T) {
g, err := dummyMiniGame()
if err != nil {
t.Fatal(err)
}
if !g.Start() {
t.Fatal("could not start mini game")
}
if g.State != gameTurnRed {
t.Error("game starting on wrong turn")
}
r := NewDummyPlayer(Red)
b := NewDummyPlayer(Blue)
var moves = []struct {
input string
player Player
res bool
}{
{"c3-b3", r, true},
{"c0-c1", b, true},
{"d2xd1", r, true},
{"c1-d1", b, true},
{"b3-c3", r, true},
{"d1xd2", b, true},
}
i := 0
for _, tt := range moves {
tname := fmt.Sprintf("%v input: %v", i, tt.input)
i++
t.Run(tname, func(t *testing.T) {
raw, err := NewRawCommand(tt.input)
if err != nil {
t.Fatalf("error creating RawCommand from %v:%v", tt.input, err)
}
parsed, err := g.Parse(tt.player, raw)
if err != nil {
t.Fatal(err)
}
res, err := g.Mutate(parsed)
if err != nil {
t.Error(err)
}
if tt.res != res {
t.Errorf("Expected command to be %v but was %v", tt.res, res)
}
})
}
}
func TestMiniGameFull(t *testing.T) {
g, err := dummyMiniGame()
if err != nil {
t.Fatal(err)
}
if !g.Start() {
t.Fatal("could not start mini game")
}
if g.State != gameTurnRed {
t.Error("game starting on wrong turn")
}
r := NewDummyPlayer(Red)
b := NewDummyPlayer(Blue)
var moves = []struct {
input string
player Player
res bool
}{
{"c3-b3", r, true},
{"c0-c1", b, true},
{"d2xd1", r, true},
{"c1-d1", b, true},
{"b3-c3", r, true},
{"d1xd2", b, true},
}
i := 0
for _, tt := range moves {
tname := fmt.Sprintf("%v input: %v", i, tt.input)
i++
t.Run(tname, func(t *testing.T) {
raw, err := NewRawCommand(tt.input)
if err != nil {
t.Fatalf("error creating RawCommand from %v:%v", tt.input, err)
}
parsed, err := g.Parse(tt.player, raw)
if err != nil {
t.Fatal(err)
}
res, err := g.Mutate(parsed)
if err != nil {
t.Error(err)
}
if tt.res != res {
t.Errorf("Expected command to be %v but was %v", tt.res, res)
}
})
}
}