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