113481Sgiacomo.travaglini@arm.com// Copyright 2006, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com
3013481Sgiacomo.travaglini@arm.com// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
3113481Sgiacomo.travaglini@arm.com// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
3213481Sgiacomo.travaglini@arm.com//
3313481Sgiacomo.travaglini@arm.com// Implements a family of generic predicate assertion macros.
3413481Sgiacomo.travaglini@arm.com
3513481Sgiacomo.travaglini@arm.com#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
3613481Sgiacomo.travaglini@arm.com#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.com// Makes sure this header is not included before gtest.h.
3913481Sgiacomo.travaglini@arm.com#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
4013481Sgiacomo.travaglini@arm.com# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
4113481Sgiacomo.travaglini@arm.com#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
4213481Sgiacomo.travaglini@arm.com
4313481Sgiacomo.travaglini@arm.com// This header implements a family of generic predicate assertion
4413481Sgiacomo.travaglini@arm.com// macros:
4513481Sgiacomo.travaglini@arm.com//
4613481Sgiacomo.travaglini@arm.com//   ASSERT_PRED_FORMAT1(pred_format, v1)
4713481Sgiacomo.travaglini@arm.com//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
4813481Sgiacomo.travaglini@arm.com//   ...
4913481Sgiacomo.travaglini@arm.com//
5013481Sgiacomo.travaglini@arm.com// where pred_format is a function or functor that takes n (in the
5113481Sgiacomo.travaglini@arm.com// case of ASSERT_PRED_FORMATn) values and their source expression
5213481Sgiacomo.travaglini@arm.com// text, and returns a testing::AssertionResult.  See the definition
5313481Sgiacomo.travaglini@arm.com// of ASSERT_EQ in gtest.h for an example.
5413481Sgiacomo.travaglini@arm.com//
5513481Sgiacomo.travaglini@arm.com// If you don't care about formatting, you can use the more
5613481Sgiacomo.travaglini@arm.com// restrictive version:
5713481Sgiacomo.travaglini@arm.com//
5813481Sgiacomo.travaglini@arm.com//   ASSERT_PRED1(pred, v1)
5913481Sgiacomo.travaglini@arm.com//   ASSERT_PRED2(pred, v1, v2)
6013481Sgiacomo.travaglini@arm.com//   ...
6113481Sgiacomo.travaglini@arm.com//
6213481Sgiacomo.travaglini@arm.com// where pred is an n-ary function or functor that returns bool,
6313481Sgiacomo.travaglini@arm.com// and the values v1, v2, ..., must support the << operator for
6413481Sgiacomo.travaglini@arm.com// streaming to std::ostream.
6513481Sgiacomo.travaglini@arm.com//
6613481Sgiacomo.travaglini@arm.com// We also define the EXPECT_* variations.
6713481Sgiacomo.travaglini@arm.com//
6813481Sgiacomo.travaglini@arm.com// For now we only support predicates whose arity is at most 5.
6913481Sgiacomo.travaglini@arm.com// Please email googletestframework@googlegroups.com if you need
7013481Sgiacomo.travaglini@arm.com// support for higher arities.
7113481Sgiacomo.travaglini@arm.com
7213481Sgiacomo.travaglini@arm.com// GTEST_ASSERT_ is the basic statement to which all of the assertions
7313481Sgiacomo.travaglini@arm.com// in this file reduce.  Don't use this in your code.
7413481Sgiacomo.travaglini@arm.com
7513481Sgiacomo.travaglini@arm.com#define GTEST_ASSERT_(expression, on_failure) \
7613481Sgiacomo.travaglini@arm.com  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
7713481Sgiacomo.travaglini@arm.com  if (const ::testing::AssertionResult gtest_ar = (expression)) \
7813481Sgiacomo.travaglini@arm.com    ; \
7913481Sgiacomo.travaglini@arm.com  else \
8013481Sgiacomo.travaglini@arm.com    on_failure(gtest_ar.failure_message())
8113481Sgiacomo.travaglini@arm.com
8213481Sgiacomo.travaglini@arm.com
8313481Sgiacomo.travaglini@arm.com// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
8413481Sgiacomo.travaglini@arm.com// this in your code.
8513481Sgiacomo.travaglini@arm.comtemplate <typename Pred,
8613481Sgiacomo.travaglini@arm.com          typename T1>
8713481Sgiacomo.travaglini@arm.comAssertionResult AssertPred1Helper(const char* pred_text,
8813481Sgiacomo.travaglini@arm.com                                  const char* e1,
8913481Sgiacomo.travaglini@arm.com                                  Pred pred,
9013481Sgiacomo.travaglini@arm.com                                  const T1& v1) {
9113481Sgiacomo.travaglini@arm.com  if (pred(v1)) return AssertionSuccess();
9213481Sgiacomo.travaglini@arm.com
9313481Sgiacomo.travaglini@arm.com  return AssertionFailure() << pred_text << "("
9413481Sgiacomo.travaglini@arm.com                            << e1 << ") evaluates to false, where"
9513481Sgiacomo.travaglini@arm.com                            << "\n" << e1 << " evaluates to " << v1;
9613481Sgiacomo.travaglini@arm.com}
9713481Sgiacomo.travaglini@arm.com
9813481Sgiacomo.travaglini@arm.com// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
9913481Sgiacomo.travaglini@arm.com// Don't use this in your code.
10013481Sgiacomo.travaglini@arm.com#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
10113481Sgiacomo.travaglini@arm.com  GTEST_ASSERT_(pred_format(#v1, v1), \
10213481Sgiacomo.travaglini@arm.com                on_failure)
10313481Sgiacomo.travaglini@arm.com
10413481Sgiacomo.travaglini@arm.com// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
10513481Sgiacomo.travaglini@arm.com// this in your code.
10613481Sgiacomo.travaglini@arm.com#define GTEST_PRED1_(pred, v1, on_failure)\
10713481Sgiacomo.travaglini@arm.com  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
10813481Sgiacomo.travaglini@arm.com                                             #v1, \
10913481Sgiacomo.travaglini@arm.com                                             pred, \
11013481Sgiacomo.travaglini@arm.com                                             v1), on_failure)
11113481Sgiacomo.travaglini@arm.com
11213481Sgiacomo.travaglini@arm.com// Unary predicate assertion macros.
11313481Sgiacomo.travaglini@arm.com#define EXPECT_PRED_FORMAT1(pred_format, v1) \
11413481Sgiacomo.travaglini@arm.com  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
11513481Sgiacomo.travaglini@arm.com#define EXPECT_PRED1(pred, v1) \
11613481Sgiacomo.travaglini@arm.com  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
11713481Sgiacomo.travaglini@arm.com#define ASSERT_PRED_FORMAT1(pred_format, v1) \
11813481Sgiacomo.travaglini@arm.com  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
11913481Sgiacomo.travaglini@arm.com#define ASSERT_PRED1(pred, v1) \
12013481Sgiacomo.travaglini@arm.com  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
12113481Sgiacomo.travaglini@arm.com
12213481Sgiacomo.travaglini@arm.com
12313481Sgiacomo.travaglini@arm.com
12413481Sgiacomo.travaglini@arm.com// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
12513481Sgiacomo.travaglini@arm.com// this in your code.
12613481Sgiacomo.travaglini@arm.comtemplate <typename Pred,
12713481Sgiacomo.travaglini@arm.com          typename T1,
12813481Sgiacomo.travaglini@arm.com          typename T2>
12913481Sgiacomo.travaglini@arm.comAssertionResult AssertPred2Helper(const char* pred_text,
13013481Sgiacomo.travaglini@arm.com                                  const char* e1,
13113481Sgiacomo.travaglini@arm.com                                  const char* e2,
13213481Sgiacomo.travaglini@arm.com                                  Pred pred,
13313481Sgiacomo.travaglini@arm.com                                  const T1& v1,
13413481Sgiacomo.travaglini@arm.com                                  const T2& v2) {
13513481Sgiacomo.travaglini@arm.com  if (pred(v1, v2)) return AssertionSuccess();
13613481Sgiacomo.travaglini@arm.com
13713481Sgiacomo.travaglini@arm.com  return AssertionFailure() << pred_text << "("
13813481Sgiacomo.travaglini@arm.com                            << e1 << ", "
13913481Sgiacomo.travaglini@arm.com                            << e2 << ") evaluates to false, where"
14013481Sgiacomo.travaglini@arm.com                            << "\n" << e1 << " evaluates to " << v1
14113481Sgiacomo.travaglini@arm.com                            << "\n" << e2 << " evaluates to " << v2;
14213481Sgiacomo.travaglini@arm.com}
14313481Sgiacomo.travaglini@arm.com
14413481Sgiacomo.travaglini@arm.com// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
14513481Sgiacomo.travaglini@arm.com// Don't use this in your code.
14613481Sgiacomo.travaglini@arm.com#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
14713481Sgiacomo.travaglini@arm.com  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
14813481Sgiacomo.travaglini@arm.com                on_failure)
14913481Sgiacomo.travaglini@arm.com
15013481Sgiacomo.travaglini@arm.com// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
15113481Sgiacomo.travaglini@arm.com// this in your code.
15213481Sgiacomo.travaglini@arm.com#define GTEST_PRED2_(pred, v1, v2, on_failure)\
15313481Sgiacomo.travaglini@arm.com  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
15413481Sgiacomo.travaglini@arm.com                                             #v1, \
15513481Sgiacomo.travaglini@arm.com                                             #v2, \
15613481Sgiacomo.travaglini@arm.com                                             pred, \
15713481Sgiacomo.travaglini@arm.com                                             v1, \
15813481Sgiacomo.travaglini@arm.com                                             v2), on_failure)
15913481Sgiacomo.travaglini@arm.com
16013481Sgiacomo.travaglini@arm.com// Binary predicate assertion macros.
16113481Sgiacomo.travaglini@arm.com#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
16213481Sgiacomo.travaglini@arm.com  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
16313481Sgiacomo.travaglini@arm.com#define EXPECT_PRED2(pred, v1, v2) \
16413481Sgiacomo.travaglini@arm.com  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
16513481Sgiacomo.travaglini@arm.com#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
16613481Sgiacomo.travaglini@arm.com  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
16713481Sgiacomo.travaglini@arm.com#define ASSERT_PRED2(pred, v1, v2) \
16813481Sgiacomo.travaglini@arm.com  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
16913481Sgiacomo.travaglini@arm.com
17013481Sgiacomo.travaglini@arm.com
17113481Sgiacomo.travaglini@arm.com
17213481Sgiacomo.travaglini@arm.com// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
17313481Sgiacomo.travaglini@arm.com// this in your code.
17413481Sgiacomo.travaglini@arm.comtemplate <typename Pred,
17513481Sgiacomo.travaglini@arm.com          typename T1,
17613481Sgiacomo.travaglini@arm.com          typename T2,
17713481Sgiacomo.travaglini@arm.com          typename T3>
17813481Sgiacomo.travaglini@arm.comAssertionResult AssertPred3Helper(const char* pred_text,
17913481Sgiacomo.travaglini@arm.com                                  const char* e1,
18013481Sgiacomo.travaglini@arm.com                                  const char* e2,
18113481Sgiacomo.travaglini@arm.com                                  const char* e3,
18213481Sgiacomo.travaglini@arm.com                                  Pred pred,
18313481Sgiacomo.travaglini@arm.com                                  const T1& v1,
18413481Sgiacomo.travaglini@arm.com                                  const T2& v2,
18513481Sgiacomo.travaglini@arm.com                                  const T3& v3) {
18613481Sgiacomo.travaglini@arm.com  if (pred(v1, v2, v3)) return AssertionSuccess();
18713481Sgiacomo.travaglini@arm.com
18813481Sgiacomo.travaglini@arm.com  return AssertionFailure() << pred_text << "("
18913481Sgiacomo.travaglini@arm.com                            << e1 << ", "
19013481Sgiacomo.travaglini@arm.com                            << e2 << ", "
19113481Sgiacomo.travaglini@arm.com                            << e3 << ") evaluates to false, where"
19213481Sgiacomo.travaglini@arm.com                            << "\n" << e1 << " evaluates to " << v1
19313481Sgiacomo.travaglini@arm.com                            << "\n" << e2 << " evaluates to " << v2
19413481Sgiacomo.travaglini@arm.com                            << "\n" << e3 << " evaluates to " << v3;
19513481Sgiacomo.travaglini@arm.com}
19613481Sgiacomo.travaglini@arm.com
19713481Sgiacomo.travaglini@arm.com// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
19813481Sgiacomo.travaglini@arm.com// Don't use this in your code.
19913481Sgiacomo.travaglini@arm.com#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
20013481Sgiacomo.travaglini@arm.com  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
20113481Sgiacomo.travaglini@arm.com                on_failure)
20213481Sgiacomo.travaglini@arm.com
20313481Sgiacomo.travaglini@arm.com// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
20413481Sgiacomo.travaglini@arm.com// this in your code.
20513481Sgiacomo.travaglini@arm.com#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
20613481Sgiacomo.travaglini@arm.com  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
20713481Sgiacomo.travaglini@arm.com                                             #v1, \
20813481Sgiacomo.travaglini@arm.com                                             #v2, \
20913481Sgiacomo.travaglini@arm.com                                             #v3, \
21013481Sgiacomo.travaglini@arm.com                                             pred, \
21113481Sgiacomo.travaglini@arm.com                                             v1, \
21213481Sgiacomo.travaglini@arm.com                                             v2, \
21313481Sgiacomo.travaglini@arm.com                                             v3), on_failure)
21413481Sgiacomo.travaglini@arm.com
21513481Sgiacomo.travaglini@arm.com// Ternary predicate assertion macros.
21613481Sgiacomo.travaglini@arm.com#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
21713481Sgiacomo.travaglini@arm.com  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
21813481Sgiacomo.travaglini@arm.com#define EXPECT_PRED3(pred, v1, v2, v3) \
21913481Sgiacomo.travaglini@arm.com  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
22013481Sgiacomo.travaglini@arm.com#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
22113481Sgiacomo.travaglini@arm.com  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
22213481Sgiacomo.travaglini@arm.com#define ASSERT_PRED3(pred, v1, v2, v3) \
22313481Sgiacomo.travaglini@arm.com  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
22413481Sgiacomo.travaglini@arm.com
22513481Sgiacomo.travaglini@arm.com
22613481Sgiacomo.travaglini@arm.com
22713481Sgiacomo.travaglini@arm.com// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
22813481Sgiacomo.travaglini@arm.com// this in your code.
22913481Sgiacomo.travaglini@arm.comtemplate <typename Pred,
23013481Sgiacomo.travaglini@arm.com          typename T1,
23113481Sgiacomo.travaglini@arm.com          typename T2,
23213481Sgiacomo.travaglini@arm.com          typename T3,
23313481Sgiacomo.travaglini@arm.com          typename T4>
23413481Sgiacomo.travaglini@arm.comAssertionResult AssertPred4Helper(const char* pred_text,
23513481Sgiacomo.travaglini@arm.com                                  const char* e1,
23613481Sgiacomo.travaglini@arm.com                                  const char* e2,
23713481Sgiacomo.travaglini@arm.com                                  const char* e3,
23813481Sgiacomo.travaglini@arm.com                                  const char* e4,
23913481Sgiacomo.travaglini@arm.com                                  Pred pred,
24013481Sgiacomo.travaglini@arm.com                                  const T1& v1,
24113481Sgiacomo.travaglini@arm.com                                  const T2& v2,
24213481Sgiacomo.travaglini@arm.com                                  const T3& v3,
24313481Sgiacomo.travaglini@arm.com                                  const T4& v4) {
24413481Sgiacomo.travaglini@arm.com  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
24513481Sgiacomo.travaglini@arm.com
24613481Sgiacomo.travaglini@arm.com  return AssertionFailure() << pred_text << "("
24713481Sgiacomo.travaglini@arm.com                            << e1 << ", "
24813481Sgiacomo.travaglini@arm.com                            << e2 << ", "
24913481Sgiacomo.travaglini@arm.com                            << e3 << ", "
25013481Sgiacomo.travaglini@arm.com                            << e4 << ") evaluates to false, where"
25113481Sgiacomo.travaglini@arm.com                            << "\n" << e1 << " evaluates to " << v1
25213481Sgiacomo.travaglini@arm.com                            << "\n" << e2 << " evaluates to " << v2
25313481Sgiacomo.travaglini@arm.com                            << "\n" << e3 << " evaluates to " << v3
25413481Sgiacomo.travaglini@arm.com                            << "\n" << e4 << " evaluates to " << v4;
25513481Sgiacomo.travaglini@arm.com}
25613481Sgiacomo.travaglini@arm.com
25713481Sgiacomo.travaglini@arm.com// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
25813481Sgiacomo.travaglini@arm.com// Don't use this in your code.
25913481Sgiacomo.travaglini@arm.com#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
26013481Sgiacomo.travaglini@arm.com  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
26113481Sgiacomo.travaglini@arm.com                on_failure)
26213481Sgiacomo.travaglini@arm.com
26313481Sgiacomo.travaglini@arm.com// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
26413481Sgiacomo.travaglini@arm.com// this in your code.
26513481Sgiacomo.travaglini@arm.com#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
26613481Sgiacomo.travaglini@arm.com  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
26713481Sgiacomo.travaglini@arm.com                                             #v1, \
26813481Sgiacomo.travaglini@arm.com                                             #v2, \
26913481Sgiacomo.travaglini@arm.com                                             #v3, \
27013481Sgiacomo.travaglini@arm.com                                             #v4, \
27113481Sgiacomo.travaglini@arm.com                                             pred, \
27213481Sgiacomo.travaglini@arm.com                                             v1, \
27313481Sgiacomo.travaglini@arm.com                                             v2, \
27413481Sgiacomo.travaglini@arm.com                                             v3, \
27513481Sgiacomo.travaglini@arm.com                                             v4), on_failure)
27613481Sgiacomo.travaglini@arm.com
27713481Sgiacomo.travaglini@arm.com// 4-ary predicate assertion macros.
27813481Sgiacomo.travaglini@arm.com#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
27913481Sgiacomo.travaglini@arm.com  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
28013481Sgiacomo.travaglini@arm.com#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
28113481Sgiacomo.travaglini@arm.com  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
28213481Sgiacomo.travaglini@arm.com#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
28313481Sgiacomo.travaglini@arm.com  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
28413481Sgiacomo.travaglini@arm.com#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
28513481Sgiacomo.travaglini@arm.com  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
28613481Sgiacomo.travaglini@arm.com
28713481Sgiacomo.travaglini@arm.com
28813481Sgiacomo.travaglini@arm.com
28913481Sgiacomo.travaglini@arm.com// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
29013481Sgiacomo.travaglini@arm.com// this in your code.
29113481Sgiacomo.travaglini@arm.comtemplate <typename Pred,
29213481Sgiacomo.travaglini@arm.com          typename T1,
29313481Sgiacomo.travaglini@arm.com          typename T2,
29413481Sgiacomo.travaglini@arm.com          typename T3,
29513481Sgiacomo.travaglini@arm.com          typename T4,
29613481Sgiacomo.travaglini@arm.com          typename T5>
29713481Sgiacomo.travaglini@arm.comAssertionResult AssertPred5Helper(const char* pred_text,
29813481Sgiacomo.travaglini@arm.com                                  const char* e1,
29913481Sgiacomo.travaglini@arm.com                                  const char* e2,
30013481Sgiacomo.travaglini@arm.com                                  const char* e3,
30113481Sgiacomo.travaglini@arm.com                                  const char* e4,
30213481Sgiacomo.travaglini@arm.com                                  const char* e5,
30313481Sgiacomo.travaglini@arm.com                                  Pred pred,
30413481Sgiacomo.travaglini@arm.com                                  const T1& v1,
30513481Sgiacomo.travaglini@arm.com                                  const T2& v2,
30613481Sgiacomo.travaglini@arm.com                                  const T3& v3,
30713481Sgiacomo.travaglini@arm.com                                  const T4& v4,
30813481Sgiacomo.travaglini@arm.com                                  const T5& v5) {
30913481Sgiacomo.travaglini@arm.com  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
31013481Sgiacomo.travaglini@arm.com
31113481Sgiacomo.travaglini@arm.com  return AssertionFailure() << pred_text << "("
31213481Sgiacomo.travaglini@arm.com                            << e1 << ", "
31313481Sgiacomo.travaglini@arm.com                            << e2 << ", "
31413481Sgiacomo.travaglini@arm.com                            << e3 << ", "
31513481Sgiacomo.travaglini@arm.com                            << e4 << ", "
31613481Sgiacomo.travaglini@arm.com                            << e5 << ") evaluates to false, where"
31713481Sgiacomo.travaglini@arm.com                            << "\n" << e1 << " evaluates to " << v1
31813481Sgiacomo.travaglini@arm.com                            << "\n" << e2 << " evaluates to " << v2
31913481Sgiacomo.travaglini@arm.com                            << "\n" << e3 << " evaluates to " << v3
32013481Sgiacomo.travaglini@arm.com                            << "\n" << e4 << " evaluates to " << v4
32113481Sgiacomo.travaglini@arm.com                            << "\n" << e5 << " evaluates to " << v5;
32213481Sgiacomo.travaglini@arm.com}
32313481Sgiacomo.travaglini@arm.com
32413481Sgiacomo.travaglini@arm.com// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
32513481Sgiacomo.travaglini@arm.com// Don't use this in your code.
32613481Sgiacomo.travaglini@arm.com#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
32713481Sgiacomo.travaglini@arm.com  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
32813481Sgiacomo.travaglini@arm.com                on_failure)
32913481Sgiacomo.travaglini@arm.com
33013481Sgiacomo.travaglini@arm.com// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
33113481Sgiacomo.travaglini@arm.com// this in your code.
33213481Sgiacomo.travaglini@arm.com#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
33313481Sgiacomo.travaglini@arm.com  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
33413481Sgiacomo.travaglini@arm.com                                             #v1, \
33513481Sgiacomo.travaglini@arm.com                                             #v2, \
33613481Sgiacomo.travaglini@arm.com                                             #v3, \
33713481Sgiacomo.travaglini@arm.com                                             #v4, \
33813481Sgiacomo.travaglini@arm.com                                             #v5, \
33913481Sgiacomo.travaglini@arm.com                                             pred, \
34013481Sgiacomo.travaglini@arm.com                                             v1, \
34113481Sgiacomo.travaglini@arm.com                                             v2, \
34213481Sgiacomo.travaglini@arm.com                                             v3, \
34313481Sgiacomo.travaglini@arm.com                                             v4, \
34413481Sgiacomo.travaglini@arm.com                                             v5), on_failure)
34513481Sgiacomo.travaglini@arm.com
34613481Sgiacomo.travaglini@arm.com// 5-ary predicate assertion macros.
34713481Sgiacomo.travaglini@arm.com#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
34813481Sgiacomo.travaglini@arm.com  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
34913481Sgiacomo.travaglini@arm.com#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
35013481Sgiacomo.travaglini@arm.com  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
35113481Sgiacomo.travaglini@arm.com#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
35213481Sgiacomo.travaglini@arm.com  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
35313481Sgiacomo.travaglini@arm.com#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
35413481Sgiacomo.travaglini@arm.com  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
35513481Sgiacomo.travaglini@arm.com
35613481Sgiacomo.travaglini@arm.com
35713481Sgiacomo.travaglini@arm.com
35813481Sgiacomo.travaglini@arm.com#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
359