72 lines
1.9 KiB
Go
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")
|
|
}
|
|
}
|