61 lines
1.2 KiB
Go
61 lines
1.2 KiB
Go
|
package analyzer
|
||
|
|
||
|
import "io"
|
||
|
import "fmt"
|
||
|
import "testing"
|
||
|
import "strings"
|
||
|
import "github.com/alecthomas/participle/v2"
|
||
|
import "git.tebibyte.media/sashakoshka/fspl/parser"
|
||
|
|
||
|
func testStringErr (
|
||
|
test *testing.T,
|
||
|
errMessage string,
|
||
|
errLine int,
|
||
|
errColumn int,
|
||
|
input string,
|
||
|
) {
|
||
|
testReaderErr (
|
||
|
test,
|
||
|
errMessage, errLine, errColumn,
|
||
|
strings.NewReader(input))
|
||
|
}
|
||
|
|
||
|
func testReaderErr (
|
||
|
test *testing.T,
|
||
|
errMessage string,
|
||
|
errLine int,
|
||
|
errColumn int,
|
||
|
inputs ...io.Reader,
|
||
|
) {
|
||
|
ast := parser.Tree { }
|
||
|
for index, stream := range inputs {
|
||
|
err := ast.Parse(fmt.Sprintf("stream%d.fspl", index), stream)
|
||
|
if err != nil {
|
||
|
test.Error("parser returned error: ", err)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
tree := Tree { }
|
||
|
err := tree.Analyze(ast)
|
||
|
if err == nil {
|
||
|
test.Error("analyzer did not return error")
|
||
|
return
|
||
|
}
|
||
|
got := err.(participle.Error)
|
||
|
gotMessage := got.Message()
|
||
|
gotLine := got.Position().Line
|
||
|
gotColumn := got.Position().Column
|
||
|
correct :=
|
||
|
gotMessage == errMessage &&
|
||
|
gotLine == errLine &&
|
||
|
gotColumn == errColumn
|
||
|
if !correct {
|
||
|
test.Log("errors do not match")
|
||
|
test.Logf("got:\n%v:%v: %v", gotLine, gotColumn, gotMessage)
|
||
|
test.Logf("correct:\n%v:%v: %v", errLine, errColumn, errMessage)
|
||
|
test.Fail()
|
||
|
return
|
||
|
}
|
||
|
}
|