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 {
|
2023-12-15 18:23:37 +00:00
|
|
|
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 {
|
2023-12-15 18:23:37 +00:00
|
|
|
test.Error("parser returned error:", err)
|
2023-09-26 20:40:26 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
tree := Tree { }
|
|
|
|
err := tree.Analyze(ast)
|
|
|
|
if err != nil {
|
2024-02-11 02:14:30 +00:00
|
|
|
test.Error("analyzer returned error:\n" + errors.Format(err))
|
2023-09-26 20:40:26 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|