fspl/analyzer/test-common.go

200 lines
4.8 KiB
Go
Raw Normal View History

2023-09-23 04:49:23 +00:00
package analyzer
import "testing"
import "strings"
2024-02-15 03:48:55 +00:00
import "github.com/google/uuid"
2024-02-23 00:22:53 +00:00
import "git.tebibyte.media/fspl/fspl/lexer"
import "git.tebibyte.media/fspl/fspl/errors"
import "git.tebibyte.media/fspl/fspl/entity"
import "git.tebibyte.media/fspl/fspl/parser/fspl"
2023-09-23 04:49:23 +00:00
func testStringErr (
test *testing.T,
errMessage string,
errRow int,
errStart int,
2023-09-23 04:49:23 +00:00
input string,
) {
address := entity.Address("stream0.fspl")
2024-02-15 04:10:43 +00:00
ast, ok := treeOf(test, address, input, false)
if !ok { return }
tree := Tree { }
err := tree.Analyze(address.UUID(), nil, ast)
if err == nil {
test.Error("analyzer did not return error")
return
}
compareErr(test, address, string(address), errMessage, errRow, errStart, err)
2023-09-23 04:49:23 +00:00
}
func testString (test *testing.T, input string) {
2024-02-14 18:49:06 +00:00
address := entity.Address("stream0.fspl")
2024-02-15 04:10:43 +00:00
ast, ok := treeOf(test, address, input, false)
if !ok { return }
tree := Tree { }
err := tree.Analyze(address.UUID(), nil, ast)
if err != nil {
test.Error("analyzer returned error:\n" + errors.Format(err))
return
}
}
2024-02-15 03:48:55 +00:00
func testUnits (
test *testing.T,
main string,
dependencies ...string,
) {
if len(dependencies) % 2 != 0 {
panic("dependencies len must be even. forget an address?")
}
tree := Tree { }
nicknames := make(map[string] uuid.UUID)
// dependencies
2024-02-15 04:10:43 +00:00
for index := 0; index < len(dependencies) - 1; index += 2 {
2024-02-15 03:48:55 +00:00
address := entity.Address(dependencies[index])
source := dependencies[index + 1]
2024-02-15 04:10:43 +00:00
ast, ok := treeOf(test, address, source, true)
2024-02-15 03:48:55 +00:00
if !ok { return }
err := tree.Analyze(address.UUID(), nicknames, ast)
if err != nil {
test.Error("analyzer returned error:\n" + errors.Format(err))
return
}
unit := address.UUID()
nickname, ok := address.Nickname()
if !ok {
test.Errorf("could not generate nickname for %v", address)
return
}
nicknames[nickname] = unit
}
// main
address := entity.Address("main.fspl")
2024-02-15 04:10:43 +00:00
ast, ok := treeOf(test, address, main, false)
2024-02-15 03:48:55 +00:00
if !ok { return }
err := tree.Analyze(address.UUID(), nicknames, ast)
if err != nil {
test.Error("analyzer returned error:\n" + errors.Format(err))
return
}
}
func testUnitsErr (
test *testing.T,
2024-02-15 04:10:43 +00:00
errFile string,
errMessage string,
errRow int,
errStart int,
main string,
dependencies ...string,
) {
if len(dependencies) % 2 != 0 {
panic("dependencies len must be even. forget an address?")
}
2024-02-15 03:48:55 +00:00
tree := Tree { }
nicknames := make(map[string] uuid.UUID)
// dependencies
2024-02-15 04:10:43 +00:00
for index := 0; index < len(dependencies) - 1; index += 2 {
address := entity.Address(dependencies[index])
source := dependencies[index + 1]
2024-02-15 04:10:43 +00:00
ast, ok := treeOf(test, address, source, true)
if !ok { return }
2024-02-15 03:48:55 +00:00
err := tree.Analyze(address.UUID(), nicknames, ast)
if err != nil {
2024-02-15 04:10:43 +00:00
compareErr(test, address, errFile, errMessage, errRow, errStart, err)
return
}
2024-02-15 03:48:55 +00:00
unit := address.UUID()
nickname, ok := address.Nickname()
if !ok {
test.Errorf("could not generate nickname for %v", address)
return
}
nicknames[nickname] = unit
}
// main
address := entity.Address("main.fspl")
2024-02-15 04:10:43 +00:00
ast, ok := treeOf(test, address, main, false)
if !ok { return }
2024-02-15 03:48:55 +00:00
err := tree.Analyze(address.UUID(), nicknames, ast)
if err != nil {
2024-02-15 04:10:43 +00:00
compareErr(test, address, errFile, errMessage, errRow, errStart, err)
return
}
test.Error("analyzer did not return error")
}
2024-02-15 04:10:43 +00:00
func treeOf (test *testing.T, address entity.Address, input string, skim bool) (fsplParser.Tree, bool) {
2024-02-13 18:12:45 +00:00
ast := fsplParser.Tree { }
2024-02-14 18:35:50 +00:00
lx, err := lexer.LexReader (
string(address),
strings.NewReader(input))
2024-02-14 18:35:50 +00:00
if err != nil {
2024-02-15 04:10:43 +00:00
test.Error("lexer returned error:\n" + errors.Format(err))
return ast, false
2024-02-14 18:35:50 +00:00
}
2024-02-15 04:10:43 +00:00
if skim {
err = ast.Skim(lx)
} else {
err = ast.Parse(lx)
}
2024-02-14 18:35:50 +00:00
if err != nil {
2024-02-15 04:10:43 +00:00
test.Error("parser returned error:\n" + errors.Format(err))
return ast, false
2023-09-23 04:49:23 +00:00
}
return ast, true
}
func compareErr (
test *testing.T,
address entity.Address,
errFile string,
errMessage string,
errRow int,
errStart int,
err error,
) bool {
2024-02-08 21:53:15 +00:00
got := err.(errors.Error)
gotMessage := got.Error()
gotFile := got.Position().File
2024-02-08 21:53:15 +00:00
gotRow := got.Position().Row + 1
gotStart := got.Position().Start + 1
2023-09-23 04:49:23 +00:00
correct :=
gotFile == errFile &&
2023-09-23 04:49:23 +00:00
gotMessage == errMessage &&
2024-02-08 08:56:09 +00:00
gotRow == errRow &&
gotStart == errStart
if correct { return true }
2024-02-14 18:35:50 +00:00
test.Log("errors do not match:")
if gotMessage != errMessage {
test.Log("- messages do not match:")
test.Logf(" [%s]", gotMessage)
test.Logf(" [%s]", errMessage)
2024-02-14 18:35:50 +00:00
}
if gotRow != errRow {
test.Logf("- rows do not match: (%d, %d)", gotRow, errRow)
2023-09-26 20:40:26 +00:00
}
if gotStart != errStart {
test.Logf("- columns do not match: (%d, %d)", gotStart, errStart)
2023-09-26 20:40:26 +00:00
}
test.Log("got:\n" + errors.Format(got))
test.Logf("correct:\n%v:%v: %v", errRow, errStart, errMessage)
test.Fail()
return false
2023-09-26 20:40:26 +00:00
}