exercism/go/minesweeper/minesweeper_test.go

199 lines
2.1 KiB
Go

package minesweeper
import (
"bytes"
"testing"
)
const targetTestVersion = 1
var validBoards = []string{
// zero size board
`
++
++`,
// empty board
`
+---+
| |
| |
| |
+---+`,
// board full of mines
`
+---+
|***|
|***|
|***|
+---+`,
// surrounded
`
+---+
|***|
|*8*|
|***|
+---+`,
// horizontal line
`
+-----+
|1*2*1|
+-----+`,
// vertical line
`
+-+
|1|
|*|
|2|
|*|
|1|
+-+`,
// cross
`
+-----+
| 2*2 |
|25*52|
|*****|
|25*52|
| 2*2 |
+-----+`,
// Large 6x6 board with 8 bombs
`
+------+
|1*22*1|
|12*322|
| 123*2|
|112*4*|
|1*22*2|
|111111|
+------+`,
// Large 5x5 board with 7 bombs
`
+-----+
|1*2*1|
|11322|
| 12*2|
|12*4*|
|1*3*2|
+-----+`,
// Small 1x5 board with 2 bombs
`
+-+
|*|
|2|
|*|
|1|
| |
+-+`,
// 1x1 square with 1 bomb
`
+-+
|*|
+-+`,
// 2x2 square with 4 bombs
`
+--+
|**|
|**|
+--+`,
// 5x5 square with 2 bombs
`
+-----+
| 111|
| 1*1|
| 111|
|111 |
|1*1 |
+-----+`,
}
var badBoards = []string{
// Unaligned
`
+-+
| |
|* |
| |
+-+`,
// incomplete border
`
+-----+
* * |
+-- --+`,
// Unknown characters
`
+-----+
|X * |
+-----+`,
}
// constructor. take board as a string, return Board with digits cleared.
func clear(s string) Board {
b := []byte(s)
for i, c := range b {
if c >= '0' && c <= '9' {
b[i] = ' '
}
}
return bytes.Split(b, []byte{'\n'})[1:]
}
func TestTestVersion(t *testing.T) {
if testVersion != targetTestVersion {
t.Fatalf("Found testVersion = %v, want %v.", testVersion, targetTestVersion)
}
}
func TestValid(t *testing.T) {
for _, ref := range validBoards {
b := clear(ref)
t.Log(b)
if err := b.Count(); err != nil {
var _ error = err
t.Fatalf("Count() returned %q, want nil.", err)
}
if res := b.String(); res != ref {
t.Fatalf("Count() result: %s,\n want:%s.", res, ref)
}
}
}
func TestBad(t *testing.T) {
for _, ref := range badBoards {
b := clear(ref)
t.Log(b)
if b.Count() == nil {
t.Fatal("Count() returned nil, want error.")
}
}
}
func BenchmarkCount(b *testing.B) {
m := clear(`
+------+
|1*22*1|
|12*322|
| 123*2|
|112*4*|
|1*22*2|
|111111|
+------+`)
b.ResetTimer()
for i := 0; i < b.N; i++ {
m.Count()
}
}