2017-07-15 21:49:08 +02:00
|
|
|
package treerack
|
2017-06-25 17:51:08 +02:00
|
|
|
|
|
|
|
import "testing"
|
|
|
|
|
|
|
|
func TestKeyVal(t *testing.T) {
|
2017-10-27 17:25:20 +02:00
|
|
|
runTestsFile(t, "keyval.parser", []testItem{{
|
|
|
|
title: "empty",
|
2017-06-25 17:51:08 +02:00
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "a comment",
|
|
|
|
text: "# a comment",
|
2017-06-25 17:51:08 +02:00
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "a key",
|
|
|
|
text: "a key",
|
2017-06-25 17:51:08 +02:00
|
|
|
nodes: []*Node{{
|
|
|
|
Name: "key-val",
|
2017-06-26 01:21:46 +02:00
|
|
|
To: 5,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "key",
|
2017-06-26 01:21:46 +02:00
|
|
|
To: 5,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "symbol",
|
2017-06-26 01:21:46 +02:00
|
|
|
To: 5,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "a key with a preceeding whitespace",
|
|
|
|
text: " a key",
|
2017-06-25 17:51:08 +02:00
|
|
|
nodes: []*Node{{
|
|
|
|
Name: "key-val",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 1,
|
|
|
|
To: 6,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "key",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 1,
|
|
|
|
To: 6,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "symbol",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 1,
|
|
|
|
To: 6,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "a key and a comment",
|
2017-06-25 17:51:08 +02:00
|
|
|
text: `
|
|
|
|
# a comment
|
|
|
|
|
|
|
|
a key
|
|
|
|
`,
|
|
|
|
nodes: []*Node{{
|
|
|
|
Name: "key-val",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 20,
|
|
|
|
To: 25,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "key",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 20,
|
|
|
|
To: 25,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "symbol",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 20,
|
|
|
|
To: 25,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "a key value pair",
|
|
|
|
text: "a key = a value",
|
2017-06-25 17:51:08 +02:00
|
|
|
nodes: []*Node{{
|
|
|
|
Name: "key-val",
|
2017-06-26 01:21:46 +02:00
|
|
|
To: 15,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "key",
|
2017-06-26 01:21:46 +02:00
|
|
|
To: 5,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "symbol",
|
2017-06-26 01:21:46 +02:00
|
|
|
To: 5,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}, {
|
|
|
|
Name: "value",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 8,
|
|
|
|
To: 15,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "key value pairs with a comment at the end of line",
|
2017-10-29 00:21:32 +02:00
|
|
|
text: "a key = a value # a comment\n" +
|
|
|
|
"another key = another value # another comment",
|
2017-06-25 17:51:08 +02:00
|
|
|
nodes: []*Node{{
|
|
|
|
Name: "key-val",
|
2017-10-29 00:21:32 +02:00
|
|
|
From: 0,
|
|
|
|
To: 39,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "key",
|
2017-10-29 00:21:32 +02:00
|
|
|
From: 0,
|
|
|
|
To: 5,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "symbol",
|
2017-10-29 00:21:32 +02:00
|
|
|
From: 0,
|
|
|
|
To: 5,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}, {
|
|
|
|
Name: "value",
|
2017-10-29 00:21:32 +02:00
|
|
|
From: 14,
|
|
|
|
To: 21,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}, {
|
|
|
|
Name: "key-val",
|
2017-10-29 00:21:32 +02:00
|
|
|
From: 40,
|
|
|
|
To: 85,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "key",
|
2017-10-29 00:21:32 +02:00
|
|
|
From: 40,
|
|
|
|
To: 51,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "symbol",
|
2017-10-29 00:21:32 +02:00
|
|
|
From: 40,
|
|
|
|
To: 51,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}, {
|
|
|
|
Name: "value",
|
2017-10-29 00:21:32 +02:00
|
|
|
From: 54,
|
|
|
|
To: 67,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "value without a key",
|
|
|
|
text: "= a value",
|
2017-06-25 17:51:08 +02:00
|
|
|
nodes: []*Node{{
|
|
|
|
Name: "key-val",
|
2017-06-26 01:21:46 +02:00
|
|
|
To: 9,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "value",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 2,
|
|
|
|
To: 9,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "a key value pair with comment",
|
2017-06-25 17:51:08 +02:00
|
|
|
text: `
|
|
|
|
# a comment
|
|
|
|
a key = a value
|
|
|
|
`,
|
|
|
|
nodes: []*Node{{
|
|
|
|
Name: "key-val",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 4,
|
|
|
|
To: 34,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "comment",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 4,
|
|
|
|
To: 15,
|
2017-06-25 17:51:08 +02:00
|
|
|
}, {
|
|
|
|
Name: "key",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 19,
|
|
|
|
To: 24,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "symbol",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 19,
|
|
|
|
To: 24,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}, {
|
|
|
|
Name: "value",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 27,
|
|
|
|
To: 34,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "a key with multiple symbols",
|
|
|
|
text: "a key . with.multiple.symbols=a value",
|
2017-06-25 17:51:08 +02:00
|
|
|
nodes: []*Node{{
|
|
|
|
Name: "key-val",
|
2017-06-26 01:21:46 +02:00
|
|
|
To: 37,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "key",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 0,
|
|
|
|
To: 29,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "symbol",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 0,
|
|
|
|
To: 5,
|
2017-06-25 17:51:08 +02:00
|
|
|
}, {
|
|
|
|
Name: "symbol",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 8,
|
|
|
|
To: 12,
|
2017-06-25 17:51:08 +02:00
|
|
|
}, {
|
|
|
|
Name: "symbol",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 13,
|
|
|
|
To: 21,
|
2017-06-25 17:51:08 +02:00
|
|
|
}, {
|
|
|
|
Name: "symbol",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 22,
|
|
|
|
To: 29,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}, {
|
|
|
|
Name: "value",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 30,
|
|
|
|
To: 37,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "a group key",
|
2017-06-25 17:51:08 +02:00
|
|
|
text: `
|
|
|
|
# a comment
|
|
|
|
[a group key.empty]
|
|
|
|
`,
|
|
|
|
nodes: []*Node{{
|
|
|
|
Name: "group-key",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 4,
|
|
|
|
To: 38,
|
2017-06-25 17:51:08 +02:00
|
|
|
Nodes: []*Node{{
|
|
|
|
Name: "comment",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 4,
|
|
|
|
To: 15,
|
2017-06-25 17:51:08 +02:00
|
|
|
}, {
|
|
|
|
Name: "symbol",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 20,
|
|
|
|
To: 31,
|
2017-06-25 17:51:08 +02:00
|
|
|
}, {
|
|
|
|
Name: "symbol",
|
2017-06-26 01:21:46 +02:00
|
|
|
From: 32,
|
|
|
|
To: 37,
|
2017-06-25 17:51:08 +02:00
|
|
|
}},
|
|
|
|
}},
|
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "a group key with multiple values",
|
2017-06-25 17:51:08 +02:00
|
|
|
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,
|
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "a group key with multiple values, in a single line",
|
|
|
|
text: "[foo.bar.baz] = one = two = three",
|
2017-06-25 17:51:08 +02:00
|
|
|
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,
|
|
|
|
}, {
|
2017-10-27 17:25:20 +02:00
|
|
|
title: "full example",
|
2017-06-25 17:51:08 +02:00
|
|
|
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,
|
|
|
|
}})
|
|
|
|
}
|