fspl/analyzer/test-common.go

83 lines
1.7 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
}
}
func testString (test *testing.T, input string) {
testReader(test, strings.NewReader(input))
}
func testReader (test *testing.T, 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 returned error:", err)
return
}
}