Always use std::function for self-tests

Now that there is a register_test variant that accepts std::function,
it seems to me that the 'selftest' struct and accompanying code is
obsolete -- simply always using std::function is simpler.  This patch
implements this idea.
This commit is contained in:
Tom Tromey
2021-09-23 13:09:48 -06:00
parent 4a2f674a68
commit d7c68312bd
2 changed files with 7 additions and 46 deletions

View File

@ -29,35 +29,7 @@ namespace selftests
the order of tests stable and easily looking up whether a test name
exists. */
static std::map<std::string, std::unique_ptr<selftest>> tests;
/* See selftest.h. */
void
register_test (const std::string &name, selftest *test)
{
/* Check that no test with this name already exist. */
gdb_assert (tests.find (name) == tests.end ());
tests[name] = std::unique_ptr<selftest> (test);
}
/* A selftest that calls the test function without arguments. */
struct lambda_selftest : public selftest
{
lambda_selftest (std::function<void(void)> function_)
{
function = function_;
}
void operator() () const override
{
function ();
}
std::function<void(void)> function;
};
static std::map<std::string, std::function<void(void)>> tests;
/* See selftest.h. */
@ -65,7 +37,10 @@ void
register_test (const std::string &name,
std::function<void(void)> function)
{
register_test (name, new lambda_selftest (function));
/* Check that no test with this name already exist. */
gdb_assert (tests.find (name) == tests.end ());
tests[name] = function;
}
/* See selftest.h. */
@ -91,7 +66,7 @@ run_tests (gdb::array_view<const char *const> filters, bool verbose)
for (const auto &pair : tests)
{
const std::string &name = pair.first;
const std::unique_ptr<selftest> &test = pair.second;
const auto &test = pair.second;
bool run = false;
if (filters.empty ())
@ -112,7 +87,7 @@ run_tests (gdb::array_view<const char *const> filters, bool verbose)
{
debug_printf (_("Running selftest %s.\n"), name.c_str ());
++ran;
(*test) ();
test ();
}
catch (const gdb_exception_error &ex)
{

View File

@ -24,29 +24,15 @@
/* A test is just a function that does some checks and throws an
exception if something has gone wrong. */
typedef void self_test_function (void);
namespace selftests
{
/* Interface for the various kinds of selftests. */
struct selftest
{
virtual ~selftest () = default;
virtual void operator() () const = 0;
};
/* True if selftest should run verbosely. */
extern bool run_verbose ();
/* Register a new self-test. */
extern void register_test (const std::string &name, selftest *test);
/* Register a new self-test. */
extern void register_test (const std::string &name,
std::function<void(void)> function);