Skip to content

Commit 9081c54

Browse files
committed
puzzles: Add Solver tests
1 parent fd9a648 commit 9081c54

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

puzzles/solver.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"log"
88
"sort"
99
"sync"
10+
"testing"
1011

1112
"github.com/pkg/errors"
1213
)
@@ -41,6 +42,18 @@ func Register(name string, solver Solver) {
4142
solvers[name] = solver
4243
}
4344

45+
// UnregisterAllSolvers cleans up registered solvers. Use for testing only.
46+
func UnregisterAllSolvers(tb testing.TB) {
47+
if tb == nil {
48+
panic("could not be called outside of tests")
49+
}
50+
51+
solversMu.Lock()
52+
defer solversMu.Unlock()
53+
54+
solvers = make(map[string]Solver)
55+
}
56+
4457
// Solvers returns a sorted list of the names of the registered puzzle solvers.
4558
func Solvers() []string {
4659
solversMu.RLock()

puzzles/solver_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package puzzles_test
2+
3+
import (
4+
"fmt"
5+
"io"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
10+
"github.com/oleg-balunenko/advent-of-code/puzzles"
11+
)
12+
13+
type mockSolver struct{}
14+
15+
func (m mockSolver) Part1(input io.Reader) (string, error) {
16+
return fmt.Sprint("part 1 of mockSolver"), nil
17+
}
18+
19+
func (m mockSolver) Part2(input io.Reader) (string, error) {
20+
return fmt.Sprint("part 2 of mockSolver"), nil
21+
}
22+
23+
func (m mockSolver) Name() string {
24+
return "mockSolver"
25+
}
26+
27+
type anotherMockSolver struct{}
28+
29+
func (a anotherMockSolver) Part1(input io.Reader) (string, error) {
30+
return fmt.Sprint("part 1 of anotherMockSolver"), nil
31+
}
32+
33+
func (a anotherMockSolver) Part2(input io.Reader) (string, error) {
34+
return fmt.Sprint("part 2 of anotherMockSolver"), nil
35+
}
36+
37+
func (a anotherMockSolver) Name() string {
38+
return "anotherMockSolver"
39+
}
40+
41+
func TestSolver(t *testing.T) {
42+
defer puzzles.UnregisterAllSolvers(t)
43+
44+
solvers := map[string]puzzles.Solver{
45+
"mock": mockSolver{},
46+
"anotherMock": anotherMockSolver{},
47+
}
48+
49+
solversList := make([]string, 0, len(solvers))
50+
51+
for name, solver := range solvers {
52+
puzzles.Register(name, solver)
53+
solversList = append(solversList, name)
54+
}
55+
56+
// get existing solver
57+
gotSolver, err := puzzles.GetSolver("mock")
58+
assert.NoError(t, err)
59+
assert.IsType(t, mockSolver{}, gotSolver)
60+
61+
// get existing solver
62+
gotSolver, err = puzzles.GetSolver("anotherMock")
63+
assert.NoError(t, err)
64+
assert.IsType(t, anotherMockSolver{}, gotSolver)
65+
66+
// get not existing solver
67+
gotSolver, err = puzzles.GetSolver("not-existed")
68+
assert.Error(t, err)
69+
assert.IsType(t, nil, gotSolver)
70+
71+
// get solvers list
72+
gotList := puzzles.Solvers()
73+
assert.ElementsMatch(t, solversList, gotList)
74+
75+
assert.Panics(t, func() {
76+
puzzles.UnregisterAllSolvers(nil)
77+
})
78+
}

0 commit comments

Comments
 (0)