aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--go/game/card.go14
-rw-r--r--go/game/card_test.go10
-rw-r--r--go/game/pileOfCards_test.go80
3 files changed, 102 insertions, 2 deletions
diff --git a/go/game/card.go b/go/game/card.go
index 70c591b7..5aee94bd 100644
--- a/go/game/card.go
+++ b/go/game/card.go
@@ -1,6 +1,7 @@
package game
import (
+ "errors"
"fmt"
"io"
"log"
@@ -178,6 +179,10 @@ func getCardDefinition(set, cardName string) ([]byte, error) {
return cardDefinition, nil
}
+var (
+ ErrUnknownCardPath = errors.New("unknown card path")
+)
+
func retrieveCardDefinition(cardPath string) ([]byte, error) {
url := PROTOCOL + path.Join(BASE_URL, CARD_DATA_URL, cardPath+".yml")
log.Printf("loading %s\n", url)
@@ -186,6 +191,10 @@ func retrieveCardDefinition(cardPath string) ([]byte, error) {
return nil, err
}
+ if resp.StatusCode == 404 {
+ return nil, ErrUnknownCardPath
+ }
+
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if err != nil {
@@ -337,13 +346,16 @@ func NewCard(cardPath string) *Card {
return card
}
-// Safely create a new card from the path.
+// NewCardSafe safely creates a new card from the path.
// Return an error if the path is invalid.
func NewCardSafe(cardPath string) (*Card, error) {
cardName := path.Base(cardPath)
set := path.Dir(cardPath)
cardDefinition, err := getCardDefinition(set, cardName)
+ if err != nil {
+ return nil, err
+ }
c := Card{
Name: "",
diff --git a/go/game/card_test.go b/go/game/card_test.go
index 72f1489a..8c2e7b16 100644
--- a/go/game/card_test.go
+++ b/go/game/card_test.go
@@ -1,14 +1,22 @@
package game
import (
+ "errors"
"reflect"
"testing"
)
func TestLoadingAllCards(t *testing.T) {
v := reflect.ValueOf(Sets)
- for i := 0; i < v.NumField(); i++ {
+ for i := range v.NumField() {
set := v.Field(i).Interface().(SetIdentifier)
NewDeckFromCardPaths(set.CardPaths()).Cards()
}
}
+
+func TestLoadingUnknownCard(t *testing.T) {
+ _, err := NewCardSafe("foo/bar")
+ if !errors.Is(err, ErrUnknownCardPath) {
+ t.Fatal("expected urlErr:", err)
+ }
+}
diff --git a/go/game/pileOfCards_test.go b/go/game/pileOfCards_test.go
index 0c9532fe..45203953 100644
--- a/go/game/pileOfCards_test.go
+++ b/go/game/pileOfCards_test.go
@@ -1,6 +1,7 @@
package game
import (
+ "errors"
"testing"
)
@@ -22,4 +23,83 @@ func TestPocFromString(t *testing.T) {
if err != nil {
t.Fatal(err)
}
+
+ // Error cases
+ poc = NewPileOfCards()
+ in = "base/archer, magic/ritual!]"
+ err = poc.FromString(in)
+ if !errors.Is(err, ErrInvalidPocString) {
+ t.Fatal("expected ErrInvalidPocString")
+ }
+
+ in = "[base/archer, magic/ritual!"
+ err = poc.FromString(in)
+ if !errors.Is(err, ErrInvalidPocString) {
+ t.Fatal("expected ErrInvalidPocString")
+ }
+
+ in = "[base/archer magic/ritual!]"
+ err = poc.FromString(in)
+ if !errors.Is(err, ErrUnknownCardPath) {
+ t.Fatal("expected url.Error")
+ }
+}
+
+func TestPocAddRemoveCard(t *testing.T) {
+ poc := NewPileOfCards()
+ archer := NewCard("base/archer")
+ poc.AddCard(archer)
+ if poc.IsEmpty() {
+ t.Fatal("poc till empty")
+ }
+ if poc.Size() != 1 {
+ t.Fatal("poc size != 1:", poc.Size())
+ }
+ if !poc.Contains(archer) {
+ t.Fatal("poc does not contain archer")
+ }
+ knight := NewCard("base/knight")
+ poc.RemoveCard(knight)
+ if poc.Size() != 1 {
+ t.Fatal("poc size != 1:", poc.Size())
+ }
+ poc.RemoveCard(archer)
+ if poc.Size() != 0 {
+ t.Fatal("poc size != 0:", poc.Size())
+ }
+ if poc.Contains(archer) {
+ t.Fatal("poc still contains archer")
+ }
+}
+
+func TestPocMoveCard(t *testing.T) {
+ poc1 := NewPileOfCards()
+ poc2 := NewPileOfCards()
+ archer := NewCard("base/archer")
+ poc1.AddCard(archer)
+ poc1.MoveCard(archer, poc2)
+ if poc1.Size() != 0 {
+ t.Fatal("poc1 size != 0:", poc1.Size())
+ }
+ if poc2.Size() != 1 {
+ t.Fatal("poc2 size != 1:", poc2.Size())
+ }
+}
+
+func TestPocToList(t *testing.T) {
+ poc := NewPileOfCards()
+ archer1 := NewCard("base/archer")
+ poc.AddCard(archer1)
+ archer2 := NewCard("base/archer")
+ poc.AddCard(archer2)
+ knight := NewCard("base/knight")
+ poc.AddCard(knight)
+ if poc.Size() != 3 {
+ t.Fatal("poc size != 3:", poc.Size())
+ }
+ is := poc.ToList()
+ exp := "2 base/archer\n1 base/knight"
+ if is != exp {
+ t.Fatal("is != exp:", is, exp)
+ }
}