diff --git a/tests/examples_test.go b/tests/examples_test.go index d1caaec..0ea0e6a 100644 --- a/tests/examples_test.go +++ b/tests/examples_test.go @@ -1,31 +1,21 @@ package tests_test import ( - "os" - "os/exec" "path/filepath" - "strings" "testing" "git.urbach.dev/cli/q/src/build" "git.urbach.dev/cli/q/src/compiler" - "git.urbach.dev/cli/q/src/linker" "git.urbach.dev/go/assert" ) -var examples = []struct { - Name string - Input string - Output string - ExitCode int -}{ +var examples = []testRun{ {"hello", "", "Hello\n", 0}, } func TestExamples(t *testing.T) { for _, test := range examples { - directory := filepath.Join("..", "examples", test.Name) - run(t, directory, test.Input, test.Output, test.ExitCode) + test.Run(t, filepath.Join("..", "examples", test.Name)) } } @@ -40,42 +30,4 @@ func BenchmarkExamples(b *testing.B) { } }) } -} - -// run builds and runs the file to check if the output matches the expected output. -func run(t *testing.T, path string, input string, expectedOutput string, expectedExitCode int) { - b := build.New(path) - env, err := compiler.Compile(b) - assert.Nil(t, err) - - tmpDir := filepath.Join(os.TempDir(), "q", "tests") - err = os.MkdirAll(tmpDir, 0o755) - assert.Nil(t, err) - - executable := b.Executable() - executable = filepath.Join(tmpDir, filepath.Base(executable)) - err = linker.WriteFile(executable, b, env) - assert.Nil(t, err) - - stat, err := os.Stat(executable) - assert.Nil(t, err) - assert.True(t, stat.Size() > 0) - - cmd := exec.Command(executable) - cmd.Stdin = strings.NewReader(input) - output, err := cmd.Output() - exitCode := 0 - - if err != nil { - exitError, ok := err.(*exec.ExitError) - - if !ok { - t.Fatal(exitError) - } - - exitCode = exitError.ExitCode() - } - - assert.Equal(t, exitCode, expectedExitCode) - assert.DeepEqual(t, string(output), expectedOutput) } \ No newline at end of file diff --git a/tests/testRun_test.go b/tests/testRun_test.go new file mode 100644 index 0000000..8faded9 --- /dev/null +++ b/tests/testRun_test.go @@ -0,0 +1,61 @@ +package tests_test + +import ( + "os" + "os/exec" + "path/filepath" + "strings" + "testing" + + "git.urbach.dev/cli/q/src/build" + "git.urbach.dev/cli/q/src/compiler" + "git.urbach.dev/cli/q/src/linker" + "git.urbach.dev/go/assert" +) + +type testRun struct { + Name string + Input string + Output string + ExitCode int +} + +// Run builds and runs the file to check if the output matches the expected output. +func (test *testRun) Run(t *testing.T, path string) { + t.Run(test.Name, func(t *testing.T) { + b := build.New(path) + env, err := compiler.Compile(b) + assert.Nil(t, err) + + tmpDir := filepath.Join(os.TempDir(), "q", "tests") + err = os.MkdirAll(tmpDir, 0o755) + assert.Nil(t, err) + + executable := b.Executable() + executable = filepath.Join(tmpDir, filepath.Base(executable)) + err = linker.WriteFile(executable, b, env) + assert.Nil(t, err) + + stat, err := os.Stat(executable) + assert.Nil(t, err) + assert.True(t, stat.Size() > 0) + + cmd := exec.Command(executable) + cmd.Stdin = strings.NewReader(test.Input) + output, err := cmd.Output() + exitCode := 0 + + if err != nil { + exitError, ok := err.(*exec.ExitError) + + if !ok { + t.Fatal(exitError) + } + + exitCode = exitError.ExitCode() + } + + assert.Equal(t, exitCode, test.ExitCode) + assert.DeepEqual(t, string(output), test.Output) + }) +} \ No newline at end of file diff --git a/tests/tests_test.go b/tests/tests_test.go new file mode 100644 index 0000000..4fb5786 --- /dev/null +++ b/tests/tests_test.go @@ -0,0 +1,15 @@ +package tests_test + +import ( + "testing" +) + +var tests = []testRun{ + {"sum", "", "", 10}, +} + +func TestTests(t *testing.T) { + for _, test := range tests { + test.Run(t, test.Name+".q") + } +} \ No newline at end of file