package parser
import (
"testing"
"github.com/google/go-cmp/cmp"
)
func TestDiagnose(t *testing.T) {
tests := []struct {
name string
template string
want []Diagnostic
}{
{
name: "no diagnostics",
template: `
package main
templ template () {
Hello, World!
}`,
want: nil,
},
// useOfLegacyCallSyntaxDiagnoser
{
name: "useOfLegacyCallSyntaxDiagnoser: template root",
template: `
package main
templ template () {
{! templ.Raw("foo") }
}`,
want: []Diagnostic{{
Message: "`{! foo }` syntax is deprecated. Use `@foo` syntax instead. Run `templ fmt .` to fix all instances.",
Range: Range{Position{39, 4, 4}, Position{55, 4, 20}},
}},
},
{
name: "useOfLegacyCallSyntaxDiagnoser: in div",
template: `
package main
templ template () {
{! templ.Raw("foo") }
}`,
want: []Diagnostic{{
Message: "`{! foo }` syntax is deprecated. Use `@foo` syntax instead. Run `templ fmt .` to fix all instances.",
Range: Range{Position{47, 5, 5}, Position{63, 5, 21}},
}},
},
{
name: "useOfLegacyCallSyntaxDiagnoser: in if",
template: `
package main
templ template () {
if true {
{! templ.Raw("foo") }
}
}`,
want: []Diagnostic{{
Message: "`{! foo }` syntax is deprecated. Use `@foo` syntax instead. Run `templ fmt .` to fix all instances.",
Range: Range{Position{51, 5, 5}, Position{67, 5, 21}},
}},
},
{
name: "useOfLegacyCallSyntaxDiagnoser: in for",
template: `
package main
templ template () {
for i := range x {
{! templ.Raw("foo") }
}
}`,
want: []Diagnostic{{
Message: "`{! foo }` syntax is deprecated. Use `@foo` syntax instead. Run `templ fmt .` to fix all instances.",
Range: Range{Position{60, 5, 5}, Position{76, 5, 21}},
}},
},
{
name: "useOfLegacyCallSyntaxDiagnoser: in switch",
template: `
package main
templ template () {
switch x {
case 1:
{! templ.Raw("foo") }
default:
{! x }
}
}`,
want: []Diagnostic{
{
Message: "`{! foo }` syntax is deprecated. Use `@foo` syntax instead. Run `templ fmt .` to fix all instances.",
Range: Range{Position{61, 6, 5}, Position{77, 6, 21}},
},
{
Message: "`{! foo }` syntax is deprecated. Use `@foo` syntax instead. Run `templ fmt .` to fix all instances.",
Range: Range{Position{95, 8, 5}, Position{96, 8, 6}},
},
},
},
{
name: "useOfLegacyCallSyntaxDiagnoser: in block",
template: `
package main
templ template () {
@layout("Home") {
{! templ.Raw("foo") }
}
}`,
want: []Diagnostic{{
Message: "`{! foo }` syntax is deprecated. Use `@foo` syntax instead. Run `templ fmt .` to fix all instances.",
Range: Range{Position{59, 5, 5}, Position{75, 5, 21}},
}},
},
{
name: "voidElementWithChildrenDiagnoser: no diagnostics",
template: `
package main
templ template () {
}`,
want: nil,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tf, err := ParseString(tt.template)
if err != nil {
t.Fatalf("ParseTemplateFile() error = %v", err)
}
got, err := Diagnose(tf)
if err != nil {
t.Fatalf("Diagnose() error = %v", err)
}
if diff := cmp.Diff(tt.want, got); diff != "" {
t.Errorf("Diagnose() mismatch (-got +want):\n%s", diff)
}
})
}
}