I know you're not talking about macros, but why? They exist to generate code:
#define SHOULD_THROW(x, name) \ { \ bool didThrow = false; \ try \ { \ x; \ } \ catch(...) { didThrow = true; } \ \ if (!didThrow) \ throw std::logic_error(name " did not throw."); \ } SHOULD_THROW(expectNotEqual(someData, anotherData), "expectNotEqual")
If you really don't want to use macros, you need to get the functor to call:
template <typename Func> void should_throw(Func pFunc, const std::string& pName) { bool didThrow = false; try { pFunc(); } catch (...) { didThrow = true; } if (!didThrow) throw std::logic_error(pName + " did not throw."); }
Boost Bind helps here:
should_throw(boost::bind(expectNotEqual, someData, anotherData), "expectNotEqual");
Of course, everything the functor does works, like lambda, etc. But if Boost is available, just use their test library :
#define BOOST_TEST_MAIN #include <boost/test/unit_test.hpp> BOOST_AUTO_TEST_CASE(test) { BOOST_CHECK_THROW(expectNotEqual(someData, anotherData) , std::logic_error); }
source share