diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 35f7afde1..59fee7e0e 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -4,6 +4,7 @@ package testing import "core:io" import "core:os" import "core:strings" +import "core:slice" reset_t :: proc(t: ^T) { clear(&t.cleanups); @@ -28,6 +29,15 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { total_success_count := 0; total_test_count := len(internal_tests); + slice.sort_by(internal_tests, proc(a, b: Internal_Test) -> bool { + if a.pkg < b.pkg { + return true; + } + return a.name < b.name; + }); + + prev_pkg := ""; + for it in internal_tests { if it.p == nil { total_test_count -= 1; @@ -40,7 +50,12 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { name := strings.trim_prefix(it.name, "test_"); - logf(t, "[Test: %q]", name); + if prev_pkg != it.pkg { + prev_pkg = it.pkg; + logf(t, "[Package: %s]", it.pkg); + } + + logf(t, "[Test: %s]", name); // TODO(bill): Catch panics { @@ -48,9 +63,9 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { } if t.error_count != 0 { - logf(t, "[%q : FAILURE]", name); + logf(t, "[%s : FAILURE]", name); } else { - logf(t, "[%q : SUCCESS]", name); + logf(t, "[%s : SUCCESS]", name); total_success_count += 1; } } diff --git a/core/testing/testing.odin b/core/testing/testing.odin index d9d4a53a3..a431d8575 100644 --- a/core/testing/testing.odin +++ b/core/testing/testing.odin @@ -3,9 +3,12 @@ package testing import "core:fmt" import "core:io" +// IMPORTANT NOTE: Compiler requires this layout Test_Signature :: proc(^T); +// IMPORTANT NOTE: Compiler requires this layout Internal_Test :: struct { + pkg: string, name: string, p: Test_Signature, } diff --git a/src/ir.cpp b/src/ir.cpp index 3022fd869..5e91d4f30 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -12941,13 +12941,20 @@ void ir_gen_tree(irGen *s) { irValue **found = map_get(&m->values, hash_entity(testing_proc)); GB_ASSERT(found != nullptr); + String pkg_name = {}; + if (testing_proc->pkg != nullptr) { + pkg_name = testing_proc->pkg->name; + } + irValue *v_pkg = ir_find_or_add_entity_string(m, pkg_name); irValue *v_name = ir_find_or_add_entity_string(m, name); irValue *v_p = *found; irValue *elem_ptr = ir_emit_array_epi(proc, all_tests_array, cast(i32)i); - irValue *name_ptr = ir_emit_struct_ep(proc, elem_ptr, 0); - irValue *p_ptr = ir_emit_struct_ep(proc, elem_ptr, 1); + irValue *pkg_ptr = ir_emit_struct_ep(proc, elem_ptr, 0); + irValue *name_ptr = ir_emit_struct_ep(proc, elem_ptr, 1); + irValue *p_ptr = ir_emit_struct_ep(proc, elem_ptr, 2); + ir_emit_store(proc, pkg_ptr, v_pkg); ir_emit_store(proc, name_ptr, v_name); ir_emit_store(proc, p_ptr, v_p); } diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index ef08edaa4..eee0d2445 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -12909,16 +12909,23 @@ void lb_generate_code(lbGenerator *gen) { lbValue *found = map_get(&m->values, hash_entity(testing_proc)); GB_ASSERT(found != nullptr); + String pkg_name = {}; + if (testing_proc->pkg != nullptr) { + pkg_name = testing_proc->pkg->name; + } + lbValue v_pkg = lb_find_or_add_entity_string(m, pkg_name); lbValue v_name = lb_find_or_add_entity_string(m, name); lbValue v_proc = *found; indices[1] = LLVMConstInt(lb_type(m, t_int), i, false); - LLVMValueRef vals[2] = {}; - vals[0] = v_name.value; - vals[1] = v_proc.value; + LLVMValueRef vals[3] = {}; + vals[0] = v_pkg.value; + vals[1] = v_name.value; + vals[2] = v_proc.value; GB_ASSERT(LLVMIsConstant(vals[0])); GB_ASSERT(LLVMIsConstant(vals[1])); + GB_ASSERT(LLVMIsConstant(vals[2])); LLVMValueRef dst = LLVMConstInBoundsGEP(all_tests_array.value, indices, gb_count_of(indices)); LLVMValueRef src = LLVMConstNamedStruct(lbt_Internal_Test, vals, gb_count_of(vals));