clone

fifteen puzzle games for the terminal, with daily puzzles, weekly ladders and xp, built on bubble tea

tech debt 6

Dami committed a8fc19e
commit
a8fc19e85f86b9127a4ee13507e6dd95b3b5e220
parent
85d46b9064fd5ff121126b0384b0cbf8ad1adab0
author
Dami <dami.etoile@gmail.com>
25 files changed, +85 -131
MAGENTS.md6+++
Marchitecture_test.go14++++++++
Mbuiltinprint/register.go2+
Mcatalog/catalog.go2+
Mfillomino/gamemode.go6++--
Dgame/print_adapter.go21-----------
Dgame/print_adapter_test.go55------------------------------
Rgamereg/gamereg.go → gameentry/gameentry.go17+++++----
Rgamereg/gamereg_test.go → gameentry/gameentry_test.go2+-
Mhashiwokakero/gamemode.go6++--
Mhitori/gamemode.go6++--
Mlightsout/gamemode.go6++--
Mnonogram/gamemode.go6++--
Mnurikabe/gamemode.go6++--
Mpdfexport/print_adapter.go2+
Mregistry/registry.go8+++--
Mrippleeffect/gamemode.go6++--
Mshikaku/gamemode.go6++--
Mspellpuzzle/gamemode.go6++--
Mspellpuzzle/print_adapter_test.go3+-
Msudoku/gamemode.go6++--
Msudokurgb/gamemode.go6++--
Mtakuzu/gamemode.go6++--
Mtakuzuplus/gamemode.go6++--
Mwordsearch/gamemode.go6++--
M AGENTS.md +6 -0
M architecture_test.go +14 -0
M builtinprint/register.go +2 -0
M catalog/catalog.go +2 -0
M fillomino/gamemode.go +3 -3
D game/print_adapter.go +0 -21
D game/print_adapter_test.go +0 -55
@@ -1,55 +0,0 @@
1-package game2-3-import (4- "testing"5-6- "codeberg.org/go-pdf/fpdf"7-)8-9-type testPrintAdapter struct {10- canonical string11- aliases []string12-}13-14-func (a testPrintAdapter) CanonicalGameType() string { return a.canonical }15-func (a testPrintAdapter) Aliases() []string { return a.aliases }16-func (a testPrintAdapter) BuildPDFPayload([]byte) (any, error) { return nil, nil }17-func (a testPrintAdapter) RenderPDFBody(*fpdf.Fpdf, any) error { return nil }18-19-func TestPrintAdapterRegistryLookupAndAliases(t *testing.T) {20- adapter := testPrintAdapter{21- canonical: "Test Word Search",22- aliases: []string{"testwordsearch", "test-word-search"},23- }24- RegisterPrintAdapter(adapter)25-26- if !HasPrintAdapter("Test Word Search") {27- t.Fatal("expected canonical lookup to be supported")28- }29- if !HasPrintAdapter("test_word_search") {30- t.Fatal("expected underscore alias lookup to be supported")31- }32- if !HasPrintAdapter("testwordsearch") {33- t.Fatal("expected compact alias lookup to be supported")34- }35- if HasPrintAdapter("lights out") {36- t.Fatal("expected unknown type to be unsupported")37- }38-}39-40-func TestRegisterPrintAdapterSkipsBlankCanonical(t *testing.T) {41- RegisterPrintAdapter(testPrintAdapter{canonical: " "})42- if HasPrintAdapter("should-not-exist") {43- t.Fatal("blank canonical adapter should not create lookups")44- }45-}46-47-func TestIsNilPrintPayload(t *testing.T) {48- var ptr *int49- if !IsNilPrintPayload(ptr) {50- t.Fatal("expected typed nil pointer to be treated as nil payload")51- }52- if IsNilPrintPayload(5) {53- t.Fatal("expected concrete payload to be non-nil")54- }55-}
R gamereg/gamereg.go → gameentry/gameentry.go +10 -7
@@ -1,9 +1,12 @@
1-package gamereg1+// Package gameentry builds concrete runtime game entries from puzzle definitions2+// and runtime mode implementations.3+package gameentry24 35 import (46 "fmt"57 68 "github.com/FelineStateMachine/puzzletea/game"9+ "github.com/FelineStateMachine/puzzletea/pdfexport"710 "github.com/FelineStateMachine/puzzletea/puzzle"811 )912
@@ -18,7 +21,7 @@ type Entry struct {
1821 Help string1922 Import func([]byte) (game.Gamer, error)2023 Modes []ModeEntry21- Print game.PrintAdapter24+ Print pdfexport.PrintAdapter2225 }2326 2427 type EntrySpec struct {
@@ -26,7 +29,7 @@ type EntrySpec struct {
2629 Help string2730 Import func([]byte) (game.Gamer, error)2831 Modes []game.Mode29- Print game.PrintAdapter32+ Print pdfexport.PrintAdapter3033 }3134 3235 func BuildModeDefs(modes []game.Mode) []puzzle.ModeDef {
@@ -47,7 +50,7 @@ func BuildModeDefs(modes []game.Mode) []puzzle.ModeDef {
4750 func NewEntry(spec EntrySpec) Entry {4851 if len(spec.Definition.Modes) != len(spec.Modes) {4952 panic(fmt.Sprintf(50- "gamereg: definition %q has %d mode definitions but %d runtime modes",53+ "gameentry: definition %q has %d mode definitions but %d runtime modes",5154 spec.Definition.Name,5255 len(spec.Definition.Modes),5356 len(spec.Modes),
@@ -59,7 +62,7 @@ func NewEntry(spec EntrySpec) Entry {
5962 spawner, ok := mode.(game.Spawner)6063 if !ok {6164 panic(fmt.Sprintf(62- "gamereg: definition %q mode %q does not implement game.Spawner",65+ "gameentry: definition %q mode %q does not implement game.Spawner",6366 spec.Definition.Name,6467 mode.Title(),6568 ))
@@ -68,7 +71,7 @@ func NewEntry(spec EntrySpec) Entry {
6871 modeDef := spec.Definition.Modes[i]6972 if modeDef.Title != mode.Title() || modeDef.Description != mode.Description() {7073 panic(fmt.Sprintf(71- "gamereg: definition %q mode %d metadata does not match runtime mode %q",74+ "gameentry: definition %q mode %d metadata does not match runtime mode %q",7275 spec.Definition.Name,7376 i,7477 mode.Title(),
@@ -84,7 +87,7 @@ func NewEntry(spec EntrySpec) Entry {
8487 }8588 if entry.Definition.Seeded != (entry.Seeded != nil) {8689 panic(fmt.Sprintf(87- "gamereg: definition %q mode %q seeded flag does not match runtime mode",90+ "gameentry: definition %q mode %q seeded flag does not match runtime mode",8891 spec.Definition.Name,8992 modeDef.Title,9093 ))
R gamereg/gamereg_test.go → gameentry/gameentry_test.go +1 -1
M hashiwokakero/gamemode.go +3 -3
M hitori/gamemode.go +3 -3
M lightsout/gamemode.go +3 -3
M nonogram/gamemode.go +3 -3
M nurikabe/gamemode.go +3 -3
M pdfexport/print_adapter.go +2 -0
M registry/registry.go +5 -3
M rippleeffect/gamemode.go +3 -3
M shikaku/gamemode.go +3 -3
M spellpuzzle/gamemode.go +3 -3
M spellpuzzle/print_adapter_test.go +1 -2
M sudoku/gamemode.go +3 -3
M sudokurgb/gamemode.go +3 -3
M takuzu/gamemode.go +3 -3
M takuzuplus/gamemode.go +3 -3
M wordsearch/gamemode.go +3 -3