Files
Sudoku/logic/solver_test.go
T

72 lines
1.9 KiB
Go

package logic_test
import (
"errors"
"testing"
"git.kleiax.de/homepage/field"
"git.kleiax.de/homepage/logic"
"git.kleiax.de/homepage/logic/strategies"
"git.kleiax.de/homepage/parser"
)
const solvedPuzzle = "123456789456789123789123456234567891567891234891234567345678912678912345912345678"
func parsedField(t *testing.T, puzzle string) *field.Field {
t.Helper()
input := &parser.PuzzleString{}
if err := input.Parse([]byte(puzzle)); err != nil {
t.Fatal(err)
}
result, err := input.GetField(0)
if err != nil {
t.Fatal(err)
}
return result
}
func TestSolverRunSolvesAndDetectsNoProgress(t *testing.T) {
t.Run("solved", func(t *testing.T) {
f := parsedField(t, "0"+solvedPuzzle[1:])
solver := &logic.Solver{}
solver.Add(&strategies.LastDigit{})
if err := solver.InitStrategies(f); err != nil {
t.Fatal(err)
}
solved, err := solver.Run(0)
if err != nil || !solved || !f.IsSolved() {
t.Fatalf("Run() = (%v, %v), field solved = %v", solved, err, f.IsSolved())
}
})
t.Run("no progress", func(t *testing.T) {
f := parsedField(t, "0"+solvedPuzzle[1:])
solver := &logic.Solver{}
if err := solver.InitStrategies(f); err != nil {
t.Fatal(err)
}
solved, err := solver.Run(0)
if err != nil || solved {
t.Fatalf("Run() = (%v, %v), want (false, nil)", solved, err)
}
})
}
func TestSolverRejectsInvalidStateAndStrategyIndex(t *testing.T) {
solver := &logic.Solver{}
if _, err := solver.Run(0); !errors.Is(err, field.ErrInvalidField) {
t.Fatalf("Run() before initialization error = %v", err)
}
if err := solver.InitStrategies(nil); !errors.Is(err, field.ErrInvalidField) {
t.Fatalf("InitStrategies(nil) error = %v", err)
}
f := parsedField(t, "0"+solvedPuzzle[1:])
if err := solver.InitStrategies(f); err != nil {
t.Fatal(err)
}
if _, err := solver.Run(1); err == nil {
t.Fatal("Run() with invalid strategy index error = nil")
}
}