338 lines
6.7 KiB
Go
338 lines
6.7 KiB
Go
package parser
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/a-h/parse"
|
|
"github.com/google/go-cmp/cmp"
|
|
)
|
|
|
|
func TestExpressionCSSPropertyParser(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
expected ExpressionCSSProperty
|
|
}{
|
|
{
|
|
name: "css: single constant property",
|
|
input: `background-color: { constants.BackgroundColor };`,
|
|
expected: ExpressionCSSProperty{
|
|
Name: "background-color",
|
|
Value: StringExpression{
|
|
Expression: Expression{
|
|
Value: "constants.BackgroundColor",
|
|
Range: Range{
|
|
From: Position{
|
|
Index: 20,
|
|
Line: 0,
|
|
Col: 20,
|
|
},
|
|
To: Position{
|
|
Index: 45,
|
|
Line: 0,
|
|
Col: 45,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "css: single constant property with windows newlines",
|
|
input: "background-color:\r\n{ constants.BackgroundColor };\r\n",
|
|
expected: ExpressionCSSProperty{
|
|
Name: "background-color",
|
|
Value: StringExpression{
|
|
Expression: Expression{
|
|
Value: "constants.BackgroundColor",
|
|
Range: Range{
|
|
From: Position{
|
|
Index: 21,
|
|
Line: 1,
|
|
Col: 2,
|
|
},
|
|
To: Position{
|
|
Index: 46,
|
|
Line: 1,
|
|
Col: 27,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
tt := tt
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
input := parse.NewInput(tt.input + "\n")
|
|
result, ok, err := expressionCSSPropertyParser.Parse(input)
|
|
if err != nil {
|
|
t.Fatalf("parser error: %v", err)
|
|
}
|
|
if !ok {
|
|
t.Fatalf("failed to parse at %d", input.Index())
|
|
}
|
|
if diff := cmp.Diff(tt.expected, result); diff != "" {
|
|
t.Error(diff)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestConstantCSSPropertyParser(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
expected ConstantCSSProperty
|
|
}{
|
|
{
|
|
name: "css: single constant property",
|
|
input: `background-color: #ffffff;`,
|
|
expected: ConstantCSSProperty{
|
|
Name: "background-color",
|
|
Value: "#ffffff",
|
|
},
|
|
},
|
|
{
|
|
name: "css: single constant webkit property",
|
|
input: `-webkit-text-stroke-color: #ffffff;`,
|
|
expected: ConstantCSSProperty{
|
|
Name: "-webkit-text-stroke-color",
|
|
Value: "#ffffff",
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
tt := tt
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
input := parse.NewInput(tt.input + "\n")
|
|
result, ok, err := constantCSSPropertyParser.Parse(input)
|
|
if err != nil {
|
|
t.Fatalf("parser error: %v", err)
|
|
}
|
|
if !ok {
|
|
t.Fatalf("failed to parse at %d", input.Index())
|
|
}
|
|
if diff := cmp.Diff(tt.expected, result); diff != "" {
|
|
t.Error(diff)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCSSParser(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
expected CSSTemplate
|
|
}{
|
|
{
|
|
name: "css: no parameters, no content",
|
|
input: `css Name() {
|
|
}`,
|
|
expected: CSSTemplate{
|
|
Name: "Name",
|
|
Range: Range{
|
|
From: Position{Index: 0, Line: 0, Col: 0},
|
|
To: Position{Index: 14, Line: 1, Col: 1},
|
|
},
|
|
Expression: Expression{
|
|
Value: "Name()",
|
|
Range: Range{
|
|
From: Position{
|
|
Index: 4,
|
|
Line: 0,
|
|
Col: 4,
|
|
},
|
|
To: Position{
|
|
Index: 10,
|
|
Line: 0,
|
|
Col: 10,
|
|
},
|
|
},
|
|
},
|
|
Properties: []CSSProperty{},
|
|
},
|
|
},
|
|
{
|
|
name: "css: without spaces",
|
|
input: `css Name() {
|
|
}`,
|
|
expected: CSSTemplate{
|
|
Name: "Name",
|
|
Range: Range{
|
|
From: Position{Index: 0, Line: 0, Col: 0},
|
|
To: Position{Index: 14, Line: 1, Col: 1},
|
|
},
|
|
Expression: Expression{
|
|
Value: "Name()",
|
|
Range: Range{
|
|
From: Position{
|
|
Index: 4,
|
|
Line: 0,
|
|
Col: 4,
|
|
},
|
|
To: Position{
|
|
Index: 10,
|
|
Line: 0,
|
|
Col: 10,
|
|
},
|
|
},
|
|
},
|
|
Properties: []CSSProperty{},
|
|
},
|
|
},
|
|
{
|
|
name: "css: single constant property",
|
|
input: `css Name() {
|
|
background-color: #ffffff;
|
|
}`,
|
|
expected: CSSTemplate{
|
|
Name: "Name",
|
|
Range: Range{
|
|
From: Position{Index: 0, Line: 0, Col: 0},
|
|
To: Position{Index: 41, Line: 2, Col: 1},
|
|
},
|
|
Expression: Expression{
|
|
Value: "Name()",
|
|
Range: Range{
|
|
From: Position{
|
|
Index: 4,
|
|
Line: 0,
|
|
Col: 4,
|
|
},
|
|
To: Position{
|
|
Index: 10,
|
|
Line: 0,
|
|
Col: 10,
|
|
},
|
|
},
|
|
},
|
|
Properties: []CSSProperty{
|
|
ConstantCSSProperty{
|
|
Name: "background-color",
|
|
Value: "#ffffff",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "css: single expression property",
|
|
input: `css Name() {
|
|
background-color: { constants.BackgroundColor };
|
|
}`,
|
|
expected: CSSTemplate{
|
|
Name: "Name",
|
|
Range: Range{
|
|
From: Position{Index: 0, Line: 0, Col: 0},
|
|
To: Position{Index: 63, Line: 2, Col: 1},
|
|
},
|
|
Expression: Expression{
|
|
Value: "Name()",
|
|
Range: Range{
|
|
From: Position{
|
|
Index: 4,
|
|
Line: 0,
|
|
Col: 4,
|
|
},
|
|
To: Position{
|
|
Index: 10,
|
|
Line: 0,
|
|
Col: 10,
|
|
},
|
|
},
|
|
},
|
|
Properties: []CSSProperty{
|
|
ExpressionCSSProperty{
|
|
Name: "background-color",
|
|
Value: StringExpression{
|
|
Expression: Expression{
|
|
Value: "constants.BackgroundColor",
|
|
Range: Range{
|
|
From: Position{
|
|
Index: 33,
|
|
Line: 1,
|
|
Col: 20,
|
|
},
|
|
To: Position{
|
|
Index: 58,
|
|
Line: 1,
|
|
Col: 45,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "css: single expression with parameter",
|
|
input: `css Name(prop string) {
|
|
background-color: { prop };
|
|
}`,
|
|
expected: CSSTemplate{
|
|
Name: "Name",
|
|
Range: Range{
|
|
From: Position{Index: 0, Line: 0, Col: 0},
|
|
To: Position{Index: 53, Line: 2, Col: 1},
|
|
},
|
|
Expression: Expression{
|
|
Value: "Name(prop string)",
|
|
Range: Range{
|
|
From: Position{
|
|
Index: 4,
|
|
Line: 0,
|
|
Col: 4,
|
|
},
|
|
To: Position{
|
|
Index: 21,
|
|
Line: 0,
|
|
Col: 21,
|
|
},
|
|
},
|
|
},
|
|
Properties: []CSSProperty{
|
|
ExpressionCSSProperty{
|
|
Name: "background-color",
|
|
Value: StringExpression{
|
|
Expression: Expression{
|
|
Value: "prop",
|
|
Range: Range{
|
|
From: Position{
|
|
Index: 44,
|
|
Line: 1,
|
|
Col: 20,
|
|
},
|
|
To: Position{
|
|
Index: 48,
|
|
Line: 1,
|
|
Col: 24,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
tt := tt
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
input := parse.NewInput(tt.input)
|
|
result, ok, err := cssParser.Parse(input)
|
|
if err != nil {
|
|
t.Fatalf("parser error: %v", err)
|
|
}
|
|
if !ok {
|
|
t.Fatalf("failed to parse at %d", input.Index())
|
|
}
|
|
if diff := cmp.Diff(tt.expected, result); diff != "" {
|
|
t.Error(diff)
|
|
}
|
|
})
|
|
}
|
|
}
|