tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

gen_gtest_pred_impl.py (21967B)


      1 #!/usr/bin/env python
      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 // GOOGLETEST_CM0001 DO NOT DELETE
    115 
    116 
    117 #ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
    118 #define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
    119 
    120 #include "gtest/gtest.h"
    121 
    122 namespace testing {
    123 
    124 // This header implements a family of generic predicate assertion
    125 // macros:
    126 //
    127 //   ASSERT_PRED_FORMAT1(pred_format, v1)
    128 //   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
    129 //   ...
    130 //
    131 // where pred_format is a function or functor that takes n (in the
    132 // case of ASSERT_PRED_FORMATn) values and their source expression
    133 // text, and returns a testing::AssertionResult.  See the definition
    134 // of ASSERT_EQ in gtest.h for an example.
    135 //
    136 // If you don't care about formatting, you can use the more
    137 // restrictive version:
    138 //
    139 //   ASSERT_PRED1(pred, v1)
    140 //   ASSERT_PRED2(pred, v1, v2)
    141 //   ...
    142 //
    143 // where pred is an n-ary function or functor that returns bool,
    144 // and the values v1, v2, ..., must support the << operator for
    145 // streaming to std::ostream.
    146 //
    147 // We also define the EXPECT_* variations.
    148 //
    149 // For now we only support predicates whose arity is at most %(n)s.
    150 // Please email googletestframework@googlegroups.com if you need
    151 // support for higher arities.
    152 
    153 // GTEST_ASSERT_ is the basic statement to which all of the assertions
    154 // in this file reduce.  Don't use this in your code.
    155 
    156 #define GTEST_ASSERT_(expression, on_failure) \\
    157  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\
    158  if (const ::testing::AssertionResult gtest_ar = (expression)) \\
    159    ; \\
    160  else \\
    161    on_failure(gtest_ar.failure_message())
    162 """ % DEFS)
    163 
    164 
    165 def Arity(n):
    166  """Returns the English name of the given arity."""
    167 
    168  if n < 0:
    169    return None
    170  elif n <= 3:
    171    return ['nullary', 'unary', 'binary', 'ternary'][n]
    172  else:
    173    return '%s-ary' % n
    174 
    175 
    176 def Title(word):
    177  """Returns the given word in title case.  The difference between
    178  this and string's title() method is that Title('4-ary') is '4-ary'
    179  while '4-ary'.title() is '4-Ary'."""
    180 
    181  return word[0].upper() + word[1:]
    182 
    183 
    184 def OneTo(n):
    185  """Returns the list [1, 2, 3, ..., n]."""
    186 
    187  return range(1, n + 1)
    188 
    189 
    190 def Iter(n, format, sep=''):
    191  """Given a positive integer n, a format string that contains 0 or
    192  more '%s' format specs, and optionally a separator string, returns
    193  the join of n strings, each formatted with the format string on an
    194  iterator ranged from 1 to n.
    195 
    196  Example:
    197 
    198  Iter(3, 'v%s', sep=', ') returns 'v1, v2, v3'.
    199  """
    200 
    201  # How many '%s' specs are in format?
    202  spec_count = len(format.split('%s')) - 1
    203  return sep.join([format % (spec_count * (i,)) for i in OneTo(n)])
    204 
    205 
    206 def ImplementationForArity(n):
    207  """Returns the implementation of n-ary predicate assertions."""
    208 
    209  # A map the defines the values used in the implementation template.
    210  DEFS = {
    211    'n' : str(n),
    212    'vs' : Iter(n, 'v%s', sep=', '),
    213    'vts' : Iter(n, '#v%s', sep=', '),
    214    'arity' : Arity(n),
    215    'Arity' : Title(Arity(n))
    216    }
    217 
    218  impl = """
    219 
    220 // Helper function for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use
    221 // this in your code.
    222 template <typename Pred""" % DEFS
    223 
    224  impl += Iter(n, """,
    225          typename T%s""")
    226 
    227  impl += """>
    228 AssertionResult AssertPred%(n)sHelper(const char* pred_text""" % DEFS
    229 
    230  impl += Iter(n, """,
    231                                  const char* e%s""")
    232 
    233  impl += """,
    234                                  Pred pred"""
    235 
    236  impl += Iter(n, """,
    237                                  const T%s& v%s""")
    238 
    239  impl += """) {
    240  if (pred(%(vs)s)) return AssertionSuccess();
    241 
    242 """ % DEFS
    243 
    244  impl += '  return AssertionFailure() << pred_text << "("'
    245 
    246  impl += Iter(n, """
    247                            << e%s""", sep=' << ", "')
    248 
    249  impl += ' << ") evaluates to false, where"'
    250 
    251  impl += Iter(
    252      n, """
    253      << "\\n" << e%s << " evaluates to " << ::testing::PrintToString(v%s)"""
    254  )
    255 
    256  impl += """;
    257 }
    258 
    259 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
    260 // Don't use this in your code.
    261 #define GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, on_failure)\\
    262  GTEST_ASSERT_(pred_format(%(vts)s, %(vs)s), \\
    263                on_failure)
    264 
    265 // Internal macro for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use
    266 // this in your code.
    267 #define GTEST_PRED%(n)s_(pred, %(vs)s, on_failure)\\
    268  GTEST_ASSERT_(::testing::AssertPred%(n)sHelper(#pred""" % DEFS
    269 
    270  impl += Iter(n, """, \\
    271                                             #v%s""")
    272 
    273  impl += """, \\
    274                                             pred"""
    275 
    276  impl += Iter(n, """, \\
    277                                             v%s""")
    278 
    279  impl += """), on_failure)
    280 
    281 // %(Arity)s predicate assertion macros.
    282 #define EXPECT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
    283  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_NONFATAL_FAILURE_)
    284 #define EXPECT_PRED%(n)s(pred, %(vs)s) \\
    285  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_NONFATAL_FAILURE_)
    286 #define ASSERT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
    287  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_FATAL_FAILURE_)
    288 #define ASSERT_PRED%(n)s(pred, %(vs)s) \\
    289  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_FATAL_FAILURE_)
    290 
    291 """ % DEFS
    292 
    293  return impl
    294 
    295 
    296 def HeaderPostamble():
    297  """Returns the postamble for the header file."""
    298 
    299  return """
    300 
    301 }  // namespace testing
    302 
    303 #endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
    304 """
    305 
    306 
    307 def GenerateFile(path, content):
    308  """Given a file path and a content string
    309     overwrites it with the given content.
    310  """
    311  print 'Updating file %s . . .' % path
    312  f = file(path, 'w+')
    313  print >>f, content,
    314  f.close()
    315 
    316  print 'File %s has been updated.' % path
    317 
    318 
    319 def GenerateHeader(n):
    320  """Given the maximum arity n, updates the header file that implements
    321  the predicate assertions.
    322  """
    323  GenerateFile(HEADER,
    324               HeaderPreamble(n)
    325               + ''.join([ImplementationForArity(i) for i in OneTo(n)])
    326               + HeaderPostamble())
    327 
    328 
    329 def UnitTestPreamble():
    330  """Returns the preamble for the unit test file."""
    331 
    332  # A map that defines the values used in the preamble template.
    333  DEFS = {
    334    'today' : time.strftime('%m/%d/%Y'),
    335    'year' : time.strftime('%Y'),
    336    'command' : '%s %s' % (os.path.basename(sys.argv[0]), sys.argv[1]),
    337    }
    338 
    339  return (
    340  """// Copyright 2006, Google Inc.
    341 // All rights reserved.
    342 //
    343 // Redistribution and use in source and binary forms, with or without
    344 // modification, are permitted provided that the following conditions are
    345 // met:
    346 //
    347 //     * Redistributions of source code must retain the above copyright
    348 // notice, this list of conditions and the following disclaimer.
    349 //     * Redistributions in binary form must reproduce the above
    350 // copyright notice, this list of conditions and the following disclaimer
    351 // in the documentation and/or other materials provided with the
    352 // distribution.
    353 //     * Neither the name of Google Inc. nor the names of its
    354 // contributors may be used to endorse or promote products derived from
    355 // this software without specific prior written permission.
    356 //
    357 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    358 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    359 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    360 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    361 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    362 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    363 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    364 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    365 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    366 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    367 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    368 
    369 // This file is AUTOMATICALLY GENERATED on %(today)s by command
    370 // '%(command)s'.  DO NOT EDIT BY HAND!
    371 
    372 // Regression test for gtest_pred_impl.h
    373 //
    374 // This file is generated by a script and quite long.  If you intend to
    375 // learn how Google Test works by reading its unit tests, read
    376 // gtest_unittest.cc instead.
    377 //
    378 // This is intended as a regression test for the Google Test predicate
    379 // assertions.  We compile it as part of the gtest_unittest target
    380 // only to keep the implementation tidy and compact, as it is quite
    381 // involved to set up the stage for testing Google Test using Google
    382 // Test itself.
    383 //
    384 // Currently, gtest_unittest takes ~11 seconds to run in the testing
    385 // daemon.  In the future, if it grows too large and needs much more
    386 // time to finish, we should consider separating this file into a
    387 // stand-alone regression test.
    388 
    389 #include <iostream>
    390 
    391 #include "gtest/gtest.h"
    392 #include "gtest/gtest-spi.h"
    393 
    394 // A user-defined data type.
    395 struct Bool {
    396  explicit Bool(int val) : value(val != 0) {}
    397 
    398  bool operator>(int n) const { return value > Bool(n).value; }
    399 
    400  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }
    401 
    402  bool operator==(const Bool& rhs) const { return value == rhs.value; }
    403 
    404  bool value;
    405 };
    406 
    407 // Enables Bool to be used in assertions.
    408 std::ostream& operator<<(std::ostream& os, const Bool& x) {
    409  return os << (x.value ? "true" : "false");
    410 }
    411 
    412 """ % DEFS)
    413 
    414 
    415 def TestsForArity(n):
    416  """Returns the tests for n-ary predicate assertions."""
    417 
    418  # A map that defines the values used in the template for the tests.
    419  DEFS = {
    420    'n' : n,
    421    'es' : Iter(n, 'e%s', sep=', '),
    422    'vs' : Iter(n, 'v%s', sep=', '),
    423    'vts' : Iter(n, '#v%s', sep=', '),
    424    'tvs' : Iter(n, 'T%s v%s', sep=', '),
    425    'int_vs' : Iter(n, 'int v%s', sep=', '),
    426    'Bool_vs' : Iter(n, 'Bool v%s', sep=', '),
    427    'types' : Iter(n, 'typename T%s', sep=', '),
    428    'v_sum' : Iter(n, 'v%s', sep=' + '),
    429    'arity' : Arity(n),
    430    'Arity' : Title(Arity(n)),
    431    }
    432 
    433  tests = (
    434  """// Sample functions/functors for testing %(arity)s predicate assertions.
    435 
    436 // A %(arity)s predicate function.
    437 template <%(types)s>
    438 bool PredFunction%(n)s(%(tvs)s) {
    439  return %(v_sum)s > 0;
    440 }
    441 
    442 // The following two functions are needed because a compiler doesn't have
    443 // a context yet to know which template function must be instantiated.
    444 bool PredFunction%(n)sInt(%(int_vs)s) {
    445  return %(v_sum)s > 0;
    446 }
    447 bool PredFunction%(n)sBool(%(Bool_vs)s) {
    448  return %(v_sum)s > 0;
    449 }
    450 """ % DEFS)
    451 
    452  tests += """
    453 // A %(arity)s predicate functor.
    454 struct PredFunctor%(n)s {
    455  template <%(types)s>
    456  bool operator()(""" % DEFS
    457 
    458  tests += Iter(n, 'const T%s& v%s', sep=""",
    459                  """)
    460 
    461  tests += """) {
    462    return %(v_sum)s > 0;
    463  }
    464 };
    465 """ % DEFS
    466 
    467  tests += """
    468 // A %(arity)s predicate-formatter function.
    469 template <%(types)s>
    470 testing::AssertionResult PredFormatFunction%(n)s(""" % DEFS
    471 
    472  tests += Iter(n, 'const char* e%s', sep=""",
    473                                             """)
    474 
    475  tests += Iter(n, """,
    476                                             const T%s& v%s""")
    477 
    478  tests += """) {
    479  if (PredFunction%(n)s(%(vs)s))
    480    return testing::AssertionSuccess();
    481 
    482  return testing::AssertionFailure()
    483      << """ % DEFS
    484 
    485  tests += Iter(n, 'e%s', sep=' << " + " << ')
    486 
    487  tests += """
    488      << " is expected to be positive, but evaluates to "
    489      << %(v_sum)s << ".";
    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  void SetUp() override {
    517    expected_to_finish_ = true;
    518    finished_ = false;""" % DEFS
    519 
    520  tests += """
    521    """ + Iter(n, 'n%s_ = ') + """0;
    522  }
    523 """
    524 
    525  tests += """
    526  void TearDown() override {
    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 if and only if the test function is expected to run to finish.
    547  static bool expected_to_finish_;
    548 
    549  // true if and only if 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 if and only if the assertion is a *_PRED_FORMAT*.
    579      use_assert:     true if and only if the assertion is a ASSERT_*.
    580      expect_failure: true if and only if the assertion is expected to fail.
    581      use_functor:    true if and only if the first argument of the assertion is
    582                      a functor (as opposed to a function)
    583      use_user_type:  true if and only if 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()