1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Copyright 2006, Google Inc.
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// All rights reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Redistribution and use in source and binary forms, with or without
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// modification, are permitted provided that the following conditions are
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// met:
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//     * Redistributions of source code must retain the above copyright
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// notice, this list of conditions and the following disclaimer.
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//     * Redistributions in binary form must reproduce the above
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// copyright notice, this list of conditions and the following disclaimer
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// in the documentation and/or other materials provided with the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// distribution.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//     * Neither the name of Google Inc. nor the names of its
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// contributors may be used to endorse or promote products derived from
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this software without specific prior written permission.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// This file is AUTOMATICALLY GENERATED on 09/24/2010 by command
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Implements a family of generic predicate assertion macros.
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Makes sure this header is not included before gtest.h.
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// This header implements a family of generic predicate assertion
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// macros:
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//   ASSERT_PRED_FORMAT1(pred_format, v1)
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//   ...
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// where pred_format is a function or functor that takes n (in the
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// case of ASSERT_PRED_FORMATn) values and their source expression
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// text, and returns a testing::AssertionResult.  See the definition
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// of ASSERT_EQ in gtest.h for an example.
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// If you don't care about formatting, you can use the more
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// restrictive version:
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//   ASSERT_PRED1(pred, v1)
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//   ASSERT_PRED2(pred, v1, v2)
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//   ...
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// where pred is an n-ary function or functor that returns bool,
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// and the values v1, v2, ..., must support the << operator for
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// streaming to std::ostream.
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// We also define the EXPECT_* variations.
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// For now we only support predicates whose arity is at most 5.
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Please email googletestframework@googlegroups.com if you need
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// support for higher arities.
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// GTEST_ASSERT_ is the basic statement to which all of the assertions
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// in this file reduce.  Don't use this in your code.
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_ASSERT_(expression, on_failure) \
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (const ::testing::AssertionResult gtest_ar = (expression)) \
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ; \
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  else \
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    on_failure(gtest_ar.failure_message())
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this in your code.
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtemplate <typename Pred,
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T1>
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAssertionResult AssertPred1Helper(const char* pred_text,
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e1,
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  Pred pred,
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T1& v1) {
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (pred(v1)) return AssertionSuccess();
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return AssertionFailure() << pred_text << "("
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e1 << ") evaluates to false, where"
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e1 << " evaluates to " << v1;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Don't use this in your code.
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_ASSERT_(pred_format(#v1, v1),\
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                on_failure)
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this in your code.
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_PRED1_(pred, v1, on_failure)\
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v1, \
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             pred, \
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v1), on_failure)
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Unary predicate assertion macros.
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPECT_PRED_FORMAT1(pred_format, v1) \
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPECT_PRED1(pred, v1) \
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_PRED_FORMAT1(pred_format, v1) \
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_PRED1(pred, v1) \
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this in your code.
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtemplate <typename Pred,
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T1,
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T2>
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAssertionResult AssertPred2Helper(const char* pred_text,
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e1,
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e2,
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  Pred pred,
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T1& v1,
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T2& v2) {
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (pred(v1, v2)) return AssertionSuccess();
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return AssertionFailure() << pred_text << "("
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e1 << ", "
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e2 << ") evaluates to false, where"
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e1 << " evaluates to " << v1
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e2 << " evaluates to " << v2;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Don't use this in your code.
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                on_failure)
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this in your code.
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_PRED2_(pred, v1, v2, on_failure)\
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v1, \
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v2, \
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             pred, \
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v1, \
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v2), on_failure)
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Binary predicate assertion macros.
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPECT_PRED2(pred, v1, v2) \
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_PRED2(pred, v1, v2) \
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this in your code.
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtemplate <typename Pred,
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T1,
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T2,
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T3>
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAssertionResult AssertPred3Helper(const char* pred_text,
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e1,
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e2,
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e3,
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  Pred pred,
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T1& v1,
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T2& v2,
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T3& v3) {
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (pred(v1, v2, v3)) return AssertionSuccess();
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return AssertionFailure() << pred_text << "("
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e1 << ", "
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e2 << ", "
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e3 << ") evaluates to false, where"
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e1 << " evaluates to " << v1
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e2 << " evaluates to " << v2
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e3 << " evaluates to " << v3;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Don't use this in your code.
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                on_failure)
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this in your code.
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v1, \
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v2, \
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v3, \
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             pred, \
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v1, \
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v2, \
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v3), on_failure)
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Ternary predicate assertion macros.
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPECT_PRED3(pred, v1, v2, v3) \
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_PRED3(pred, v1, v2, v3) \
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this in your code.
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtemplate <typename Pred,
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T1,
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T2,
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T3,
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T4>
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAssertionResult AssertPred4Helper(const char* pred_text,
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e1,
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e2,
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e3,
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e4,
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  Pred pred,
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T1& v1,
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T2& v2,
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T3& v3,
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T4& v4) {
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return AssertionFailure() << pred_text << "("
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e1 << ", "
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e2 << ", "
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e3 << ", "
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e4 << ") evaluates to false, where"
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e1 << " evaluates to " << v1
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e2 << " evaluates to " << v2
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e3 << " evaluates to " << v3
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e4 << " evaluates to " << v4;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Don't use this in your code.
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                on_failure)
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this in your code.
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v1, \
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v2, \
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v3, \
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v4, \
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             pred, \
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v1, \
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v2, \
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v3, \
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v4), on_failure)
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 4-ary predicate assertion macros.
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this in your code.
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtemplate <typename Pred,
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T1,
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T2,
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T3,
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T4,
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          typename T5>
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAssertionResult AssertPred5Helper(const char* pred_text,
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e1,
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e2,
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e3,
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e4,
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const char* e5,
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  Pred pred,
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T1& v1,
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T2& v2,
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T3& v3,
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T4& v4,
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const T5& v5) {
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return AssertionFailure() << pred_text << "("
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e1 << ", "
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e2 << ", "
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e3 << ", "
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e4 << ", "
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << e5 << ") evaluates to false, where"
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e1 << " evaluates to " << v1
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e2 << " evaluates to " << v2
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e3 << " evaluates to " << v3
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e4 << " evaluates to " << v4
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            << "\n" << e5 << " evaluates to " << v5;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Don't use this in your code.
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                on_failure)
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this in your code.
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v1, \
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v2, \
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v3, \
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v4, \
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             #v5, \
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             pred, \
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v1, \
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v2, \
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v3, \
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v4, \
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             v5), on_failure)
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 5-ary predicate assertion macros.
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
359