mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 23:58:50 +00:00
Merge pull request #3141 from laytan/add-all-packages-flag-for-tests
Add `odin test -all-packages` to be able to test an entire project
This commit is contained in:
@@ -423,6 +423,7 @@ struct BuildContext {
|
|||||||
Array<String> extra_packages;
|
Array<String> extra_packages;
|
||||||
|
|
||||||
StringSet test_names;
|
StringSet test_names;
|
||||||
|
bool test_all_packages;
|
||||||
|
|
||||||
gbAffinity affinity;
|
gbAffinity affinity;
|
||||||
isize thread_count;
|
isize thread_count;
|
||||||
|
|||||||
+42
-33
@@ -2368,6 +2368,43 @@ gb_internal void force_add_dependency_entity(Checker *c, Scope *scope, String co
|
|||||||
add_dependency_to_set(c, e);
|
add_dependency_to_set(c, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gb_internal void collect_testing_procedures_of_package(Checker *c, AstPackage *pkg) {
|
||||||
|
AstPackage *testing_package = get_core_package(&c->info, str_lit("testing"));
|
||||||
|
Scope *testing_scope = testing_package->scope;
|
||||||
|
Entity *test_signature = scope_lookup_current(testing_scope, str_lit("Test_Signature"));
|
||||||
|
|
||||||
|
Scope *s = pkg->scope;
|
||||||
|
for (auto const &entry : s->elements) {
|
||||||
|
Entity *e = entry.value;
|
||||||
|
if (e->kind != Entity_Procedure) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((e->flags & EntityFlag_Test) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String name = e->token.string;
|
||||||
|
|
||||||
|
bool is_tester = true;
|
||||||
|
|
||||||
|
Type *t = base_type(e->type);
|
||||||
|
GB_ASSERT(t->kind == Type_Proc);
|
||||||
|
if (are_types_identical(t, base_type(test_signature->type))) {
|
||||||
|
// Good
|
||||||
|
} else {
|
||||||
|
gbString str = type_to_string(t);
|
||||||
|
error(e->token, "Testing procedures must have a signature type of proc(^testing.T), got %s", str);
|
||||||
|
gb_string_free(str);
|
||||||
|
is_tester = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_tester) {
|
||||||
|
add_dependency_to_set(c, e);
|
||||||
|
array_add(&c->info.testing_procedures, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gb_internal void generate_minimum_dependency_set_internal(Checker *c, Entity *start) {
|
gb_internal void generate_minimum_dependency_set_internal(Checker *c, Entity *start) {
|
||||||
for_array(i, c->info.definitions) {
|
for_array(i, c->info.definitions) {
|
||||||
@@ -2471,41 +2508,13 @@ gb_internal void generate_minimum_dependency_set_internal(Checker *c, Entity *st
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Entity *test_signature = scope_lookup_current(testing_scope, str_lit("Test_Signature"));
|
|
||||||
|
|
||||||
|
|
||||||
AstPackage *pkg = c->info.init_package;
|
AstPackage *pkg = c->info.init_package;
|
||||||
Scope *s = pkg->scope;
|
collect_testing_procedures_of_package(c, pkg);
|
||||||
|
|
||||||
for (auto const &entry : s->elements) {
|
if (build_context.test_all_packages) {
|
||||||
Entity *e = entry.value;
|
for (auto const &entry : c->info.packages) {
|
||||||
if (e->kind != Entity_Procedure) {
|
AstPackage *pkg = entry.value;
|
||||||
continue;
|
collect_testing_procedures_of_package(c, pkg);
|
||||||
}
|
|
||||||
|
|
||||||
if ((e->flags & EntityFlag_Test) == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String name = e->token.string;
|
|
||||||
|
|
||||||
bool is_tester = true;
|
|
||||||
|
|
||||||
Type *t = base_type(e->type);
|
|
||||||
GB_ASSERT(t->kind == Type_Proc);
|
|
||||||
if (are_types_identical(t, base_type(test_signature->type))) {
|
|
||||||
// Good
|
|
||||||
} else {
|
|
||||||
gbString str = type_to_string(t);
|
|
||||||
error(e->token, "Testing procedures must have a signature type of proc(^testing.T), got %s", str);
|
|
||||||
gb_string_free(str);
|
|
||||||
is_tester = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_tester) {
|
|
||||||
add_dependency_to_set(c, e);
|
|
||||||
array_add(&c->info.testing_procedures, e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (start != nullptr) {
|
} else if (start != nullptr) {
|
||||||
|
|||||||
+6
-1
@@ -473,7 +473,7 @@ gb_internal bool parse_build_flags(Array<String> args) {
|
|||||||
add_flag(&build_flags, BuildFlag_ObfuscateSourceCodeLocations, str_lit("obfuscate-source-code-locations"), BuildFlagParam_None, Command__does_build);
|
add_flag(&build_flags, BuildFlag_ObfuscateSourceCodeLocations, str_lit("obfuscate-source-code-locations"), BuildFlagParam_None, Command__does_build);
|
||||||
|
|
||||||
add_flag(&build_flags, BuildFlag_Short, str_lit("short"), BuildFlagParam_None, Command_doc);
|
add_flag(&build_flags, BuildFlag_Short, str_lit("short"), BuildFlagParam_None, Command_doc);
|
||||||
add_flag(&build_flags, BuildFlag_AllPackages, str_lit("all-packages"), BuildFlagParam_None, Command_doc);
|
add_flag(&build_flags, BuildFlag_AllPackages, str_lit("all-packages"), BuildFlagParam_None, Command_doc | Command_test);
|
||||||
add_flag(&build_flags, BuildFlag_DocFormat, str_lit("doc-format"), BuildFlagParam_None, Command_doc);
|
add_flag(&build_flags, BuildFlag_DocFormat, str_lit("doc-format"), BuildFlagParam_None, Command_doc);
|
||||||
|
|
||||||
add_flag(&build_flags, BuildFlag_IgnoreWarnings, str_lit("ignore-warnings"), BuildFlagParam_None, Command_all);
|
add_flag(&build_flags, BuildFlag_IgnoreWarnings, str_lit("ignore-warnings"), BuildFlagParam_None, Command_all);
|
||||||
@@ -1149,6 +1149,7 @@ gb_internal bool parse_build_flags(Array<String> args) {
|
|||||||
break;
|
break;
|
||||||
case BuildFlag_AllPackages:
|
case BuildFlag_AllPackages:
|
||||||
build_context.cmd_doc_flags |= CmdDocFlag_AllPackages;
|
build_context.cmd_doc_flags |= CmdDocFlag_AllPackages;
|
||||||
|
build_context.test_all_packages = true;
|
||||||
break;
|
break;
|
||||||
case BuildFlag_DocFormat:
|
case BuildFlag_DocFormat:
|
||||||
build_context.cmd_doc_flags |= CmdDocFlag_DocFormat;
|
build_context.cmd_doc_flags |= CmdDocFlag_DocFormat;
|
||||||
@@ -1908,6 +1909,10 @@ gb_internal void print_show_help(String const arg0, String const &command) {
|
|||||||
print_usage_line(1, "-test-name:<string>");
|
print_usage_line(1, "-test-name:<string>");
|
||||||
print_usage_line(2, "Runs specific test only by name.");
|
print_usage_line(2, "Runs specific test only by name.");
|
||||||
print_usage_line(0, "");
|
print_usage_line(0, "");
|
||||||
|
|
||||||
|
print_usage_line(1, "-all-packages");
|
||||||
|
print_usage_line(2, "Tests all packages imported into the given initial package.");
|
||||||
|
print_usage_line(0, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (run_or_build) {
|
if (run_or_build) {
|
||||||
|
|||||||
Reference in New Issue
Block a user