treerack/errors_test.go
2017-11-25 22:01:02 +01:00

116 lines
2.4 KiB
Go

package treerack
import (
"bytes"
"testing"
)
func TestError(t *testing.T) {
type testItem struct {
title string
syntax string
text string
offset int
line int
column int
definition string
}
for _, test := range []testItem{{
title: "single def, empty text",
syntax: `a = "a"`,
definition: "a",
}, {
title: "single def, wrong text",
syntax: `a = "a"`,
text: "b",
definition: "a",
}, {
title: "single optional def, wrong text",
syntax: `a = "a"?`,
text: "b",
definition: "a",
}, {
title: "error on second line, second column",
syntax: `a = [a\n]*`,
text: "aa\nabaa\naa",
offset: 4,
line: 1,
column: 1,
definition: "a",
}, {
title: "multiple definitions",
syntax: `a = "aa"; A:root = a`,
text: "ab",
offset: 1,
column: 1,
definition: "a",
}, {
title: "choice, options succeed",
syntax: `a = "12"; b = "1"; c:root = a | b`,
text: "123",
offset: 2,
column: 2,
definition: "c",
}, {
title: "choice succeeds, document fails",
syntax: `a = "12"; b = "1"; c:root = a | b`,
text: "13",
offset: 1,
column: 1,
definition: "c",
}, {
title: "choice fails",
syntax: `a = "12"; b = "2"; c:root = a | b`,
text: "13",
offset: 1,
column: 1,
definition: "a",
}, {
title: "choice fails, longer option reported",
syntax: `a = "12"; b = "134"; c:root = a | b`,
text: "135",
offset: 2,
column: 2,
definition: "b",
}} {
t.Run(test.title, func(t *testing.T) {
s, err := openSyntaxString(test.syntax)
if err != nil {
t.Error(err)
return
}
_, err = s.Parse(bytes.NewBufferString(test.text))
if err == nil {
t.Error("failed to fail")
return
}
perr, ok := err.(*ParseError)
if !ok {
t.Error("invalid error returned", err)
return
}
if perr.Offset != test.offset {
t.Error("invalid error offset", perr.Offset, test.offset)
return
}
if perr.Line != test.line {
t.Error("invalid line index", perr.Line, test.line)
return
}
if perr.Column != test.column {
t.Error("invalid column index", perr.Column, test.column)
}
if perr.Definition != test.definition {
t.Error("invalid definition", perr.Definition, test.definition)
}
})
}
}