test(processor): multi-line golden fixtures; route .sass through SCSS lexer
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
code_before();
|
||||
/* block line one
|
||||
block line two */
|
||||
code_after();
|
||||
@@ -0,0 +1,3 @@
|
||||
<?php
|
||||
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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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,2 @@
|
||||
# a comment
|
||||
key = value
|
||||
@@ -0,0 +1 @@
|
||||
key = value
|
||||
@@ -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();
|
||||
@@ -0,0 +1,4 @@
|
||||
int a = 1; // line
|
||||
/* block
|
||||
spanning */
|
||||
int b = 2; /* inline */ int c = 3;
|
||||
@@ -0,0 +1,2 @@
|
||||
int a = 1;
|
||||
int b = 2; int c = 3;
|
||||
@@ -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; }
|
||||
@@ -0,0 +1,4 @@
|
||||
top();
|
||||
/* a
|
||||
b */
|
||||
bottom();
|
||||
@@ -0,0 +1,2 @@
|
||||
top();
|
||||
bottom();
|
||||
@@ -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() {}
|
||||
@@ -0,0 +1,4 @@
|
||||
top();
|
||||
/* a
|
||||
b */
|
||||
bottom();
|
||||
@@ -0,0 +1,4 @@
|
||||
top();
|
||||
/* a
|
||||
b */
|
||||
bottom();
|
||||
@@ -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;
|
||||
@@ -0,0 +1,3 @@
|
||||
x();
|
||||
/* no end
|
||||
more
|
||||
@@ -0,0 +1 @@
|
||||
x();
|
||||
Reference in New Issue
Block a user