@@ -2,15 +2,15 @@ package goat
2
2
3
3
import (
4
4
"bytes"
5
+ "errors"
5
6
"flag"
7
+ "fmt"
6
8
"io"
7
9
"io/ioutil"
8
10
"os"
9
11
"path/filepath"
10
12
"strings"
11
13
"testing"
12
-
13
- qt "github.com/frankban/quicktest"
14
14
)
15
15
16
16
var (
23
23
)
24
24
25
25
// XX TXT source file suite is limited to a single file -- "circuits.txt"
26
- func TestExamplesStableOutput (t * testing.T ) {
27
- c := qt .New (t )
28
-
26
+ func TestExampleStableOutput (t * testing.T ) {
29
27
var previous string
30
28
for i := 0 ; i < 3 ; i ++ {
31
29
in , err := os .Open (filepath .Join (basePath , "circuits.txt" ))
@@ -36,7 +34,7 @@ func TestExamplesStableOutput(t *testing.T) {
36
34
BuildAndWriteSVG (in , & out , "black" , "white" )
37
35
in .Close ()
38
36
if i > 0 && previous != out .String () {
39
- c . Fail ()
37
+ t . FailNow ()
40
38
}
41
39
previous = out .String ()
42
40
@@ -49,84 +47,87 @@ func TestExamples(t *testing.T) {
49
47
t .Fatal (err )
50
48
}
51
49
52
- var buff * bytes.Buffer
53
- if write == nil {
50
+ if * write {
51
+ writeExamples (t , filenames )
52
+ } else {
54
53
t .Logf ("Verifying equality of current SVG with examples/ references.\n " )
54
+ verifyExamples (t , filenames )
55
55
}
56
- var failures int
56
+ }
57
+
58
+
59
+ func writeExamples (t * testing.T , filenames []string ) {
57
60
for _ , name := range filenames {
58
61
in := getIn (name )
59
- var out io.WriteCloser
60
- if * write {
61
- out = getOut (name )
62
- } else {
63
- if buff == nil {
64
- buff = & bytes.Buffer {}
65
- } else {
66
- buff .Reset ()
67
- }
68
- out = struct {
69
- io.Writer
70
- io.Closer
71
- }{
72
- buff ,
73
- io .NopCloser (nil ),
74
- }
75
- }
76
-
62
+ out := getOut (name )
77
63
BuildAndWriteSVG (in , out , * svgColorLightScheme , * svgColorDarkScheme )
78
-
79
64
in .Close ()
80
65
out .Close ()
66
+ }
67
+ }
81
68
82
- if buff != nil {
83
- golden , err := getOutString (name )
84
- if err != nil {
85
- t .Log (err )
86
- }
87
- if newStr := buff .String (); newStr != golden {
88
- // Skip complaint if the modification timestamp of the .txt file
89
- // source is fresher than that of the .svg?
90
- // => NO, Any .txt difference might be an editing mistake.
91
-
92
- t .Logf ("Content mismatch for %s. Length was %d, expected %d" ,
93
- toSVGFilename (name ), buff .Len (), len (golden ))
94
- for i := 0 ; i < min (len (golden ), len (newStr )); i ++ {
95
- if newStr [i ] != golden [i ] {
96
- t .Logf ("Differing runes at offset %d: new='%#v' reference='%#v'\n " ,
97
- i , newStr [i ], golden [i ])
98
- break
99
- }
100
- }
101
- t .Logf ("Generated contents do not match existing %s" ,
102
- toSVGFilename (name ))
103
- failures ++
104
- } else {
105
- if testing .Verbose () {
106
- t .Logf ("Existing and generated contents match %s\n " ,
107
- toSVGFilename (name ))
108
- }
109
- }
110
- in .Close ()
111
- out .Close ()
69
+ func verifyExamples (t * testing.T , filenames []string ) {
70
+ var failures []string
71
+ for _ , name := range filenames {
72
+ in := getIn (name )
73
+ buff := & bytes.Buffer {}
74
+ BuildAndWriteSVG (in , buff , * svgColorLightScheme , * svgColorDarkScheme )
75
+ in .Close ()
76
+ if nil != compareSVG (t , buff , name ) {
77
+ failures = append (failures , name )
112
78
}
79
+
113
80
}
114
- if failures > 0 {
81
+ if len ( failures ) > 0 {
115
82
t .Logf (`Failed to verify contents of %d .svg files
116
- Consider:
117
- %s` ,
118
- failures ,
119
- "$ go test -run TestExamples -v -args -write" )
83
+ Failing files:` ,
84
+ len (failures ))
85
+ for _ , name := range failures {
86
+ svgFile := toSVGFilename (name )
87
+ fmt .Printf ("\t \t %s\n " , svgFile )
88
+ }
120
89
t .FailNow ()
121
90
}
122
91
}
123
92
93
+ func compareSVG (t * testing.T , buff * bytes.Buffer , fileName string ) error {
94
+ golden , err := getOutString (fileName )
95
+ if err != nil {
96
+ t .Log (err )
97
+ }
98
+ if newStr := buff .String (); newStr != golden {
99
+ // Skip complaint if the modification timestamp of the .txt file
100
+ // source is fresher than that of the .svg?
101
+ // => NO, Any .txt difference might be an editing mistake.
102
+
103
+ t .Logf ("Content mismatch for %s. Length was %d, expected %d" ,
104
+ toSVGFilename (fileName ), buff .Len (), len (golden ))
105
+ for i := 0 ; i < min (len (golden ), len (newStr )); i ++ {
106
+ if newStr [i ] != golden [i ] {
107
+ t .Logf ("Differing runes at offset %d: new='%#v' reference='%#v'\n " ,
108
+ i , newStr [i ], golden [i ])
109
+ break
110
+ }
111
+ }
112
+ t .Logf ("Generated contents do not match existing %s" ,
113
+ toSVGFilename (fileName ))
114
+ return errors .New ("Generated contents do not match existing" )
115
+ } else {
116
+ if testing .Verbose () {
117
+ t .Logf ("Existing and generated contents match %s\n " ,
118
+ toSVGFilename (fileName ))
119
+ }
120
+ }
121
+ return nil
122
+ }
123
+
124
124
func BenchmarkComplicated (b * testing.B ) {
125
125
in := getIn (filepath .FromSlash ("examples/complicated.txt" ))
126
126
b .ResetTimer ()
127
127
for i := 0 ; i < b .N ; i ++ {
128
128
BuildAndWriteSVG (in , io .Discard , "black" , "white" )
129
129
}
130
+ in .Close ()
130
131
}
131
132
132
133
const basePath string = "examples"
@@ -150,6 +151,7 @@ func getOut(txtFilename string) io.WriteCloser {
150
151
func getOutString (txtFilename string ) (string , error ) {
151
152
b , err := ioutil .ReadFile (toSVGFilename (txtFilename ))
152
153
if err != nil {
154
+ // XX Simply panic rather than return an error?
153
155
return "" , err
154
156
}
155
157
// XX Why are there RETURN characters in contents of the .SVG files?
0 commit comments