clone

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

chore/app-model-decomp
puzzletea / games / nurikabe / elo_test.go
elo_test.go 2.2K
1package nurikabe23import (4 "reflect"5 "testing"67 "github.com/FelineStateMachine/puzzletea/difficulty"8)910func TestSpawnEloRejectsInvalidElo(t *testing.T) {11 mode := NewMode("Elo", "test", 5, 5, 0.28, 5)12 gamer, report, err := mode.SpawnElo("seed", difficulty.SoftCapElo+1)13 if err == nil {14 t.Fatal("SpawnElo returned nil error")15 }16 if gamer != nil {17 t.Fatalf("gamer = %#v, want nil", gamer)18 }19 if !reflect.DeepEqual(report, difficulty.Report{}) {20 t.Fatalf("report = %#v, want zero report", report)21 }22}2324func TestSpawnEloDeterministicForSameSeedAndElo(t *testing.T) {25 mode := NewMode("Elo", "test", 5, 5, 0.28, 5)26 const target = difficulty.Elo(600)2728 gameA, reportA, err := mode.SpawnElo("same-seed", target)29 if err != nil {30 t.Fatalf("first SpawnElo returned error: %v", err)31 }32 gameB, reportB, err := mode.SpawnElo("same-seed", target)33 if err != nil {34 t.Fatalf("second SpawnElo returned error: %v", err)35 }3637 saveA, err := gameA.GetSave()38 if err != nil {39 t.Fatalf("first save returned error: %v", err)40 }41 saveB, err := gameB.GetSave()42 if err != nil {43 t.Fatalf("second save returned error: %v", err)44 }45 if string(saveA) != string(saveB) {46 t.Fatalf("SpawnElo saves differ for same seed and Elo:\n%s\n%s", saveA, saveB)47 }48 if !reflect.DeepEqual(reportA, reportB) {49 t.Fatalf("SpawnElo reports differ for same seed and Elo:\n%#v\n%#v", reportA, reportB)50 }51}5253func TestSpawnEloReportPopulated(t *testing.T) {54 mode := NewMode("Elo", "test", 5, 5, 0.28, 5)55 const target = difficulty.Elo(900)5657 gamer, report, err := mode.SpawnElo("report-seed", target)58 if err != nil {59 t.Fatalf("SpawnElo returned error: %v", err)60 }61 if gamer == nil {62 t.Fatal("SpawnElo returned nil gamer")63 }64 if report.TargetElo != target {65 t.Fatalf("TargetElo = %d, want %d", report.TargetElo, target)66 }67 if err := difficulty.ValidateElo(report.ActualElo); err != nil {68 t.Fatalf("ActualElo = %d is invalid: %v", report.ActualElo, err)69 }70 if report.Confidence == "" {71 t.Fatal("Confidence is empty")72 }7374 for _, key := range []string{75 "width",76 "height",77 "cells",78 "clue_count",79 "unknown_count",80 "solution_count",81 "solver_nodes",82 "branches",83 "max_depth",84 } {85 if _, ok := report.Metrics[key]; !ok {86 t.Fatalf("metric %q missing from %+v", key, report.Metrics)87 }88 }89}