main: add tests
Add testing infrastructure and one initial test (for src/runtime/print.go). More tests to be added later.
Этот коммит содержится в:
родитель
ed227b8fd3
коммит
d8f0ddf3fa
3 изменённых файлов: 150 добавлений и 0 удалений
91
main_test.go
Обычный файл
91
main_test.go
Обычный файл
|
@ -0,0 +1,91 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
// This file tests the compiler by running Go files in testdata/*.go and
|
||||||
|
// comparing their output with the expected output in testdata/*.txt.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
const TESTDATA = "testdata"
|
||||||
|
|
||||||
|
func TestCompiler(t *testing.T) {
|
||||||
|
matches, err := filepath.Glob(TESTDATA + "/*.go")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("could not read test files:", err)
|
||||||
|
}
|
||||||
|
if len(matches) == 0 {
|
||||||
|
t.Fatal("no test files found")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a temporary directory for test output files.
|
||||||
|
tmpdir, err := ioutil.TempDir("", "tinygo-test")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("could not create temporary directory:", err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tmpdir)
|
||||||
|
|
||||||
|
for _, path := range matches {
|
||||||
|
t.Run(path, func(t *testing.T) {
|
||||||
|
runTest(path, tmpdir, t)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func runTest(path, tmpdir string, t *testing.T) {
|
||||||
|
// Get the expected output for this test.
|
||||||
|
txtpath := path[:len(path)-3] + ".txt"
|
||||||
|
f, err := os.Open(txtpath)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("could not open expected output file:", err)
|
||||||
|
}
|
||||||
|
expected, err := ioutil.ReadAll(f)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("could not read expected output file:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build the test binary.
|
||||||
|
binary := filepath.Join(tmpdir, "test")
|
||||||
|
err = Build(path, binary, "", false, false, "")
|
||||||
|
if err != nil {
|
||||||
|
t.Log("failed to build:", err)
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the test.
|
||||||
|
cmd := exec.Command(binary)
|
||||||
|
stdout := &bytes.Buffer{}
|
||||||
|
cmd.Stdout = stdout
|
||||||
|
err = cmd.Run()
|
||||||
|
|
||||||
|
// putchar() prints CRLF, convert it to LF.
|
||||||
|
actual := bytes.Replace(stdout.Bytes(), []byte{'\r', '\n'}, []byte{'\n'}, -1)
|
||||||
|
|
||||||
|
// Check whether the command ran successfully.
|
||||||
|
fail := false
|
||||||
|
if err != nil {
|
||||||
|
t.Log("failed to run:", err)
|
||||||
|
fail = true
|
||||||
|
} else if !bytes.Equal(expected, actual) {
|
||||||
|
t.Log("output did not match")
|
||||||
|
fail = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if fail {
|
||||||
|
r := bufio.NewReader(bytes.NewReader(actual))
|
||||||
|
for {
|
||||||
|
line, err := r.ReadString('\n')
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
t.Log("stdout:", line[:len(line)-1])
|
||||||
|
}
|
||||||
|
t.Fail()
|
||||||
|
}
|
||||||
|
}
|
39
testdata/print.go
предоставленный
Обычный файл
39
testdata/print.go
предоставленный
Обычный файл
|
@ -0,0 +1,39 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// test basic printing
|
||||||
|
println("hello world!")
|
||||||
|
println(42)
|
||||||
|
println(100000000)
|
||||||
|
|
||||||
|
// check that this one doesn't print an extra space between args
|
||||||
|
print("a", "b", "c")
|
||||||
|
println()
|
||||||
|
// ..but this one does
|
||||||
|
println("a", "b", "c")
|
||||||
|
|
||||||
|
// print integers
|
||||||
|
println(uint8(123))
|
||||||
|
println(int8(123))
|
||||||
|
println(int8(-123))
|
||||||
|
println(uint16(12345))
|
||||||
|
println(int16(12345))
|
||||||
|
println(int16(-12345))
|
||||||
|
println(uint32(12345678))
|
||||||
|
println(int32(12345678))
|
||||||
|
println(int32(-12345678))
|
||||||
|
println(uint64(123456789012))
|
||||||
|
println(int64(123456789012))
|
||||||
|
println(int64(-123456789012))
|
||||||
|
|
||||||
|
// print float64
|
||||||
|
println(3.14)
|
||||||
|
|
||||||
|
// print map
|
||||||
|
println(map[string]int{"three": 3, "five": 5})
|
||||||
|
|
||||||
|
// TODO: print pointer
|
||||||
|
|
||||||
|
// print bool
|
||||||
|
println(true, false)
|
||||||
|
}
|
20
testdata/print.txt
предоставленный
Обычный файл
20
testdata/print.txt
предоставленный
Обычный файл
|
@ -0,0 +1,20 @@
|
||||||
|
hello world!
|
||||||
|
42
|
||||||
|
100000000
|
||||||
|
abc
|
||||||
|
a b c
|
||||||
|
123
|
||||||
|
123
|
||||||
|
-123
|
||||||
|
12345
|
||||||
|
12345
|
||||||
|
-12345
|
||||||
|
12345678
|
||||||
|
12345678
|
||||||
|
-12345678
|
||||||
|
123456789012
|
||||||
|
123456789012
|
||||||
|
-123456789012
|
||||||
|
+3.140000e+000
|
||||||
|
map[2]
|
||||||
|
true false
|
Загрузка…
Создание таблицы
Сослаться в новой задаче