59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
package puzzle_test
|
|
|
|
import (
|
|
"15-puzzle/internal/puzzle"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestIsSolvable(t *testing.T) {
|
|
table := []struct {
|
|
puzzle [16]byte
|
|
solvable bool
|
|
}{
|
|
{[16]byte{
|
|
13, 2, 10, 3,
|
|
1, 12, 8, 4,
|
|
5, 0, 9, 6,
|
|
15, 14, 11, 7},
|
|
true},
|
|
{[16]byte{
|
|
6, 13, 7, 10,
|
|
8, 9, 11, 0,
|
|
15, 2, 12, 5,
|
|
14, 3, 1, 4},
|
|
true},
|
|
{[16]byte{
|
|
12, 1, 10, 2,
|
|
7, 11, 4, 14,
|
|
5, 0, 9, 15,
|
|
8, 13, 6, 3},
|
|
true},
|
|
{[16]byte{ // not solvable permutation
|
|
3, 9, 1, 15,
|
|
14, 11, 4, 6,
|
|
13, 0, 10, 12,
|
|
2, 7, 8, 5},
|
|
false},
|
|
{[16]byte{ // same as before but tiles 1 and 2 are switched
|
|
3, 9, 2, 15,
|
|
14, 11, 4, 6,
|
|
13, 0, 10, 12,
|
|
1, 7, 8, 5},
|
|
true},
|
|
}
|
|
for i := range table {
|
|
t.Run(fmt.Sprintf("case_%d", i), func(t *testing.T) {
|
|
solvable, err := puzzle.IsSolvable(table[i].puzzle)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, table[i].solvable, solvable)
|
|
})
|
|
}
|
|
_, err := puzzle.IsSolvable([16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 13, 14, 15, 16})
|
|
assert.Error(t, err)
|
|
_, err = puzzle.IsSolvable([16]byte{0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0})
|
|
assert.Error(t, err)
|
|
}
|