Skip to content

Instantly share code, notes, and snippets.

@andreysolovyev381
Created October 4, 2019 08:37
Show Gist options
  • Save andreysolovyev381/b43fc49a66faf9b033971b6674d00c66 to your computer and use it in GitHub Desktop.
Save andreysolovyev381/b43fc49a66faf9b033971b6674d00c66 to your computer and use it in GitHub Desktop.
Utils for running a simple Unit Test for any func. Usually "void TestSomething()"
/*
* usage:
* TestRunner tr;
* RUN_TEST(tr, FUNC_NAME);
*
*/
template<class T, class U>
void AssertEqual(const T& t, const U& u, const string& hint = {}) {
if (!(t == u)) {
ostringstream os;
os << "Assertion failed: " << t << " != " << u;
if (!hint.empty()) {
os << " hint: " << hint;
}
throw runtime_error(os.str());
}
}
inline void Assert(bool b, const string& hint) {
AssertEqual(b, true, hint);
}
class TestRunner {
public:
template <class TestFunc>
void RunTest(TestFunc func, const string& test_name) {
try {
func();
cerr << test_name << " OK" << endl;
} catch (exception& e) {
++fail_count;
cerr << test_name << " fail: " << e.what() << endl;
} catch (...) {
++fail_count;
cerr << "Unknown exception caught" << endl;
}
}
~TestRunner() {
if (fail_count > 0) {
cerr << fail_count << " unit tests failed. Terminate" << endl;
exit(1);
}
}
private:
int fail_count = 0;
};
#define ASSERT_EQUAL(x, y) { \
ostringstream __os__; \
__os__ << #x << " != " << #y << ", " \
<< __FILE__ << ":" << __LINE__; \
AssertEqual(x, y, __os__.str()); \
}
#define ASSERT(x) { \
ostringstream os; \
os << #x << " is false, " \
<< __FILE__ << ":" << __LINE__; \
Assert(x, os.str()); \
}
#define RUN_TEST(tr, func) \
tr.RunTest(func, #func)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment