This is useful when doing several asserts in one loop, for instance: there isn't always a way to deduce the loop index from the assert failure, so these macros allow the user to give more context information.legacy
| @@ -17,6 +17,7 @@ | |||
| #define __LOL_UNIT_H__ | |||
| #include <iostream> | |||
| #include <iomanip> | |||
| #include <sstream> | |||
| #include <cstdio> | |||
| #include <cmath> | |||
| @@ -63,7 +64,7 @@ protected: | |||
| int m_testcases, m_failcases; | |||
| int m_asserts, m_failure; | |||
| char const *m_fixturename, *m_currentname; | |||
| std::stringstream m_errorlog; | |||
| std::stringstream m_errorlog, m_context; | |||
| }; | |||
| template<class T> class Fixture : protected FixtureBase | |||
| @@ -105,6 +106,7 @@ public: | |||
| m_asserts = 0; | |||
| m_failure = false; | |||
| m_currentname = c->m_testname; | |||
| m_context.str(""); | |||
| (static_cast<FixtureClass *>(this)->*c->m_fun)(); | |||
| std::cout << (m_failure ? 'F' : '.'); | |||
| } | |||
| @@ -226,9 +228,10 @@ public: | |||
| << " (F) line: " << __LINE__ << " " \ | |||
| << __FILE__ << std::endl; \ | |||
| m_errorlog << "equality assertion failed" << std::endl; \ | |||
| m_errorlog << "- Expected: " << (a) << std::endl; \ | |||
| m_errorlog << "- Actual : " << (b) << std::endl; \ | |||
| m_errorlog << "- Expected: " << #a << " = " << (a) << std::endl; \ | |||
| m_errorlog << "- Actual : " << #b << " = " << (b) << std::endl; \ | |||
| m_errorlog << message; \ | |||
| m_errorlog << m_context.str(); \ | |||
| m_failure = true; \ | |||
| return; \ | |||
| } \ | |||
| @@ -245,10 +248,14 @@ public: | |||
| << " (F) line: " << __LINE__ << " " \ | |||
| << __FILE__ << std::endl; \ | |||
| m_errorlog << "double equality assertion failed" << std::endl; \ | |||
| m_errorlog << "- Expected: " << (a) << std::endl; \ | |||
| m_errorlog << "- Actual : " << (b) << std::endl; \ | |||
| m_errorlog << "- Delta : " << (t) << std::endl; \ | |||
| std::streamsize old_prec = m_errorlog.precision(); \ | |||
| m_errorlog << std::setprecision(16); \ | |||
| m_errorlog << "- Expected: " << #a << " = " << (a) << std::endl; \ | |||
| m_errorlog << "- Actual : " << #b << " = " << (b) << std::endl; \ | |||
| m_errorlog << "- Delta : " << #t << " = " << (t) << std::endl; \ | |||
| m_errorlog << std::setprecision(old_prec); \ | |||
| m_errorlog << message; \ | |||
| m_errorlog << m_context.str(); \ | |||
| m_failure = true; \ | |||
| return; \ | |||
| } \ | |||
| @@ -264,10 +271,20 @@ public: | |||
| << __FILE__ << std::endl; \ | |||
| m_errorlog << "forced failure" << std::endl; \ | |||
| m_errorlog << "- " << message << std::endl; \ | |||
| m_errorlog << m_context.str(); \ | |||
| m_failure = true; \ | |||
| return; \ | |||
| } while(!True()) | |||
| #define LOLUNIT_SET_CONTEXT(n) \ | |||
| do { \ | |||
| m_context.str(""); \ | |||
| m_context << "- Context : " << #n << " = " << (n) << std::endl; \ | |||
| } while(!True()) | |||
| #define LOLUNIT_UNSET_CONTEXT(n) \ | |||
| m_context.str("") | |||
| #define LOLUNIT_ASSERT(cond) \ | |||
| LOLUNIT_ASSERT_GENERIC("", cond) | |||
| @@ -45,6 +45,7 @@ public: | |||
| { | |||
| half a = (half)pairs[i].f; | |||
| uint16_t b = pairs[i].x; | |||
| LOLUNIT_SET_CONTEXT(i); | |||
| LOLUNIT_ASSERT_EQUAL(a.bits, b); | |||
| } | |||
| } | |||
| @@ -55,6 +56,7 @@ public: | |||
| { | |||
| half a = half::makeaccurate(pairs[i].f); | |||
| uint16_t b = pairs[i].x; | |||
| LOLUNIT_SET_CONTEXT(i); | |||
| LOLUNIT_ASSERT_EQUAL(a.bits, b); | |||
| } | |||
| } | |||
| @@ -65,6 +67,7 @@ public: | |||
| { | |||
| half a = half::makebits(i); | |||
| uint16_t b = i; | |||
| LOLUNIT_SET_CONTEXT(i); | |||
| LOLUNIT_ASSERT_EQUAL(a.bits, b); | |||
| } | |||
| } | |||
| @@ -140,6 +143,7 @@ public: | |||
| { | |||
| for (uint32_t i = 0; i < 0x10000; i++) | |||
| { | |||
| LOLUNIT_SET_CONTEXT(i); | |||
| half h = half::makebits(i); | |||
| if (h.is_nan()) | |||
| { | |||
| @@ -165,6 +169,7 @@ public: | |||
| { | |||
| float a = (float)half::makebits(pairs[i].x); | |||
| float b = pairs[i].f; | |||
| LOLUNIT_SET_CONTEXT(i); | |||
| LOLUNIT_ASSERT_EQUAL(a, b); | |||
| } | |||
| @@ -173,6 +178,7 @@ public: | |||
| half h = half::makebits(i); | |||
| float f = (float)h; | |||
| half g = (half)f; | |||
| LOLUNIT_SET_CONTEXT(i); | |||
| if (h.is_nan()) | |||
| { | |||
| LOLUNIT_ASSERT(isnan(f)); | |||
| @@ -301,8 +307,8 @@ HalfTest::TestPair const HalfTest::pairs[] = | |||
| { 0.125f, 0x3000 }, | |||
| { 15.9375f, 0x4bf8 }, | |||
| { 31.0f / (1 << 14), 0x17c0 }, /* 0x1.fp-10 */ | |||
| { 31.0f / (1 << 18), 0x07c0 }, /* 0x1.fp-14, denormal */ | |||
| { 31.0f / (1 << 19), 0x03e0 }, /* 0x1.fp-15, denormal */ | |||
| { 31.0f / (1 << 18), 0x07c0 }, /* 0x1.fp-14, normal float, denormal half */ | |||
| { 31.0f / (1 << 19), 0x03e0 }, /* 0x1.fp-15, normal float, denormal half */ | |||
| }; | |||
| } /* namespace lol */ | |||
| @@ -37,6 +37,7 @@ public: | |||
| double a = sin(f); | |||
| #endif | |||
| double b = lol_sin(f); | |||
| LOLUNIT_SET_CONTEXT(f); | |||
| LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11); | |||
| } | |||
| @@ -49,6 +50,7 @@ public: | |||
| double a = sin(f); | |||
| #endif | |||
| double b = lol_sin(f); | |||
| LOLUNIT_SET_CONTEXT(f); | |||
| LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11); | |||
| } | |||
| } | |||
| @@ -64,6 +66,7 @@ public: | |||
| double a = cos(f); | |||
| #endif | |||
| double b = lol_cos(f); | |||
| LOLUNIT_SET_CONTEXT(f); | |||
| LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11); | |||
| } | |||
| @@ -76,6 +79,7 @@ public: | |||
| double a = cos(f); | |||
| #endif | |||
| double b = lol_cos(f); | |||
| LOLUNIT_SET_CONTEXT(f); | |||
| LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11); | |||
| } | |||
| } | |||
| @@ -94,6 +98,7 @@ public: | |||
| #endif | |||
| double b1, b2; | |||
| lol_sincos(f, &b1, &b2); | |||
| LOLUNIT_SET_CONTEXT(f); | |||
| LOLUNIT_ASSERT_DOUBLES_EQUAL(a1, b1, fabs(f) * 1e-11); | |||
| LOLUNIT_ASSERT_DOUBLES_EQUAL(a2, b2, fabs(f) * 1e-11); | |||
| } | |||
| @@ -110,6 +115,7 @@ public: | |||
| #endif | |||
| double b1, b2; | |||
| lol_sincos(f, &b1, &b2); | |||
| LOLUNIT_SET_CONTEXT(f); | |||
| LOLUNIT_ASSERT_DOUBLES_EQUAL(a1, b1, fabs(f) * 1e-11); | |||
| LOLUNIT_ASSERT_DOUBLES_EQUAL(a2, b2, fabs(f) * 1e-11); | |||
| } | |||
| @@ -126,6 +132,7 @@ public: | |||
| double a = tan(f); | |||
| #endif | |||
| double b = lol_tan(f); | |||
| LOLUNIT_SET_CONTEXT(f); | |||
| if (fabs(a) > 1e4) | |||
| LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(a) * fabs(a) * 1e-11); | |||
| else if (fabs(a) > 1.0) | |||
| @@ -143,6 +150,7 @@ public: | |||
| double a = tan(f); | |||
| #endif | |||
| double b = lol_tan(f); | |||
| LOLUNIT_SET_CONTEXT(f); | |||
| if (fabs(a) > 1e4) | |||
| LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(a) * fabs(a) * 1e-11); | |||
| else if (fabs(a) > 1.0) | |||