module main // Provide a no-frills implementation of the TestRunner interface: fn vtest_init() { change_test_runner(&TestRunner(SimpleTestRunner{})) } struct SimpleTestRunner { mut: fname string // file_test_info VTestFileMetaInfo fn_test_info VTestFnMetaInfo fn_assert_passes u64 fn_passes u64 fn_fails u64 // total_assert_passes u64 total_assert_fails u64 } fn (mut runner SimpleTestRunner) free() { unsafe { runner.fname.free() runner.fn_test_info.free() runner.file_test_info.free() } } fn normalise_fname(name string) string { return 'fn ' + name.replace('__', '.').replace('main.', '') } fn (mut runner SimpleTestRunner) start(ntests int) { eprintln('SimpleTestRunner testing start; expected: $ntests test functions') } fn (mut runner SimpleTestRunner) finish() { eprintln('SimpleTestRunner testing finish; fn:[passes: $runner.fn_passes, fails: $runner.fn_fails], assert:[passes: $runner.total_assert_passes, fails: $runner.total_assert_fails]') } fn (mut runner SimpleTestRunner) exit_code() int { if runner.fn_fails > 0 { return 1 } return 0 } // fn (mut runner SimpleTestRunner) fn_start() bool { runner.fn_assert_passes = 0 runner.fname = normalise_fname(runner.fn_test_info.name) return true } fn (mut runner SimpleTestRunner) fn_pass() { runner.fn_passes++ } fn (mut runner SimpleTestRunner) fn_fail() { runner.fn_fails++ eprintln('>>> fail $runner.fname') } fn (mut runner SimpleTestRunner) fn_error(line_nr int, file string, mod string, fn_name string, errmsg string) { eprintln('>>> SimpleTestRunner fn_error $runner.fname, line_nr: $line_nr, file: $file, mod: $mod, fn_name: $fn_name, errmsg: $errmsg') } // fn (mut runner SimpleTestRunner) assert_pass(i &VAssertMetaInfo) { runner.total_assert_passes++ runner.fn_assert_passes++ unsafe { i.free() } } fn (mut runner SimpleTestRunner) assert_fail(i &VAssertMetaInfo) { runner.total_assert_fails++ eprintln('> failed assert ${runner.fn_assert_passes + 1} in $runner.fname, assert was in ${normalise_fname(i.fn_name)}, line: ${ i.line_nr + 1}') unsafe { i.free() } }