Skip to content

Commit

Permalink
Try fixing uninitialized tests with an extra layer of classes
Browse files Browse the repository at this point in the history
  • Loading branch information
tylerkaraszewski committed Aug 1, 2024
1 parent 142a943 commit 56eb27f
Show file tree
Hide file tree
Showing 2 changed files with 152 additions and 134 deletions.
82 changes: 40 additions & 42 deletions test/lib/tpunit++.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,17 @@
#include <chrono>
using namespace tpunit;

bool tpunit::TestFixture::exitFlag = false;
bool tpunit::_TestFixture::exitFlag = false;
thread_local string tpunit::currentTestName;
thread_local tpunit::TestFixture* tpunit::currentTestPtr = nullptr;
thread_local tpunit::_TestFixture* tpunit::currentTestPtr = nullptr;
thread_local mutex tpunit::currentTestNameMutex;

thread_local int tpunit::TestFixture::perFixtureStats::_assertions = 0;
thread_local int tpunit::TestFixture::perFixtureStats::_exceptions = 0;
thread_local int tpunit::TestFixture::perFixtureStats::_traces = 0;
thread_local int tpunit::_TestFixture::perFixtureStats::_assertions = 0;
thread_local int tpunit::_TestFixture::perFixtureStats::_exceptions = 0;
thread_local int tpunit::_TestFixture::perFixtureStats::_traces = 0;

