fspl/generator/test-common.go

126 lines
3.1 KiB
Go
Raw Normal View History

2023-11-17 03:04:56 +00:00
package generator
import "testing"
import "strings"
2024-02-20 02:00:20 +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/analyzer"
import "git.tebibyte.media/fspl/fspl/testcommon"
import "git.tebibyte.media/fspl/fspl/parser/fspl"
2023-11-17 03:04:56 +00:00
func testString (test *testing.T, correct string, input string) {
2024-02-20 02:00:20 +00:00
address := entity.Address("main.fspl")
ast, ok := treeOf(test, address, input, false)
if !ok { return }
tree := analyzer.Tree { }
err := tree.Analyze(address.UUID(), nil, ast)
2024-02-09 09:02:55 +00:00
if err != nil {
test.Error("analyzer returned error:\n" + errors.Format(err))
2024-02-09 09:02:55 +00:00
return
}
2024-02-20 02:00:20 +00:00
testSemanticTree(test, correct, input, tree)
}
func testUnits (
test *testing.T,
correct string,
main string,
dependencies ...string,
) {
if len(dependencies) % 2 != 0 {
panic("dependencies len must be even. forget an address?")
2023-11-17 03:04:56 +00:00
}
2024-02-20 02:00:20 +00:00
tree := analyzer.Tree { }
nicknames := make(map[string] uuid.UUID)
2023-11-17 03:04:56 +00:00
2024-02-20 02:00:20 +00:00
// dependencies
for index := 0; index < len(dependencies) - 1; index += 2 {
address := entity.Address(dependencies[index])
test.Log("analyzing", address, "UUID", address.UUID())
2024-02-20 02:00:20 +00:00
source := dependencies[index + 1]
ast, ok := treeOf(test, address, source, true)
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")
test.Log("analyzing MAIN", address, "UUID", address.UUID())
2024-02-20 02:00:20 +00:00
ast, ok := treeOf(test, address, main, false)
if !ok { return }
err := tree.Analyze(address.UUID(), nicknames, ast)
2023-11-17 03:04:56 +00:00
if err != nil {
2024-02-20 02:00:20 +00:00
test.Error("analyzer returned error:\n" + errors.Format(err))
2023-11-17 03:04:56 +00:00
return
}
2024-02-20 02:00:20 +00:00
testSemanticTree(test, correct, "", tree)
}
func testSemanticTree (test *testing.T, correct string, input string, tree analyzer.Tree) {
2023-12-01 06:18:10 +00:00
module, err := (&Target {
WordSize: 64,
Arch: "x86_64",
}).Generate(tree)
2023-11-23 06:26:14 +00:00
if err != nil {
2023-11-26 09:02:22 +00:00
test.Error("generator returned error:", err)
2023-11-23 06:26:14 +00:00
return
}
2023-11-17 03:04:56 +00:00
output := new(strings.Builder)
2023-11-23 06:26:14 +00:00
_, err = module.WriteTo(output)
2023-11-17 03:04:56 +00:00
if err != nil {
2023-11-26 09:02:22 +00:00
test.Error("generator returned error:", err)
2023-11-17 03:04:56 +00:00
return
}
2024-01-27 23:07:49 +00:00
2023-11-17 03:04:56 +00:00
got := output.String()
2023-11-23 06:26:14 +00:00
if got != correct {
2023-11-17 03:04:56 +00:00
test.Logf("results do not match")
testcommon.Compare(test, correct, got)
2024-02-20 02:00:20 +00:00
if input != "" {
test.Log("SOURCE FSPL CODE:")
test.Log("\033[32m" + input + "\033[0m")
}
2023-11-17 03:04:56 +00:00
test.Fail()
}
}
2024-02-20 02:00:20 +00:00
func treeOf (test *testing.T, address entity.Address, input string, skim bool) (fsplParser.Tree, bool) {
ast := fsplParser.Tree { }
lx, err := lexer.LexReader (
string(address),
strings.NewReader(input))
if err != nil {
test.Error("lexer returned error:\n" + errors.Format(err))
return ast, false
}
if skim {
err = ast.Skim(lx)
} else {
err = ast.Parse(lx)
}
if err != nil {
test.Error("parser returned error:\n" + errors.Format(err))
return ast, false
}
return ast, true
}