native test framework
This commit is contained in:
@@ -12778,3 +12778,101 @@ main func() void {
|
||||
testing.expect(t, types.is_slice(nested_field, &hir_module.types))
|
||||
testing.expect_value(t, types.child_type(nested_field, &hir_module.types), types.INT)
|
||||
}
|
||||
|
||||
@(test)
|
||||
parser_records_native_tests_and_test_imports :: proc(t: ^testing.T) {
|
||||
text := `test import "../math"
|
||||
|
||||
addition test {
|
||||
return
|
||||
}
|
||||
`
|
||||
source_file := source.Source{path="tests.bro", text=text}
|
||||
diagnostics := source.init_diagnostics(&source_file)
|
||||
defer source.destroy_diagnostics(&diagnostics)
|
||||
symbols := symbol.init_table()
|
||||
defer symbol.destroy_table(&symbols)
|
||||
stream := lexer.lex(&source_file, &diagnostics, &symbols)
|
||||
defer delete(stream.items)
|
||||
module := parser.parse(&stream, &source_file, &diagnostics)
|
||||
defer ast.destroy_module(&module)
|
||||
|
||||
testing.expect_value(t, len(diagnostics.items), 0)
|
||||
testing.expect_value(t, len(module.imports), 1)
|
||||
testing.expect(t, module.imports[0].test_only)
|
||||
testing.expect_value(t, module.imports[0].alias, symbol.INVALID)
|
||||
testing.expect_value(t, len(module.functions), 1)
|
||||
testing.expect(t, module.functions[0].test)
|
||||
testing.expect_value(t, symbol.resolve(&symbols, module.functions[0].name), "addition")
|
||||
}
|
||||
|
||||
@(test)
|
||||
native_test_framework_discovers_reports_and_preserves_main :: proc(t: ^testing.T) {
|
||||
directory := "/tmp/brolang-test-native-framework"
|
||||
root := "/tmp/brolang-test-native-framework/root"
|
||||
dependency := "/tmp/brolang-test-native-framework/dependency"
|
||||
root_path := "/tmp/brolang-test-native-framework/root/main.bro"
|
||||
dependency_path := "/tmp/brolang-test-native-framework/dependency/math.bro"
|
||||
test_output := "/tmp/brolang-test-native-framework-tests"
|
||||
app_output := "/tmp/brolang-test-native-framework-app"
|
||||
_ = os2.remove_all(directory)
|
||||
defer _ = os2.remove_all(directory)
|
||||
defer _ = os.remove(test_output)
|
||||
defer _ = os.remove(app_output)
|
||||
testing.expect(t, os2.make_directory_all(root) == nil)
|
||||
testing.expect(t, os2.make_directory_all(dependency) == nil)
|
||||
|
||||
root_text := `testing :: import "@std/testing"
|
||||
|
||||
test import "../dependency"
|
||||
|
||||
main func() i32 { return 77 }
|
||||
|
||||
root_passes test {
|
||||
try testing.expect(true)
|
||||
}
|
||||
|
||||
root_fails test {
|
||||
try testing.expect_equal(42, 41)
|
||||
}
|
||||
|
||||
root_continues test {
|
||||
try testing.expect(true)
|
||||
}
|
||||
`
|
||||
dependency_text := `testing :: import "@std/testing"
|
||||
|
||||
dependency_passes test {
|
||||
try testing.expect(true)
|
||||
}
|
||||
`
|
||||
testing.expect(t, os.write_entire_file(root_path, transmute([]byte)root_text))
|
||||
testing.expect(t, os.write_entire_file(dependency_path, transmute([]byte)dependency_text))
|
||||
|
||||
app_status := compiler_core.compile_package(
|
||||
root, app_output, nil, target.DEFAULT, cimport.Options{}, ".",
|
||||
)
|
||||
testing.expect_value(t, app_status, 0)
|
||||
app_state := run_executable(app_output)
|
||||
testing.expect_value(t, app_state.exit_code, 77)
|
||||
|
||||
test_status := compiler_core.compile_package(
|
||||
root, test_output, nil, target.DEFAULT, cimport.Options{}, ".", .Test,
|
||||
)
|
||||
testing.expect_value(t, test_status, 0)
|
||||
state, stdout, stderr, _ := os2.process_exec(
|
||||
os2.Process_Desc{command=[]string{test_output}},
|
||||
context.allocator,
|
||||
)
|
||||
defer delete(stdout)
|
||||
defer delete(stderr)
|
||||
output := string(stderr)
|
||||
testing.expect_value(t, state.exit_code, 1)
|
||||
testing.expect(t, strings.contains(output, "PASS root.root_passes"))
|
||||
testing.expect(t, strings.contains(output, "FAIL root.root_fails"))
|
||||
testing.expect(t, strings.contains(output, "expected 42, found 41"))
|
||||
testing.expect(t, strings.contains(output, "PASS root.root_continues"))
|
||||
testing.expect(t, strings.contains(output, "PASS dependency.dependency_passes"))
|
||||
testing.expect(t, strings.contains(output, root_path))
|
||||
testing.expect(t, strings.contains(output, "3 passed, 1 failed"))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user