1 #ifndef TUT_ASSERT_H_GUARD
 
   2 #define TUT_ASSERT_H_GUARD
 
   3 #include <tut/tut_config.hpp>
 
  11 #if defined(TUT_USE_POSIX)
 
  16 #include "tut_exception.hpp"
 
  24         std::ostringstream &msg_prefix(std::ostringstream &str, const M &msg)
 
  26             std::ostringstream ss;
 
  43  * Tests provided condition.
 
  46 void ensure(bool cond)
 
  50         // TODO: default ctor?
 
  56  * Tests provided condition.
 
  59 void ensure_not(bool cond)
 
  65  * Tests provided condition.
 
  69 void ensure(const M& msg, bool cond)
 
  78  * Tests provided condition.
 
  82 void ensure_not(const M& msg, bool cond)
 
  88  * Tests two objects for being equal.
 
  91  * NB: both LHS and RHS must have operator << defined somewhere, or
 
  92  * client code will not compile at all!
 
  94 template <typename M, typename LHS, typename RHS>
 
  95 void ensure_equals(const M& msg, const LHS& actual, const RHS& expected)
 
  97     if (expected != actual)
 
  99         std::ostringstream ss;
 
 100         detail::msg_prefix(ss,msg)
 
 106         throw failure(ss.str());
 
 111  * Tests two pointers for being equal.
 
 114  * NB: both T and Q must have operator << defined somewhere, or
 
 115  * client code will not compile at all!
 
 117 template <typename M, typename LHS, typename RHS>
 
 118 void ensure_equals(const M& msg, const LHS * const actual, const RHS * const expected)
 
 120     if (expected != actual)
 
 122         std::ostringstream ss;
 
 123         detail::msg_prefix(ss,msg)
 
 129         throw failure(ss.str());
 
 134 void ensure_equals(const M& msg, const double& actual, const double& expected, const double& epsilon)
 
 136     const double diff = actual - expected;
 
 138     if ( (actual != expected) && !((diff <= epsilon) && (diff >= -epsilon )) )
 
 140         std::ostringstream ss;
 
 141         detail::msg_prefix(ss,msg)
 
 144            << std::setprecision(16)
 
 145            << "expected `" << expected
 
 146            << "` actual `" << actual
 
 147            << "` with precision `" << epsilon << "`";
 
 148         throw failure(ss.str());
 
 153 void ensure_equals(const M& msg, const double& actual, const double& expected)
 
 155     ensure_equals(msg, actual, expected, std::numeric_limits<double>::epsilon());
 
 158 template <typename LHS, typename RHS>
 
 159 void ensure_equals(const LHS& actual, const RHS& expected)
 
 161     ensure_equals("Values are not equal", actual, expected);
 
 165 template<typename LhsIterator, typename RhsIterator>
 
 166 void ensure_equals(const std::string &msg,
 
 167                    const LhsIterator &lhs_begin, const LhsIterator &lhs_end,
 
 168                    const RhsIterator &rhs_begin, const RhsIterator &rhs_end)
 
 170     typename std::iterator_traits<LhsIterator>::difference_type lhs_size = std::distance(lhs_begin, lhs_end);
 
 171     typename std::iterator_traits<RhsIterator>::difference_type rhs_size = std::distance(rhs_begin, rhs_end);
 
 173     if(lhs_size < rhs_size)
 
 175         ensure_equals(msg + ": range is too short", lhs_size, rhs_size);
 
 178     if(lhs_size > rhs_size)
 
 180         ensure_equals(msg + ": range is too long", lhs_size, rhs_size);
 
 183     assert(lhs_size == rhs_size);
 
 185     LhsIterator lhs_i = lhs_begin;
 
 186     RhsIterator rhs_i = rhs_begin;
 
 187     while( (lhs_i != lhs_end) && (rhs_i != rhs_end) )
 
 191             std::ostringstream ss;
 
 192             detail::msg_prefix(ss,msg)
 
 193                 << "expected `" << *rhs_i
 
 194                 << "` actual `" << *lhs_i
 
 195                 << "` at offset " << std::distance(lhs_begin, lhs_i);
 
 196             throw failure(ss.str());
 
 203     assert(lhs_i == lhs_end);
 
 204     assert(rhs_i == rhs_end);
 
 207 template<typename LhsIterator, typename RhsIterator>
 
 208 void ensure_equals(const LhsIterator &lhs_begin, const LhsIterator &lhs_end,
 
 209                    const RhsIterator &rhs_begin, const RhsIterator &rhs_end)
 
 211     ensure_equals("Ranges are not equal", lhs_begin, lhs_end, rhs_begin, rhs_end);
 
 214 template<typename LhsType, typename RhsType>
 
 215 void ensure_equals(const LhsType *lhs_begin, const LhsType *lhs_end,
 
 216                    const RhsType *rhs_begin, const RhsType *rhs_end)
 
 218     ensure_equals("Ranges are not equal", lhs_begin, lhs_end, rhs_begin, rhs_end);
 
 222  * Tests two objects for being at most in given distance one from another.
 
 223  * Borders are excluded.
 
 226  * NB: T must have operator << defined somewhere, or
 
 227  * client code will not compile at all! Also, T shall have
 
 228  * operators + and -, and be comparable.
 
 230  * TODO: domains are wrong, T - T might not yield T, but Q
 
 232 template <typename M, class T>
 
 233 void ensure_distance(const M& msg, const T& actual, const T& expected, const T& distance)
 
 235     if (expected-distance >= actual || expected+distance <= actual)
 
 237         std::ostringstream ss;
 
 238         detail::msg_prefix(ss,msg)
 
 246         throw failure(ss.str());
 
 251 void ensure_distance(const T& actual, const T& expected, const T& distance)
 
 253     ensure_distance<>("Distance is wrong", actual, expected, distance);
 
 257 void ensure_errno(const M& msg, bool cond)
 
 261 #if defined(TUT_USE_POSIX)
 
 263         std::ostringstream ss;
 
 264         detail::msg_prefix(ss,msg)
 
 265            << strerror_r(errno, e, sizeof(e));
 
 266         throw failure(ss.str());
 
 274  * Unconditionally fails with message.
 
 276 void fail(const char* msg = "")
 
 282 void fail(const M& msg)
 
 288  * Mark test case as known failure and skip execution.
 
 290 void skip(const char* msg = "")
 
 296 void skip(const M& msg)
 
 301 } // end of namespace