mirror of
https://github.com/mikefarah/yq.git
synced 2026-03-10 15:54:26 +00:00
126 lines
4.4 KiB
Go
126 lines
4.4 KiB
Go
package yqlib
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/mikefarah/yq/v4/test"
|
|
)
|
|
|
|
func getExpressionParser() ExpressionParserInterface {
|
|
InitExpressionParser()
|
|
return ExpressionParser
|
|
}
|
|
|
|
func TestParserCreateMapColonOnItsOwn(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression(":")
|
|
test.AssertResultComplex(t, "':' expects 2 args but there is 0", err.Error())
|
|
}
|
|
|
|
func TestParserNoMatchingCloseBracket(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression(".cat | with(.;.bob")
|
|
test.AssertResultComplex(t, "bad expression - probably missing close bracket on WITH", err.Error())
|
|
}
|
|
|
|
func TestParserNoMatchingCloseCollect(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression("[1,2")
|
|
test.AssertResultComplex(t, "bad expression, could not find matching `]`", err.Error())
|
|
}
|
|
func TestParserNoMatchingCloseObjectInCollect(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression(`[{"b": "c"]`)
|
|
test.AssertResultComplex(t, "bad expression, could not find matching `}`", err.Error())
|
|
}
|
|
|
|
func TestParserNoMatchingCloseInCollect(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression(`[(.a]`)
|
|
test.AssertResultComplex(t, "bad expression, could not find matching `)`", err.Error())
|
|
}
|
|
|
|
func TestParserNoMatchingCloseCollectObject(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression(`{"a": "b"`)
|
|
test.AssertResultComplex(t, "bad expression, could not find matching `}`", err.Error())
|
|
}
|
|
|
|
func TestParserNoMatchingCloseCollectInCollectObject(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression(`{"b": [1}`)
|
|
test.AssertResultComplex(t, "bad expression, could not find matching `]`", err.Error())
|
|
}
|
|
|
|
func TestParserNoMatchingCloseBracketInCollectObject(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression(`{"b": (1}`)
|
|
test.AssertResultComplex(t, "bad expression, could not find matching `)`", err.Error())
|
|
}
|
|
|
|
func TestParserNoArgsForTwoArgOp(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression("=")
|
|
test.AssertResultComplex(t, "'=' expects 2 args but there is 0", err.Error())
|
|
}
|
|
|
|
func TestParserOneLhsArgsForTwoArgOp(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression(".a =")
|
|
test.AssertResultComplex(t, "'=' expects 2 args but there is 1", err.Error())
|
|
}
|
|
|
|
func TestParserOneRhsArgsForTwoArgOp(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression("= .a")
|
|
test.AssertResultComplex(t, "'=' expects 2 args but there is 1", err.Error())
|
|
}
|
|
|
|
func TestParserTwoArgsForTwoArgOp(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression(".a = .b")
|
|
test.AssertResultComplex(t, nil, err)
|
|
}
|
|
|
|
func TestParserNoArgsForOneArgOp(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression("explode")
|
|
test.AssertResultComplex(t, "'explode' expects 1 arg but received none", err.Error())
|
|
}
|
|
|
|
func TestParserOneArgForOneArgOp(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression("explode(.)")
|
|
test.AssertResultComplex(t, nil, err)
|
|
}
|
|
|
|
func TestParserExtraArgs(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression("sortKeys(.) explode(.)")
|
|
test.AssertResultComplex(t, "bad expression, please check expression syntax", err.Error())
|
|
}
|
|
|
|
func TestParserEmptyExpression(t *testing.T) {
|
|
_, err := getExpressionParser().ParseExpression("")
|
|
test.AssertResultComplex(t, nil, err)
|
|
}
|
|
|
|
func TestParserSingleOperation(t *testing.T) {
|
|
result, err := getExpressionParser().ParseExpression(".")
|
|
test.AssertResultComplex(t, nil, err)
|
|
if result == nil {
|
|
t.Fatal("Expected non-nil result for single operation")
|
|
}
|
|
if result.Operation == nil {
|
|
t.Fatal("Expected operation to be set")
|
|
}
|
|
}
|
|
|
|
func TestParserFirstOpWithZeroArgs(t *testing.T) {
|
|
// Test the special case where firstOpType can accept zero args
|
|
result, err := getExpressionParser().ParseExpression("first")
|
|
test.AssertResultComplex(t, nil, err)
|
|
if result == nil {
|
|
t.Fatal("Expected non-nil result for first operation with zero args")
|
|
}
|
|
}
|
|
|
|
func TestParserInvalidExpressionTree(t *testing.T) {
|
|
// This tests the createExpressionTree function with malformed postfix
|
|
parser := getExpressionParser().(*expressionParserImpl)
|
|
|
|
// Create invalid postfix operations that would leave more than one item on stack
|
|
invalidOps := []*Operation{
|
|
{OperationType: &operationType{NumArgs: 0}},
|
|
{OperationType: &operationType{NumArgs: 0}},
|
|
}
|
|
|
|
_, err := parser.createExpressionTree(invalidOps)
|
|
test.AssertResultComplex(t, "bad expression, please check expression syntax", err.Error())
|
|
}
|