clone

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

main
puzzletea / games / hashiwokakero / benchmark_test.go
benchmark_test.go 2.3K
1package hashiwokakero23import (4 "math/rand/v2"5 "testing"6)78func skipBenchmarkInShortMode(b *testing.B) {9 b.Helper()10 if testing.Short() {11 b.Skip("skipping benchmark in short mode")12 }13}1415func benchmarkHashiModesByBoardSize() []HashiMode {16 return []HashiMode{17 NewMode("Hard 7x7", "benchmark", 7, 7, 17, 20),18 NewMode("Hard 9x9", "benchmark", 9, 9, 28, 32),19 NewMode("Hard 11x11", "benchmark", 11, 11, 42, 48),20 NewMode("Hard 13x13", "benchmark", 13, 13, 59, 68),21 }22}2324func BenchmarkGeneratePuzzleByBoardSize(b *testing.B) {25 skipBenchmarkInShortMode(b)2627 for modeIndex, mode := range benchmarkHashiModesByBoardSize() {28 b.Run(mode.Title(), func(b *testing.B) {29 b.ReportAllocs()30 for i := 0; i < b.N; i++ {31 var (32 puzzle Puzzle33 err error34 )35 for attempt := range 32 {36 rng := rand.New(rand.NewPCG(uint64(i+1), uint64(modeIndex*10+attempt+1)))37 puzzle, err = GeneratePuzzleSeeded(mode, rng)38 if err == nil {39 break40 }41 }42 if err != nil {43 b.Fatalf("GeneratePuzzleSeeded failed: %v", err)44 }45 if puzzle.Width != mode.Width || puzzle.Height != mode.Height {46 b.Fatalf("wrong dimensions: got %dx%d, want %dx%d", puzzle.Width, puzzle.Height, mode.Width, mode.Height)47 }48 }49 })50 }51}5253func BenchmarkBuildSpanningTree(b *testing.B) {54 skipBenchmarkInShortMode(b)5556 for modeIndex, mode := range benchmarkHashiModesByBoardSize() {57 b.Run(mode.Title(), func(b *testing.B) {58 base, err := GeneratePuzzleSeeded(mode, rand.New(rand.NewPCG(uint64(modeIndex+50), uint64(modeIndex+60))))59 if err != nil {60 b.Fatalf("seed puzzle generation failed: %v", err)61 }6263 islands := make([]Island, len(base.Islands))64 copy(islands, base.Islands)6566 b.ReportAllocs()67 b.ResetTimer()68 successes := 069 for i := 0; i < b.N; i++ {70 ok := false71 for attempt := range 32 {72 islandCopy := make([]Island, len(islands))73 copy(islandCopy, islands)7475 p := Puzzle{76 Width: mode.Width,77 Height: mode.Height,78 Islands: islandCopy,79 }8081 ok = buildSpanningTreeSeeded(82 &p,83 rand.New(rand.NewPCG(uint64(i+1), uint64(modeIndex*100+attempt+1))),84 )85 if ok {86 successes++87 break88 }89 }90 }91 if successes == 0 {92 b.Fatal("buildSpanningTreeSeeded never succeeded")93 }94 })95 }96}