Refactor Sudoku field and solver implementation
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user