~ubuntu-branches/debian/squeeze/protobuf/squeeze

« back to all changes in this revision

Viewing changes to src/gtest/gen_gtest_pred_impl.py

  • Committer: Bazaar Package Importer
  • Author(s): Julien Cristau
  • Date: 2009-06-02 16:19:00 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20090602161900-vm176i3ryt35yk91
Tags: 2.0.3-2.2
* Non-maintainer upload.
* Fix FTBFS from -2.1: don't fail when we can't clean up the java build,
  such as when openjdk isn't installed.
* Disable parallel builds, because libtool is made of fail (if binary-arch
  and build-indep run concurrently, we relink a library while it's being
  used; that doesn't work so well).

Show diffs side-by-side

added added

removed removed

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