yq/pkg/yqlib/treeops/data_tree_navigator_test.go

693 lines
14 KiB
Go
Raw Normal View History

2020-10-08 23:59:03 +00:00
package treeops
import (
2020-10-27 05:45:16 +00:00
"container/list"
2020-10-08 23:59:03 +00:00
"strings"
"testing"
yaml "gopkg.in/yaml.v3"
)
var treeNavigator = NewDataTreeNavigator(NavigationPrefs{})
var treeCreator = NewPathTreeCreator()
2020-10-27 05:45:16 +00:00
func readDoc(t *testing.T, content string) *list.List {
inputList := list.New()
2020-10-17 11:10:47 +00:00
if content == "" {
2020-10-27 05:45:16 +00:00
return inputList
2020-10-17 11:10:47 +00:00
}
2020-10-08 23:59:03 +00:00
decoder := yaml.NewDecoder(strings.NewReader(content))
var dataBucket yaml.Node
err := decoder.Decode(&dataBucket)
if err != nil {
2020-10-19 05:36:46 +00:00
t.Error(content)
2020-10-08 23:59:03 +00:00
t.Error(err)
}
2020-10-27 05:45:16 +00:00
inputList.PushBack(&CandidateNode{
Document: 0,
Filename: "test.yml",
Node: &dataBucket,
})
return inputList
2020-10-08 23:59:03 +00:00
}
2020-10-27 05:45:16 +00:00
func resultsToString(results *list.List) []string {
2020-10-17 11:10:47 +00:00
var pretty []string = make([]string, 0)
2020-10-27 05:45:16 +00:00
for el := results.Front(); el != nil; el = el.Next() {
n := el.Value.(*CandidateNode)
2020-10-17 11:10:47 +00:00
pretty = append(pretty, NodeToString(n))
2020-10-08 23:59:03 +00:00
}
return pretty
}
2020-10-20 04:33:20 +00:00
// func TestDataTreeNavigatorDeleteSimple(t *testing.T) {
// nodes := readDoc(t, `a:
// b: apple
// c: camel`)
// path, errPath := treeCreator.ParsePath("a .- b")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [a]
// Tag: !!map, Kind: MappingNode, Anchor:
// c: camel
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorDeleteTwice(t *testing.T) {
// nodes := readDoc(t, `a:
// b: apple
// c: camel
// d: dingo`)
// path, errPath := treeCreator.ParsePath("a .- b OR a .- c")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [a]
// Tag: !!map, Kind: MappingNode, Anchor:
// d: dingo
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorDeleteWithUnion(t *testing.T) {
// nodes := readDoc(t, `a:
// b: apple
// c: camel
// d: dingo`)
// path, errPath := treeCreator.ParsePath("a .- (b OR c)")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [a]
// Tag: !!map, Kind: MappingNode, Anchor:
// d: dingo
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorDeleteByIndex(t *testing.T) {
// nodes := readDoc(t, `a:
// - b: apple
// - b: sdfsd
// - b: apple`)
// path, errPath := treeCreator.ParsePath("(a .- (0 or 1))")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [a]
// Tag: !!seq, Kind: SequenceNode, Anchor:
// - b: apple
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorDeleteByFind(t *testing.T) {
// nodes := readDoc(t, `a:
// - b: apple
// - b: sdfsd
// - b: apple`)
// path, errPath := treeCreator.ParsePath("(a .- (* == apple))")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [a]
// Tag: !!seq, Kind: SequenceNode, Anchor:
// - b: sdfsd
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorDeleteArrayByFind(t *testing.T) {
// nodes := readDoc(t, `a:
// - apple
// - sdfsd
// - apple`)
// path, errPath := treeCreator.ParsePath("(a .- (. == apple))")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [a]
// Tag: !!seq, Kind: SequenceNode, Anchor:
// - sdfsd
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorDeleteViaSelf(t *testing.T) {
// nodes := readDoc(t, `- apple
// - sdfsd
// - apple`)
// path, errPath := treeCreator.ParsePath(". .- (. == apple)")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: []
// Tag: !!seq, Kind: SequenceNode, Anchor:
// - sdfsd
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorFilterWithSplat(t *testing.T) {
// nodes := readDoc(t, `f:
// a: frog
// b: dally
// c: log`)
// path, errPath := treeCreator.ParsePath(".f | .[] == \"frog\"")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [f]
// Tag: !!int, Kind: ScalarNode, Anchor:
// 2
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorCountAndCollectWithFilterCmd(t *testing.T) {
// nodes := readDoc(t, `f:
// a: frog
// b: dally
// c: log`)
// path, errPath := treeCreator.ParsePath(".f | .[] == *og ")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [f]
// Tag: !!int, Kind: ScalarNode, Anchor:
// 2
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorCollectWithFilter(t *testing.T) {
// nodes := readDoc(t, `f:
// a: frog
// b: dally
// c: log`)
// path, errPath := treeCreator.ParsePath("f(collect(. == *og))")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [f]
// Tag: , Kind: SequenceNode, Anchor:
// - frog
// - log
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorCountWithFilter2(t *testing.T) {
// nodes := readDoc(t, `f:
// a: frog
// b: dally
// c: log`)
// path, errPath := treeCreator.ParsePath("count(f(. == *og))")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: []
// Tag: !!int, Kind: ScalarNode, Anchor:
// 2
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorCollectWithFilter2(t *testing.T) {
// nodes := readDoc(t, `f:
// a: frog
// b: dally
// c: log`)
// path, errPath := treeCreator.ParsePath("collect(f(. == *og))")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: []
// Tag: , Kind: SequenceNode, Anchor:
// - frog
// - log
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorCountMultipleMatchesInside(t *testing.T) {
// nodes := readDoc(t, `f:
// a: [1,2]
// b: dally
// c: [3,4,5]`)
// path, errPath := treeCreator.ParsePath("f | count(a or c)")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [f]
// Tag: !!int, Kind: ScalarNode, Anchor:
// 2
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorCollectMultipleMatchesInside(t *testing.T) {
// nodes := readDoc(t, `f:
// a: [1,2]
// b: dally
// c: [3,4,5]`)
// path, errPath := treeCreator.ParsePath("f | collect(a or c)")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [f]
// Tag: , Kind: SequenceNode, Anchor:
// - [1, 2]
// - [3, 4, 5]
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorCountMultipleMatchesInsideSplat(t *testing.T) {
// nodes := readDoc(t, `f:
// a: [1,2,3]
// b: [1,2,3,4]
// c: [1,2,3,4,5]`)
// path, errPath := treeCreator.ParsePath("f(count( (a or c)*))")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [f]
// Tag: !!int, Kind: ScalarNode, Anchor:
// 8
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorCountMultipleMatchesOutside(t *testing.T) {
// nodes := readDoc(t, `f:
// a: [1,2,3]
// b: [1,2,3,4]
// c: [1,2,3,4,5]`)
// path, errPath := treeCreator.ParsePath("f(a or c)(count(*))")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [f a]
// Tag: !!int, Kind: ScalarNode, Anchor:
// 3
// -- Node --
// Document 0, path: [f c]
// Tag: !!int, Kind: ScalarNode, Anchor:
// 5
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorCountOfResults(t *testing.T) {
// nodes := readDoc(t, `- apple
// - sdfsd
// - apple`)
// path, errPath := treeCreator.ParsePath("count(*)")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: []
// Tag: !!int, Kind: ScalarNode, Anchor:
// 3
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorCountNoMatches(t *testing.T) {
// nodes := readDoc(t, `- apple
// - sdfsd
// - apple`)
// path, errPath := treeCreator.ParsePath("count(5)")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: []
// Tag: !!int, Kind: ScalarNode, Anchor:
// 0
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorDeleteAndWrite(t *testing.T) {
// nodes := readDoc(t, `a:
// - b: apple
// - b: sdfsd
// - { b: apple, c: cat }`)
// path, errPath := treeCreator.ParsePath("(a .- (0 or 1)) or (a[0].b := frog)")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [a]
// Tag: !!seq, Kind: SequenceNode, Anchor:
// - {b: frog, c: cat}
// -- Node --
// Document 0, path: [a 0 b]
// Tag: !!str, Kind: ScalarNode, Anchor:
// frog
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorDeleteArray(t *testing.T) {
// nodes := readDoc(t, `a:
// - b: apple
// - b: sdfsd
// - b: apple`)
// path, errPath := treeCreator.ParsePath("a .- (b == a*)")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [a]
// Tag: !!seq, Kind: SequenceNode, Anchor:
// - b: sdfsd
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorArraySimple(t *testing.T) {
// nodes := readDoc(t, `- b: apple`)
// path, errPath := treeCreator.ParsePath("[0]")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [0]
// Tag: !!map, Kind: MappingNode, Anchor:
// b: apple
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorSimpleAssignByFind(t *testing.T) {
// nodes := readDoc(t, `a:
// b: apple`)
// path, errPath := treeCreator.ParsePath("a(. == apple) := frog")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [a b]
// Tag: !!str, Kind: ScalarNode, Anchor:
// frog
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorOrDeDupes(t *testing.T) {
// nodes := readDoc(t, `a:
// cat: apple
// mad: things`)
// path, errPath := treeCreator.ParsePath("a.(cat or cat)")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [a cat]
// Tag: !!str, Kind: ScalarNode, Anchor:
// apple
// `
// test.AssertResult(t, expected, resultsToString(results))
// }
// func TestDataTreeNavigatorAnd(t *testing.T) {
// nodes := readDoc(t, `a:
// cat: apple
// pat: apple
// cow: apple
// mad: things`)
// path, errPath := treeCreator.ParsePath("a.(*t and c*)")
// if errPath != nil {
// t.Error(errPath)
// }
// results, errNav := treeNavigator.GetMatchingNodes(nodes, path)
// if errNav != nil {
// t.Error(errNav)
// }
// expected := `
// -- Node --
// Document 0, path: [a cat]
// Tag: !!str, Kind: ScalarNode, Anchor:
// apple
// `
// test.AssertResult(t, expected, resultsToString(results))
// }