395 lines
5.9 KiB
Go
395 lines
5.9 KiB
Go
![]() |
package parse
|
||
|
|
||
|
import "testing"
|
||
|
|
||
|
func TestKeyVal(t *testing.T) {
|
||
|
test(t, "keyval.p", "doc", []testItem{{
|
||
|
msg: "empty",
|
||
|
}, {
|
||
|
msg: "a comment",
|
||
|
text: "# a comment",
|
||
|
}, {
|
||
|
msg: "a key",
|
||
|
text: "a key",
|
||
|
nodes: []*Node{{
|
||
|
Name: "key-val",
|
||
|
to: 5,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
to: 5,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
to: 5,
|
||
|
}},
|
||
|
}},
|
||
|
}},
|
||
|
}, {
|
||
|
msg: "a key with a preceeding whitespace",
|
||
|
text: " a key",
|
||
|
nodes: []*Node{{
|
||
|
Name: "key-val",
|
||
|
from: 1,
|
||
|
to: 6,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
from: 1,
|
||
|
to: 6,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
from: 1,
|
||
|
to: 6,
|
||
|
}},
|
||
|
}},
|
||
|
}},
|
||
|
}, {
|
||
|
msg: "a key and a comment",
|
||
|
text: `
|
||
|
# a comment
|
||
|
|
||
|
a key
|
||
|
`,
|
||
|
nodes: []*Node{{
|
||
|
Name: "key-val",
|
||
|
from: 20,
|
||
|
to: 25,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
from: 20,
|
||
|
to: 25,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
from: 20,
|
||
|
to: 25,
|
||
|
}},
|
||
|
}},
|
||
|
}},
|
||
|
}, {
|
||
|
msg: "a key value pair",
|
||
|
text: "a key = a value",
|
||
|
nodes: []*Node{{
|
||
|
Name: "key-val",
|
||
|
to: 15,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
to: 5,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
to: 5,
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
from: 8,
|
||
|
to: 15,
|
||
|
}},
|
||
|
}},
|
||
|
}, {
|
||
|
msg: "key value pairs with a comment at the end of line",
|
||
|
text: `
|
||
|
a key = a value # a comment
|
||
|
another key = another value # another comment
|
||
|
`,
|
||
|
nodes: []*Node{{
|
||
|
Name: "key-val",
|
||
|
from: 11,
|
||
|
to: 32,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
from: 11,
|
||
|
to: 16,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
from: 11,
|
||
|
to: 16,
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
from: 25,
|
||
|
to: 32,
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
from: 61,
|
||
|
to: 88,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
from: 61,
|
||
|
to: 72,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
from: 61,
|
||
|
to: 72,
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
from: 75,
|
||
|
to: 88,
|
||
|
}},
|
||
|
}},
|
||
|
}, {
|
||
|
msg: "value without a key",
|
||
|
text: "= a value",
|
||
|
nodes: []*Node{{
|
||
|
Name: "key-val",
|
||
|
to: 9,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "value",
|
||
|
from: 2,
|
||
|
to: 9,
|
||
|
}},
|
||
|
}},
|
||
|
}, {
|
||
|
msg: "a key value pair with comment",
|
||
|
text: `
|
||
|
# a comment
|
||
|
a key = a value
|
||
|
`,
|
||
|
nodes: []*Node{{
|
||
|
Name: "key-val",
|
||
|
from: 4,
|
||
|
to: 34,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "comment",
|
||
|
from: 4,
|
||
|
to: 15,
|
||
|
}, {
|
||
|
Name: "key",
|
||
|
from: 19,
|
||
|
to: 24,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
from: 19,
|
||
|
to: 24,
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
from: 27,
|
||
|
to: 34,
|
||
|
}},
|
||
|
}},
|
||
|
}, {
|
||
|
msg: "a key with multiple symbols",
|
||
|
text: "a key . with.multiple.symbols=a value",
|
||
|
nodes: []*Node{{
|
||
|
Name: "key-val",
|
||
|
to: 37,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
from: 0,
|
||
|
to: 29,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
from: 0,
|
||
|
to: 5,
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
from: 8,
|
||
|
to: 12,
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
from: 13,
|
||
|
to: 21,
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
from: 22,
|
||
|
to: 29,
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
from: 30,
|
||
|
to: 37,
|
||
|
}},
|
||
|
}},
|
||
|
}, {
|
||
|
msg: "a group key",
|
||
|
text: `
|
||
|
# a comment
|
||
|
[a group key.empty]
|
||
|
`,
|
||
|
nodes: []*Node{{
|
||
|
Name: "group-key",
|
||
|
from: 4,
|
||
|
to: 38,
|
||
|
Nodes: []*Node{{
|
||
|
Name: "comment",
|
||
|
from: 4,
|
||
|
to: 15,
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
from: 20,
|
||
|
to: 31,
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
from: 32,
|
||
|
to: 37,
|
||
|
}},
|
||
|
}},
|
||
|
}, {
|
||
|
msg: "a group key with multiple values",
|
||
|
text: `
|
||
|
[foo.bar.baz]
|
||
|
= one
|
||
|
= two
|
||
|
= three
|
||
|
`,
|
||
|
nodes: []*Node{{
|
||
|
Name: "group-key",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}},
|
||
|
ignorePosition: true,
|
||
|
}, {
|
||
|
msg: "a group key with multiple values, in a single line",
|
||
|
text: "[foo.bar.baz] = one = two = three",
|
||
|
nodes: []*Node{{
|
||
|
Name: "group-key",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}},
|
||
|
ignorePosition: true,
|
||
|
}, {
|
||
|
msg: "full example",
|
||
|
text: `
|
||
|
# a keyval document
|
||
|
|
||
|
key1 = foo
|
||
|
key1.a = bar
|
||
|
key1.b = baz
|
||
|
|
||
|
key2 = qux
|
||
|
|
||
|
# foo bar baz values
|
||
|
[foo.bar.baz]
|
||
|
a = 1
|
||
|
b = 2 # even
|
||
|
c = 3
|
||
|
`,
|
||
|
nodes: []*Node{{
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "group-key",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "comment",
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
}, {
|
||
|
Name: "symbol",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "key-val",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "key",
|
||
|
Nodes: []*Node{{
|
||
|
Name: "symbol",
|
||
|
}},
|
||
|
}, {
|
||
|
Name: "value",
|
||
|
}},
|
||
|
}},
|
||
|
ignorePosition: true,
|
||
|
}})
|
||
|
}
|