|
1 | 1 | package lexers_test
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "encoding/json" |
| 4 | + "bytes" |
| 5 | + "fmt" |
5 | 6 | "io"
|
6 | 7 | "os"
|
7 | 8 | "path/filepath"
|
@@ -64,41 +65,41 @@ func BenchmarkGet(b *testing.B) {
|
64 | 65 | }
|
65 | 66 | }
|
66 | 67 |
|
67 |
| -func FileTest(t *testing.T, lexer chroma.Lexer, actualFilename, expectedFilename string) { |
| 68 | +func FileTest(t *testing.T, lexer chroma.Lexer, sourceFile, expectedFilename string) { |
68 | 69 | t.Helper()
|
69 |
| - t.Run(lexer.Config().Name+"/"+actualFilename, func(t *testing.T) { |
| 70 | + t.Run(lexer.Config().Name+"/"+sourceFile, func(t *testing.T) { |
70 | 71 | // Read and tokenise source text.
|
71 |
| - actualText, err := os.ReadFile(actualFilename) |
| 72 | + sourceBytes, err := os.ReadFile(sourceFile) |
72 | 73 | assert.NoError(t, err)
|
73 |
| - actual, err := chroma.Tokenise(lexer, nil, string(actualText)) |
| 74 | + actualTokens, err := chroma.Tokenise(lexer, nil, string(sourceBytes)) |
74 | 75 | assert.NoError(t, err)
|
75 | 76 |
|
76 |
| - if os.Getenv("RECORD") != "" { |
77 |
| - // Update the expected file with the generated output of this lexer |
78 |
| - f, err := os.Create(expectedFilename) |
79 |
| - defer f.Close() // nolint: gosec |
80 |
| - assert.NoError(t, err) |
81 |
| - for _, token := range actual { |
82 |
| - if token.Type == chroma.Error { |
83 |
| - t.Logf("Found Error token in lexer %s output: %s", lexer.Config().Name, repr.String(token)) |
84 |
| - } |
| 77 | + // Check for error tokens early |
| 78 | + for _, token := range actualTokens { |
| 79 | + if token.Type == chroma.Error { |
| 80 | + t.Logf("Found Error token in lexer %s output: %s", lexer.Config().Name, repr.String(token)) |
85 | 81 | }
|
86 |
| - assert.NoError(t, formatters.JSON.Format(f, nil, chroma.Literator(actual...))) |
87 |
| - } else { |
88 |
| - // Read expected JSON into token slice. |
89 |
| - var expected []chroma.Token |
90 |
| - r, err := os.Open(expectedFilename) |
91 |
| - assert.NoError(t, err) |
92 |
| - err = json.NewDecoder(r).Decode(&expected) |
93 |
| - assert.NoError(t, err) |
| 82 | + } |
94 | 83 |
|
95 |
| - assert.Equal(t, expected, actual) |
| 84 | + // Use a bytes.Buffer to "render" the actual bytes |
| 85 | + var actualBytes bytes.Buffer |
| 86 | + err = formatters.JSON.Format(&actualBytes, nil, chroma.Literator(actualTokens...)) |
| 87 | + assert.NoError(t, err) |
96 | 88 |
|
97 |
| - // Check for error tokens. |
98 |
| - for _, token := range actual { |
99 |
| - if token.Type == chroma.Error { |
100 |
| - t.Logf("Found Error token in lexer %s output: %s", lexer.Config().Name, repr.String(token)) |
101 |
| - } |
| 89 | + expectedBytes, err := os.ReadFile(expectedFilename) |
| 90 | + assert.NoError(t, err) |
| 91 | + |
| 92 | + // Check that the expected bytes are identical |
| 93 | + if !bytes.Equal(actualBytes.Bytes(), expectedBytes) { |
| 94 | + if os.Getenv("RECORD") == "true" { |
| 95 | + f, err := os.Create(expectedFilename) |
| 96 | + assert.NoError(t, err) |
| 97 | + _, err = f.Write(actualBytes.Bytes()) |
| 98 | + assert.NoError(t, err) |
| 99 | + assert.NoError(t, f.Close()) |
| 100 | + } else { |
| 101 | + // fail via an assertion of string values for diff output |
| 102 | + assert.Equal(t, string(expectedBytes), actualBytes.String()) |
102 | 103 | }
|
103 | 104 | }
|
104 | 105 | })
|
@@ -167,20 +168,20 @@ func FileTestAnalysis(t *testing.T, lexer chroma.Lexer, actualFilepath, expected
|
167 | 168 | assert.NoError(t, err)
|
168 | 169 |
|
169 | 170 | actual := analyser.AnalyseText(string(data))
|
170 |
| - |
171 |
| - if os.Getenv("RECORD") == "true" { |
172 |
| - // Update the expected file with the generated output of this lexer |
173 |
| - f, err := os.Create(expectedFilepath) |
174 |
| - defer f.Close() // nolint: gosec |
175 |
| - assert.NoError(t, err) |
176 |
| - |
177 |
| - _, err = f.WriteString(strconv.FormatFloat(float64(actual), 'f', -1, 32)) |
178 |
| - assert.NoError(t, err) |
179 |
| - } else { |
180 |
| - expected, err := strconv.ParseFloat(strings.TrimSpace(string(expectedData)), 32) |
181 |
| - assert.NoError(t, err) |
182 |
| - |
183 |
| - assert.Equal(t, float32(expected), actual) |
| 171 | + var actualData bytes.Buffer |
| 172 | + fmt.Fprintf(&actualData, "%s\n", strconv.FormatFloat(float64(actual), 'f', -1, 32)) |
| 173 | + |
| 174 | + if !bytes.Equal(expectedData, actualData.Bytes()) { |
| 175 | + if os.Getenv("RECORD") == "true" { |
| 176 | + f, err := os.Create(expectedFilepath) |
| 177 | + assert.NoError(t, err) |
| 178 | + _, err = f.Write(actualData.Bytes()) |
| 179 | + assert.NoError(t, err) |
| 180 | + assert.NoError(t, f.Close()) |
| 181 | + } else { |
| 182 | + // fail via an assertion of string comparison for nicer diff output |
| 183 | + assert.Equal(t, string(expectedData), actualData.String()) |
| 184 | + } |
184 | 185 | }
|
185 | 186 | })
|
186 | 187 | }
|
|
0 commit comments