17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Copyright 2006, Google Inc.
27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// All rights reserved.
37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Redistribution and use in source and binary forms, with or without
57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// modification, are permitted provided that the following conditions are
67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// met:
77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions of source code must retain the above copyright
97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// notice, this list of conditions and the following disclaimer.
107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Redistributions in binary form must reproduce the above
117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// copyright notice, this list of conditions and the following disclaimer
127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in the documentation and/or other materials provided with the
137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// distribution.
147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//     * Neither the name of Google Inc. nor the names of its
157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// contributors may be used to endorse or promote products derived from
167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this software without specific prior written permission.
177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
30b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad// This file is AUTOMATICALLY GENERATED on 09/24/2010 by command
317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Implements a family of generic predicate assertion macros.
347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Makes sure this header is not included before gtest.h.
397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
40b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This header implements a family of generic predicate assertion
447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// macros:
457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_PRED_FORMAT1(pred_format, v1)
477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ...
497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// where pred_format is a function or functor that takes n (in the
517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// case of ASSERT_PRED_FORMATn) values and their source expression
527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// text, and returns a testing::AssertionResult.  See the definition
537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// of ASSERT_EQ in gtest.h for an example.
547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// If you don't care about formatting, you can use the more
567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// restrictive version:
577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_PRED1(pred, v1)
597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ASSERT_PRED2(pred, v1, v2)
607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//   ...
617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// where pred is an n-ary function or functor that returns bool,
637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// and the values v1, v2, ..., must support the << operator for
647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// streaming to std::ostream.
657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// We also define the EXPECT_* variations.
677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//
687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// For now we only support predicates whose arity is at most 5.
697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Please email googletestframework@googlegroups.com if you need
707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// support for higher arities.
717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// GTEST_ASSERT_ is the basic statement to which all of the assertions
737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// in this file reduce.  Don't use this in your code.
747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_ASSERT_(expression, on_failure) \
767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (const ::testing::AssertionResult gtest_ar = (expression)) \
787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    ; \
797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  else \
807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman    on_failure(gtest_ar.failure_message())
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this in your code.
857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Pred,
867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T1>
877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanAssertionResult AssertPred1Helper(const char* pred_text,
887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e1,
897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  Pred pred,
907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T1& v1) {
917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (pred(v1)) return AssertionSuccess();
927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
93b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  return AssertionFailure() << pred_text << "("
94b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e1 << ") evaluates to false, where"
95b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e1 << " evaluates to " << v1;
967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Don't use this in your code.
1007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
1017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_ASSERT_(pred_format(#v1, v1),\
1027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                on_failure)
1037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
1057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this in your code.
1067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_PRED1_(pred, v1, on_failure)\
1077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
1087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v1, \
1097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             pred, \
1107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v1), on_failure)
1117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Unary predicate assertion macros.
1137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_PRED_FORMAT1(pred_format, v1) \
1147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
1157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_PRED1(pred, v1) \
1167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
1177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_PRED_FORMAT1(pred_format, v1) \
1187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
1197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_PRED1(pred, v1) \
1207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
1217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
1257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this in your code.
1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Pred,
1277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T1,
1287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T2>
1297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanAssertionResult AssertPred2Helper(const char* pred_text,
1307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e1,
1317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e2,
1327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  Pred pred,
1337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T1& v1,
1347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T2& v2) {
1357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (pred(v1, v2)) return AssertionSuccess();
1367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
137b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  return AssertionFailure() << pred_text << "("
138b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e1 << ", "
139b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e2 << ") evaluates to false, where"
140b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e1 << " evaluates to " << v1
141b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e2 << " evaluates to " << v2;
1427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
1437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
1457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Don't use this in your code.
1467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
1477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\
1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                on_failure)
1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
1517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this in your code.
1527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_PRED2_(pred, v1, v2, on_failure)\
1537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
1547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v1, \
1557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v2, \
1567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             pred, \
1577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v1, \
1587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v2), on_failure)
1597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Binary predicate assertion macros.
1617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
1627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
1637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_PRED2(pred, v1, v2) \
1647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
1657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
1667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_PRED2(pred, v1, v2) \
1687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
1697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
1737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this in your code.
1747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Pred,
1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T1,
1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T2,
1777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T3>
1787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanAssertionResult AssertPred3Helper(const char* pred_text,
1797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e1,
1807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e2,
1817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e3,
1827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  Pred pred,
1837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T1& v1,
1847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T2& v2,
1857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T3& v3) {
1867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (pred(v1, v2, v3)) return AssertionSuccess();
1877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
188b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  return AssertionFailure() << pred_text << "("
189b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e1 << ", "
190b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e2 << ", "
191b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e3 << ") evaluates to false, where"
192b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e1 << " evaluates to " << v1
193b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e2 << " evaluates to " << v2
194b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e3 << " evaluates to " << v3;
1957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
1967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
1987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Don't use this in your code.
1997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
2007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\
2017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                on_failure)
2027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
2047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this in your code.
2057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
2067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
2077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v1, \
2087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v2, \
2097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v3, \
2107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             pred, \
2117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v1, \
2127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v2, \
2137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v3), on_failure)
2147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Ternary predicate assertion macros.
2167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
2177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
2187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_PRED3(pred, v1, v2, v3) \
2197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
2207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
2217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
2227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_PRED3(pred, v1, v2, v3) \
2237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
2247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
2287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this in your code.
2297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Pred,
2307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T1,
2317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T2,
2327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T3,
2337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T4>
2347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanAssertionResult AssertPred4Helper(const char* pred_text,
2357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e1,
2367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e2,
2377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e3,
2387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e4,
2397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  Pred pred,
2407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T1& v1,
2417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T2& v2,
2427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T3& v3,
2437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T4& v4) {
2447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
2457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
246b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  return AssertionFailure() << pred_text << "("
247b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e1 << ", "
248b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e2 << ", "
249b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e3 << ", "
250b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e4 << ") evaluates to false, where"
251b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e1 << " evaluates to " << v1
252b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e2 << " evaluates to " << v2
253b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e3 << " evaluates to " << v3
254b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e4 << " evaluates to " << v4;
2557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
2567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
2587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Don't use this in your code.
2597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
2607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\
2617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                on_failure)
2627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
2647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this in your code.
2657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
2667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
2677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v1, \
2687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v2, \
2697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v3, \
2707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v4, \
2717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             pred, \
2727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v1, \
2737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v2, \
2747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v3, \
2757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v4), on_failure)
2767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 4-ary predicate assertion macros.
2787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
2797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
2807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
2817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
2827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
2837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
2847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
2857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
2867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
2897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
2907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this in your code.
2917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantemplate <typename Pred,
2927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T1,
2937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T2,
2947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T3,
2957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T4,
2967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman          typename T5>
2977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanAssertionResult AssertPred5Helper(const char* pred_text,
2987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e1,
2997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e2,
3007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e3,
3017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e4,
3027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const char* e5,
3037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  Pred pred,
3047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T1& v1,
3057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T2& v2,
3067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T3& v3,
3077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T4& v4,
3087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                  const T5& v5) {
3097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
3107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
311b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad  return AssertionFailure() << pred_text << "("
312b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e1 << ", "
313b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e2 << ", "
314b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e3 << ", "
315b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e4 << ", "
316b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << e5 << ") evaluates to false, where"
317b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e1 << " evaluates to " << v1
318b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e2 << " evaluates to " << v2
319b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e3 << " evaluates to " << v3
320b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e4 << " evaluates to " << v4
321b33f8e3e55932d0e15a686ef0c598da8dbc37acdJay Foad                            << "\n" << e5 << " evaluates to " << v5;
3227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}
3237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
3257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Don't use this in your code.
3267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
3277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\
3287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                on_failure)
3297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
3317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// this in your code.
3327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
3337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
3347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v1, \
3357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v2, \
3367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v3, \
3377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v4, \
3387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             #v5, \
3397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             pred, \
3407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v1, \
3417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v2, \
3427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v3, \
3437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v4, \
3447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman                                             v5), on_failure)
3457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 5-ary predicate assertion macros.
3477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
3487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
3497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
3507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
3517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
3527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
3537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
3547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
3557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
3587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
359