fspl/analyzer/test-common.go

98 lines
2.0 KiB
Go
Raw Normal View History

2023-09-23 04:49:23 +00:00
package analyzer
import "io"
import "fmt"
import "testing"
import "strings"
2024-02-09 09:01:41 +00:00
import "git.tebibyte.media/sashakoshka/fspl/lexer"
2024-02-08 08:56:09 +00:00
import "git.tebibyte.media/sashakoshka/fspl/errors"
2023-09-23 04:49:23 +00:00
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,
2024-02-08 08:56:09 +00:00
errRow int,
errStart int,
2023-09-23 04:49:23 +00:00
inputs ...io.Reader,
) {
ast := parser.Tree { }
for index, stream := range inputs {
2024-02-09 09:01:41 +00:00
lx, err := lexer.LexReader (
fmt.Sprintf("stream%d.fspl", index),
stream)
if err != nil {
test.Error("lexer returned error:", err)
return
}
err = ast.Parse(lx)
2023-09-23 04:49:23 +00:00
if err != nil {
test.Error("parser returned error:", err)
2023-09-23 04:49:23 +00:00
return
}
}
tree := Tree { }
err := tree.Analyze(ast)
if err == nil {
test.Error("analyzer did not return error")
return
}
2024-02-08 08:56:09 +00:00
2024-02-08 21:53:15 +00:00
got := err.(errors.Error)
gotMessage := got.Error()
gotRow := got.Position().Row + 1
gotStart := got.Position().Start + 1
2023-09-23 04:49:23 +00:00
correct :=
gotMessage == errMessage &&
2024-02-08 08:56:09 +00:00
gotRow == errRow &&
gotStart == errStart
2023-09-23 04:49:23 +00:00
if !correct {
test.Log("errors do not match")
2024-02-08 21:53:15 +00:00
test.Log("got:\n" + errors.Format(got))
2024-02-08 08:56:09 +00:00
test.Logf("correct:\n%v:%v: %v", errRow, errStart, errMessage)
2023-09-23 04:49:23 +00:00
test.Fail()
}
}
2023-09-26 20:40:26 +00:00
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 {
2024-02-09 09:01:41 +00:00
lx, err := lexer.LexReader (
fmt.Sprintf("stream%d.fspl", index),
stream)
if err != nil {
test.Error("lexer returned error:", err)
return
}
err = ast.Parse(lx)
2023-09-26 20:40:26 +00:00
if err != nil {
test.Error("parser returned error:", err)
2023-09-26 20:40:26 +00:00
return
}
}
tree := Tree { }
err := tree.Analyze(ast)
if err != nil {
test.Error("analyzer returned error:\n" + errors.Format(err))
2023-09-26 20:40:26 +00:00
return
}
}