11be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Copyright 2006, Google Inc.
21be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// All rights reserved.
31be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
41be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Redistribution and use in source and binary forms, with or without
51be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// modification, are permitted provided that the following conditions are
61be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// met:
71be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
81be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Redistributions of source code must retain the above copyright
91be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// notice, this list of conditions and the following disclaimer.
101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Redistributions in binary form must reproduce the above
111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// copyright notice, this list of conditions and the following disclaimer
121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in the documentation and/or other materials provided with the
131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// distribution.
141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//     * Neither the name of Google Inc. nor the names of its
151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// contributors may be used to endorse or promote products derived from
161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this software without specific prior written permission.
171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot// This file is AUTOMATICALLY GENERATED on 09/24/2010 by command
311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Implements a family of generic predicate assertion macros.
341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Makes sure this header is not included before gtest.h.
391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
4041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// This header implements a family of generic predicate assertion
441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// macros:
451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   ASSERT_PRED_FORMAT1(pred_format, v1)
471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   ...
491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// where pred_format is a function or functor that takes n (in the
511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// case of ASSERT_PRED_FORMATn) values and their source expression
521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// text, and returns a testing::AssertionResult.  See the definition
531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// of ASSERT_EQ in gtest.h for an example.
541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// If you don't care about formatting, you can use the more
561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// restrictive version:
571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   ASSERT_PRED1(pred, v1)
591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   ASSERT_PRED2(pred, v1, v2)
601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//   ...
611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// where pred is an n-ary function or functor that returns bool,
631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// and the values v1, v2, ..., must support the << operator for
641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// streaming to std::ostream.
651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// We also define the EXPECT_* variations.
671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania//
681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// For now we only support predicates whose arity is at most 5.
691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Please email googletestframework@googlegroups.com if you need
701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// support for higher arities.
711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// GTEST_ASSERT_ is the basic statement to which all of the assertions
731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// in this file reduce.  Don't use this in your code.
741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_ASSERT_(expression, on_failure) \
761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  if (const ::testing::AssertionResult gtest_ar = (expression)) \
781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    ; \
791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  else \
801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania    on_failure(gtest_ar.failure_message())
811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this in your code.
851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Pred,
861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T1>
871be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaAssertionResult AssertPred1Helper(const char* pred_text,
881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e1,
891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  Pred pred,
901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T1& v1) {
911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  if (pred(v1)) return AssertionSuccess();
921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
9341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return AssertionFailure() << pred_text << "("
9441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e1 << ") evaluates to false, where"
9541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e1 << " evaluates to " << v1;
961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Don't use this in your code.
1001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
1011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_ASSERT_(pred_format(#v1, v1),\
1021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                on_failure)
1031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
1051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this in your code.
1061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PRED1_(pred, v1, on_failure)\
1071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
1081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v1, \
1091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             pred, \
1101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v1), on_failure)
1111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Unary predicate assertion macros.
1131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define EXPECT_PRED_FORMAT1(pred_format, v1) \
1141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
1151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define EXPECT_PRED1(pred, v1) \
1161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
1171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define ASSERT_PRED_FORMAT1(pred_format, v1) \
1181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
1191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define ASSERT_PRED1(pred, v1) \
1201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
1211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
1251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this in your code.
1261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Pred,
1271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T1,
1281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T2>
1291be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaAssertionResult AssertPred2Helper(const char* pred_text,
1301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e1,
1311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e2,
1321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  Pred pred,
1331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T1& v1,
1341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T2& v2) {
1351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  if (pred(v1, v2)) return AssertionSuccess();
1361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
13741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return AssertionFailure() << pred_text << "("
13841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e1 << ", "
13941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e2 << ") evaluates to false, where"
14041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e1 << " evaluates to " << v1
14141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e2 << " evaluates to " << v2;
1421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
1431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
1451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Don't use this in your code.
1461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
1471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\
1481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                on_failure)
1491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
1511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this in your code.
1521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PRED2_(pred, v1, v2, on_failure)\
1531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
1541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v1, \
1551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v2, \
1561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             pred, \
1571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v1, \
1581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v2), on_failure)
1591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Binary predicate assertion macros.
1611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
1621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
1631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define EXPECT_PRED2(pred, v1, v2) \
1641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
1651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
1661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
1671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define ASSERT_PRED2(pred, v1, v2) \
1681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
1691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
1731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this in your code.
1741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Pred,
1751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T1,
1761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T2,
1771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T3>
1781be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaAssertionResult AssertPred3Helper(const char* pred_text,
1791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e1,
1801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e2,
1811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e3,
1821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  Pred pred,
1831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T1& v1,
1841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T2& v2,
1851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T3& v3) {
1861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  if (pred(v1, v2, v3)) return AssertionSuccess();
1871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
18841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return AssertionFailure() << pred_text << "("
18941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e1 << ", "
19041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e2 << ", "
19141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e3 << ") evaluates to false, where"
19241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e1 << " evaluates to " << v1
19341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e2 << " evaluates to " << v2
19441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e3 << " evaluates to " << v3;
1951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
1961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
1971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
1981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Don't use this in your code.
1991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
2001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\
2011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                on_failure)
2021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
2041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this in your code.
2051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
2061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
2071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v1, \
2081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v2, \
2091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v3, \
2101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             pred, \
2111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v1, \
2121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v2, \
2131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v3), on_failure)
2141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Ternary predicate assertion macros.
2161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
2171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
2181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define EXPECT_PRED3(pred, v1, v2, v3) \
2191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
2201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
2211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
2221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define ASSERT_PRED3(pred, v1, v2, v3) \
2231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
2241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
2281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this in your code.
2291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Pred,
2301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T1,
2311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T2,
2321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T3,
2331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T4>
2341be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaAssertionResult AssertPred4Helper(const char* pred_text,
2351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e1,
2361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e2,
2371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e3,
2381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e4,
2391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  Pred pred,
2401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T1& v1,
2411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T2& v2,
2421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T3& v3,
2431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T4& v4) {
2441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
2451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
24641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return AssertionFailure() << pred_text << "("
24741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e1 << ", "
24841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e2 << ", "
24941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e3 << ", "
25041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e4 << ") evaluates to false, where"
25141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e1 << " evaluates to " << v1
25241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e2 << " evaluates to " << v2
25341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e3 << " evaluates to " << v3
25441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e4 << " evaluates to " << v4;
2551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
2561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
2581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Don't use this in your code.
2591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
2601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\
2611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                on_failure)
2621be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2631be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
2641be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this in your code.
2651be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
2661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
2671be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v1, \
2681be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v2, \
2691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v3, \
2701be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v4, \
2711be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             pred, \
2721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v1, \
2731be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v2, \
2741be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v3, \
2751be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v4), on_failure)
2761be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2771be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 4-ary predicate assertion macros.
2781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
2791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
2801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
2811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
2821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
2831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
2841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
2851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
2861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
2891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
2901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this in your code.
2911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniatemplate <typename Pred,
2921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T1,
2931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T2,
2941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T3,
2951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T4,
2961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania          typename T5>
2971be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaAssertionResult AssertPred5Helper(const char* pred_text,
2981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e1,
2991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e2,
3001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e3,
3011be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e4,
3021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const char* e5,
3031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  Pred pred,
3041be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T1& v1,
3051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T2& v2,
3061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T3& v3,
3071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T4& v4,
3081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                  const T5& v5) {
3091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
3101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
31141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  return AssertionFailure() << pred_text << "("
31241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e1 << ", "
31341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e2 << ", "
31441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e3 << ", "
31541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e4 << ", "
31641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << e5 << ") evaluates to false, where"
31741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e1 << " evaluates to " << v1
31841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e2 << " evaluates to " << v2
31941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e3 << " evaluates to " << v3
32041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e4 << " evaluates to " << v4
32141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                            << "\n" << e5 << " evaluates to " << v5;
3221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania}
3231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
3251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Don't use this in your code.
3261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
3271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\
3281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                on_failure)
3291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
3311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// this in your code.
3321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
3331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
3341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v1, \
3351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v2, \
3361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v3, \
3371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v4, \
3381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             #v5, \
3391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             pred, \
3401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v1, \
3411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v2, \
3421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v3, \
3431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v4, \
3441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania                                             v5), on_failure)
3451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania// 5-ary predicate assertion macros.
3471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
3481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
3491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
3501be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
3511be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
3521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
3531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
3541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
3551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3561be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania
3581be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
359