7 : _numberOfSuccessfulTests(0)
8 , _numberOfFailedTests(0)
9 , _nameOfCurrentTest() {
12 void UnitTest::check(const char* subtestName
, bool success
) {
14 _numberOfSuccessfulTests
++;
17 _numberOfFailedTests
++;
18 if (_nameOfCurrentTest
.size() == 0)
19 printf("FAILED unnamed test/%s\n", subtestName
);
21 printf("FAILED: test %s/%s\n", _nameOfCurrentTest
.c_str(), subtestName
);
23 void UnitTest::run(std::string
const &testName
, void (*testFnc
)(UnitTest
&)) {
24 printf("test started: %s\n", testName
.c_str());
25 _nameOfCurrentTest
= testName
;
28 } catch (const char* msg
) {
29 _numberOfFailedTests
++;
30 printf("FAILED: test %s crashed: %s\n", _nameOfCurrentTest
.c_str(), msg
);
32 _numberOfFailedTests
++;
33 printf("FAILED: test %s crashed\n", _nameOfCurrentTest
.c_str());
35 printf("test ended: %s\n", testName
.c_str());
37 // --------------------------------
38 UnitTestRegistry
* UnitTestRegistry::get() {
39 static UnitTestRegistry
* instance
= nullptr;
40 // TODO: this isn't thread-safe. do we care?
41 if (instance
== nullptr) {
42 instance
= new UnitTestRegistry
;
47 UnitTestRegistry::UnitTestRegistry() {
50 void UnitTestRegistry::registerTest(std::string
const &testName
, void (*testFnc
)(UnitTest
&)) {
51 // TODO: this isn't thread-safe. do we care?
52 _tests
.push_back(std::make_pair(testName
, testFnc
));
54 void UnitTestRegistry::runTests(UnitTest
& t
) {
55 printf("tests start\n");
56 for (listType::iterator i
= _tests
.begin(), e
= _tests
.end(); i
!= e
; ++i
) {
58 t
.run(i
->first
, i
->second
);
62 printf("tests finished\n");
64 UnitTestRun::UnitTestRun(std::string
const &testName
, void (*testFnc
)(UnitTest
&)) {
65 UnitTestRegistry::get()->registerTest(testName
, testFnc
);