2019-11-23 03:52:29 +00:00
|
|
|
package yqlib
|
2015-10-03 05:10:29 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
2019-12-01 20:10:42 +00:00
|
|
|
|
2019-12-09 02:44:53 +00:00
|
|
|
"github.com/mikefarah/yq/v3/test"
|
2015-10-03 05:10:29 +00:00
|
|
|
)
|
|
|
|
|
2020-01-08 21:17:56 +00:00
|
|
|
var parser = NewPathParser()
|
|
|
|
|
2015-10-03 05:10:29 +00:00
|
|
|
var parsePathsTests = []struct {
|
|
|
|
path string
|
2020-02-12 04:40:21 +00:00
|
|
|
expectedPaths []interface{}
|
2015-10-03 05:10:29 +00:00
|
|
|
}{
|
2020-02-12 04:40:21 +00:00
|
|
|
{"a.b", append(make([]interface{}, 0), "a", "b")},
|
|
|
|
{"a.b.**", append(make([]interface{}, 0), "a", "b", "**")},
|
|
|
|
{"a.b.*", append(make([]interface{}, 0), "a", "b", "*")},
|
|
|
|
{"a.b[0]", append(make([]interface{}, 0), "a", "b", int64(0))},
|
|
|
|
{"a.b.0", append(make([]interface{}, 0), "a", "b", "0")},
|
|
|
|
{"a.b.d[+]", append(make([]interface{}, 0), "a", "b", "d", "+")},
|
|
|
|
{"a", append(make([]interface{}, 0), "a")},
|
|
|
|
{"a.b.c", append(make([]interface{}, 0), "a", "b", "c")},
|
|
|
|
{"\"a.b\".c", append(make([]interface{}, 0), "a.b", "c")},
|
|
|
|
{"a.\"b.c\".d", append(make([]interface{}, 0), "a", "b.c", "d")},
|
|
|
|
{"[1].a.d", append(make([]interface{}, 0), int64(1), "a", "d")},
|
|
|
|
{"a[0].c", append(make([]interface{}, 0), "a", int64(0), "c")},
|
|
|
|
{"[0]", append(make([]interface{}, 0), int64(0))},
|
2015-10-03 05:10:29 +00:00
|
|
|
}
|
|
|
|
|
2020-01-08 21:17:56 +00:00
|
|
|
func TestPathParserParsePath(t *testing.T) {
|
2015-10-03 05:10:29 +00:00
|
|
|
for _, tt := range parsePathsTests {
|
2020-01-08 21:17:56 +00:00
|
|
|
test.AssertResultComplex(t, tt.expectedPaths, parser.ParsePath(tt.path))
|
2015-10-03 05:10:29 +00:00
|
|
|
}
|
2019-12-01 20:10:42 +00:00
|
|
|
}
|
2020-01-08 21:17:56 +00:00
|
|
|
|
|
|
|
func TestPathParserMatchesNextPathElementSplat(t *testing.T) {
|
|
|
|
var node = NodeContext{Head: "*"}
|
|
|
|
test.AssertResult(t, true, parser.MatchesNextPathElement(node, ""))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPathParserMatchesNextPathElementDeepSplat(t *testing.T) {
|
|
|
|
var node = NodeContext{Head: "**"}
|
|
|
|
test.AssertResult(t, true, parser.MatchesNextPathElement(node, ""))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPathParserMatchesNextPathElementAppendArrayValid(t *testing.T) {
|
|
|
|
var node = NodeContext{Head: "+"}
|
|
|
|
test.AssertResult(t, true, parser.MatchesNextPathElement(node, "3"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPathParserMatchesNextPathElementAppendArrayInvalid(t *testing.T) {
|
|
|
|
var node = NodeContext{Head: "+"}
|
|
|
|
test.AssertResult(t, false, parser.MatchesNextPathElement(node, "cat"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPathParserMatchesNextPathElementPrefixMatchesWhole(t *testing.T) {
|
|
|
|
var node = NodeContext{Head: "cat*"}
|
|
|
|
test.AssertResult(t, true, parser.MatchesNextPathElement(node, "cat"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPathParserMatchesNextPathElementPrefixMatchesStart(t *testing.T) {
|
|
|
|
var node = NodeContext{Head: "cat*"}
|
|
|
|
test.AssertResult(t, true, parser.MatchesNextPathElement(node, "caterpillar"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPathParserMatchesNextPathElementPrefixMismatch(t *testing.T) {
|
|
|
|
var node = NodeContext{Head: "cat*"}
|
|
|
|
test.AssertResult(t, false, parser.MatchesNextPathElement(node, "dog"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPathParserMatchesNextPathElementExactMatch(t *testing.T) {
|
|
|
|
var node = NodeContext{Head: "farahtek"}
|
|
|
|
test.AssertResult(t, true, parser.MatchesNextPathElement(node, "farahtek"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPathParserMatchesNextPathElementExactMismatch(t *testing.T) {
|
|
|
|
var node = NodeContext{Head: "farahtek"}
|
|
|
|
test.AssertResult(t, false, parser.MatchesNextPathElement(node, "othertek"))
|
|
|
|
}
|