blob: 809dfa27b74251615d66174c1ba4129e34f66cf0 [file] [log] [blame] [edit]
package parser
import (
"strings"
"testing"
"github.com/protocolbuffers/txtpbfmt/ast"
)
func findNode(name string, nodes []*ast.Node) *ast.Node {
for _, n := range nodes {
if n.Name == name {
return n
}
if found := findNode(name, n.Children); found != nil {
return found
}
}
return nil
}
func mkString(lines ...string) string {
return strings.Join(lines, "\n")
}
func TestParsePositions(t *testing.T) {
for i, tc := range []struct {
in string
startByte, endByte int
start, end ast.Position
}{{
in: `trackme: "foo"` + "\n",
startByte: 0,
}, {
in: mkString(
"# top", // 5 bytes + newline
"trackme: 4", // 10 bytes + newline
),
startByte: 0,
}, {
in: mkString(
"# top", // 5 bytes + newline
"unrelated: 1", // 12 bytes + newline
"trackme: 4",
),
startByte: 19,
}, {
in: "trackme: {\n}",
startByte: 0, endByte: 11,
start: ast.Position{Line: 1, Column: 1},
end: ast.Position{Line: 2},
}, {
in: mkString(
"# top", // 5 bytes + newline
"unrelated: 1", // 12 bytes + newline
"", // this already gets accounted for trackme
"trackme: 4",
),
startByte: 19,
}, {
in: mkString(
"# top", // 5 bytes + newline
"unrelated: 1", // 12 bytes + newline
"# boo", // this already gets accounted for trackme
"trackme: 4",
),
startByte: 19,
}, {
in: mkString(
"# top", // 5 bytes + newline
"unrelated: 1", // 12 bytes + newline
"", // this already gets accounted for trackme
"# boo",
"trackme: 4",
),
startByte: 19,
}, {
in: mkString(
"outer: {", // 8 bytes + newline
" foo: 1", // 8 bytes + newline
" trackme: 4",
"}",
),
startByte: 18,
}, {
in: mkString(
"outer: {", // 8 bytes + newline
" foo: 1", // 8 bytes + newline
"", // acounted already for trackme
" # multiline desc",
" # for trackme",
" trackme: 4",
"}",
),
startByte: 18,
}, {
in: mkString(
"trackme: {", // 10 bytes + newline
" content: 1", // 12 bytes + newline
"}",
),
startByte: 0, endByte: 24,
start: ast.Position{Line: 1, Column: 1},
end: ast.Position{Line: 3},
}, {
in: mkString(
"outer: {", // 8 bytes + newline
" a: 1", // 6 bytes + newline
" trackme: {", // 12 bytes + newline
" b: 2", // 8 bytes + newline
" # end comment", // 17 bytes + newline
" }",
"}",
),
startByte: 9 + 7, endByte: 9 + 7 + 13 + 9 + 18,
start: ast.Position{Line: 3, Column: 1},
end: ast.Position{Line: 6},
}} {
nodes, err := Parse([]byte(tc.in))
if err != nil {
t.Fatal(err)
}
found := findNode("trackme", nodes)
if found == nil {
t.Fatalf("%d. TestParsePositions no node 'trackme' found", i)
}
if (uint32(tc.startByte) != found.Start.Byte) ||
(uint32(tc.endByte) != found.End.Byte) ||
(tc.start.Line > 0 && found.Start.Line != tc.start.Line) ||
(tc.start.Column > 0 && found.Start.Column != tc.start.Column) ||
(tc.end.Line > 0 && found.End.Line != tc.end.Line) {
t.Errorf("%d. TestParsePositions got = %+v, want = (%d, %d), (%d, %d, %d); input:\n%s",
i,
found,
tc.startByte, tc.endByte,
tc.start.Line, tc.start.Column, tc.end.Line,
tc.in)
}
}
}