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