提交 106cf4c8 编写于 作者: chai2010's avatar chai2010

完善测试功能

上级 5319e5a5
......@@ -9,19 +9,19 @@ import (
"strings"
"time"
"github.com/tetratelabs/wazero/sys"
"wa-lang.org/wa/internal/backends/compiler_wat"
"wa-lang.org/wa/internal/loader"
"wa-lang.org/wa/internal/wabt"
"wa-lang.org/wa/internal/wazero"
)
func (p *App) RunTest(pkgpath string, appArgs ...string) error {
func (p *App) RunTest(pkgpath string, appArgs ...string) {
cfg := p.opt.Config()
cfg.UnitTest = true
prog, err := loader.LoadProgram(cfg, pkgpath)
if err != nil {
return err
fmt.Println(err)
os.Exit(1)
}
startTime := time.Now()
......@@ -31,13 +31,14 @@ func (p *App) RunTest(pkgpath string, appArgs ...string) error {
if len(mainPkg.TestInfo.Files) == 0 {
fmt.Printf("? %s [no test files]\n", prog.Manifest.MainPkg)
return nil
return
}
// 生成 wat 文件(main 函数为空)
watOutput, err := compiler_wat.New().Compile(prog, "")
if err != nil {
return err
fmt.Println(err)
os.Exit(1)
}
// wat 落盘(仅用于调试)
......@@ -46,12 +47,14 @@ func (p *App) RunTest(pkgpath string, appArgs ...string) error {
// 编译为 wasm
wasmBytes, err := wabt.Wat2Wasm([]byte(watOutput))
if err != nil {
return err
fmt.Println(err)
os.Exit(1)
}
m, err := wazero.BuildModule(cfg, wasmName, wasmBytes, wasmArgs...)
if err != nil {
return err
fmt.Println(err)
os.Exit(1)
}
defer m.Close()
......@@ -60,12 +63,17 @@ func (p *App) RunTest(pkgpath string, appArgs ...string) error {
for _, t := range mainPkg.TestInfo.Tests {
_, stdout, stderr, err := m.RunFunc(mainPkg.Pkg.Path() + "." + t.Name)
if err != nil {
if len(stdout) > 0 {
if s := sWithPrefix(string(stdout), " "); s != "" {
fmt.Println(s)
}
}
if len(stderr) > 0 {
if s := sWithPrefix(string(stderr), " "); s != "" {
fmt.Println(s)
}
}
return err
os.Exit(1)
}
stdout = bytes.TrimSpace(stdout)
......@@ -77,7 +85,7 @@ func (p *App) RunTest(pkgpath string, appArgs ...string) error {
if firstError == nil {
firstError = err
}
if _, ok := err.(*sys.ExitError); ok {
if _, ok := wazero.AsExitError(err); ok {
fmt.Printf("---- %s.%s\n", prog.Manifest.MainPkg, t.Name)
if s := sWithPrefix(string(stdout), " "); s != "" {
fmt.Println(s)
......@@ -103,12 +111,18 @@ func (p *App) RunTest(pkgpath string, appArgs ...string) error {
for _, t := range mainPkg.TestInfo.Examples {
_, stdout, stderr, err := m.RunFunc(mainPkg.Pkg.Path() + "." + t.Name)
if err != nil {
if len(stdout) > 0 {
if s := sWithPrefix(string(stdout), " "); s != "" {
fmt.Println(s)
}
}
if len(stderr) > 0 {
if s := sWithPrefix(string(stderr), " "); s != "" {
fmt.Println(s)
}
}
return err
os.Exit(1)
}
stdout = bytes.TrimSpace(stdout)
......@@ -120,7 +134,7 @@ func (p *App) RunTest(pkgpath string, appArgs ...string) error {
if firstError == nil {
firstError = err
}
if _, ok := err.(*sys.ExitError); ok {
if _, ok := wazero.AsExitError(err); ok {
fmt.Printf("---- %s.%s\n", prog.Manifest.MainPkg, t.Name)
if s := sWithPrefix(string(stdout), " "); s != "" {
fmt.Println(s)
......@@ -150,7 +164,7 @@ func (p *App) RunTest(pkgpath string, appArgs ...string) error {
fmt.Printf("ok %s %v\n", prog.Manifest.MainPkg, time.Now().Sub(startTime).Round(time.Millisecond))
return nil
return
}
func sWithPrefix(s, prefix string) string {
......
......@@ -372,11 +372,7 @@ func Main() {
}
appArgs := c.Args().Slice()[1:]
waApp := app.NewApp(build_Options(c))
err := waApp.RunTest(c.Args().First(), appArgs...)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
waApp.RunTest(c.Args().First(), appArgs...)
return nil
},
},
......
......@@ -114,7 +114,8 @@ func (p *Module) buildModule() error {
WithSysNanosleep().
WithSysNanotime().
WithSysWalltime().
WithArgs(append([]string{p.wasmName}, p.wasmArgs...)...)
WithArgs(append([]string{p.wasmName}, p.wasmArgs...)...).
WithName(p.wasmName)
// TODO: Windows 可能导致异常, 临时屏蔽
if runtime.GOOS != "windows" {
......
package wazero
import (
"github.com/tetratelabs/wazero/sys"
"wa-lang.org/wa/internal/config"
)
......@@ -14,3 +15,11 @@ func RunWasm(cfg *config.Config, wasmName string, wasmBytes []byte, wasmArgs ...
return m.RunMain()
}
func AsExitError(err error) (exitCode int, ok bool) {
errExit, ok := err.(*sys.ExitError)
if ok {
return int(errExit.ExitCode()), true
}
return 0, false
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册