| /* GDB self-testing. | 
 |    Copyright (C) 2016-2023 Free Software Foundation, Inc. | 
 |  | 
 |    This file is part of GDB. | 
 |  | 
 |    This program is free software; you can redistribute it and/or modify | 
 |    it under the terms of the GNU General Public License as published by | 
 |    the Free Software Foundation; either version 3 of the License, or | 
 |    (at your option) any later version. | 
 |  | 
 |    This program is distributed in the hope that it will be useful, | 
 |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |    GNU General Public License for more details. | 
 |  | 
 |    You should have received a copy of the GNU General Public License | 
 |    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ | 
 |  | 
 | #ifndef COMMON_SELFTEST_H | 
 | #define COMMON_SELFTEST_H | 
 |  | 
 | #include "gdbsupport/array-view.h" | 
 | #include "gdbsupport/function-view.h" | 
 | #include "gdbsupport/iterator-range.h" | 
 | #include <set> | 
 | #include <vector> | 
 |  | 
 | /* A test is just a function that does some checks and throws an | 
 |    exception if something has gone wrong.  */ | 
 |  | 
 | namespace selftests | 
 | { | 
 |  | 
 | /* Selftests are registered under a unique name.  */ | 
 |  | 
 | struct selftest | 
 | { | 
 |   selftest (std::string name, std::function<void (void)> test) | 
 |     : name { std::move (name) }, test { std::move (test) } | 
 |   { } | 
 |   bool operator< (const selftest &rhs) const | 
 |   { return name < rhs.name; } | 
 |  | 
 |   std::string name; | 
 |   std::function<void (void)> test; | 
 | }; | 
 |  | 
 | /* Type of the container of all the registered selftests.  */ | 
 | using selftests_registry = std::set<selftest>; | 
 | using selftests_range = iterator_range<selftests_registry::const_iterator>; | 
 |  | 
 | /* Create a range to iterate over all registered tests.  */ | 
 |  | 
 | selftests_range all_selftests (); | 
 |  | 
 | /* True if selftest should run verbosely.  */ | 
 |  | 
 | extern bool run_verbose (); | 
 |  | 
 | /* Register a new self-test.  */ | 
 |  | 
 | extern void register_test (const std::string &name, | 
 | 			   std::function<void(void)> function); | 
 |  | 
 | /* A selftest generator is a callback function used to delay the generation | 
 |    of selftests.  */ | 
 |  | 
 | using selftests_generator = std::function<std::vector<selftest> (void)>; | 
 |  | 
 | /* Register a function which can lazily register selftests once GDB is fully | 
 |    initialized. */ | 
 |  | 
 | extern void add_lazy_generator (selftests_generator generator); | 
 |  | 
 | /* Run all the self tests.  This print a message describing the number | 
 |    of test and the number of failures. | 
 |  | 
 |    If FILTERS is not empty, only run tests with names containing one of the | 
 |    element of FILTERS.  */ | 
 |  | 
 | extern void run_tests (gdb::array_view<const char *const> filters, | 
 | 		       bool verbose = false); | 
 |  | 
 | /* Reset GDB or GDBserver's internal state.  */ | 
 | extern void reset (); | 
 | } | 
 |  | 
 | /* Check that VALUE is true, and, if not, throw an exception.  */ | 
 |  | 
 | #define SELF_CHECK(VALUE)						\ | 
 |   do {									\ | 
 |     if (!(VALUE))							\ | 
 |       error (_("self-test failed at %s:%d"), __FILE__, __LINE__);	\ | 
 |   } while (0) | 
 |  | 
 | #endif /* COMMON_SELFTEST_H */ |