diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2025-07-05 17:35:58 -0400 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-08-20 15:57:24 +0200 |
| commit | f46c023f0eadd2be844d40afaafded1b0f14a9fc (patch) | |
| tree | 3c5bcd0dff4c88ccc5eba53650dbbd0d21cbc439 | |
| parent | 91af2f3fe4a9b40093ea43c7c899f8281ee887f8 (diff) | |
| download | muhqs-game-f46c023f0eadd2be844d40afaafded1b0f14a9fc.tar.gz muhqs-game-f46c023f0eadd2be844d40afaafded1b0f14a9fc.zip | |
fail if loading an unknown card and add more poc test cases
| -rw-r--r-- | go/game/card.go | 14 | ||||
| -rw-r--r-- | go/game/card_test.go | 10 | ||||
| -rw-r--r-- | go/game/pileOfCards_test.go | 80 |
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) + } } |
