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") } }