clone

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

main
puzzletea / games / hitori / elo_test.go
elo_test.go 3.0K
1package hitori23import (4 "context"5 "reflect"6 "testing"78 "github.com/FelineStateMachine/puzzletea/difficulty"9)1011func TestSpawnEloRejectsInvalidElo(t *testing.T) {12 mode := NewMode("Test", "Test mode.", 5, 0.32)1314 gamer, report, err := mode.SpawnElo("seed", difficulty.SoftCapElo+1)15 if err == nil {16 t.Fatal("SpawnElo returned nil error for invalid Elo")17 }18 if gamer != nil {19 t.Fatalf("SpawnElo gamer = %#v, want nil", gamer)20 }21 if !reflect.DeepEqual(report, difficulty.Report{}) {22 t.Fatalf("SpawnElo report = %#v, want zero report", report)23 }24}2526func TestSpawnEloContextCanceled(t *testing.T) {27 mode := NewMode("Test", "Test mode.", 5, 0.32)28 ctx, cancel := context.WithCancel(context.Background())29 cancel()3031 gamer, report, err := mode.SpawnEloContext(ctx, "seed", 1200)32 if err == nil {33 t.Fatal("SpawnEloContext returned nil error for canceled context")34 }35 if gamer != nil {36 t.Fatalf("gamer = %#v, want nil", gamer)37 }38 if !reflect.DeepEqual(report, difficulty.Report{}) {39 t.Fatalf("report = %#v, want zero report", report)40 }41}4243func TestSpawnEloDeterministicForSameSeedAndElo(t *testing.T) {44 mode := NewMode("Test", "Test mode.", 5, 0.32)45 target := difficulty.Elo(1500)4647 gamerA, reportA, err := mode.SpawnElo("same-seed", target)48 if err != nil {49 t.Fatalf("first SpawnElo returned error: %v", err)50 }51 gamerB, reportB, err := mode.SpawnElo("same-seed", target)52 if err != nil {53 t.Fatalf("second SpawnElo returned error: %v", err)54 }5556 saveA, err := gamerA.GetSave()57 if err != nil {58 t.Fatalf("first GetSave returned error: %v", err)59 }60 saveB, err := gamerB.GetSave()61 if err != nil {62 t.Fatalf("second GetSave returned error: %v", err)63 }64 if string(saveA) != string(saveB) {65 t.Fatalf("SpawnElo saves differ for same seed and Elo:\n%s\n%s", saveA, saveB)66 }67 if !reflect.DeepEqual(reportA, reportB) {68 t.Fatalf("SpawnElo reports differ for same seed and Elo:\n%#v\n%#v", reportA, reportB)69 }70}7172func TestSpawnEloPopulatesDifficultyReport(t *testing.T) {73 mode := NewMode("Test", "Test mode.", 5, 0.32)74 target := difficulty.Elo(2200)7576 gamer, report, err := mode.SpawnElo("report-fields", target)77 if err != nil {78 t.Fatalf("SpawnElo returned error: %v", err)79 }80 if gamer == nil {81 t.Fatal("SpawnElo returned nil gamer")82 }83 if report.TargetElo != target {84 t.Fatalf("TargetElo = %d, want %d", report.TargetElo, target)85 }86 if report.ActualElo < difficulty.MinElo || report.ActualElo > difficulty.SoftCapElo {87 t.Fatalf("ActualElo = %d, want in supported range", report.ActualElo)88 }89 if report.Confidence != difficulty.ConfidenceMedium {90 t.Fatalf("Confidence = %q, want %q", report.Confidence, difficulty.ConfidenceMedium)91 }9293 requiredMetrics := []string{94 "size",95 "cells",96 "target_black_pct",97 "duplicate_cells",98 "duplicate_groups",99 "duplicate_pct",100 "solution_count",101 }102 for _, name := range requiredMetrics {103 if _, ok := report.Metrics[name]; !ok {104 t.Fatalf("report metric %q missing from %#v", name, report.Metrics)105 }106 }107 if report.Metrics["solution_count"] != 1 {108 t.Fatalf("solution_count = %v, want 1", report.Metrics["solution_count"])109 }110}