package parser import ( "testing" "github.com/a-h/parse" "github.com/google/go-cmp/cmp" ) func TestForExpressionParser(t *testing.T) { tests := []struct { name string input string expected any }{ { name: "for: simple", input: `for _, item := range p.Items {
{ item }
}`, expected: ForExpression{ Expression: Expression{ Value: `_, item := range p.Items`, Range: Range{ From: Position{ Index: 4, Line: 0, Col: 4, }, To: Position{ Index: 28, Line: 0, Col: 28, }, }, }, Children: []Node{ Whitespace{Value: "\t\t\t\t\t"}, Element{ Name: "div", NameRange: Range{ From: Position{Index: 37, Line: 1, Col: 6}, To: Position{Index: 40, Line: 1, Col: 9}, }, Children: []Node{ StringExpression{ Expression: Expression{ Value: `item`, Range: Range{ From: Position{ Index: 43, Line: 1, Col: 12, }, To: Position{ Index: 47, Line: 1, Col: 16, }, }, }, }, }, TrailingSpace: SpaceVertical, }, }, }, }, { name: "for: simple, without spaces", input: `for _, item := range p.Items{
{ item }
}`, expected: ForExpression{ Expression: Expression{ Value: `_, item := range p.Items`, Range: Range{ From: Position{ Index: 4, Line: 0, Col: 4, }, To: Position{ Index: 28, Line: 0, Col: 28, }, }, }, Children: []Node{ Whitespace{Value: "\t\t\t\t\t"}, Element{ Name: "div", NameRange: Range{ From: Position{Index: 36, Line: 1, Col: 6}, To: Position{Index: 39, Line: 1, Col: 9}, }, Children: []Node{ StringExpression{ Expression: Expression{ Value: `item`, Range: Range{ From: Position{ Index: 42, Line: 1, Col: 12, }, To: Position{ Index: 46, Line: 1, Col: 16, }, }, }, }, }, TrailingSpace: SpaceVertical, }, }, }, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { input := parse.NewInput(tt.input) actual, ok, err := forExpression.Parse(input) if err != nil { t.Fatalf("unexpected error: %v", err) } if !ok { t.Fatalf("unexpected failure for input %q", tt.input) } if diff := cmp.Diff(tt.expected, actual); diff != "" { t.Error(diff) } }) } } func TestIncompleteFor(t *testing.T) { t.Run("no opening brace", func(t *testing.T) { input := parse.NewInput(`for with no brace is ignored`) _, ok, err := forExpression.Parse(input) if err != nil { t.Fatalf("unexpected error: %v", err) } if ok { t.Fatal("expected a non match, but got a match") } }) t.Run("capitalised For", func(t *testing.T) { input := parse.NewInput(`For with no brace`) _, ok, err := forExpression.Parse(input) if err != nil { t.Fatalf("unexpected error: %v", err) } if ok { t.Fatal("expected a non match, but got a match") } }) }