Skip to content

Commit fae1668

Browse files
dmullisdmullis
dmullis
authored andcommitted
Enumerate examples/ for which SVG file contents may need to change
Refactor for tidiness.
1 parent 544fa9e commit fae1668

File tree

1 file changed

+65
-63
lines changed

1 file changed

+65
-63
lines changed

examples_test.go

+65-63
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ package goat
22

33
import (
44
"bytes"
5+
"errors"
56
"flag"
7+
"fmt"
68
"io"
79
"io/ioutil"
810
"os"
911
"path/filepath"
1012
"strings"
1113
"testing"
12-
13-
qt "github.com/frankban/quicktest"
1414
)
1515

1616
var (
@@ -23,9 +23,7 @@ var (
2323
)
2424

2525
// 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) {
2927
var previous string
3028
for i := 0; i < 3; i++ {
3129
in, err := os.Open(filepath.Join(basePath, "circuits.txt"))
@@ -36,7 +34,7 @@ func TestExamplesStableOutput(t *testing.T) {
3634
BuildAndWriteSVG(in, &out, "black", "white")
3735
in.Close()
3836
if i > 0 && previous != out.String() {
39-
c.Fail()
37+
t.FailNow()
4038
}
4139
previous = out.String()
4240

@@ -49,84 +47,87 @@ func TestExamples(t *testing.T) {
4947
t.Fatal(err)
5048
}
5149

52-
var buff *bytes.Buffer
53-
if write == nil {
50+
if *write {
51+
writeExamples(t, filenames)
52+
} else {
5453
t.Logf("Verifying equality of current SVG with examples/ references.\n")
54+
verifyExamples(t, filenames)
5555
}
56-
var failures int
56+
}
57+
58+
59+
func writeExamples(t *testing.T, filenames []string) {
5760
for _, name := range filenames {
5861
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)
7763
BuildAndWriteSVG(in, out, *svgColorLightScheme, *svgColorDarkScheme)
78-
7964
in.Close()
8065
out.Close()
66+
}
67+
}
8168

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)
11278
}
79+
11380
}
114-
if failures > 0 {
81+
if len(failures) > 0 {
11582
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+
}
12089
t.FailNow()
12190
}
12291
}
12392

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+
124124
func BenchmarkComplicated(b *testing.B) {
125125
in := getIn(filepath.FromSlash("examples/complicated.txt"))
126126
b.ResetTimer()
127127
for i := 0; i < b.N; i++ {
128128
BuildAndWriteSVG(in, io.Discard, "black", "white")
129129
}
130+
in.Close()
130131
}
131132

132133
const basePath string = "examples"
@@ -150,6 +151,7 @@ func getOut(txtFilename string) io.WriteCloser {
150151
func getOutString(txtFilename string) (string, error) {
151152
b, err := ioutil.ReadFile(toSVGFilename(txtFilename))
152153
if err != nil {
154+
// XX Simply panic rather than return an error?
153155
return "", err
154156
}
155157
// XX Why are there RETURN characters in contents of the .SVG files?

0 commit comments

Comments
 (0)