mirror of https://github.com/kubernetes/kops.git
133 lines
3.5 KiB
Go
133 lines
3.5 KiB
Go
package jsonpath
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
"testing"
|
|
)
|
|
|
|
func TestTokensAndPaths(t *testing.T) {
|
|
j := []byte(`
|
|
{
|
|
"foo": 1,
|
|
"bar": 2,
|
|
"test": "Hello, world!",
|
|
"baz": 123.1,
|
|
"array": [
|
|
{"foo": 1},
|
|
{"bar": 2},
|
|
{"baz": 3}
|
|
],
|
|
"subobj": {
|
|
"foo": 1,
|
|
"subarray": [1,2,3],
|
|
"subsubobj": {
|
|
"bar": 2,
|
|
"baz": 3,
|
|
"array": ["hello", "world"]
|
|
}
|
|
},
|
|
"bool": true,
|
|
"a": [[0],[[1]]]
|
|
}`)
|
|
|
|
expPaths := []JsonPath{
|
|
{""},
|
|
{"foo"}, {"foo"},
|
|
{"bar"}, {"bar"},
|
|
{"test"}, {"test"},
|
|
{"baz"}, {"baz"},
|
|
{"array"}, {"array", -1},
|
|
{"array", 0, ""}, {"array", 0, "foo"}, {"array", 0, "foo"}, {"array", 0},
|
|
{"array", 1, ""}, {"array", 1, "bar"}, {"array", 1, "bar"}, {"array", 1},
|
|
{"array", 2, ""}, {"array", 2, "baz"}, {"array", 2, "baz"}, {"array", 2},
|
|
{"array"},
|
|
{"subobj"},
|
|
{"subobj", ""},
|
|
{"subobj", "foo"}, {"subobj", "foo"},
|
|
{"subobj", "subarray"}, {"subobj", "subarray", -1},
|
|
{"subobj", "subarray", 0}, {"subobj", "subarray", 1}, {"subobj", "subarray", 2},
|
|
{"subobj", "subarray"},
|
|
{"subobj", "subsubobj"}, {"subobj", "subsubobj", ""},
|
|
{"subobj", "subsubobj", "bar"}, {"subobj", "subsubobj", "bar"},
|
|
{"subobj", "subsubobj", "baz"}, {"subobj", "subsubobj", "baz"},
|
|
{"subobj", "subsubobj", "array"}, {"subobj", "subsubobj", "array", -1},
|
|
{"subobj", "subsubobj", "array", 0}, {"subobj", "subsubobj", "array", 1},
|
|
{"subobj", "subsubobj", "array"},
|
|
{"subobj", "subsubobj"}, {"subobj"},
|
|
{"bool"}, {"bool"},
|
|
{"a"}, {"a", -1}, {"a", 0, -1}, {"a", 0, 0}, {"a", 0}, {"a", 1, -1},
|
|
{"a", 1, 0, -1}, {"a", 1, 0, 0}, {"a", 1, 0}, {"a", 1}, {"a"},
|
|
{},
|
|
}
|
|
|
|
expTokens := []json.Token{
|
|
json.Delim('{'),
|
|
KeyString("foo"), float64(1),
|
|
KeyString("bar"), float64(2),
|
|
KeyString("test"), "Hello, world!",
|
|
KeyString("baz"), float64(123.1),
|
|
KeyString("array"), json.Delim('['),
|
|
json.Delim('{'), KeyString("foo"), float64(1), json.Delim('}'),
|
|
json.Delim('{'), KeyString("bar"), float64(2), json.Delim('}'),
|
|
json.Delim('{'), KeyString("baz"), float64(3), json.Delim('}'),
|
|
json.Delim(']'),
|
|
KeyString("subobj"),
|
|
json.Delim('{'),
|
|
KeyString("foo"), float64(1),
|
|
KeyString("subarray"), json.Delim('['),
|
|
float64(1), float64(2), float64(3),
|
|
json.Delim(']'),
|
|
KeyString("subsubobj"), json.Delim('{'),
|
|
KeyString("bar"), float64(2),
|
|
KeyString("baz"), float64(3),
|
|
KeyString("array"), json.Delim('['),
|
|
"hello", "world",
|
|
json.Delim(']'),
|
|
json.Delim('}'), json.Delim('}'),
|
|
KeyString("bool"), true,
|
|
KeyString("a"),
|
|
json.Delim('['), json.Delim('['), float64(0), json.Delim(']'),
|
|
json.Delim('['), json.Delim('['), float64(1), json.Delim(']'), json.Delim(']'),
|
|
json.Delim(']'),
|
|
json.Delim('}'),
|
|
}
|
|
outTokens := []json.Token{}
|
|
outPaths := []JsonPath{}
|
|
|
|
d := NewDecoder(bytes.NewBuffer(j))
|
|
|
|
for {
|
|
st, err := d.Token()
|
|
if err == io.EOF {
|
|
break
|
|
} else if err != nil {
|
|
t.Error(err)
|
|
break
|
|
}
|
|
outTokens = append(outTokens, st)
|
|
outPaths = append(outPaths, d.Path())
|
|
}
|
|
|
|
// Check tokens
|
|
if len(outTokens) != len(expTokens) {
|
|
t.Errorf("Out has %v elements, expected %v", len(outTokens), len(expTokens))
|
|
}
|
|
for i, v := range expTokens {
|
|
if v != outTokens[i] {
|
|
t.Errorf("@%v exp: %T:%v but was: %T:%v", i, v, v, outTokens[i], outTokens[i])
|
|
}
|
|
}
|
|
|
|
// Check paths
|
|
if len(outPaths) != len(expPaths) {
|
|
t.Errorf("Outpaths has %v elements, expected %v", len(outPaths), len(expPaths))
|
|
}
|
|
for i, v := range expPaths {
|
|
if !v.Equal(outPaths[i]) {
|
|
t.Errorf("@%v exp: %T:%v but was: %T:%v", i, v, v, outPaths[i], outPaths[i])
|
|
}
|
|
}
|
|
}
|