1d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#!/usr/bin/env python
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2006, Google Inc.
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# All rights reserved.
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met:
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions of source code must retain the above copyright
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer.
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions in binary form must reproduce the above
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution.
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Neither the name of Google Inc. nor the names of its
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission.
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""gen_gtest_pred_impl.py v0.1
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerates the implementation of Google Test predicate assertions and
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleaccompanying tests.
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleUsage:
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  gen_gtest_pred_impl.py MAX_ARITY
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillewhere MAX_ARITY is a positive integer.
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleThe command generates the implementation of up-to MAX_ARITY-ary
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepredicate assertions, and writes it to file gtest_pred_impl.h in the
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledirectory where the script is.  It also generates the accompanying
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleunit test in file gtest_pred_impl_unittest.cc.
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'wan@google.com (Zhanyong Wan)'
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport os
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport sys
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport time
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Where this script is.
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleSCRIPT_DIR = os.path.dirname(sys.argv[0])
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Where to store the generated header.
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleHEADER = os.path.join(SCRIPT_DIR, '../include/gtest/gtest_pred_impl.h')
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Where to store the generated unit test.
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleUNIT_TEST = os.path.join(SCRIPT_DIR, '../test/gtest_pred_impl_unittest.cc')
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef HeaderPreamble(n):
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Returns the preamble for the header file.
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Args:
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    n:  the maximum arity of the predicate macros to be generated.
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # A map that defines the values used in the preamble template.
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DEFS = {
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'today' : time.strftime('%m/%d/%Y'),
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'year' : time.strftime('%Y'),
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'command' : '%s %s' % (os.path.basename(sys.argv[0]), n),
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'n' : n
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return (
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""// Copyright 2006, Google Inc.
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// All rights reserved.
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This file is AUTOMATICALLY GENERATED on %(today)s by command
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// '%(command)s'.  DO NOT EDIT BY HAND!
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Implements a family of generic predicate assertion macros.
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Makes sure this header is not included before gtest.h.
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This header implements a family of generic predicate assertion
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// macros:
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   ASSERT_PRED_FORMAT1(pred_format, v1)
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   ...
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// where pred_format is a function or functor that takes n (in the
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// case of ASSERT_PRED_FORMATn) values and their source expression
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// text, and returns a testing::AssertionResult.  See the definition
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// of ASSERT_EQ in gtest.h for an example.
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// If you don't care about formatting, you can use the more
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// restrictive version:
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   ASSERT_PRED1(pred, v1)
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   ASSERT_PRED2(pred, v1, v2)
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   ...
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// where pred is an n-ary function or functor that returns bool,
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// and the values v1, v2, ..., must support the << operator for
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// streaming to std::ostream.
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// We also define the EXPECT_* variations.
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// For now we only support predicates whose arity is at most %(n)s.
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Please email googletestframework@googlegroups.com if you need
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// support for higher arities.
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// GTEST_ASSERT_ is the basic statement to which all of the assertions
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in this file reduce.  Don't use this in your code.
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_ASSERT_(expression, on_failure) \\
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (const ::testing::AssertionResult gtest_ar = (expression)) \\
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ; \\
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  else \\
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    on_failure(gtest_ar.failure_message())
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % DEFS)
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef Arity(n):
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Returns the English name of the given arity."""
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if n < 0:
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return None
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  elif n <= 3:
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ['nullary', 'unary', 'binary', 'ternary'][n]
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  else:
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return '%s-ary' % n
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef Title(word):
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Returns the given word in title case.  The difference between
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  this and string's title() method is that Title('4-ary') is '4-ary'
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  while '4-ary'.title() is '4-Ary'."""
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return word[0].upper() + word[1:]
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef OneTo(n):
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Returns the list [1, 2, 3, ..., n]."""
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return range(1, n + 1)
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef Iter(n, format, sep=''):
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Given a positive integer n, a format string that contains 0 or
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  more '%s' format specs, and optionally a separator string, returns
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  the join of n strings, each formatted with the format string on an
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  iterator ranged from 1 to n.
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Example:
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Iter(3, 'v%s', sep=', ') returns 'v1, v2, v3'.
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # How many '%s' specs are in format?
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  spec_count = len(format.split('%s')) - 1
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return sep.join([format % (spec_count * (i,)) for i in OneTo(n)])
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef ImplementationForArity(n):
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Returns the implementation of n-ary predicate assertions."""
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # A map the defines the values used in the implementation template.
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DEFS = {
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'n' : str(n),
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'vs' : Iter(n, 'v%s', sep=', '),
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'vts' : Iter(n, '#v%s', sep=', '),
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'arity' : Arity(n),
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'Arity' : Title(Arity(n))
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl = """
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Helper function for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this in your code.
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Pred""" % DEFS
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += Iter(n, """,
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          typename T%s""")
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += """>
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleAssertionResult AssertPred%(n)sHelper(const char* pred_text""" % DEFS
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += Iter(n, """,
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                  const char* e%s""")
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += """,
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                  Pred pred"""
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += Iter(n, """,
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                  const T%s& v%s""")
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += """) {
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (pred(%(vs)s)) return AssertionSuccess();
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Message msg;
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % DEFS
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += '  msg << pred_text << "("'
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += Iter(n, """
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      << e%s""", sep=' << ", "')
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += ' << ") evaluates to false, where"'
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += Iter(n, """
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      << "\\n" << e%s << " evaluates to " << v%s""")
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += """;
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return AssertionFailure(msg);
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Don't use this in your code.
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, on_failure)\\
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GTEST_ASSERT_(pred_format(%(vts)s, %(vs)s),\\
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                on_failure)
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Internal macro for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this in your code.
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GTEST_PRED%(n)s_(pred, %(vs)s, on_failure)\\
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GTEST_ASSERT_(::testing::AssertPred%(n)sHelper(#pred""" % DEFS
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += Iter(n, """, \\
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             #v%s""")
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += """, \\
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             pred"""
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += Iter(n, """, \\
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             v%s""")
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  impl += """), on_failure)
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// %(Arity)s predicate assertion macros.
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define EXPECT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_NONFATAL_FAILURE_)
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define EXPECT_PRED%(n)s(pred, %(vs)s) \\
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_NONFATAL_FAILURE_)
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define ASSERT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_FATAL_FAILURE_)
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define ASSERT_PRED%(n)s(pred, %(vs)s) \\
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_FATAL_FAILURE_)
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % DEFS
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return impl
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef HeaderPostamble():
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Returns the postamble for the header file."""
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return """
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef GenerateFile(path, content):
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Given a file path and a content string, overwrites it with the
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  given content."""
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  print 'Updating file %s . . .' % path
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  f = file(path, 'w+')
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  print >>f, content,
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  f.close()
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  print 'File %s has been updated.' % path
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef GenerateHeader(n):
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Given the maximum arity n, updates the header file that implements
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  the predicate assertions."""
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GenerateFile(HEADER,
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               HeaderPreamble(n)
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               + ''.join([ImplementationForArity(i) for i in OneTo(n)])
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               + HeaderPostamble())
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef UnitTestPreamble():
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Returns the preamble for the unit test file."""
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # A map that defines the values used in the preamble template.
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DEFS = {
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'today' : time.strftime('%m/%d/%Y'),
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'year' : time.strftime('%Y'),
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'command' : '%s %s' % (os.path.basename(sys.argv[0]), sys.argv[1]),
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return (
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""// Copyright 2006, Google Inc.
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// All rights reserved.
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This file is AUTOMATICALLY GENERATED on %(today)s by command
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// '%(command)s'.  DO NOT EDIT BY HAND!
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Regression test for gtest_pred_impl.h
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This file is generated by a script and quite long.  If you intend to
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// learn how Google Test works by reading its unit tests, read
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// gtest_unittest.cc instead.
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This is intended as a regression test for the Google Test predicate
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assertions.  We compile it as part of the gtest_unittest target
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// only to keep the implementation tidy and compact, as it is quite
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// involved to set up the stage for testing Google Test using Google
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test itself.
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Currently, gtest_unittest takes ~11 seconds to run in the testing
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// daemon.  In the future, if it grows too large and needs much more
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// time to finish, we should consider separating this file into a
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// stand-alone regression test.
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <iostream>
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h>
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest-spi.h>
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A user-defined data type.
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestruct Bool {
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  explicit Bool(int val) : value(val != 0) {}
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool operator>(int n) const { return value > Bool(n).value; }
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool operator==(const Bool& rhs) const { return value == rhs.value; }
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool value;
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Enables Bool to be used in assertions.
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestd::ostream& operator<<(std::ostream& os, const Bool& x) {
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return os << (x.value ? "true" : "false");
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % DEFS)
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef TestsForArity(n):
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Returns the tests for n-ary predicate assertions."""
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # A map that defines the values used in the template for the tests.
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DEFS = {
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'n' : n,
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'es' : Iter(n, 'e%s', sep=', '),
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'vs' : Iter(n, 'v%s', sep=', '),
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'vts' : Iter(n, '#v%s', sep=', '),
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'tvs' : Iter(n, 'T%s v%s', sep=', '),
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'int_vs' : Iter(n, 'int v%s', sep=', '),
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'Bool_vs' : Iter(n, 'Bool v%s', sep=', '),
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'types' : Iter(n, 'typename T%s', sep=', '),
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'v_sum' : Iter(n, 'v%s', sep=' + '),
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'arity' : Arity(n),
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'Arity' : Title(Arity(n)),
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests = (
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""// Sample functions/functors for testing %(arity)s predicate assertions.
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A %(arity)s predicate function.
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <%(types)s>
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool PredFunction%(n)s(%(tvs)s) {
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return %(v_sum)s > 0;
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The following two functions are needed to circumvent a bug in
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// gcc 2.95.3, which sometimes has problem with the above template
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// function.
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool PredFunction%(n)sInt(%(int_vs)s) {
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return %(v_sum)s > 0;
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool PredFunction%(n)sBool(%(Bool_vs)s) {
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return %(v_sum)s > 0;
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % DEFS)
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A %(arity)s predicate functor.
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestruct PredFunctor%(n)s {
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <%(types)s>
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool operator()(""" % DEFS
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += Iter(n, 'const T%s& v%s', sep=""",
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                  """)
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """) {
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return %(v_sum)s > 0;
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % DEFS
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A %(arity)s predicate-formatter function.
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <%(types)s>
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletesting::AssertionResult PredFormatFunction%(n)s(""" % DEFS
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += Iter(n, 'const char* e%s', sep=""",
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             """)
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += Iter(n, """,
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             const T%s& v%s""")
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """) {
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (PredFunction%(n)s(%(vs)s))
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return testing::AssertionSuccess();
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  testing::Message msg;
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  msg << """ % DEFS
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += Iter(n, 'e%s', sep=' << " + " << ')
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      << " is expected to be positive, but evaluates to "
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      << %(v_sum)s << ".";
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return testing::AssertionFailure(msg);
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % DEFS
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A %(arity)s predicate-formatter functor.
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestruct PredFormatFunctor%(n)s {
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <%(types)s>
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  testing::AssertionResult operator()(""" % DEFS
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += Iter(n, 'const char* e%s', sep=""",
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                      """)
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += Iter(n, """,
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                      const T%s& v%s""")
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """) const {
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return PredFormatFunction%(n)s(%(es)s, %(vs)s);
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % DEFS
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests for {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Predicate%(n)sTest : public testing::Test {
515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected:
516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void SetUp() {
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    expected_to_finish_ = true;
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    finished_ = false;""" % DEFS
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """ + Iter(n, 'n%s_ = ') + """0;
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void TearDown() {
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Verifies that each of the predicate's arguments was evaluated
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // exactly once."""
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += ''.join(["""
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EXPECT_EQ(1, n%s_) <<
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "The predicate assertion didn't evaluate argument %s "
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "exactly once.";""" % (i, i + 1) for i in OneTo(n)])
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Verifies that the control flow in the test function is expected.
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (expected_to_finish_ && !finished_) {
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      FAIL() << "The predicate assertion unexpactedly aborted the test.";
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else if (!expected_to_finish_ && finished_) {
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      FAIL() << "The failed predicate assertion didn't abort the test "
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                "as expected.";
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // true iff the test function is expected to run to finish.
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool expected_to_finish_;
548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // true iff the test function did run to finish.
550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static bool finished_;
551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % DEFS
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += Iter(n, """
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static int n%s_;""")
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """
557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool Predicate%(n)sTest::expected_to_finish_;
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool Predicate%(n)sTest::finished_;
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % DEFS
562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += Iter(n, """int Predicate%%(n)sTest::n%s_;
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""") % DEFS
565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += """
567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef Predicate%(n)sTest EXPECT_PRED_FORMAT%(n)sTest;
568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef Predicate%(n)sTest ASSERT_PRED_FORMAT%(n)sTest;
569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef Predicate%(n)sTest EXPECT_PRED%(n)sTest;
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef Predicate%(n)sTest ASSERT_PRED%(n)sTest;
571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" % DEFS
572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def GenTest(use_format, use_assert, expect_failure,
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              use_functor, use_user_type):
575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Returns the test for a predicate assertion macro.
576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      use_format:     true iff the assertion is a *_PRED_FORMAT*.
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      use_assert:     true iff the assertion is a ASSERT_*.
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      expect_failure: true iff the assertion is expected to fail.
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      use_functor:    true iff the first argument of the assertion is
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      a functor (as opposed to a function)
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      use_user_type:  true iff the predicate functor/function takes
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      argument(s) of a user-defined type.
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Example:
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GenTest(1, 0, 0, 1, 0) returns a test that tests the behavior
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      of a successful EXPECT_PRED_FORMATn() that takes a functor
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      whose arguments have built-in types."""
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if use_assert:
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assrt = 'ASSERT'  # 'assert' is reserved, so we cannot use
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                        # that identifier here.
595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assrt = 'EXPECT'
597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertion = assrt + '_PRED'
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if use_format:
601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      pred_format = 'PredFormat'
602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertion += '_FORMAT'
603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      pred_format = 'Pred'
605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertion += '%(n)s' % DEFS
607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if use_functor:
609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      pred_format_type = 'functor'
610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      pred_format += 'Functor%(n)s()'
611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      pred_format_type = 'function'
613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      pred_format += 'Function%(n)s'
614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if not use_format:
615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if use_user_type:
616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          pred_format += 'Bool'
617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        else:
618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          pred_format += 'Int'
619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test_name = pred_format_type.title()
621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if use_user_type:
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      arg_type = 'user-defined type (Bool)'
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      test_name += 'OnUserType'
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if expect_failure:
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        arg = 'Bool(n%s_++)'
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      else:
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        arg = 'Bool(++n%s_)'
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      arg_type = 'built-in type (int)'
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      test_name += 'OnBuiltInType'
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if expect_failure:
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        arg = 'n%s_++'
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      else:
635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        arg = '++n%s_'
636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if expect_failure:
638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      successful_or_failed = 'failed'
639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      expected_or_not = 'expected.'
640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      test_name +=  'Failure'
641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      successful_or_failed = 'successful'
643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      expected_or_not = 'UNEXPECTED!'
644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      test_name +=  'Success'
645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # A map that defines the values used in the test template.
647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    defs = DEFS.copy()
648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    defs.update({
649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      'assert' : assrt,
650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      'assertion' : assertion,
651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      'test_name' : test_name,
652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      'pf_type' : pred_format_type,
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      'pf' : pred_format,
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      'arg_type' : arg_type,
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      'arg' : arg,
656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      'successful' : successful_or_failed,
657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      'expected' : expected_or_not,
658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      })
659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test = """
661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Tests a %(successful)s %(assertion)s where the
662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// predicate-formatter is a %(pf_type)s on a %(arg_type)s.
663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(%(assertion)sTest, %(test_name)s) {""" % defs
664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    indent = (len(assertion) + 3)*' '
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extra_indent = ''
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if expect_failure:
669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      extra_indent = '  '
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if use_assert:
671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        test += """
672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  expected_to_finish_ = false;
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_FATAL_FAILURE({  // NOLINT"""
674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      else:
675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        test += """
676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NONFATAL_FAILURE({  // NOLINT"""
677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test += '\n' + extra_indent + """  %(assertion)s(%(pf)s""" % defs
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test = test % defs
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test += Iter(n, ',\n' + indent + extra_indent + '%(arg)s' % defs)
682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test += ');\n' + extra_indent + '  finished_ = true;\n'
683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if expect_failure:
685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      test += '  }, "");\n'
686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    test += '}\n'
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return test
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Generates tests for all 2**6 = 64 combinations.
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests += ''.join([GenTest(use_format, use_assert, expect_failure,
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            use_functor, use_user_type)
693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    for use_format in [0, 1]
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    for use_assert in [0, 1]
695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    for expect_failure in [0, 1]
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    for use_functor in [0, 1]
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    for use_user_type in [0, 1]
698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    ])
699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return tests
701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef UnitTestPostamble():
704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Returns the postamble for the tests."""
705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return ''
707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef GenerateUnitTest(n):
710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Returns the tests for up-to n-ary predicate assertions."""
711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GenerateFile(UNIT_TEST,
713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               UnitTestPreamble()
714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               + ''.join([TestsForArity(i) for i in OneTo(n)])
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               + UnitTestPostamble())
716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef _Main():
719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """The entry point of the script.  Generates the header file and its
720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unit test."""
721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if len(sys.argv) != 2:
723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    print __doc__
724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    print 'Author: ' + __author__
725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    sys.exit(1)
726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  n = int(sys.argv[1])
728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GenerateHeader(n)
729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GenerateUnitTest(n)
730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif __name__ == '__main__':
733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  _Main()
734