iutest  1.17.99.14
iutest_matcher.hpp
[詳解]
1 //======================================================================
2 //-----------------------------------------------------------------------
13 //-----------------------------------------------------------------------
14 //======================================================================
15 #ifndef INCG_IRIS_IUTEST_MATCHER_HPP_23746E00_1A4B_4778_91AD_45C6DEFEEFA7_
16 #define INCG_IRIS_IUTEST_MATCHER_HPP_23746E00_1A4B_4778_91AD_45C6DEFEEFA7_
17 
18 #if IUTEST_HAS_MATCHERS
19 
20 //======================================================================
21 // define
26 #define IUTEST_TEST_THAT(actual, matcher, on_failure) \
27  IUTEST_AMBIGUOUS_ELSE_BLOCKER_ \
28  if( ::iutest::AssertionResult iutest_ar = matcher(actual) ) { \
29  } else \
30  on_failure(::iutest::detail::MatcherAssertionFailureMessage( \
31  ::iutest::PrintToString(actual).c_str(), #matcher, iutest_ar))
32 
37 namespace iutest {
38 namespace detail
39 {
40 
41 //======================================================================
42 // function
46 inline ::std::string MatcherAssertionFailureMessage(const char* actual, const char* matcher_str
47  , const AssertionResult& ar)
48 {
49  iu_global_format_stringstream strm;
50  strm << "error: Expected: " << matcher_str
51  << "\n Actual: " << actual
52  << "\nWhich is: " << ar.message();
53  return strm.str();
54 }
55 
56 //======================================================================
57 // class
58 
59 IUTEST_PRAGMA_ASSIGNMENT_OPERATOR_COULD_NOT_GENERATE_WARN_DISABLE_BEGIN()
60 
61 
64 class IMatcher
65 {
66  IMatcher& operator=(const IMatcher&);
67 public:
68  template<typename T>
69  struct is_matcher : public iutest_type_traits::is_base_of<IMatcher, T> {};
70 public:
71  IMatcher() {}
72  IMatcher(const IMatcher&) {}
73  virtual ~IMatcher() {}
74  virtual ::std::string WhichIs() const = 0;
75 };
76 
77 #if !defined(IUTEST_NO_SFINAE)
78 template<typename T>
79 inline typename detail::enable_if_t< IMatcher::is_matcher<T>, iu_ostream>::type& operator << (iu_ostream& os, const T& m)
80 {
81  return os << m.WhichIs();
82 }
83 #else
84 inline iu_ostream& operator << (iu_ostream& os, const IMatcher& m)
85 {
86  return os << m.WhichIs();
87 }
88 #endif
89 
95 #define IIUT_DECL_COMPARE_MATCHER(name, op) \
96  template<typename T> \
97  class IUTEST_PP_CAT(name, Matcher) IUTEST_CXX_FINAL : public IMatcher { \
98  public: explicit IUTEST_PP_CAT(name, Matcher)(const T& v) : m_expected(v) {}\
99  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE { \
100  iu_global_format_stringstream strm; \
101  strm << #name ": " << m_expected; return strm.str(); \
102  } \
103  template<typename U>AssertionResult operator ()(const U& actual) const { \
104  if IUTEST_COND_LIKELY( actual op m_expected ) return AssertionSuccess();\
105  return AssertionFailure() << WhichIs(); \
106  } \
107  private: const T& m_expected; \
108  }
109 
110 #define IIUT_DECL_COMPARE_MATCHER2(name, op) \
111  class IUTEST_PP_CAT(Twofold, IUTEST_PP_CAT(name, Matcher)) IUTEST_CXX_FINAL : public IMatcher{ \
112  public: ::std::string WhichIs() const IUTEST_CXX_OVERRIDE { return #name; } \
113  template<typename T, typename U>AssertionResult operator () \
114  (const T& actual, const U& expected) const { \
115  if IUTEST_COND_LIKELY( actual op expected ) return AssertionSuccess(); \
116  return AssertionFailure() << WhichIs() << ": " << actual << " vs " << expected; \
117  } \
118  }
119 
120 
121 IUTEST_PRAGMA_WARN_PUSH()
122 IUTEST_PRAGMA_WARN_DISABLE_SIGN_COMPARE()
123 
124 IIUT_DECL_COMPARE_MATCHER(Ne, !=);
125 IIUT_DECL_COMPARE_MATCHER(Le, <=);
126 IIUT_DECL_COMPARE_MATCHER(Lt, < );
127 IIUT_DECL_COMPARE_MATCHER(Ge, >=);
128 IIUT_DECL_COMPARE_MATCHER(Gt, > );
129 
130 IIUT_DECL_COMPARE_MATCHER2(Eq, ==);
131 IIUT_DECL_COMPARE_MATCHER2(Ne, !=);
132 IIUT_DECL_COMPARE_MATCHER2(Le, <=);
133 IIUT_DECL_COMPARE_MATCHER2(Lt, < );
134 IIUT_DECL_COMPARE_MATCHER2(Ge, >=);
135 IIUT_DECL_COMPARE_MATCHER2(Gt, > );
136 
137 IUTEST_PRAGMA_WARN_POP()
138 
139 #undef IIUT_DECL_COMPARE_MATCHER
140 #undef IIUT_DECL_COMPARE_MATCHER2
141 
142 #define IIUT_DECL_STR_COMPARE_MATCHER(name) \
143  template<typename T> \
144  class IUTEST_PP_CAT(name, Matcher) IUTEST_CXX_FINAL : public IMatcher { \
145  public: IUTEST_PP_CAT(name, Matcher)(const T& value) : m_expected(value) {} \
146  template<typename U>AssertionResult operator ()(const U& actual) const { \
147  if IUTEST_COND_LIKELY( internal::IUTEST_PP_CAT(name, Helper)::Compare( \
148  actual, m_expected) ) { return AssertionSuccess(); } \
149  return AssertionFailure() << WhichIs(); \
150  } \
151  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE { \
152  iu_global_format_stringstream strm; strm << #name ": " << m_expected; \
153  return strm.str(); \
154  } \
155  private: \
156  const T& m_expected; \
157  }
158 
159 IIUT_DECL_STR_COMPARE_MATCHER(StrEq);
160 IIUT_DECL_STR_COMPARE_MATCHER(StrNe);
161 IIUT_DECL_STR_COMPARE_MATCHER(StrCaseEq);
162 IIUT_DECL_STR_COMPARE_MATCHER(StrCaseNe);
163 
164 #undef IIUT_DECL_COMPARE_MATCHER
165 
173 class IsNullMatcher IUTEST_CXX_FINAL : public IMatcher
174 {
175 public:
176  template<typename U>
177  AssertionResult operator ()(const U& actual) const
178  {
179  if IUTEST_COND_LIKELY( actual == IUTEST_NULLPTR )
180  {
181  return AssertionSuccess();
182  }
183  return AssertionFailure() << WhichIs();
184  }
185  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
186  {
187  return "Is Null";
188  }
189 };
190 
194 class NotNullMatcher IUTEST_CXX_FINAL : public IMatcher
195 {
196 public:
197  template<typename U>
198  AssertionResult operator ()(const U& actual) const
199  {
200  if IUTEST_COND_LIKELY( actual != IUTEST_NULLPTR )
201  {
202  return AssertionSuccess();
203  }
204  return AssertionFailure() << WhichIs();
205  }
206 
207  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
208  {
209  return "Not Null";
210  }
211 };
212 
216 template<typename T>
217 class FloatingPointEqMatcher IUTEST_CXX_FINAL : public IMatcher
218 {
219 public:
220  explicit FloatingPointEqMatcher(const T& value) : m_expected(value) {}
221 
222 public:
223  template<typename U>
224  AssertionResult operator ()(const U& actual) const
225  {
226  const floating_point<T> f2(actual);
227  if IUTEST_COND_LIKELY( m_expected.AlmostEquals(f2) )
228  {
229  return AssertionSuccess();
230  }
231  return AssertionFailure() << WhichIs();
232  }
233 
234  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
235  {
236  iu_global_format_stringstream strm;
237  strm << "Eq: " << PrintToString(m_expected);
238  return strm.str();
239  }
240 private:
241  floating_point<T> m_expected;
242 };
243 
247 template<typename T>
248 class NanSensitiveFloatingPointEqMatcher IUTEST_CXX_FINAL : public IMatcher
249 {
250 public:
251  explicit NanSensitiveFloatingPointEqMatcher(const T& value) : m_expected(value) {}
252 
253 public:
254  template<typename U>
255  AssertionResult operator ()(const U& actual) const
256  {
257  const floating_point<T> f2(actual);
258  if IUTEST_COND_LIKELY( m_expected.NanSensitiveAlmostEquals(f2) )
259  {
260  return AssertionSuccess();
261  }
262  return AssertionFailure() << WhichIs();
263  }
264 
265  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
266  {
267  iu_global_format_stringstream strm;
268  strm << "NanSensitive Eq: " << PrintToString(m_expected);
269  return strm.str();
270  }
271 private:
272  floating_point<T> m_expected;
273 };
274 
278 template<typename T>
279 class FloatingPointNearMatcher IUTEST_CXX_FINAL : public IMatcher
280 {
281 public:
282  explicit FloatingPointNearMatcher(const T& value, const T& abs_error)
283  : m_expected(value), m_max_abs_error(abs_error) {}
284 
285 public:
286  template<typename U>
287  AssertionResult operator ()(const U& actual) const
288  {
289  const floating_point<T> a(actual);
290  if IUTEST_COND_LIKELY( m_expected.AlmostNear(a, m_max_abs_error) )
291  {
292  return AssertionSuccess();
293  }
294  return AssertionFailure() << WhichIs();
295  }
296 
297  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
298  {
299  iu_global_format_stringstream strm;
300  strm << "Near: " << PrintToString(m_expected) << "(abs error <= " << m_max_abs_error << ")";
301  return strm.str();
302  }
303 private:
304  floating_point<T> m_expected;
305  T m_max_abs_error;
306 };
307 
311 template<typename T>
312 class NanSensitiveFloatingPointNearMatcher IUTEST_CXX_FINAL : public IMatcher
313 {
314 public:
315  explicit NanSensitiveFloatingPointNearMatcher(const T& value, const T& abs_error)
316  : m_expected(value), m_max_abs_error(abs_error) {}
317 
318 public:
319  template<typename U>
320  AssertionResult operator ()(const U& actual) const
321  {
322  const floating_point<T> a(actual);
323  if IUTEST_COND_LIKELY( m_expected.NanSensitiveAlmostNear(a, m_max_abs_error) )
324  {
325  return AssertionSuccess();
326  }
327  return AssertionFailure() << WhichIs();
328  }
329 
330  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
331  {
332  iu_global_format_stringstream strm;
333  strm << "NanSensitive Near: " << PrintToString(m_expected) << "(abs error <= " << m_max_abs_error << ")";
334  return strm.str();
335  }
336 private:
337  floating_point<T> m_expected;
338  T m_max_abs_error;
339 };
340 
344 template<typename T>
345 class StartsWithMatcher IUTEST_CXX_FINAL : public IMatcher
346 {
347 public:
348  explicit StartsWithMatcher(T str) : m_expected(str) {}
349 
350 public:
351  template<typename U>
352  AssertionResult operator ()(const U& actual) const
353  {
354  if IUTEST_COND_LIKELY( StartsWith(actual, m_expected) )
355  {
356  return AssertionSuccess();
357  }
358  return AssertionFailure() << WhichIs();
359  }
360 
361 public:
362  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
363  {
364  iu_global_format_stringstream strm;
365  strm << "StartsWith: " << m_expected;
366  return strm.str();
367  }
368 private:
369  static bool StartsWith(const char* actual, const char* start)
370  {
371  return strstr(actual, start) == actual;
372  }
373  static bool StartsWith(const ::std::string& actual, const char* start)
374  {
375  const char* p = actual.c_str();
376  return StartsWith(p, start);
377  }
378  static bool StartsWith(const char* actual, const ::std::string& start)
379  {
380  const char* p = start.c_str();
381  return StartsWith(actual, p);
382  }
383  static bool StartsWith(const ::std::string& actual, const ::std::string& start)
384  {
385  const char* p = start.c_str();
386  return StartsWith(actual, p);
387  }
388 private:
389  T m_expected;
390 };
391 
395 template<typename T>
396 class HasSubstrMatcher IUTEST_CXX_FINAL : public IMatcher
397 {
398 public:
399  explicit HasSubstrMatcher(T expected) : m_expected(expected) {}
400 public:
401  template<typename U>
402  AssertionResult operator ()(const U& actual) const
403  {
404  if IUTEST_COND_LIKELY( HasSubstr(actual, m_expected) )
405  {
406  return AssertionSuccess();
407  }
408  return AssertionFailure() << WhichIs();
409  }
410 
411 public:
412  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
413  {
414  iu_global_format_stringstream strm;
415  strm << "HasSubstr: " << m_expected;
416  return strm.str();
417  }
418 private:
419  static bool HasSubstr(const char* actual, const char* expected)
420  {
421  return strstr(actual, expected) != NULL;
422  }
423  static bool HasSubstr(const ::std::string& actual, const char* expected)
424  {
425  const char* p = actual.c_str();
426  return HasSubstr(p, expected);
427  }
428  static bool HasSubstr(const char* actual, const ::std::string& expected)
429  {
430  const char* p = expected.c_str();
431  return HasSubstr(actual, p);
432  }
433  static bool HasSubstr(const ::std::string& actual, const ::std::string& expected)
434  {
435  const char* p = expected.c_str();
436  return HasSubstr(actual, p);
437  }
438 
439 private:
440  T m_expected;
441 };
442 
446 template<typename T>
447 class EndsWithMatcher IUTEST_CXX_FINAL : public IMatcher
448 {
449 public:
450  explicit EndsWithMatcher(T str) : m_expected(str) {}
451 
452 public:
453  template<typename U>
454  AssertionResult operator ()(const U& actual) const
455  {
456  if IUTEST_COND_LIKELY( EndsWith(actual, m_expected) )
457  {
458  return AssertionSuccess();
459  }
460  return AssertionFailure() << WhichIs();
461  }
462 
463 public:
464  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
465  {
466  iu_global_format_stringstream strm;
467  strm << "EndsWith: " << m_expected;
468  return strm.str();
469  }
470 private:
471  static bool EndsWith(const char* actual, const char* end)
472  {
473  const size_t len = strlen(end);
474  const size_t actual_len = strlen(actual);
475  if( len > actual_len )
476  {
477  return false;
478  }
479  const char* p = actual + actual_len - 1;
480  const char* q = end + len - 1;
481  for( size_t i=0; i < len; ++i, --p, --q )
482  {
483  if( *p != *q )
484  {
485  return false;
486  }
487  }
488  return true;
489  }
490  static bool EndsWith(const ::std::string& actual, const char* end)
491  {
492  const char* p = actual.c_str();
493  return EndsWith(p, end);
494  }
495  static bool EndsWith(const char* actual, const ::std::string& end)
496  {
497  const char* p = end.c_str();
498  return EndsWith(actual, p);
499  }
500  static bool EndsWith(const ::std::string& actual, const ::std::string& end)
501  {
502  const char* p = end.c_str();
503  return EndsWith(actual, p);
504  }
505 private:
506  T m_expected;
507 };
508 
512 template<typename T>
513 class EqMatcher : public IMatcher
514 {
515 public:
516  explicit EqMatcher(const T& expected) : m_expected(expected) {}
517 
518 public:
519  template<typename U>
520  AssertionResult operator ()(const U& actual) const
521  {
522  if IUTEST_COND_LIKELY( Equals(actual, m_expected) )
523  {
524  return AssertionSuccess();
525  }
526  return AssertionFailure() << WhichIs();
527  }
528 
529 public:
530  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
531  {
532  iu_global_format_stringstream strm;
533  strm << "Eq: " << PrintToString(m_expected);
534  return strm.str();
535  }
536 private:
537  template<typename A, typename B>
538  static bool Equals(const A& actual, const B& expected)
539  {
540 IUTEST_PRAGMA_WARN_PUSH()
541 IUTEST_PRAGMA_WARN_DISABLE_SIGN_COMPARE()
542  return actual == expected;
543 IUTEST_PRAGMA_WARN_POP()
544  }
545  static bool Equals(const char* actual, const char* expected)
546  {
547  return strcmp(actual, expected) == 0;
548  }
549  static bool Equals(const ::std::string& actual, const char* expected)
550  {
551  const char* p = actual.c_str();
552  return Equals(p, expected);
553  }
554  static bool Equals(const ::std::string& actual, const ::std::string& expected)
555  {
556  const char* p = expected.c_str();
557  return Equals(actual, p);
558  }
559 private:
560  const T& m_expected;
561 };
562 
566 template<typename T>
567 class TypedEqMatcher IUTEST_CXX_FINAL : public EqMatcher<T>
568 {
569 public:
570  explicit TypedEqMatcher(T expected) : EqMatcher<T>(m_expected), m_expected(expected) {}
571 public:
572  AssertionResult operator ()(const T& actual)
573  {
574  return EqMatcher<T>::operator ()(actual);
575  }
576  template<typename U>
577  AssertionResult operator ()(const U&) const;
578 
579 private:
580  T m_expected;
581 };
582 
586 #if !defined(IUTEST_NO_SFINAE)
587 
588 template<typename T>
589 T& CastToMatcher(T& matcher
590  , typename detail::enable_if_t< IMatcher::is_matcher<T> >::type*& = detail::enabler::value)
591 {
592  return matcher;
593 }
595 template<typename T>
596 EqMatcher<T> CastToMatcher(const T& value
597  , typename detail::disable_if_t< IMatcher::is_matcher<T> >::type*& = detail::enabler::value)
598 {
599  return EqMatcher<T>(value);
600 }
601 
602 #else
603 
604 template<typename T>
605 T& CastToMatcher(T& matcher)
606 {
607  return matcher;
608 }
609 
610 #endif
611 
612 
616 template<typename T>
617 class ContainsMatcher IUTEST_CXX_FINAL : public IMatcher
618 {
619 public:
620  explicit ContainsMatcher(const T& expected) : m_expected(expected) {}
621 
622 public:
623  template<typename U>
624  AssertionResult operator ()(const U& actual)
625  {
627  if IUTEST_COND_LIKELY( Contains(begin(actual), end(actual)) )
628  {
629  return AssertionSuccess();
630  }
631  return AssertionFailure() << WhichIs();
632  }
633 
634 public:
635  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
636  {
637  iu_global_format_stringstream strm;
638  strm << "Contains: " << m_expected;
639  return strm.str();
640  }
641 private:
642  template<typename Ite>
643  bool Contains(Ite begin, Ite end)
644  {
645  for( Ite it = begin; it != end; ++it )
646  {
647  if( CastToMatcher(m_expected)(*it) )
648  {
649  return true;
650  }
651  }
652  return false;
653  }
654 
655 private:
656  T m_expected;
657 };
658 
659 #if IUTEST_HAS_MATCHER_EACH
660 
664 template<typename T>
665 class EachMatcher IUTEST_CXX_FINAL : public IMatcher
666 {
667 public:
668  explicit EachMatcher(const T& expected) : m_expected(expected) {}
669 
670 public:
671  template<typename U>
672  AssertionResult operator ()(const U& actual)
673  {
675  if IUTEST_COND_LIKELY( Each(begin(actual), end(actual)) )
676  {
677  return AssertionSuccess();
678  }
679  return AssertionFailure() << WhichIs();
680  }
681 
682 public:
683  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
684  {
685  iu_global_format_stringstream strm;
686  strm << "Each: " << m_expected;
687  return strm.str();
688  }
689 private:
690  template<typename Ite>
691  bool Each(Ite begin, Ite end)
692  {
693  for( Ite it = begin; it != end; ++it )
694  {
695  if( !CastToMatcher(m_expected)(*it) )
696  {
697  return false;
698  }
699  }
700  return true;
701  }
702 
703 private:
704  T m_expected;
705 };
706 
707 #endif
708 
712 template<typename T>
713 class ContainerEqMatcher IUTEST_CXX_FINAL : public IMatcher
714 {
715 public:
716  explicit ContainerEqMatcher(const T& expected) : m_expected(expected) {}
717 
718 public:
719  template<typename U>
720  AssertionResult operator ()(const U& actual)
721  {
723  if IUTEST_COND_LIKELY( Check(begin(m_expected), end(m_expected)
724  , begin(actual), end(actual)) )
725  {
726  return AssertionSuccess();
727  }
728  return AssertionFailure() << WhichIs();
729  }
730 
731 public:
732  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
733  {
734  iu_global_format_stringstream strm;
735  strm << "ContainerEq: " << PrintToString(m_expected);
736  strm << " (" << m_whichIs << ")";
737  return strm.str();
738  }
739 private:
740  template<typename Ite1, typename Ite2>
741  bool Check(Ite1 b1, Ite1 e1, Ite2 b2, Ite2 e2)
742  {
743  size_t elem=0;
744  bool result = true;
745  Message ar;
746  for( elem=0; b1 != e1 && b2 != e2; ++b1, ++b2, ++elem )
747  {
748  if( !internal::backward::EqHelper<false>::Compare("", "", *b1, *b2) )
749  {
750  result = false;
751  ar << "\nMismatch in a position " << elem << ": "
752  << ::iutest::internal::FormatForComparisonFailureMessage(*b1, *b2)
753  << " vs " << ::iutest::internal::FormatForComparisonFailureMessage(*b2, *b1);
754  }
755  }
756  if( b1 != e1 || b2 != e2 )
757  {
758  const size_t elem1 = elem + ::std::distance(b1, e1);
759  const size_t elem2 = elem + ::std::distance(b2, e2);
760  result = false;
761  ar << "\nMismatch element : " << elem1 << " vs " << elem2;
762  }
763  m_whichIs = ar.GetString();
764  return result;
765  }
766 
767 private:
768  const T& m_expected;
769  ::std::string m_whichIs;
770 };
771 
772 
773 #if IUTEST_HAS_MATCHER_POINTWISE
774 
778 template<typename M, typename T>
779 class PointwiseMatcher IUTEST_CXX_FINAL : public IMatcher
780 {
781 public:
782  PointwiseMatcher(const M& matcher, const T& expected)
783  : m_matcher(matcher), m_expected(expected) {}
784 
785 public:
786  template<typename U>
787  AssertionResult operator ()(const U& actual)
788  {
790  if IUTEST_COND_LIKELY( Check(begin(m_expected), end(m_expected)
791  , begin(actual), end(actual)) )
792  {
793  return AssertionSuccess();
794  }
795  return AssertionFailure() << WhichIs();
796  }
797 
798 public:
799  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
800  {
801  iu_global_format_stringstream strm;
802  strm << "Pointwise: " << m_matcher << ": " << PrintToString(m_expected);
803  strm << " (" << m_whichIs << ")";
804  return strm.str();
805  }
806 private:
807  template<typename Ite1, typename Ite2>
808  bool Check(Ite1 b1, Ite1 e1, Ite2 b2, Ite2 e2)
809  {
810  size_t elem=0;
811  bool result = true;
812  Message ar;
813  for( elem=0; b1 != e1 && b2 != e2; ++b1, ++b2, ++elem )
814  {
815  const AssertionResult r = m_matcher(*b2, *b1);
816  if( r.failed() )
817  {
818  result = false;
819  ar << "\nMismatch in a position " << elem << ": " << r.message();
820  }
821  }
822  if( b1 != e1 || b2 != e2 )
823  {
824  const size_t elem1 = elem + ::std::distance(b1, e1);
825  const size_t elem2 = elem + ::std::distance(b2, e2);
826  result = false;
827  ar << "\nMismatch element : " << elem1 << " vs " << elem2;
828  }
829  m_whichIs = ar.GetString();
830  return result;
831  }
832 
833 private:
834  M m_matcher;
835  const T& m_expected;
836  ::std::string m_whichIs;
837 };
838 
839 #endif
840 
841 #if IUTEST_HAS_MATCHER_OPTIONAL
842 
846 template<typename T>
847 class OptionalMatcher IUTEST_CXX_FINAL : public IMatcher
848 {
849 public:
850  explicit OptionalMatcher(const T& expected)
851  : m_expected(expected) {}
852 
853 public:
854  template<typename U>
855  AssertionResult operator ()(const U& actual)
856  {
857  if( Check(actual) )
858  {
859  return AssertionSuccess();
860  }
861  return AssertionFailure() << WhichIs();
862  }
863 
864 private:
865  template<typename U>
866  bool Check(const U& actual)
867  {
868  bool result = true;
869  Message ar;
870  if( !actual )
871  {
872  result = false;
873  ar << "which is not engaged";
874  }
875  else if( !CastToMatcher(m_expected)(*actual) )
876  {
877  result = false;
878  ar << actual;
879  }
880  m_whichIs = ar.GetString();
881  return result;
882  }
883 
884 public:
885  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
886  {
887  iu_global_format_stringstream strm;
888  strm << "Optional: " << PrintToString(m_expected);
889  strm << " (" << m_whichIs << ")";
890  return strm.str();
891  }
892 private:
893  const T& m_expected;
894  ::std::string m_whichIs;
895 };
896 
897 #endif
898 
899 
903 class IsEmptyMatcher IUTEST_CXX_FINAL : public IMatcher
904 {
905 public:
906  template<typename U>
907  AssertionResult operator ()(const U& actual)
908  {
909  if IUTEST_COND_LIKELY( (actual).empty() )
910  {
911  return AssertionSuccess();
912  }
913  return AssertionFailure() << WhichIs();
914  }
915 
916 public:
917  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
918  {
919  return "Is Empty";
920  }
921 };
922 
923 
927 template<typename T>
928 class SizeIsMatcher IUTEST_CXX_FINAL : public IMatcher
929 {
930 public:
931  explicit SizeIsMatcher(const T& expected) : m_expected(expected) {}
932 
933 public:
934  template<typename U>
935  AssertionResult operator ()(const U& actual)
936  {
937  if IUTEST_COND_LIKELY( Check(actual) )
938  {
939  return AssertionSuccess();
940  }
941  return AssertionFailure() << WhichIs();
942  }
943 
944 public:
945  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
946  {
947  iu_global_format_stringstream strm;
948  strm << "Size is: " << m_expected;
949  return strm.str();
950  }
951 private:
952  template<typename Container>
953  bool Check(const Container& actual)
954  {
955  return static_cast<bool>(CastToMatcher(m_expected)(actual.size()));
956  }
957 #if !defined(IUTEST_NO_FUNCTION_TEMPLATE_ORDERING)
958  template<typename U, size_t SIZE>
959  bool Check(const U(&)[SIZE])
960  {
961  return static_cast<bool>(CastToMatcher(m_expected)(SIZE));
962  }
963 #endif
964 
965 private:
966  T m_expected;
967 };
968 
972 template<typename T>
973 class AtMatcher IUTEST_CXX_FINAL : public IMatcher
974 {
975 public:
976  AtMatcher(size_t index, const T& expected) : m_index(index), m_expected(expected) {}
977 
978 public:
979  template<typename U>
980  AssertionResult operator ()(const U& actual)
981  {
982  if IUTEST_COND_LIKELY( CastToMatcher(m_expected)(actual[m_index]) )
983  {
984  return AssertionSuccess();
985  }
986  return AssertionFailure() << WhichIs();
987  }
988 
989 public:
990  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
991  {
992  iu_global_format_stringstream strm;
993  strm << "At " << m_index << ": " << m_expected;
994  return strm.str();
995  }
996 
997 private:
998  size_t m_index;
999  T m_expected;
1000 };
1001 
1005 template<typename T>
1006 class ElementsAreArrayMatcher IUTEST_CXX_FINAL : public IMatcher
1007 {
1008 public:
1009  template<typename It>
1010  ElementsAreArrayMatcher(It begin, It end, bool expected_elem_count=true)
1011  : m_expected_elem_count(expected_elem_count)
1012  {
1013  m_expected.insert(m_expected.end(), begin, end);
1014  }
1015 
1016 public:
1017  template<typename U>
1018  AssertionResult operator ()(const U& actual)
1019  {
1021  return Check(begin(actual), end(actual));
1022  }
1023 
1024 public:
1025  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1026  {
1027  return WhichIs(PrintToString(m_expected));
1028  }
1029  ::std::string WhichIs(const ::std::string& msg) const
1030  {
1031  iu_global_format_stringstream strm;
1032  if( m_expected_elem_count )
1033  {
1034  strm << "ElementsAreArray: ";
1035  }
1036  else
1037  {
1038  strm << "ElementsAreArrayForward: ";
1039  }
1040  strm << msg;
1041  return strm.str();
1042  }
1043 private:
1044  template<typename Ite>
1045  AssertionResult Check(Ite actual_begin, Ite actual_end)
1046  {
1047  const size_t actual_cnt = ::std::distance(actual_begin, actual_end);
1048  const size_t expected_cnt = m_expected.size();
1049  if IUTEST_COND_UNLIKELY( actual_cnt < expected_cnt )
1050  {
1051  iu_global_format_stringstream stream;
1052  stream << "actual argument[" << actual_cnt << "] is less than " << expected_cnt;
1053  return AssertionFailure() << WhichIs(stream.str());
1054  }
1055  if IUTEST_COND_UNLIKELY( m_expected_elem_count && actual_cnt > expected_cnt )
1056  {
1057  iu_global_format_stringstream stream;
1058  stream << "actual argument[" << actual_cnt << "] is greater than " << expected_cnt;
1059  return AssertionFailure() << WhichIs(stream.str());
1060  }
1061 
1062  Ite it_a=actual_begin;
1063  typename ::std::vector<T>::iterator it_e=m_expected.begin();
1064  for( int i=0; it_a != actual_end && it_e != m_expected.end(); ++it_e, ++it_a, ++i )
1065  {
1066  (void)i;
1067  if IUTEST_COND_UNLIKELY( *it_a != *it_e )
1068  {
1069  return AssertionFailure() << WhichIs();
1070  }
1071  }
1072  return AssertionSuccess();
1073  }
1074 
1075 private:
1076  ::std::vector<T> m_expected;
1077  bool m_expected_elem_count;
1078 };
1079 
1080 #if IUTEST_HAS_MATCHER_ELEMENTSARE
1081 
1085 class ElementsAreMatcherBase : public IMatcher
1086 {
1087 protected:
1088  template<typename T, typename U>
1089  static AssertionResult Check(T& matchers, const U& actual)
1090  {
1092  return Check<0, tuples::tuple_size<T>::value - 1>(begin(actual), end(actual), matchers);
1093  }
1094  template<int N, typename T>
1095  static ::std::string WhichIs(const T& matchers)
1096  {
1097  ::std::string str = "ElementsAre: {";
1098  str += WhichIs_<T, N, tuples::tuple_size<T>::value-1>(matchers);
1099  str += "}";
1100  return str;
1101  }
1102 private:
1103  template<int N, int LAST, typename Ite, typename M>
1104  static AssertionResult Check(Ite it, Ite end, M& matchers)
1105  {
1106  const size_t cnt = ::std::distance(it, end);
1107  if IUTEST_COND_UNLIKELY( cnt < LAST+1 )
1108  {
1109  return AssertionFailure() << "ElementsAre: argument[" << cnt << "] is less than " << LAST+1;
1110  }
1111  return CheckElem<N, LAST>(it, end, matchers);
1112  }
1113 
1114  template<int N, int LAST, typename Ite, typename M>
1115  static AssertionResult CheckElem(Ite it, Ite end, M& matchers
1116  , typename detail::enable_if<N == LAST, void>::type*& = detail::enabler::value)
1117  {
1118  for( int index=N; it != end; ++it, ++index )
1119  {
1120  AssertionResult ar = CastToMatcher(tuples::get<N>(matchers))(*it);
1121  if IUTEST_COND_UNLIKELY( !ar )
1122  {
1123  return AssertionFailure() << WhichIsElem<N>(matchers, index);
1124  }
1125  }
1126  return AssertionSuccess();
1127  }
1128 
1129  template<int N, int LAST, typename Ite, typename M>
1130  static AssertionResult CheckElem(Ite it, Ite end, M& matchers
1131  , typename detail::disable_if<N == LAST, void>::type*& = detail::enabler::value)
1132  {
1133  AssertionResult ar = CastToMatcher(tuples::get<N>(matchers))(*it);
1134  if IUTEST_COND_LIKELY( ar )
1135  {
1136  return CheckElem<N + 1, LAST>(++it, end, matchers);
1137  }
1138  return AssertionFailure() << WhichIsElem<N>(matchers, N);
1139  }
1140 
1141  template<int N, typename T>
1142  static ::std::string WhichIsElem(const T& matchers, int index)
1143  {
1144  iu_global_format_stringstream strm;
1145  strm << "ElementsAre(" << index << "): " << tuples::get<N>(matchers);
1146  return strm.str();
1147  }
1148 
1149  template<typename T, int N, int LAST>
1150  static ::std::string WhichIs_(const T& matchers
1151  , typename detail::enable_if<N == LAST, void>::type*& = detail::enabler::value)
1152  {
1153  return StreamableToString(tuples::get<N>(matchers));
1154  }
1155  template<typename T, int N, int LAST>
1156  static ::std::string WhichIs_(const T& matchers
1157  , typename detail::disable_if<N == LAST, void>::type*& = detail::enabler::value)
1158  {
1159  return StreamableToString(tuples::get<N>(matchers)) + ", " + WhichIs_<T, N + 1, LAST>(matchers);
1160  }
1161 };
1162 
1163 #if IUTEST_HAS_MATCHER_VARIADIC
1164 
1168 template<typename ...T>
1169 class ElementsAreMatcher IUTEST_CXX_FINAL : public ElementsAreMatcherBase
1170 {
1171 public:
1172  explicit ElementsAreMatcher(T... t) : m_matchers(t...) {}
1173 
1174 public:
1175  template<typename U>
1176  AssertionResult operator ()(const U& actual)
1177  {
1178  return Check(m_matchers, actual);
1179  }
1180  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1181  {
1182  return ElementsAreMatcherBase::WhichIs<0>(m_matchers);
1183  }
1184 
1185 private:
1186  tuples::tuple<T...> m_matchers;
1187 };
1188 
1189 #else
1190 
1191 /*
1192 template<typename T0, typename T1>
1193 class ElementsAreMatcher IUTEST_CXX_FINAL : public ElementsAreMatcherBase
1194 {
1195 public:
1196  ElementsAreMatcher(T0 m0, T1 m1) : m_matchers(m0, m1) {}
1197 
1198 public:
1199  template<typename U>
1200  AssertionResult operator ()(const U& actual)
1201  {
1202  return Check(m_matchers, actual);
1203  }
1204  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1205  {
1206  return ElementsAreMatcherBase::WhichIs<0>(m_matchers);
1207  }
1208 private:
1209  tuples::tuple<T0, T1> m_matchers;
1210 };
1211 */
1212 
1213 #define IIUT_DECL_ELEMENTSARE_MATCHER(n) \
1214  template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
1215  class IUTEST_PP_CAT(ElementsAreMatcher, n) IUTEST_CXX_FINAL : public ElementsAreMatcherBase { \
1216  public: IUTEST_PP_CAT(ElementsAreMatcher, n)(IUTEST_PP_ENUM_BINARY_PARAMS(n, T, m)) \
1217  : m_matchers(IUTEST_PP_ENUM_PARAMS(n, m)) {} \
1218  template<typename U>AssertionResult operator ()(const U& actual) { \
1219  return Check(m_matchers, actual); } \
1220  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE { \
1221  return ElementsAreMatcherBase::WhichIs<0>(m_matchers); } \
1222  private: \
1223  tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > m_matchers; \
1224  }
1225 
1226 IIUT_DECL_ELEMENTSARE_MATCHER(1);
1227 IIUT_DECL_ELEMENTSARE_MATCHER(2);
1228 IIUT_DECL_ELEMENTSARE_MATCHER(3);
1229 IIUT_DECL_ELEMENTSARE_MATCHER(4);
1230 IIUT_DECL_ELEMENTSARE_MATCHER(5);
1231 IIUT_DECL_ELEMENTSARE_MATCHER(6);
1232 IIUT_DECL_ELEMENTSARE_MATCHER(7);
1233 IIUT_DECL_ELEMENTSARE_MATCHER(8);
1234 IIUT_DECL_ELEMENTSARE_MATCHER(9);
1235 IIUT_DECL_ELEMENTSARE_MATCHER(10);
1236 
1237 #undef IIUT_DECL_ELEMENTSARE_MATCHER
1238 
1239 #endif
1240 
1241 #endif
1242 
1246 template<typename F, typename T>
1247 class FieldMatcher IUTEST_CXX_FINAL : public IMatcher
1248 {
1249 public:
1250  FieldMatcher(const F& field, const T& expected) : m_field(field), m_expected(expected) {}
1251 
1252 public:
1253  template<typename U>
1254  AssertionResult operator ()(const U& actual)
1255  {
1256  if IUTEST_COND_LIKELY( Check(actual) )
1257  {
1258  return AssertionSuccess();
1259  }
1260  return AssertionFailure() << WhichIs();
1261  }
1262 
1263 public:
1264  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1265  {
1266  iu_global_format_stringstream strm;
1267  strm << "Field: " << m_expected;
1268  //strm << "Field: (" << detail::GetTypeNameProxy<F>::GetTypeName() << ") " << m_expected;
1269  return strm.str();
1270  }
1271 private:
1272 #if !defined(IUTEST_NO_SFINAE)
1273  template<typename U>
1274  bool Check(const U& actual
1275  , typename detail::disable_if_t< detail::is_pointer<U> >::type*& = detail::enabler::value)
1276  {
1277  return static_cast<bool>(CastToMatcher(m_expected)(actual.*m_field));
1278  }
1279  template<typename U>
1280  bool Check(const U& actual
1281  , typename detail::enable_if_t< detail::is_pointer<U> >::type*& = detail::enabler::value)
1282  {
1283  return static_cast<bool>(CastToMatcher(m_expected)(actual->*m_field));
1284  }
1285 #else
1286  template<typename U>
1287  bool Check(const U& actual)
1288  {
1289  return static_cast<bool>(CastToMatcher(m_expected)(actual->*m_field));
1290  }
1291 #endif
1292 
1293 private:
1294  const F& m_field;
1295  T m_expected;
1296 };
1297 
1301 template<typename F, typename T>
1302 class PropertyMatcher IUTEST_CXX_FINAL : public IMatcher
1303 {
1304 public:
1305  PropertyMatcher(const F& prop, const T& expected) : m_property(prop), m_expected(expected) {}
1306 
1307 public:
1308  template<typename U>
1309  AssertionResult operator ()(const U& actual)
1310  {
1311  if IUTEST_COND_LIKELY( Check(actual) )
1312  {
1313  return AssertionSuccess();
1314  }
1315  return AssertionFailure() << WhichIs();
1316  }
1317 
1318 public:
1319  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1320  {
1321  iu_global_format_stringstream strm;
1322  strm << "Property: " << m_expected;
1323  //strm << "Property: (" << detail::GetTypeNameProxy<F>::GetTypeName() << ") " << m_expected;
1324  return strm.str();
1325  }
1326 private:
1327 #if !defined(IUTEST_NO_SFINAE)
1328  template<typename U>
1329  bool Check(const U& actual
1330  , typename detail::disable_if_t< detail::is_pointer<U> >::type*& = detail::enabler::value)
1331  {
1332  return static_cast<bool>(CastToMatcher(m_expected)((actual.*m_property)()));
1333  }
1334  template<typename U>
1335  bool Check(const U& actual
1336  , typename detail::enable_if_t< detail::is_pointer<U> >::type*& = detail::enabler::value)
1337  {
1338  return static_cast<bool>(CastToMatcher(m_expected)((actual->*m_property)()));
1339  }
1340 #else
1341  template<typename U>
1342  bool Check(const U& actual)
1343  {
1344  return static_cast<bool>(CastToMatcher(m_expected)((actual->*m_property)()));
1345  }
1346 #endif
1347 
1348 private:
1349  const F& m_property;
1350  T m_expected;
1351 };
1352 
1356 template<typename T>
1357 class KeyMatcher IUTEST_CXX_FINAL : public IMatcher
1358 {
1359 public:
1360  explicit KeyMatcher(const T& expected) : m_expected(expected) {}
1361 
1362 public:
1363  template<typename U>
1364  AssertionResult operator ()(const U& actual) const
1365  {
1366  if IUTEST_COND_LIKELY( CastToMatcher(m_expected)(actual.first) )
1367  {
1368  return AssertionSuccess();
1369  }
1370  return AssertionFailure() << WhichIs();
1371  }
1372 
1373 public:
1374  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1375  {
1376  iu_global_format_stringstream strm;
1377  strm << "Key: " << m_expected;
1378  return strm.str();
1379  }
1380 
1381 private:
1382  const T& m_expected;
1383 };
1384 
1388 template<typename T1, typename T2>
1389 class PairMatcher IUTEST_CXX_FINAL : public IMatcher
1390 {
1391 public:
1392  PairMatcher(const T1& m1, const T2& m2) : m_m1(m1), m_m2(m2) {}
1393 
1394 public:
1395  template<typename U>
1396  AssertionResult operator ()(const U& actual)
1397  {
1398  if IUTEST_COND_UNLIKELY( !CheckElem(actual.first, m_m1) )
1399  {
1400  return AssertionFailure() << WhichIs();
1401  }
1402  if IUTEST_COND_UNLIKELY( !CheckElem(actual.second, m_m2) )
1403  {
1404  return AssertionFailure() << WhichIs();
1405  }
1406  return AssertionSuccess();
1407  }
1408 
1409 public:
1410  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1411  {
1412  iu_global_format_stringstream strm;
1413  strm << "Pair: (" << m_m1 << ", " << m_m2 << ")";
1414  return strm.str();
1415  }
1416 private:
1417  template<typename T, typename U>
1418  bool CheckElem(const T& actual, U& matcher)
1419  {
1420  return static_cast<bool>(CastToMatcher(matcher)(actual));
1421  }
1422 
1423 private:
1424  T1 m_m1;
1425  T2 m_m2;
1426 };
1427 
1431 template<typename F, typename T>
1432 class ResultOfMatcher IUTEST_CXX_FINAL : public IMatcher
1433 {
1434 public:
1435  ResultOfMatcher(F& func, const T& expected) : m_func(func), m_expected(expected) {}
1436 
1437 public:
1438  template<typename U>
1439  AssertionResult operator ()(const U& actual)
1440  {
1441  if IUTEST_COND_LIKELY( Check(actual) )
1442  {
1443  return AssertionSuccess();
1444  }
1445  return AssertionFailure() << WhichIs();
1446  }
1447 
1448 public:
1449  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1450  {
1451  iu_global_format_stringstream strm;
1452  strm << "Result of: " << m_expected;
1453  //strm << "Result of " << detail::GetTypeNameProxy<F>::GetTypeName() << "(): " << m_expected;
1454  return strm.str();
1455  }
1456 private:
1457  template<typename U>
1458  bool Check(const U& actual)
1459  {
1460  return static_cast<bool>(CastToMatcher(m_expected)((*m_func)(actual)));
1461  }
1462 private:
1463  F& m_func;
1464  T m_expected;
1465 };
1466 
1470 template<typename T>
1471 class PointeeMatcher IUTEST_CXX_FINAL : public IMatcher
1472 {
1473 public:
1474  explicit PointeeMatcher(const T& expected) : m_expected(expected) {}
1475 
1476 public:
1477  template<typename U>
1478  AssertionResult operator ()(const U& actual)
1479  {
1480  if IUTEST_COND_LIKELY( Check(actual) )
1481  {
1482  return AssertionSuccess();
1483  }
1484  return AssertionFailure() << WhichIs();
1485  }
1486 
1487 public:
1488  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1489  {
1490  iu_global_format_stringstream strm;
1491  strm << "Points To: " << m_expected;
1492  return strm.str();
1493  }
1494 private:
1495  template<typename U>
1496  bool Check(const U& actual)
1497  {
1498  return static_cast<bool>(CastToMatcher(m_expected)(*actual));
1499  }
1500 private:
1501  T m_expected;
1502 };
1503 
1507 template<typename T>
1508 class NotMatcher IUTEST_CXX_FINAL : public IMatcher
1509 {
1510 public:
1511  explicit NotMatcher(const T& unexpected) : m_unexpected(unexpected) {}
1512 
1513 public:
1514  template<typename U>
1515  AssertionResult operator ()(const U& actual)
1516  {
1517  if IUTEST_COND_LIKELY( !CastToMatcher(m_unexpected)(actual) )
1518  {
1519  return AssertionSuccess();
1520  }
1521  return AssertionFailure() << WhichIs();
1522  }
1523 
1524 public:
1525  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1526  {
1527  iu_global_format_stringstream strm;
1528  strm << "Not: (" << m_unexpected << ")";
1529  return strm.str();
1530  }
1531 
1532 private:
1533  T m_unexpected;
1534 };
1535 
1539 template<typename T>
1540 class AnyMatcher IUTEST_CXX_FINAL : public IMatcher
1541 {
1542 public:
1543  AssertionResult operator ()(const T&) const
1544  {
1545  return AssertionSuccess();
1546  }
1547  template<typename U>
1548  AssertionResult operator ()(const U&) const;
1549 
1550 public:
1551  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1552  {
1553  iu_global_format_stringstream strm;
1554  strm << "A: " << detail::GetTypeNameProxy<T>::GetTypeName();
1555  return strm.str();
1556  }
1557 };
1558 
1562 class AnythingMatcher IUTEST_CXX_FINAL : public IMatcher
1563 {
1564 public:
1565  AnythingMatcher() {}
1566 public:
1567  template<typename U>
1568  AssertionResult operator ()(const U&) const
1569  {
1570  return AssertionSuccess();
1571  }
1572 
1573 public:
1574  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1575  {
1576  return "_";
1577  }
1578 };
1579 
1580 #if IUTEST_HAS_MATCHER_REGEX
1581 
1585 class RegexMatcher IUTEST_CXX_FINAL : public IMatcher
1586 {
1587 public:
1588  RegexMatcher(const detail::iuRegex& expected, bool full_match) : m_expected(expected), m_full_match(full_match) {}
1589 
1590 public:
1591  template<typename U>
1592  AssertionResult operator ()(const U& actual) const
1593  {
1594  if IUTEST_COND_LIKELY( Regex(actual) )
1595  {
1596  return AssertionSuccess();
1597  }
1598  return AssertionFailure() << WhichIs();
1599  }
1600 
1601 public:
1602  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1603  {
1604  iu_global_format_stringstream strm;
1605  if( m_full_match )
1606  {
1607  strm << "MatchesRegex: " << m_expected.pattern();
1608  }
1609  else
1610  {
1611  strm << "ContainsRegex: " << m_expected.pattern();
1612  }
1613  return strm.str();
1614  }
1615 private:
1616  bool Regex(const char* actual) const
1617  {
1618  return m_full_match ? m_expected.FullMatch(actual)
1619  : m_expected.PartialMatch(actual);
1620  }
1621  bool Regex(const ::std::string& actual) const
1622  {
1623  return m_full_match ? m_expected.FullMatch(actual.c_str())
1624  : m_expected.PartialMatch(actual.c_str());
1625  }
1626 
1627 private:
1628  detail::iuRegex m_expected;
1629  bool m_full_match;
1630 };
1631 
1632 #endif
1633 
1634 #if IUTEST_HAS_MATCHER_ALLOF_AND_ANYOF
1635 
1639 class AllOfMatcherBase : public IMatcher
1640 {
1641 protected:
1642  template<typename T, typename U>
1643  static AssertionResult Check(T& matchers, const U& actual)
1644  {
1645  return Check_<T, U, 0, tuples::tuple_size<T>::value-1>(matchers, actual);
1646  }
1647  template<int N, typename T>
1648  static ::std::string WhichIs(const T& matchers)
1649  {
1650  return WhichIs_<T, N, tuples::tuple_size<T>::value-1>(matchers);
1651  }
1652 private:
1653  template<typename T, typename U, int N, int LAST>
1654  static AssertionResult Check_(T& matchers, const U& actual, typename detail::enable_if<N == LAST, void>::type*& = detail::enabler::value)
1655  {
1656  AssertionResult ar = tuples::get<N>(matchers)(actual);
1657  if IUTEST_COND_LIKELY( ar )
1658  {
1659  return ar;
1660  }
1661  return AssertionFailure() << WhichIs_<T, 0, N>(matchers);
1662  }
1663  template<typename T, typename U, int N, int LAST>
1664  static AssertionResult Check_(T& matchers, const U& actual, typename detail::disable_if<N == LAST, void>::type*& = detail::enabler::value)
1665  {
1666  AssertionResult ar = tuples::get<N>(matchers)(actual);
1667  if IUTEST_COND_LIKELY( ar )
1668  {
1669  return Check_<T, U, N + 1, LAST>(matchers, actual);
1670  }
1671  return AssertionFailure() << WhichIs_<T, 0, N>(matchers);
1672  }
1673 
1674  template<typename T, int N, int LAST>
1675  static ::std::string WhichIs_(const T& matchers, typename detail::enable_if<N == LAST, void>::type*& = detail::enabler::value)
1676  {
1677  return tuples::get<N>(matchers).WhichIs();
1678  }
1679  template<typename T, int N, int LAST>
1680  static ::std::string WhichIs_(const T& matchers, typename detail::disable_if<N == LAST, void>::type*& = detail::enabler::value)
1681  {
1682  return tuples::get<N>(matchers).WhichIs() + " and " + WhichIs_<T, N + 1, LAST>(matchers);
1683  }
1684 };
1685 
1686 #if IUTEST_HAS_MATCHER_VARIADIC
1687 
1691 template<typename ...T>
1692 class AllOfMatcher IUTEST_CXX_FINAL : public AllOfMatcherBase
1693 {
1694 public:
1695  explicit AllOfMatcher(T... t) : m_matchers(t...) {}
1696 
1697 public:
1698  template<typename U>
1699  AssertionResult operator ()(const U& actual)
1700  {
1701  return Check(m_matchers, actual);
1702  }
1703  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1704  {
1705  return AllOfMatcherBase::WhichIs<0>(m_matchers);
1706  }
1707 
1708 private:
1709  tuples::tuple<T...> m_matchers;
1710 };
1711 
1712 #else
1713 
1714 /*
1715 template<typename T0, typename T1>
1716 class AllOfMatcher IUTEST_CXX_FINAL : public AllOfMatcherBase
1717 {
1718 public:
1719  AllOfMatcher(T0 m0, T1 m1) : m_matchers(m0, m1) {}
1720 
1721 public:
1722  template<typename U>
1723  AssertionResult operator ()(const U& actual)
1724  {
1725  return Check(m_matchers, actual);
1726  }
1727  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1728  {
1729  return AllOfMatcherBase::WhichIs<0>(m_matchers);
1730  }
1731 private:
1732  tuples::tuple<T0, T1> m_matchers;
1733 };
1734 */
1735 
1736 #define IIUT_DECL_ALLOF_MATCHER(n) \
1737  template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
1738  class IUTEST_PP_CAT(AllOfMatcher, n) IUTEST_CXX_FINAL : public AllOfMatcherBase { \
1739  public: IUTEST_PP_CAT(AllOfMatcher, n)(IUTEST_PP_ENUM_BINARY_PARAMS(n, T, m)) \
1740  : m_matchers(IUTEST_PP_ENUM_PARAMS(n, m)) {} \
1741  template<typename U>AssertionResult operator ()(const U& actual) { \
1742  return Check(m_matchers, actual); } \
1743  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE { \
1744  return AllOfMatcherBase::WhichIs<0>(m_matchers); } \
1745  private: \
1746  tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > m_matchers; \
1747  }
1748 
1749 IIUT_DECL_ALLOF_MATCHER(2);
1750 IIUT_DECL_ALLOF_MATCHER(3);
1751 IIUT_DECL_ALLOF_MATCHER(4);
1752 IIUT_DECL_ALLOF_MATCHER(5);
1753 IIUT_DECL_ALLOF_MATCHER(6);
1754 IIUT_DECL_ALLOF_MATCHER(7);
1755 IIUT_DECL_ALLOF_MATCHER(8);
1756 IIUT_DECL_ALLOF_MATCHER(9);
1757 IIUT_DECL_ALLOF_MATCHER(10);
1758 
1759 #undef IIUT_DECL_ALLOF_MATCHER
1760 
1761 #endif
1762 
1766 class AnyOfMatcherBase : public IMatcher
1767 {
1768 protected:
1769  template<typename T, typename U>
1770  static AssertionResult Check(T& matchers, const U& actual)
1771  {
1772  return Check_<T, U, 0, tuples::tuple_size<T>::value-1>(matchers, actual);
1773  }
1774  template<int N, typename T>
1775  static ::std::string WhichIs(const T& matchers)
1776  {
1777  return WhichIs_<T, N, tuples::tuple_size<T>::value-1>(matchers);
1778  }
1779 private:
1780  template<typename T, typename U, int N, int LAST>
1781  static AssertionResult Check_(T& matchers, const U& actual, typename detail::enable_if<N == LAST, void>::type*& = detail::enabler::value)
1782  {
1783  AssertionResult ar = tuples::get<N>(matchers)(actual);
1784  if IUTEST_COND_LIKELY( ar )
1785  {
1786  return ar;
1787  }
1788  return AssertionFailure() << WhichIs_<T, 0, N>(matchers);
1789  }
1790  template<typename T, typename U, int N, int LAST>
1791  static AssertionResult Check_(T& matchers, const U& actual, typename detail::disable_if<N == LAST, void>::type*& = detail::enabler::value)
1792  {
1793  AssertionResult ar = tuples::get<N>(matchers)(actual);
1794  if IUTEST_COND_LIKELY( ar )
1795  {
1796  return ar;
1797  }
1798  return Check_<T, U, N + 1, LAST>(matchers, actual);
1799  }
1800 
1801  template<typename T, int N, int LAST>
1802  static ::std::string WhichIs_(const T& matchers, typename detail::enable_if<N == LAST, void>::type*& = detail::enabler::value)
1803  {
1804  return tuples::get<N>(matchers).WhichIs();
1805  }
1806  template<typename T, int N, int LAST>
1807  static ::std::string WhichIs_(const T& matchers, typename detail::disable_if<N == LAST, void>::type*& = detail::enabler::value)
1808  {
1809  return tuples::get<N>(matchers).WhichIs() + " or " + WhichIs_<T, N + 1, LAST>(matchers);
1810  }
1811 };
1812 
1813 #if IUTEST_HAS_MATCHER_VARIADIC
1814 
1818 template<typename ...T>
1819 class AnyOfMatcher IUTEST_CXX_FINAL : public AnyOfMatcherBase
1820 {
1821 public:
1822  explicit AnyOfMatcher(T... t) : m_matchers(t...) {}
1823 
1824 public:
1825  template<typename U>
1826  AssertionResult operator ()(const U& actual)
1827  {
1828  return Check(m_matchers, actual);
1829  }
1830  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1831  {
1832  return AnyOfMatcherBase::WhichIs<0>(m_matchers);
1833  }
1834 
1835 private:
1836  tuples::tuple<T...> m_matchers;
1837 };
1838 
1839 #else
1840 
1841 /*
1842 template<typename T0, typename T1>
1843 class AnyOfMatcher IUTEST_CXX_FINAL : public AnyOfMatcherBase
1844 {
1845 public:
1846  AnyOfMatcher(T0 m0, T1 m1) : m_matchers(m0, m1) {}
1847 
1848 public:
1849  template<typename U>
1850  AssertionResult operator ()(const U& actual)
1851  {
1852  return Check(m_matchers, actual);
1853  }
1854  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE
1855  {
1856  return AnyOfMatcherBase::WhichIs<0>(m_matchers);
1857  }
1858 private:
1859  tuples::tuple<T0, T1> m_matchers;
1860 };
1861 */
1862 
1863 #define IIUT_DECL_ANYOF_MATCHER(n) \
1864  template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
1865  class IUTEST_PP_CAT(AnyOfMatcher, n) IUTEST_CXX_FINAL : public AnyOfMatcherBase { \
1866  public: IUTEST_PP_CAT(AnyOfMatcher, n)(IUTEST_PP_ENUM_BINARY_PARAMS(n, T, m)) \
1867  : m_matchers(IUTEST_PP_ENUM_PARAMS(n, m)) {} \
1868  template<typename U>AssertionResult operator ()(const U& actual) { \
1869  return Check(m_matchers, actual); } \
1870  ::std::string WhichIs() const IUTEST_CXX_OVERRIDE { \
1871  return AnyOfMatcherBase::WhichIs<0>(m_matchers); } \
1872  private: \
1873  tuples::tuple< IUTEST_PP_ENUM_PARAMS(n, T) > m_matchers; \
1874  }
1875 
1876 IIUT_DECL_ANYOF_MATCHER(2);
1877 IIUT_DECL_ANYOF_MATCHER(3);
1878 IIUT_DECL_ANYOF_MATCHER(4);
1879 IIUT_DECL_ANYOF_MATCHER(5);
1880 IIUT_DECL_ANYOF_MATCHER(6);
1881 IIUT_DECL_ANYOF_MATCHER(7);
1882 IIUT_DECL_ANYOF_MATCHER(8);
1883 IIUT_DECL_ANYOF_MATCHER(9);
1884 IIUT_DECL_ANYOF_MATCHER(10);
1885 
1886 #undef IIUT_DECL_ANYOF_MATCHER
1887 
1888 #endif
1889 
1890 #endif
1891 
1892 IUTEST_PRAGMA_ASSIGNMENT_OPERATOR_COULD_NOT_GENERATE_WARN_DISABLE_END()
1893 
1894 } // end of namespace detail
1895 
1899 namespace matchers
1901 
1912 template<typename T>
1913 detail::EqMatcher<T> Equals(const T& expected)
1915  return detail::EqMatcher<T>(expected);
1916 }
1917 
1922 template<typename T>
1923 detail::EqMatcher<T> Eq(const T& expected)
1925  return detail::EqMatcher<T>(expected);
1926 }
1927 
1932 template<typename T>
1933 detail::NeMatcher<T> Ne(const T& expected)
1935  return detail::NeMatcher<T>(expected);
1936 }
1937 
1942 template<typename T>
1943 detail::LeMatcher<T> Le(const T& expected)
1945  return detail::LeMatcher<T>(expected);
1946 }
1947 
1952 template<typename T>
1953 detail::LtMatcher<T> Lt(const T& expected)
1955  return detail::LtMatcher<T>(expected);
1956 }
1957 
1962 template<typename T>
1963 detail::GeMatcher<T> Ge(const T& expected)
1965  return detail::GeMatcher<T>(expected);
1966 }
1967 
1972 template<typename T>
1973 detail::GtMatcher<T> Gt(const T& expected)
1975  return detail::GtMatcher<T>(expected);
1976 }
1977 
1982 inline detail::TwofoldEqMatcher Eq()
1984  return detail::TwofoldEqMatcher();
1985 }
1986 
1991 inline detail::TwofoldNeMatcher Ne()
1993  return detail::TwofoldNeMatcher();
1994 }
1995 
2000 inline detail::TwofoldLeMatcher Le()
2002  return detail::TwofoldLeMatcher();
2003 }
2004 
2009 inline detail::TwofoldLtMatcher Lt()
2011  return detail::TwofoldLtMatcher();
2012 }
2013 
2018 inline detail::TwofoldGeMatcher Ge()
2020  return detail::TwofoldGeMatcher();
2021 }
2022 
2027 inline detail::TwofoldGtMatcher Gt()
2029  return detail::TwofoldGtMatcher();
2030 }
2031 
2036 inline detail::IsNullMatcher IsNull()
2038  return detail::IsNullMatcher();
2039 }
2040 
2045 inline detail::NotNullMatcher NotNull()
2047  return detail::NotNullMatcher();
2048 }
2049 
2054 template<typename T, typename U>
2055 detail::TypedEqMatcher<T> TypedEq(const U& expected)
2057  return detail::TypedEqMatcher<T>(static_cast<T>(expected));
2058 }
2059 
2064 template<typename T>
2065 inline detail::FloatingPointEqMatcher<T> FloatingPointEq(T expected)
2067  return detail::FloatingPointEqMatcher<T>(expected);
2068 }
2069 
2074 inline detail::FloatingPointEqMatcher<float> FloatEq(float expected)
2076  return detail::FloatingPointEqMatcher<float>(expected);
2077 }
2078 
2083 inline detail::FloatingPointEqMatcher<double> DoubleEq(double expected)
2085  return detail::FloatingPointEqMatcher<double>(expected);
2086 }
2087 
2088 #if IUTEST_HAS_LONG_DOUBLE
2089 
2094 inline detail::FloatingPointEqMatcher<long double> LongDoubleEq(long double expected)
2095 {
2096  return detail::FloatingPointEqMatcher<long double>(expected);
2097 }
2098 
2099 #endif
2100 
2105 template<typename T>
2106 inline detail::NanSensitiveFloatingPointEqMatcher<T> NanSensitiveFloatingPointEq(T expected)
2108  return detail::NanSensitiveFloatingPointEqMatcher<T>(expected);
2109 }
2110 
2115 inline detail::NanSensitiveFloatingPointEqMatcher<float> NanSensitiveFloatEq(float expected)
2117  return detail::NanSensitiveFloatingPointEqMatcher<float>(expected);
2118 }
2119 
2124 inline detail::NanSensitiveFloatingPointEqMatcher<double> NanSensitiveDoubleEq(double expected)
2126  return detail::NanSensitiveFloatingPointEqMatcher<double>(expected);
2127 }
2128 
2129 #if IUTEST_HAS_LONG_DOUBLE
2130 
2135 inline detail::NanSensitiveFloatingPointEqMatcher<long double> NanSensitiveLongDoubleEq(long double expected)
2136 {
2137  return detail::NanSensitiveFloatingPointEqMatcher<long double>(expected);
2138 }
2139 
2140 #endif
2141 
2142 #if IUTEST_HAS_MATCHER_FLOATINGPOINT_NEAR
2143 
2148 template<typename T>
2149 inline detail::FloatingPointNearMatcher<T> FloatingPointNear(T expected, T max_abs_error)
2151  return detail::FloatingPointNearMatcher<T>(expected, max_abs_error);
2152 }
2153 
2158 inline detail::FloatingPointNearMatcher<float> FloatNear(float expected, float max_abs_error)
2160  return detail::FloatingPointNearMatcher<float>(expected, max_abs_error);
2161 }
2162 
2167 inline detail::FloatingPointNearMatcher<double> DoubleNear(double expected, double max_abs_error)
2169  return detail::FloatingPointNearMatcher<double>(expected, max_abs_error);
2170 }
2171 
2172 #if IUTEST_HAS_LONG_DOUBLE
2173 
2178 inline detail::FloatingPointNearMatcher<long double> LongDoubleNear(long double expected, long double max_abs_error)
2179 {
2180  return detail::FloatingPointNearMatcher<long double>(expected, max_abs_error);
2181 }
2182 
2183 #endif
2184 
2189 template<typename T>
2190 inline detail::NanSensitiveFloatingPointNearMatcher<T> NanSensitiveFloatingPointNear(T expected, T max_abs_error)
2192  return detail::NanSensitiveFloatingPointNearMatcher<T>(expected, max_abs_error);
2193 }
2194 
2199 inline detail::NanSensitiveFloatingPointNearMatcher<float> NanSensitiveFloatNear(float expected, float max_abs_error)
2201  return detail::NanSensitiveFloatingPointNearMatcher<float>(expected, max_abs_error);
2202 }
2203 
2208 inline detail::NanSensitiveFloatingPointNearMatcher<double> NanSensitiveDoubleNear(double expected, double max_abs_error)
2210  return detail::NanSensitiveFloatingPointNearMatcher<double>(expected, max_abs_error);
2211 }
2212 
2213 #if IUTEST_HAS_LONG_DOUBLE
2214 
2219 inline detail::NanSensitiveFloatingPointNearMatcher<long double> NanSensitiveLongDoubleNear(long double expected, long double max_abs_error)
2220 {
2221  return detail::NanSensitiveFloatingPointNearMatcher<long double>(expected, max_abs_error);
2222 }
2223 
2224 #endif
2225 
2226 #endif
2227 
2232 template<typename T>
2233 detail::StrEqMatcher<T> StrEq(const T& expected)
2235  return detail::StrEqMatcher<T>(expected);
2236 }
2237 
2242 template<typename T>
2243 detail::StrNeMatcher<T> StrNe(const T& expected)
2245  return detail::StrNeMatcher<T>(expected);
2246 }
2247 
2252 template<typename T>
2253 detail::StrCaseEqMatcher<T> StrCaseEq(const T& expected)
2255  return detail::StrCaseEqMatcher<T>(expected);
2256 }
2257 
2262 template<typename T>
2263 detail::StrCaseNeMatcher<T> StrCaseNe(const T& expected)
2265  return detail::StrCaseNeMatcher<T>(expected);
2266 }
2267 
2272 template<typename T>
2273 detail::StartsWithMatcher<const T&> StartsWith(const T& str)
2275  return detail::StartsWithMatcher<const T&>(str);
2276 }
2277 
2282 template<typename T>
2283 detail::HasSubstrMatcher<const T&> HasSubstr(const T& str)
2285  return detail::HasSubstrMatcher<const T&>(str);
2286 }
2287 
2292 template<typename T>
2293 detail::EndsWithMatcher<const T&> EndsWith(const T& str)
2295  return detail::EndsWithMatcher<const T&>(str);
2296 }
2297 
2302 template<typename T>
2303 detail::ContainsMatcher<T> Contains(const T& expected)
2305  return detail::ContainsMatcher<T>(expected);
2306 }
2307 
2308 #if IUTEST_HAS_MATCHER_EACH
2309 
2314 template<typename T>
2315 detail::EachMatcher<T> Each(const T& expected)
2317  return detail::EachMatcher<T>(expected);
2318 }
2319 
2320 #endif
2321 
2326 template<typename T>
2327 detail::ContainerEqMatcher<T> ContainerEq(const T& expected)
2329  return detail::ContainerEqMatcher<T>(expected);
2330 }
2331 
2332 #if IUTEST_HAS_MATCHER_POINTWISE
2333 
2338 template<typename M, typename T>
2339 detail::PointwiseMatcher<M, T> Pointwise(const M& matcher, const T& expected)
2341  return detail::PointwiseMatcher<M, T>(matcher, expected);
2342 }
2343 
2344 #endif
2345 
2346 #if IUTEST_HAS_MATCHER_OPTIONAL
2347 
2352 template<typename T>
2353 detail::OptionalMatcher<T> Optional(const T& expected)
2355  return detail::OptionalMatcher<T>(expected);
2356 }
2357 
2358 #endif
2359 
2364 inline detail::IsEmptyMatcher IsEmpty()
2366  return detail::IsEmptyMatcher();
2367 }
2368 
2373 template<typename T>
2374 detail::SizeIsMatcher<T> SizeIs(const T& expected)
2376  return detail::SizeIsMatcher<T>(expected);
2377 }
2378 
2383 template<typename T>
2384 detail::AtMatcher<T> At(size_t index, const T& expected)
2386  return detail::AtMatcher<T>(index, expected);
2387 }
2388 
2393 template<typename Container>
2394 detail::ElementsAreArrayMatcher< typename Container::value_type > ElementsAreArray(const Container& container)
2397  return detail::ElementsAreArrayMatcher<typename Container::value_type>(container.begin(), container.end());
2398 }
2399 
2400 #if !defined(IUTEST_NO_FUNCTION_TEMPLATE_ORDERING)
2402 template<typename T, size_t SIZE>
2403 detail::ElementsAreArrayMatcher<T> ElementsAreArray(const T(&v)[SIZE])
2405  return detail::ElementsAreArrayMatcher<T>(v, v + SIZE);
2406 }
2407 
2408 #if !defined(IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
2410 template<typename Ite>
2411 detail::ElementsAreArrayMatcher< typename detail::IteratorTraits<Ite>::type > ElementsAreArray(Ite begin, Ite end)
2413  return detail::ElementsAreArrayMatcher< typename detail::IteratorTraits<Ite>::type >(begin, end);
2414 }
2415 #endif
2416 
2417 #if IUTEST_HAS_INITIALIZER_LIST
2419 template<typename T>
2420 detail::ElementsAreArrayMatcher<T> ElementsAreArray(::std::initializer_list<T> l)
2421 {
2422  return detail::ElementsAreArrayMatcher<T>(l.begin(), l.end());
2423 }
2424 #endif
2425 
2426 #endif
2427 
2432 template<typename T>
2433 detail::ElementsAreArrayMatcher<T> ElementsAreArray(const T* a, int count)
2435  return detail::ElementsAreArrayMatcher<T>(a, a + count);
2436 }
2437 
2438 #if IUTEST_HAS_MATCHER_ELEMENTSAREARRAYFORWARD
2439 
2444 template<typename Container>
2445 detail::ElementsAreArrayMatcher< typename Container::value_type > ElementsAreArrayForward(const Container& container)
2447  return detail::ElementsAreArrayMatcher<typename Container::value_type>(container.begin(), container.end(), false);
2448 }
2449 
2450 #if !defined(IUTEST_NO_FUNCTION_TEMPLATE_ORDERING)
2452 template<typename T, size_t SIZE>
2453 detail::ElementsAreArrayMatcher<T> ElementsAreArrayForward(const T(&v)[SIZE])
2455  return detail::ElementsAreArrayMatcher<T>(v, v + SIZE, false);
2456 }
2457 
2458 #if !defined(IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
2460 template<typename Ite>
2461 detail::ElementsAreArrayMatcher< typename detail::IteratorTraits<Ite>::type > ElementsAreArrayForward(Ite begin, Ite end)
2463  return detail::ElementsAreArrayMatcher< typename detail::IteratorTraits<Ite>::type >(begin, end, false);
2464 }
2465 #endif
2466 
2467 #if IUTEST_HAS_INITIALIZER_LIST
2469 template<typename T>
2470 detail::ElementsAreArrayMatcher<T> ElementsAreArrayForward(::std::initializer_list<T> l)
2471 {
2472  return detail::ElementsAreArrayMatcher<T>(l.begin(), l.end(), false);
2473 }
2474 #endif
2475 
2476 #endif
2477 
2482 template<typename T>
2483 detail::ElementsAreArrayMatcher<T> ElementsAreArrayForward(const T* a, int count)
2485  return detail::ElementsAreArrayMatcher<T>(a, a + count, false);
2486 }
2487 
2488 #endif
2489 
2490 #if IUTEST_HAS_MATCHER_ELEMENTSARE
2491 
2492 #if IUTEST_HAS_MATCHER_VARIADIC
2493 
2497 template<typename ...T>
2498 detail::ElementsAreMatcher<T...> ElementsAre(const T&... m)
2500  return detail::ElementsAreMatcher<T...>(m...);
2501 }
2502 
2503 #else
2504 
2505 #define IIUT_ELEMENTSARE_MATCHER_NAME(n) IUTEST_PP_CAT(ElementsAreMatcher, n)
2506 #define IIUT_DECL_ELEMENTSARE(n) \
2507  template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
2508  detail:: IIUT_ELEMENTSARE_MATCHER_NAME(n)< IUTEST_PP_ENUM_PARAMS(n, T) > \
2509  ElementsAre( IUTEST_PP_ENUM_BINARY_PARAMS(n, const T, &m) ) { return \
2510  detail:: IIUT_ELEMENTSARE_MATCHER_NAME(n)< IUTEST_PP_ENUM_PARAMS(n, T) > \
2511  ( IUTEST_PP_ENUM_PARAMS(n, m) ); }
2512 
2513 
2514 IIUT_DECL_ELEMENTSARE(1)
2515 IIUT_DECL_ELEMENTSARE(2)
2516 IIUT_DECL_ELEMENTSARE(3)
2517 IIUT_DECL_ELEMENTSARE(4)
2518 IIUT_DECL_ELEMENTSARE(5)
2519 IIUT_DECL_ELEMENTSARE(6)
2520 IIUT_DECL_ELEMENTSARE(7)
2521 IIUT_DECL_ELEMENTSARE(8)
2522 IIUT_DECL_ELEMENTSARE(9)
2523 IIUT_DECL_ELEMENTSARE(10)
2524 
2525 #undef IIUT_ELEMENTSARE_MATCHER_NAME
2526 #undef IIUT_DECL_ELEMENTSARE
2527 #endif
2528 
2529 #endif
2530 
2535 template<typename T>
2536 detail::KeyMatcher<T> Key(const T& expected)
2538  return detail::KeyMatcher<T>(expected);
2539 }
2540 
2545 template<typename T1, typename T2>
2546 detail::PairMatcher<T1, T2> Pair(const T1& m1, const T2& m2)
2548  return detail::PairMatcher<T1, T2>(m1, m2);
2549 }
2550 
2555 template<typename F, typename T>
2556 detail::FieldMatcher<F, T> Field(const F& field, const T& expected)
2558  return detail::FieldMatcher<F, T>(field, expected);
2559 }
2560 
2565 template<typename P, typename T>
2566 detail::PropertyMatcher<P, T> Property(const P& prop, const T& expected)
2568  return detail::PropertyMatcher<P, T>(prop, expected);
2569 }
2570 
2575 template<typename F, typename T>
2576 detail::ResultOfMatcher<F, T> ResultOf(const F& func, const T& expected)
2578  return detail::ResultOfMatcher<F, T>(func, expected);
2579 }
2580 
2584 template<typename T>
2585 detail::PointeeMatcher<T> Pointee(const T& expected)
2587  return detail::PointeeMatcher<T>(expected);
2588 }
2589 
2593 template<typename T>
2594 detail::NotMatcher<T> Not(const T& unexpected)
2596  return detail::NotMatcher<T>(unexpected);
2597 }
2598 
2602 template<typename T>
2603 detail::AnyMatcher<T> A()
2605  return detail::AnyMatcher<T>();
2606 }
2607 
2608 
2612 const detail::AnythingMatcher _;
2614 #if IUTEST_HAS_MATCHER_REGEX
2615 
2619 inline detail::RegexMatcher MatchesRegex(const ::std::string& str)
2620 {
2621  return detail::RegexMatcher(detail::iuRegex(str), true);
2622 }
2623 
2627 inline detail::RegexMatcher ContainsRegex(const ::std::string& str)
2628 {
2629  return detail::RegexMatcher(detail::iuRegex(str), false);
2630 }
2631 
2632 #endif
2633 
2634 #if IUTEST_HAS_MATCHER_ALLOF_AND_ANYOF
2635 
2636 #if IUTEST_HAS_MATCHER_VARIADIC
2637 
2642 template<typename ...T>
2643 detail::AllOfMatcher<T...> AllOf(const T&... m)
2645  return detail::AllOfMatcher<T...>(m...);
2646 }
2647 
2652 template<typename ...T>
2653 detail::AnyOfMatcher<T...> AnyOf(const T&... m)
2655  return detail::AnyOfMatcher<T...>(m...);
2656 }
2657 
2658 #else
2659 
2660 #define IIUT_ANYOF_AND_ALLOF_MATCHER_NAME(name, n) IUTEST_PP_CAT( IUTEST_PP_CAT(name, Matcher), n)
2661 #define IIUT_DECL_ANYOF_AND_ALLOF(name, n) \
2662  template< IUTEST_PP_ENUM_PARAMS(n, typename T) > \
2663  detail:: IIUT_ANYOF_AND_ALLOF_MATCHER_NAME(name, n)< IUTEST_PP_ENUM_PARAMS(n, T) > \
2664  name( IUTEST_PP_ENUM_BINARY_PARAMS(n, const T, &m) ) { return \
2665  detail:: IIUT_ANYOF_AND_ALLOF_MATCHER_NAME(name, n)< IUTEST_PP_ENUM_PARAMS(n, T) > \
2666  ( IUTEST_PP_ENUM_PARAMS(n, m) ); }
2667 
2668 
2669 IIUT_DECL_ANYOF_AND_ALLOF(AllOf, 2)
2670 IIUT_DECL_ANYOF_AND_ALLOF(AllOf, 3)
2671 IIUT_DECL_ANYOF_AND_ALLOF(AllOf, 4)
2672 IIUT_DECL_ANYOF_AND_ALLOF(AllOf, 5)
2673 IIUT_DECL_ANYOF_AND_ALLOF(AllOf, 6)
2674 IIUT_DECL_ANYOF_AND_ALLOF(AllOf, 7)
2675 IIUT_DECL_ANYOF_AND_ALLOF(AllOf, 8)
2676 IIUT_DECL_ANYOF_AND_ALLOF(AllOf, 9)
2677 IIUT_DECL_ANYOF_AND_ALLOF(AllOf, 10)
2678 
2679 IIUT_DECL_ANYOF_AND_ALLOF(AnyOf, 2)
2680 IIUT_DECL_ANYOF_AND_ALLOF(AnyOf, 3)
2681 IIUT_DECL_ANYOF_AND_ALLOF(AnyOf, 4)
2682 IIUT_DECL_ANYOF_AND_ALLOF(AnyOf, 5)
2683 IIUT_DECL_ANYOF_AND_ALLOF(AnyOf, 6)
2684 IIUT_DECL_ANYOF_AND_ALLOF(AnyOf, 7)
2685 IIUT_DECL_ANYOF_AND_ALLOF(AnyOf, 8)
2686 IIUT_DECL_ANYOF_AND_ALLOF(AnyOf, 9)
2687 IIUT_DECL_ANYOF_AND_ALLOF(AnyOf, 10)
2688 
2689 #undef IIUT_ANYOF_AND_ALLOF_MATCHER_NAME
2690 #undef IIUT_DECL_ANYOF_AND_ALLOF
2691 
2692 #endif
2693 
2694 #endif
2695 
2699 template<typename T, typename M>
2700 bool Value(const T& value, const M& expected)
2702  return static_cast<bool>(detail::CastToMatcher(expected)(value));
2703 }
2704 
2709 } // end of namespace matchers
2710 
2711 using namespace matchers; // NOLINT
2712 
2713 } // end of namespace iutest
2714 
2715 #endif // IUTEST_HAS_MATCHERS
2716 
2717 #endif // INCG_IRIS_IUTEST_MATCHER_HPP_23746E00_1A4B_4778_91AD_45C6DEFEEFA7_
detail::TwofoldGtMatcher Gt()
Make Twofold Gt matcher
Definition: iutest_matcher.hpp:2028
detail::HasSubstrMatcher< const T & > HasSubstr(const T &str)
Make HasSubstr matcher
Definition: iutest_matcher.hpp:2284
detail::NanSensitiveFloatingPointNearMatcher< double > NanSensitiveDoubleNear(double expected, double max_abs_error)
Make NanSensitive Double Near matcher
Definition: iutest_matcher.hpp:2209
detail::EachMatcher< T > Each(const T &expected)
Make Each matcher
Definition: iutest_matcher.hpp:2316
detail::NotNullMatcher NotNull()
Make NotNull matcher
Definition: iutest_matcher.hpp:2046
detail::EndsWithMatcher< const T & > EndsWith(const T &str)
Make EndsWith matcher
Definition: iutest_matcher.hpp:2294
detail::AnyOfMatcher< T... > AnyOf(const T &... m)
Make AnyOf matcher
Definition: iutest_matcher.hpp:2654
detail::ElementsAreArrayMatcher< T > ElementsAreArray(const T *a, int count)
Make ElementsAreArray matcher
Definition: iutest_matcher.hpp:2434
detail::NanSensitiveFloatingPointEqMatcher< T > NanSensitiveFloatingPointEq(T expected)
Make FloatingPoint Eq matcher
Definition: iutest_matcher.hpp:2107
detail::StrEqMatcher< T > StrEq(const T &expected)
Make StrEq matcher
Definition: iutest_matcher.hpp:2234
detail::AllOfMatcher< T... > AllOf(const T &... m)
Make AllOf matcher
Definition: iutest_matcher.hpp:2644
detail::PairMatcher< T1, T2 > Pair(const T1 &m1, const T2 &m2)
Make Pair matcher
Definition: iutest_matcher.hpp:2547
detail::IsNullMatcher IsNull()
Make IsNull matcher
Definition: iutest_matcher.hpp:2037
detail::NotMatcher< T > Not(const T &unexpected)
Make Not matcher
Definition: iutest_matcher.hpp:2595
detail::StartsWithMatcher< const T & > StartsWith(const T &str)
Make StartsWith matcher
Definition: iutest_matcher.hpp:2274
detail::TypedEqMatcher< T > TypedEq(const U &expected)
Make TypedEq matcher
Definition: iutest_matcher.hpp:2056
detail::FloatingPointEqMatcher< T > FloatingPointEq(T expected)
Make FloatingPoint Eq matcher
Definition: iutest_matcher.hpp:2066
detail::AnyMatcher< T > A()
Make Any matcher
Definition: iutest_matcher.hpp:2604
detail::EqMatcher< T > Equals(const T &expected)
Make Equals matcher
Definition: iutest_matcher.hpp:1914
detail::FloatingPointEqMatcher< float > FloatEq(float expected)
Make Float Eq matcher
Definition: iutest_matcher.hpp:2075
detail::ContainerEqMatcher< T > ContainerEq(const T &expected)
Make ContainerEq matcher
Definition: iutest_matcher.hpp:2328
detail::AtMatcher< T > At(size_t index, const T &expected)
Make At matcher
Definition: iutest_matcher.hpp:2385
detail::SizeIsMatcher< T > SizeIs(const T &expected)
Make SizeIs matcher
Definition: iutest_matcher.hpp:2375
detail::NanSensitiveFloatingPointNearMatcher< float > NanSensitiveFloatNear(float expected, float max_abs_error)
Make NanSensitive Float Near matcher
Definition: iutest_matcher.hpp:2200
detail::NanSensitiveFloatingPointNearMatcher< T > NanSensitiveFloatingPointNear(T expected, T max_abs_error)
Make FloatingPoint Near matcher
Definition: iutest_matcher.hpp:2191
detail::FieldMatcher< F, T > Field(const F &field, const T &expected)
Make Field matcher
Definition: iutest_matcher.hpp:2557
detail::PropertyMatcher< P, T > Property(const P &prop, const T &expected)
Make Property matcher
Definition: iutest_matcher.hpp:2567
detail::TwofoldEqMatcher Eq()
Make Twofold Eq matcher
Definition: iutest_matcher.hpp:1983
detail::StrCaseNeMatcher< T > StrCaseNe(const T &expected)
Make StrCaseNe matcher
Definition: iutest_matcher.hpp:2264
detail::TwofoldLtMatcher Lt()
Make Twofold Lt matcher
Definition: iutest_matcher.hpp:2010
detail::NanSensitiveFloatingPointEqMatcher< float > NanSensitiveFloatEq(float expected)
Make NanSensitive Float Eq matcher
Definition: iutest_matcher.hpp:2116
bool Value(const T &value, const M &expected)
Value predicate
Definition: iutest_matcher.hpp:2701
detail::FloatingPointNearMatcher< double > DoubleNear(double expected, double max_abs_error)
Make Double Near matcher
Definition: iutest_matcher.hpp:2168
detail::PointeeMatcher< T > Pointee(const T &expected)
Make Pointee matcher
Definition: iutest_matcher.hpp:2586
detail::PointwiseMatcher< M, T > Pointwise(const M &matcher, const T &expected)
Make Pointwise matcher
Definition: iutest_matcher.hpp:2340
detail::NanSensitiveFloatingPointEqMatcher< double > NanSensitiveDoubleEq(double expected)
Make NanSensitive Double Eq matcher
Definition: iutest_matcher.hpp:2125
detail::ElementsAreMatcher< T... > ElementsAre(const T &... m)
Make ElementsAre matcher
Definition: iutest_matcher.hpp:2499
detail::TwofoldGeMatcher Ge()
Make Twofold Ge matcher
Definition: iutest_matcher.hpp:2019
detail::TwofoldNeMatcher Ne()
Make Twofold Ne matcher
Definition: iutest_matcher.hpp:1992
detail::ElementsAreArrayMatcher< T > ElementsAreArrayForward(const T *a, int count)
Make ElementsAreArrayForward matcher
Definition: iutest_matcher.hpp:2484
detail::StrNeMatcher< T > StrNe(const T &expected)
Make StrNe matcher
Definition: iutest_matcher.hpp:2244
detail::KeyMatcher< T > Key(const T &expected)
Make Key matcher
Definition: iutest_matcher.hpp:2537
detail::ResultOfMatcher< F, T > ResultOf(const F &func, const T &expected)
Make ResultOf matcher
Definition: iutest_matcher.hpp:2577
detail::FloatingPointNearMatcher< float > FloatNear(float expected, float max_abs_error)
Make Float Near matcher
Definition: iutest_matcher.hpp:2159
detail::IsEmptyMatcher IsEmpty()
Make IsEmpty matcher
Definition: iutest_matcher.hpp:2365
const detail::AnythingMatcher _
Anything matcher
Definition: iutest_matcher.hpp:2613
detail::TwofoldLeMatcher Le()
Make Twofold Le matcher
Definition: iutest_matcher.hpp:2001
detail::StrCaseEqMatcher< T > StrCaseEq(const T &expected)
Make StrCaseEq matcher
Definition: iutest_matcher.hpp:2254
detail::FloatingPointEqMatcher< double > DoubleEq(double expected)
Make Double Eq matcher
Definition: iutest_matcher.hpp:2084
detail::OptionalMatcher< T > Optional(const T &expected)
Make Optional matcher
Definition: iutest_matcher.hpp:2354
detail::ContainsMatcher< T > Contains(const T &expected)
Make Contains matcher
Definition: iutest_matcher.hpp:2304
detail::FloatingPointNearMatcher< T > FloatingPointNear(T expected, T max_abs_error)
Make FloatingPoint Near matcher
Definition: iutest_matcher.hpp:2150
#define IUTEST_CXX_FINAL
final definition
Definition: iutest_compiler.hpp:756
#define IUTEST_CXX_OVERRIDE
override definition
Definition: iutest_compiler.hpp:747
#define IUTEST_USING_BEGIN_END()
using begin,end
Definition: iutest_stdlib.hpp:34
iutest root namespace
Definition: iutest_charcode.hpp:33
AssertionResult AssertionSuccess()
テスト成功を示す AssertionResult オブジェクトの取得
Definition: iutest_assertion.hpp:406
std::string PrintToString(const T &v)
文字列化
Definition: iutest_printers.hpp:767
AssertionResult AssertionFailure()
テスト失敗を示す AssertionResult オブジェクトの取得
Definition: iutest_assertion.hpp:410
detail::iuStreamMessage Message
Message クラス
Definition: iutest_assertion.hpp:33