test(processor): multi-line golden fixtures; route .sass through SCSS lexer

This commit is contained in:
2026-07-02 09:20:06 -05:00
parent bbc49efbfe
commit b07ea41c60
83 changed files with 544 additions and 1 deletions
+1 -1
View File
@@ -27,7 +27,7 @@ type LineChange struct {
func resolveLexer(filename string) chroma.Lexer {
ext := strings.TrimPrefix(strings.ToLower(filepath.Ext(filename)), ".")
var l chroma.Lexer
if ext == "less" {
if ext == "less" || ext == "sass" {
l = lexers.Get("SCSS")
} else {
l = lexers.Match("f." + ext)
+1
View File
@@ -19,6 +19,7 @@ func TestResolveLexer(t *testing.T) {
{"a.rs", "Rust"},
{"a.html", "HTML"},
{"a.less", "SCSS"},
{"a.sass", "SCSS"},
{"a.conf", ""},
}
for _, c := range cases {
+101
View File
@@ -0,0 +1,101 @@
package processor
import (
"bytes"
"os"
"path/filepath"
"testing"
"github.com/carlosarraes/shush/internal/config"
"github.com/carlosarraes/shush/internal/git"
"github.com/carlosarraes/shush/internal/types"
)
type multilineCase struct {
name string
file string
cli types.CLI
cfg *config.Config
gitMode bool
ranges []git.LineRange
}
func runMultilineCase(t *testing.T, tc multilineCase) {
t.Helper()
src := filepath.Join("testdata", "multiline", tc.file)
in, err := os.ReadFile(src)
if err != nil {
t.Fatalf("read input %s: %v", src, err)
}
tmp := t.TempDir()
work := filepath.Join(tmp, tc.file)
if err := os.WriteFile(work, in, 0644); err != nil {
t.Fatalf("write work: %v", err)
}
cfg := tc.cfg
if cfg == nil {
cfg = config.Default()
}
p := &Processor{cli: tc.cli}
if tc.gitMode {
err = p.processFileWithLineRanges(work, tc.ranges, cfg)
} else {
lang, derr := DetectLanguage(work)
if derr != nil {
t.Fatalf("detect language: %v", derr)
}
err = p.processFileInMemory(work, lang, cfg)
}
if err != nil {
t.Fatalf("process: %v", err)
}
got, err := os.ReadFile(work)
if err != nil {
t.Fatalf("read result: %v", err)
}
golden := src + ".golden"
want, err := os.ReadFile(golden)
if err != nil {
t.Fatalf("read golden %s: %v", golden, err)
}
if !bytes.Equal(got, want) {
t.Errorf("%s mismatch:\n--- got ---\n%q\n--- want ---\n%q", tc.name, got, want)
}
}
func TestMultiline(t *testing.T) {
blockExts := []string{
"js", "ts", "jsx", "tsx", "go", "c", "cpp", "cc", "cxx", "h", "hpp",
"java", "cs", "rs", "swift", "kt", "kts", "dart", "scala", "php",
"css", "scss", "sass", "less", "sql",
}
xmlExts := []string{"html", "htm", "xml", "svg"}
var cases []multilineCase
for _, e := range blockExts {
cases = append(cases, multilineCase{name: "block " + e, file: "block_" + e + "." + e})
}
for _, e := range xmlExts {
cases = append(cases, multilineCase{name: "block " + e, file: "block_" + e + "." + e})
}
cases = append(cases,
multilineCase{name: "preproc kept", file: "preproc.c"},
multilineCase{name: "raw string", file: "rawstring.go"},
multilineCase{name: "template literal", file: "template.js"},
multilineCase{name: "rust lifetime", file: "lifetime.rs"},
multilineCase{name: "mixed line and block", file: "mixed.c"},
multilineCase{name: "marker in line comment", file: "marker_in_line.c"},
multilineCase{name: "unterminated", file: "unterminated.c"},
multilineCase{name: "conf fallback", file: "fallback.conf"},
multilineCase{name: "git straddle kept", file: "straddle.js",
gitMode: true, ranges: []git.LineRange{{Start: 4, End: 4}}},
multilineCase{name: "git range removes inside block", file: "range_inside.js",
gitMode: true, ranges: []git.LineRange{{Start: 2, End: 4}}},
)
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
runMultilineCase(t, tc)
})
}
}
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before
<!-- block line one
block line two -->
code_after
@@ -0,0 +1,2 @@
code_before
code_after
+4
View File
@@ -0,0 +1,4 @@
code_before
<!-- block line one
block line two -->
code_after
@@ -0,0 +1,2 @@
code_before
code_after
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+5
View File
@@ -0,0 +1,5 @@
<?php
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,3 @@
<?php
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before
<!-- block line one
block line two -->
code_after
@@ -0,0 +1,2 @@
code_before
code_after
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before();
/* block line one
block line two */
code_after();
@@ -0,0 +1,2 @@
code_before();
code_after();
+4
View File
@@ -0,0 +1,4 @@
code_before
<!-- block line one
block line two -->
code_after
@@ -0,0 +1,2 @@
code_before
code_after
+2
View File
@@ -0,0 +1,2 @@
# a comment
key = value
@@ -0,0 +1 @@
key = value
+1
View File
@@ -0,0 +1 @@
fn f<'a>(x: &'a str) -> char { 'z'/* c */ }
@@ -0,0 +1 @@
fn f<'a>(x: &'a str) -> char { 'z' }
@@ -0,0 +1,2 @@
z(); // a /* b
w();
@@ -0,0 +1,2 @@
z();
w();
+4
View File
@@ -0,0 +1,4 @@
int a = 1; // line
/* block
spanning */
int b = 2; /* inline */ int c = 3;
+2
View File
@@ -0,0 +1,2 @@
int a = 1;
int b = 2; int c = 3;
+5
View File
@@ -0,0 +1,5 @@
#include <stdio.h>
#define N 4
/* real
block */
int main() { return N; }
@@ -0,0 +1,3 @@
#include <stdio.h>
#define N 4
int main() { return N; }
+4
View File
@@ -0,0 +1,4 @@
top();
/* a
b */
bottom();
@@ -0,0 +1,2 @@
top();
bottom();
+5
View File
@@ -0,0 +1,5 @@
package main
var re = `a /* not a comment */ b`
/* real
block */
func main() {}
@@ -0,0 +1,3 @@
package main
var re = `a /* not a comment */ b`
func main() {}
+4
View File
@@ -0,0 +1,4 @@
top();
/* a
b */
bottom();
@@ -0,0 +1,4 @@
top();
/* a
b */
bottom();
+3
View File
@@ -0,0 +1,3 @@
const s = `line1 /* nope
line2 */ still`; // real
const x = 1;
@@ -0,0 +1,3 @@
const s = `line1 /* nope
line2 */ still`;
const x = 1;
+3
View File
@@ -0,0 +1,3 @@
x();
/* no end
more
@@ -0,0 +1 @@
x();