C++ how can I refactor this?
c++
Solution
I know you say no macro's, but why? They exist for generating 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 make a 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 anything that makes a functor works, like lambda's, etc. But if Boost is available, just use their testing 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);
}
Problem
I have the code below in my test code in many places: ``` // // Make a function call while expecting an exception should be thrown // bool exceptionThrown = false; try { expectNotEqual(someData, anotherData, methodName); } catch(std::logic_error&) { exceptionThrown = true; } if(!exceptionThrown) throw std::logic_error(methodName+"exception not thrown"); ``` It would be nice (more readable, concise) if I could encapsulate all that, and do something like: ``` exceptionShouldBeThrown(expectNotEqual(someData, anotherData, methodName)); ``` I dont want to use macro ...does anyone know how I could achieve the one-liner above with C++?