Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ how can I refactor this?

Tags:

c++

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++?

like image 700
sivabudh Avatar asked Dec 12 '22 23:12

sivabudh


1 Answers

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);
}
like image 92
GManNickG Avatar answered Dec 15 '22 12:12

GManNickG