tpunit::TestFixture::method::method(TestFixture* obj, void (TestFixture::*addr)(), const char* name, unsigned char type)
// The following pragma lines disable a specific uninitialized variable warning specifically for clang. Ideally we remove this,
// but it likely means changing the way we invoke every single test (not just in bedrock, but all other repos that use this test framework).
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wuninitialized"
tpunit::_TestFixture::method::method(_TestFixture* obj, void (_TestFixture::*addr)(), const char* name, unsigned char type)
: _this(obj)
#pragma clang diagnostic pop
, _addr(addr)
, _type(type)
, _next(0) {
Expand All @@ -31,20 +26,26 @@ tpunit::TestFixture::method::method(TestFixture* obj, void (TestFixture::*addr)(
*dest = 0;
}

tpunit::TestFixture::method::~method() {
tpunit::_TestFixture::method::~method() {
delete _next;
}

tpunit::TestFixture::stats::stats()
tpunit::_TestFixture::stats::stats()
: _failures(0)
, _passes(0)
{}

tpunit::TestFixture::perFixtureStats::perFixtureStats()
tpunit::_TestFixture::perFixtureStats::perFixtureStats()
{
}

tpunit::TestFixture::TestFixture(method* m0, method* m1, method* m2, method* m3, method* m4,
tpunit::_TestFixture::_TestFixture(const char* name, bool parallel)
: _name(name),
_parallel(parallel)
{
}

void tpunit::_TestFixture::registerTests(method* m0, method* m1, method* m2, method* m3, method* m4,
method* m5, method* m6, method* m7, method* m8, method* m9,
method* m10, method* m11, method* m12, method* m13, method* m14,
method* m15, method* m16, method* m17, method* m18, method* m19,
Expand All @@ -57,10 +58,7 @@ tpunit::TestFixture::TestFixture(method* m0, method* m1, method* m2, method*
method* m50, method* m51, method* m52, method* m53, method* m54,
method* m55, method* m56, method* m57, method* m58, method* m59,
method* m60, method* m61, method* m62, method* m63, method* m64,
method* m65, method* m66, method* m67, method* m68, method* m69,
const char* name, bool parallel)
: _name(name),
_parallel(parallel)
method* m65, method* m66, method* m67, method* m68, method* m69)
{
tpunit_detail_fixture_list()->push_back(this);

Expand Down Expand Up @@ -94,21 +92,21 @@ tpunit::TestFixture::TestFixture(method* m0, method* m1, method* m2, method*
_mutex = 0;
}

tpunit::TestFixture::~TestFixture() {
tpunit::_TestFixture::~_TestFixture() {
delete _afters;
delete _after_classes;
delete _befores;
delete _before_classes;
delete _tests;
}

int tpunit::TestFixture::tpunit_detail_do_run(int threads, std::function<void()> threadInitFunction) {
int tpunit::_TestFixture::tpunit_detail_do_run(int threads, std::function<void()> threadInitFunction) {
const std::set<std::string> include, exclude;
const std::list<std::string> before, after;
return tpunit_detail_do_run(include, exclude, before, after, threads, threadInitFunction);
}

void tpunit::TestFixture::tpunit_run_test_class(TestFixture* f) {
void tpunit::_TestFixture::tpunit_run_test_class(_TestFixture* f) {
f->_stats._assertions = 0;
f->_stats._exceptions = 0;
tpunit_detail_do_methods(f->_before_classes);
Expand All @@ -129,7 +127,7 @@ void tpunit::TestFixture::tpunit_run_test_class(TestFixture* f) {
}
}

int tpunit::TestFixture::tpunit_detail_do_run(const set<string>& include, const set<string>& exclude,
int tpunit::_TestFixture::tpunit_detail_do_run(const set<string>& include, const set<string>& exclude,
const list<string>& before, const list<string>& after, int threads,
std::function<void()> threadInitFunction) {
threadInitFunction();
Expand All @@ -138,8 +136,8 @@ int tpunit::TestFixture::tpunit_detail_do_run(const set<string>& include, const
* run unless it's in 'exclude'. If 'include' has at least one entry,
* then only tests in 'include' are run, and 'exclude' is ignored.
*/
std::list<TestFixture*> testFixtureList = *tpunit_detail_fixture_list();
testFixtureList.sort([&](TestFixture* a, TestFixture* b) {
std::list<_TestFixture*> testFixtureList = *tpunit_detail_fixture_list();
testFixtureList.sort([&](_TestFixture* a, _TestFixture* b) {
if (a->_name && b->_name) {
return strcmp(a->_name, b->_name) < 0;
}
Expand Down Expand Up @@ -179,7 +177,7 @@ int tpunit::TestFixture::tpunit_detail_do_run(const set<string>& include, const
_exclude.insert(name);
}

list<TestFixture*> afterTests;
list<_TestFixture*> afterTests;
mutex testTimeLock;
multimap<chrono::milliseconds, string> testTimes;

Expand All @@ -193,7 +191,7 @@ int tpunit::TestFixture::tpunit_detail_do_run(const set<string>& include, const
try {
// Do test.
while (1) {
TestFixture* f = 0;
_TestFixture* f = 0;
{
lock_guard<recursive_mutex> lock(m);
if (testFixtureList.empty()) {
Expand Down Expand Up @@ -333,7 +331,7 @@ int tpunit::TestFixture::tpunit_detail_do_run(const set<string>& include, const
return 1;
}

bool tpunit::TestFixture::tpunit_detail_fp_equal(float lhs, float rhs, unsigned char ulps) {
bool tpunit::_TestFixture::tpunit_detail_fp_equal(float lhs, float rhs, unsigned char ulps) {
union {
float f;
char c[4];
Expand All @@ -360,7 +358,7 @@ bool tpunit::TestFixture::tpunit_detail_fp_equal(float lhs, float rhs, unsigned
((lhs_u.c[lsb] > rhs_u.c[lsb]) ? lhs_u.c[lsb] - rhs_u.c[lsb] : rhs_u.c[lsb] - lhs_u.c[lsb]) <= ulps;
}

bool tpunit::TestFixture::tpunit_detail_fp_equal(double lhs, double rhs, unsigned char ulps) {
bool tpunit::_TestFixture::tpunit_detail_fp_equal(double lhs, double rhs, unsigned char ulps) {
union {
double d;
char c[8];
Expand Down Expand Up @@ -398,25 +396,25 @@ bool tpunit::TestFixture::tpunit_detail_fp_equal(double lhs, double rhs, unsigne
((lhs_u.c[lsb] > rhs_u.c[lsb]) ? lhs_u.c[lsb] - rhs_u.c[lsb] : rhs_u.c[lsb] - lhs_u.c[lsb]) <= ulps;
}

void tpunit::TestFixture::tpunit_detail_assert(TestFixture* f, const char* _file, int _line) {
void tpunit::_TestFixture::tpunit_detail_assert(_TestFixture* f, const char* _file, int _line) {
lock_guard<recursive_mutex> lock(*(f->_mutex));
printf(" assertion #%i at %s:%i\n", ++f->_stats._assertions, _file, _line);
f->printTestBuffer();
}

void tpunit::TestFixture::tpunit_detail_exception(TestFixture* f, method* _method, const char* _message) {
void tpunit::_TestFixture::tpunit_detail_exception(_TestFixture* f, method* _method, const char* _message) {
lock_guard<recursive_mutex> lock(*(f->_mutex));
printf(" exception #%i from %s with cause: %s\n", ++f->_stats._exceptions, _method->_name, _message);
f->printTestBuffer();
}

void tpunit::TestFixture::tpunit_detail_trace(TestFixture* f, const char* _file, int _line, const char* _message) {
void tpunit::_TestFixture::tpunit_detail_trace(_TestFixture* f, const char* _file, int _line, const char* _message) {
lock_guard<recursive_mutex> lock(*(f->_mutex));
printf(" trace #%i at %s:%i: %s\n", ++f->_stats._traces, _file, _line, _message);
f->printTestBuffer();
}

void tpunit::TestFixture::tpunit_detail_do_method(tpunit::TestFixture::method* m) {
void tpunit::_TestFixture::tpunit_detail_do_method(tpunit::_TestFixture::method* m) {
try {
// If we're exiting, then don't try and run any more tests.
if (exitFlag) {
Expand All @@ -438,14 +436,14 @@ void tpunit::TestFixture::tpunit_detail_do_method(tpunit::TestFixture::method* m
}
}

void tpunit::TestFixture::tpunit_detail_do_methods(tpunit::TestFixture::method* m) {
void tpunit::_TestFixture::tpunit_detail_do_methods(tpunit::_TestFixture::method* m) {
while (m) {
tpunit_detail_do_method(m);
m = m->_next;
}
}

void tpunit::TestFixture::tpunit_detail_do_tests(TestFixture* f) {
void tpunit::_TestFixture::tpunit_detail_do_tests(_TestFixture* f) {
method* t = f->_tests;
list<thread> testThreads;
while(t) {
Expand Down Expand Up @@ -499,35 +497,35 @@ void tpunit::TestFixture::tpunit_detail_do_tests(TestFixture* f) {
}
}

void tpunit::TestFixture::TESTINFO(const string& newLog) {
void tpunit::_TestFixture::TESTINFO(const string& newLog) {
lock_guard<recursive_mutex> lock(*(_mutex));

// Format the buffer with an indent as we print it out.
testOutputBuffer += " " + newLog + "\n";
}

void tpunit::TestFixture::printTestBuffer() {
void tpunit::_TestFixture::printTestBuffer() {
lock_guard<recursive_mutex> lock(*(_mutex));

cout << testOutputBuffer;
testOutputBuffer = "";
}

tpunit::TestFixture::stats& tpunit::TestFixture::tpunit_detail_stats() {
tpunit::_TestFixture::stats& tpunit::_TestFixture::tpunit_detail_stats() {
static stats _stats;
return _stats;
}

list<tpunit::TestFixture*>* tpunit::TestFixture::tpunit_detail_fixture_list() {
static list<TestFixture*>* _fixtureList = new list<TestFixture*>;
list<tpunit::_TestFixture*>* tpunit::_TestFixture::tpunit_detail_fixture_list() {
static list<_TestFixture*>* _fixtureList = new list<_TestFixture*>;
return _fixtureList;
}

int tpunit::Tests::run(int threads, std::function<void()> threadInitFunction) {
return TestFixture::tpunit_detail_do_run(threads, threadInitFunction);
return _TestFixture::tpunit_detail_do_run(threads, threadInitFunction);
}

int tpunit::Tests::run(const set<string>& include, const set<string>& exclude,
const list<string>& before, const list<string>& after, int threads, std::function<void()> threadInitFunction) {
return TestFixture::tpunit_detail_do_run(include, exclude, before, after, threads, threadInitFunction);
return _TestFixture::tpunit_detail_do_run(include, exclude, before, after, threads, threadInitFunction);
}
Loading

0 comments on commit 56eb27f

Please sign in to comment.