package jmespath import ( "fmt" "testing" "github.com/stretchr/testify/assert") var parsingErrorTests = []struct { expression string msg string}{ {"foo.", "Incopmlete expression"}, {"[foo", "Incopmlete expression"}, {"]", "Invalid"}, {")", "Invalid"}, {"}", "Invalid"}, {"foo..bar", "Invalid"}, {`foo."bar`, "Forwards lexer errors"}, {`{foo: bar`, "Incomplete expression"}, {`{foo bar}`, "Invalid"}, {`[foo bar]`, "Invalid"}, {`foo@`, "Invalid"}, {`&&&&&&&&&&&&t(`, "Invalid"}, {`[*][`, "Invalid"},} func TestParsingErrors(t *testing.T) { assert := assert.New(t) parser := NewParser() for _, tt := range parsingErrorTests { _, err := parser.Parse(tt.expression) assert.NotNil(err, fmt.Sprintf("Expected parsing error: %s, for expression: %s", tt.msg, tt.expression)) }} var prettyPrinted = `ASTProjection { children: { ASTField { value: "foo" } ASTSubexpression { children: { ASTSubexpression { children: { ASTField { value: "bar" } ASTField { value: "baz" } } ASTField { value: "qux" } }}` var prettyPrintedCompNode = `ASTFilterProjection { children: { ASTField { value: "a" } ASTIdentity { } ASTComparator { value: tLTE children: { ASTField { value: "b" } ASTField { value: "c" } }}` func TestPrettyPrintedAST(t *testing.T) { assert := assert.New(t) parser := NewParser() parsed, _ := parser.Parse("foo[*].bar.baz.qux") assert.Equal(parsed.PrettyPrint(0), prettyPrinted)} func TestPrettyPrintedCompNode(t *testing.T) { assert := assert.New(t) parser := NewParser() parsed, _ := parser.Parse("a[?b<=c]") assert.Equal(parsed.PrettyPrint(0), prettyPrintedCompNode)} func BenchmarkParseIdentifier(b *testing.B) { runParseBenchmark(b, exprIdentifier)} func BenchmarkParseSubexpression(b *testing.B) { runParseBenchmark(b, exprSubexpr)} func BenchmarkParseDeeplyNested50(b *testing.B) { runParseBenchmark(b, deeplyNested50)} func BenchmarkParseDeepNested50Pipe(b *testing.B) { runParseBenchmark(b, deeplyNested50Pipe)} func BenchmarkParseDeepNested50Index(b *testing.B) { runParseBenchmark(b, deeplyNested50Index)} func BenchmarkParseQuotedIdentifier(b *testing.B) { runParseBenchmark(b, exprQuotedIdentifier)} func BenchmarkParseQuotedIdentifierEscapes(b *testing.B) { runParseBenchmark(b, quotedIdentifierEscapes)} func BenchmarkParseRawStringLiteral(b *testing.B) { runParseBenchmark(b, rawStringLiteral)} func BenchmarkParseDeepProjection104(b *testing.B) { runParseBenchmark(b, deepProjection104)} func runParseBenchmark(b *testing.B, expression string) { parser := NewParser() for i := 0; i < b.N; i++ { parser.Parse(expression) }}
package jmespath
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
)
var parsingErrorTests = []struct {
expression string
msg string
}{
{"foo.", "Incopmlete expression"},
{"[foo", "Incopmlete expression"},
{"]", "Invalid"},
{")", "Invalid"},
{"}", "Invalid"},
{"foo..bar", "Invalid"},
{`foo."bar`, "Forwards lexer errors"},
{`{foo: bar`, "Incomplete expression"},
{`{foo bar}`, "Invalid"},
{`[foo bar]`, "Invalid"},
{`foo@`, "Invalid"},
{`&&&&&&&&&&&&t(`, "Invalid"},
{`[*][`, "Invalid"},
}
func TestParsingErrors(t *testing.T) {
assert := assert.New(t)
parser := NewParser()
for _, tt := range parsingErrorTests {
_, err := parser.Parse(tt.expression)
assert.NotNil(err, fmt.Sprintf("Expected parsing error: %s, for expression: %s", tt.msg, tt.expression))
}
}
var prettyPrinted = `ASTProjection {
children: {
ASTField {
value: "foo"
}
ASTSubexpression {
children: {
ASTSubexpression {
children: {
ASTField {
value: "bar"
}
ASTField {
value: "baz"
}
}
ASTField {
value: "qux"
}
}
}
`
var prettyPrintedCompNode = `ASTFilterProjection {
children: {
ASTField {
value: "a"
}
ASTIdentity {
}
ASTComparator {
value: tLTE
children: {
ASTField {
value: "b"
}
ASTField {
value: "c"
}
}
}
`
func TestPrettyPrintedAST(t *testing.T) {
assert := assert.New(t)
parser := NewParser()
parsed, _ := parser.Parse("foo[*].bar.baz.qux")
assert.Equal(parsed.PrettyPrint(0), prettyPrinted)
}
func TestPrettyPrintedCompNode(t *testing.T) {
assert := assert.New(t)
parser := NewParser()
parsed, _ := parser.Parse("a[?b<=c]")
assert.Equal(parsed.PrettyPrint(0), prettyPrintedCompNode)
}
func BenchmarkParseIdentifier(b *testing.B) {
runParseBenchmark(b, exprIdentifier)
}
func BenchmarkParseSubexpression(b *testing.B) {
runParseBenchmark(b, exprSubexpr)
}
func BenchmarkParseDeeplyNested50(b *testing.B) {
runParseBenchmark(b, deeplyNested50)
}
func BenchmarkParseDeepNested50Pipe(b *testing.B) {
runParseBenchmark(b, deeplyNested50Pipe)
}
func BenchmarkParseDeepNested50Index(b *testing.B) {
runParseBenchmark(b, deeplyNested50Index)
}
func BenchmarkParseQuotedIdentifier(b *testing.B) {
runParseBenchmark(b, exprQuotedIdentifier)
}
func BenchmarkParseQuotedIdentifierEscapes(b *testing.B) {
runParseBenchmark(b, quotedIdentifierEscapes)
}
func BenchmarkParseRawStringLiteral(b *testing.B) {
runParseBenchmark(b, rawStringLiteral)
}
func BenchmarkParseDeepProjection104(b *testing.B) {
runParseBenchmark(b, deepProjection104)
}
func runParseBenchmark(b *testing.B, expression string) {
parser := NewParser()
for i := 0; i < b.N; i++ {
parser.Parse(expression)
}
}