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 | ||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Ayke van Laethem
						Ayke van Laethem