diff --git a/src/spectrum/test/spectrum-value-test.cc b/src/spectrum/test/spectrum-value-test.cc index 5d279ac3d..f499984c1 100644 --- a/src/spectrum/test/spectrum-value-test.cc +++ b/src/spectrum/test/spectrum-value-test.cc @@ -72,6 +72,7 @@ SpectrumValueTestCase::MoreOrLessEqual (SpectrumValue x, SpectrumValue y) void SpectrumValueTestCase::DoRun (void) { + NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL (*m_a.GetSpectrumModel (), *m_b.GetSpectrumModel (), TOLERANCE, GetName ()); NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL (m_a, m_b, TOLERANCE, GetName ()); } diff --git a/src/spectrum/test/spectrum-value-test.h b/src/spectrum/test/spectrum-value-test.h index 367421b68..aab736c0b 100644 --- a/src/spectrum/test/spectrum-value-test.h +++ b/src/spectrum/test/spectrum-value-test.h @@ -23,6 +23,70 @@ #include #include + +/** + * \brief Test if two SpectrumModel instances are equal within a given tolerance. + * + * This test compares component-by-component the two SpectrumModel + * instances; if any pair of components differs by more than the given + * tolerance, the test fails. + * + * \param actual the actual value obtained by the simulator + * \param expected the expected value obtained by off-line calculations + * \param tol the tolerance + * \param msg the message to print if the test fails + * + */ +#define NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL(actual, expected, tol, msg) \ + NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL_INTERNAL(actual, expected, tol, msg, __FILE__, __LINE__) + + +/** + * \internal + */ +#define NS_TEST_ASSERT_MSG_SPECTRUM_MODEL_EQ_TOL_INTERNAL(actual, expected, tol, msg, file, line) \ + do \ + { \ + Bands::const_iterator i = (actual).Begin (); \ + Bands::const_iterator j = (expected).Begin (); \ + uint32_t k = 0; \ + while (i != (actual).End () && j != (expected).End ()) \ + { \ + if ((i->fl > j->fl + (tol)) || (i->fl < j->fl - (tol)) || \ + (i->fc > j->fc + (tol)) || (i->fc < j->fc - (tol)) || \ + (i->fh > j->fh + (tol)) || (i->fh < j->fh - (tol))) \ + { \ + if (gBreakOnFailure) {*(int *)0 = 0;} \ + std::ostringstream indexStream; \ + indexStream << "[" << k << "]"; \ + std::ostringstream msgStream; \ + msgStream << (msg); \ + std::ostringstream actualStream; \ + actualStream << i->fl << " <-- " << i->fc << " --> " << i->fh; \ + std::ostringstream expectedStream; \ + expectedStream << j->fl << " <-- " << j->fc << " --> " << j->fh; \ + ReportTestFailure (std::string (#actual) + indexStream.str () + " == " + std::string (#expected) + indexStream.str (), \ + actualStream.str (), expectedStream.str (), msgStream.str (), (file), (line)); \ + } \ + ++i; \ + ++j; \ + ++k; \ + } \ + if (i != (actual).End () || j != (expected).End ()) \ + { \ + std::ostringstream msgStream; \ + msgStream << (msg); \ + std::ostringstream actualStream; \ + actualStream << (i != (actual).End ()); \ + std::ostringstream expectedStream; \ + expectedStream << (j != (expected).End ()); \ + ReportTestFailure ("Bands::iterator == End ()" , \ + actualStream.str (), expectedStream.str (), msgStream.str (), (file), (line)); \ + } \ + } \ + while (false); \ + + /** * \brief Test if two SpectrumValue instances are equal within a given tolerance. * @@ -46,10 +110,10 @@ #define NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL_INTERNAL(actual, expected, tol, msg, file, line) \ do \ { \ - Values::const_iterator i = actual.ConstValuesBegin (); \ - Values::const_iterator j = expected.ConstValuesBegin (); \ + Values::const_iterator i = (actual).ConstValuesBegin (); \ + Values::const_iterator j = (expected).ConstValuesBegin (); \ uint32_t k = 0; \ - while (i != actual.ConstValuesEnd () && j != expected.ConstValuesEnd ()) \ + while (i != (actual).ConstValuesEnd () && j != (expected).ConstValuesEnd ()) \ { \ if ((*i) > (*j) + (tol) || (*i) < (*j) - (tol)) \ { \ @@ -69,6 +133,17 @@ ++j; \ ++k; \ } \ + if (i != (actual).ConstValuesEnd () || j != (expected).ConstValuesEnd ()) \ + { \ + std::ostringstream msgStream; \ + msgStream << (msg); \ + std::ostringstream actualStream; \ + actualStream << (i != (actual).ConstValuesEnd ()); \ + std::ostringstream expectedStream; \ + expectedStream << (j != (expected).ConstValuesEnd ()); \ + ReportTestFailure ("Values::const_iterator == ConstValuesEnd ()" , \ + actualStream.str (), expectedStream.str (), msgStream.str (), (file), (line)); \ + } \ } \ while (false); \