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