/
life_test.go
102 lines (89 loc) · 2.59 KB
/
life_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package main
import (
"github.com/rymo4/life/universe"
"testing"
)
// Possible data flows:
// 1. CanonicalString to Universe
// 2. Universe to CanonicalString
// 3. MapString to Universe
// 4. Universe to MapString
// 5. File to Universe
// Maybe later: 6. Universe to file
// Tests must send data through all pathes
//-------------------
// MapString -> Universe -> next Universe -> MapString
// Tests: 3, 4
type mapToNextMap struct {
Input, Answer string
Toroidal bool
}
func (m mapToNextMap) Check() (bool, string) {
u := universe.LoadFromString(m.Input)
u.Toroidal = m.Toroidal
u.Next()
message := "Answer:\n" + m.Answer + "\nGuess:\n" + u.String() + "\nInput:\n" + m.Input + "\n"
return u.String() == m.Answer, message
}
//-------------------
// CanonicalString -> Universe -> CanonicalString
// Tests: 1, 2
type canonicalToCanonical struct {
Input, Answer string
}
func (c canonicalToCanonical) Check() (bool, string) {
u := universe.LoadFromCanonicalString(c.Input)
u.Next()
message := "Answer:\n" + c.Answer + "\nGuess:\n" + u.CanonicalString() + "\nInput:\n" + c.Input + "\n"
return u.CanonicalString() == c.Answer, message
}
//-------------------
// Test Cases
type testcase interface {
Check() (bool, string)
}
type testsuite []testcase
func Run(t *testing.T, ts []testcase) {
for _, test := range ts {
ok, message := test.Check()
if !ok {
t.Errorf(message)
}
}
}
//-------------------
// Finally, the tests...
func TestSize(t *testing.T) {
u := universe.LoadFromCanonicalString("3,2,f|0,0,")
if u.Width != 3 || u.Height != 2 {
t.Error("Size does not match")
}
u = universe.LoadFromString("..\n..\n..\n")
if u.Width != 2 || u.Height != 3 {
t.Error("Size does not match")
}
}
func TestToroid(t *testing.T) {
tests := []testcase{
mapToNextMap{Input: ".OO.\n....\n.OO.\n", Answer: ".OO.\n....\n.OO.\n", Toroidal: true},
mapToNextMap{Input: "O..O\n....\nO..O\n", Answer: "O..O\n....\nO..O\n", Toroidal: true},
mapToNextMap{Input: "O..O\n....\nO..O\n", Answer: "....\n....\n....\n", Toroidal: false},
}
Run(t, tests)
}
func TestCanonicalString(t *testing.T) {
tests := []testcase{
canonicalToCanonical{Input: "3,2,true|0,0", Answer: "3,2,true|"},
canonicalToCanonical{Input: "3,2,false|1,0", Answer: "3,2,false|"},
}
Run(t, tests)
}
func TestMaps(t *testing.T) {
tests := []testcase{
mapToNextMap{Input: "...\nOOO\n...\n", Answer: ".O.\n.O.\n.O.\n"},
mapToNextMap{Input: ".O.\n.O.\n.O.\n", Answer: "...\nOOO\n...\n"},
mapToNextMap{Input: "...\n...\n...\n", Answer: "...\n...\n...\n"},
mapToNextMap{Input: "..\n..\n..\n", Answer: "..\n..\n..\n"},
}
Run(t, tests)
}