clone

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

bug/architecture-test-trim-path
puzzletea / weekly / weekly_test.go
weekly_test.go 2.5K
1package weekly23import (4 "testing"5 "time"6)78func TestNameAndParseRoundTrip(t *testing.T) {9 name := Name(2026, 1, 1)10 if name != "Week 01-2026 - #01" {11 t.Fatalf("Name() = %q, want %q", name, "Week 01-2026 - #01")12 }1314 info, ok := ParseName(name)15 if !ok {16 t.Fatal("ParseName() = false, want true")17 }18 if info.Year != 2026 || info.Week != 1 || info.Index != 1 {19 t.Fatalf("ParseName() = %+v, want year=2026 week=1 index=1", info)20 }21}2223func TestParseNameRejectsInvalidValues(t *testing.T) {24 tests := []string{25 "Week 1-2026 - #01",26 "Week 01-2026 - #1",27 "Week 00-2026 - #01",28 "Week 01-2026 - #00",29 "Week 54-2026 - #01",30 "Week 01-2026 - #100",31 "week 01-2026 - #01",32 }3334 for _, name := range tests {35 t.Run(name, func(t *testing.T) {36 if _, ok := ParseName(name); ok {37 t.Fatalf("ParseName(%q) = true, want false", name)38 }39 })40 }41}4243func TestRNGDeterministic(t *testing.T) {44 rngA := RNG(2026, 12, 7)45 rngB := RNG(2026, 12, 7)4647 for i := range 10 {48 if got, want := rngA.Int64(), rngB.Int64(); got != want {49 t.Fatalf("draw %d = %d, want %d", i, got, want)50 }51 }52}5354func TestModeDeterministic(t *testing.T) {55 _, gameTypeA, modeA := Mode(2026, 20, 17)56 _, gameTypeB, modeB := Mode(2026, 20, 17)5758 if gameTypeA != gameTypeB || modeA != modeB {59 t.Fatalf("Mode() mismatch: (%q,%q) vs (%q,%q)", gameTypeA, modeA, gameTypeB, modeB)60 }61}6263func TestISOWeekBoundary(t *testing.T) {64 date := time.Date(2025, time.December, 29, 12, 0, 0, 0, time.UTC)65 info := Current(date)66 if info.Year != 2026 || info.Week != 1 {67 t.Fatalf("Current() = %+v, want year=2026 week=1", info)68 }6970 start := StartOfWeek(2026, 1, time.UTC)71 if !start.Equal(time.Date(2025, time.December, 29, 0, 0, 0, 0, time.UTC)) {72 t.Fatalf("StartOfWeek() = %v, want 2025-12-29", start)73 }74}7576func TestBonusXP(t *testing.T) {77 tests := []struct {78 index int79 want int80 }{81 {index: 1, want: 0},82 {index: 9, want: 0},83 {index: 10, want: 1},84 {index: 19, want: 1},85 {index: 20, want: 2},86 {index: 99, want: 9},87 }8889 for _, tt := range tests {90 t.Run(Name(2026, 1, tt.index), func(t *testing.T) {91 if got := BonusXP(tt.index); got != tt.want {92 t.Fatalf("BonusXP(%d) = %d, want %d", tt.index, got, tt.want)93 }94 })95 }96}9798func TestEligibleModesIncludeSudokuRGBVariant(t *testing.T) {99 found := map[string]bool{}100 for _, entry := range eligibleModes {101 if entry.GameType == "Sudoku RGB" {102 found[entry.Mode] = true103 }104 }105106 if !found["Sudoku RGB"] {107 t.Fatalf("eligibleModes missing Sudoku RGB variant")108 }109}