core: add test-name filters to the vtest harness
run_all() takes an optional substring list; vtest_main forwards argv and a comma-separated $VT_ONLY. No filter => run everything, as before. Makes iterating on one slow end-to-end case (the engine suite) practical without a framework swap. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HPPSGhiArbvQgwC2DNiURS
This commit is contained in:
@@ -81,9 +81,17 @@ std::string show(const T &v) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int run_all() {
|
inline int run_all(const std::vector<std::string> &filters = {}) {
|
||||||
int failed_cases = 0;
|
int failed_cases = 0;
|
||||||
for (const auto &c : registry()) {
|
for (const auto &c : registry()) {
|
||||||
|
if (!filters.empty()) {
|
||||||
|
bool match = false;
|
||||||
|
for (const auto &f : filters)
|
||||||
|
if (std::string_view(c.name).find(f) != std::string_view::npos)
|
||||||
|
match = true;
|
||||||
|
if (!match)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
int before = stats().failures;
|
int before = stats().failures;
|
||||||
stats().current_fatal = false;
|
stats().current_fatal = false;
|
||||||
std::fprintf(stderr, "[ RUN ] %s\n", c.name);
|
std::fprintf(stderr, "[ RUN ] %s\n", c.name);
|
||||||
|
|||||||
@@ -1,6 +1,29 @@
|
|||||||
// vtest_main.cpp — shared entry point for every CORE test binary.
|
// vtest_main.cpp — shared entry point for every CORE test binary.
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "vtest.hpp"
|
#include "vtest.hpp"
|
||||||
|
|
||||||
int main() {
|
// Optional filters: each argv argument (or a comma-separated entry in $VT_ONLY) is a
|
||||||
return ::vt::run_all();
|
// substring; a test runs only if its name contains one of them. No filters => run all.
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
std::vector<std::string> filters;
|
||||||
|
for (int i = 1; i < argc; ++i)
|
||||||
|
filters.emplace_back(argv[i]);
|
||||||
|
if (const char *env = std::getenv("VT_ONLY")) {
|
||||||
|
std::string cur;
|
||||||
|
for (const char *p = env;; ++p) {
|
||||||
|
if (*p == ',' || *p == '\0') {
|
||||||
|
if (!cur.empty())
|
||||||
|
filters.push_back(cur);
|
||||||
|
cur.clear();
|
||||||
|
if (*p == '\0')
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
cur.push_back(*p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ::vt::run_all(filters);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user