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