1package fillomino23import (4 "reflect"5 "testing"67 "github.com/FelineStateMachine/puzzletea/difficulty"8)910func TestSpawnEloRejectsInvalidElo(t *testing.T) {11 mode := NewMode("Elo", "test", 6, 6, 0.6)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", 6, 6, 0.6)26 gameA, reportA, err := mode.SpawnElo("same-seed", 1300)27 if err != nil {28 t.Fatal(err)29 }30 gameB, reportB, err := mode.SpawnElo("same-seed", 1300)31 if err != nil {32 t.Fatal(err)33 }34 saveA, err := gameA.GetSave()35 if err != nil {36 t.Fatal(err)37 }38 saveB, err := gameB.GetSave()39 if err != nil {40 t.Fatal(err)41 }42 if string(saveA) != string(saveB) {43 t.Fatalf("SpawnElo saves differ for same seed and Elo:\n%s\n%s", saveA, saveB)44 }45 if !reflect.DeepEqual(reportA, reportB) {46 t.Fatalf("reports differ:\n%#v\n%#v", reportA, reportB)47 }48}4950func TestSpawnEloReportPopulated(t *testing.T) {51 mode := NewMode("Elo", "test", 6, 6, 0.6)52 _, report, err := mode.SpawnElo("report-seed", 1800)53 if err != nil {54 t.Fatal(err)55 }56 if report.TargetElo != 1800 {57 t.Fatalf("TargetElo = %d, want 1800", report.TargetElo)58 }59 if err := difficulty.ValidateElo(report.ActualElo); err != nil {60 t.Fatalf("ActualElo = %d is invalid: %v", report.ActualElo, err)61 }62 if report.Confidence == "" {63 t.Fatal("Confidence is empty")64 }65 for _, key := range []string{"width", "height", "cells", "given_count", "unknown_count", "given_ratio", "target_ratio", "max_region", "solution_count"} {66 if _, ok := report.Metrics[key]; !ok {67 t.Fatalf("metric %q missing from %+v", key, report.Metrics)68 }69 }70}