]> git.wincent.com - WOTest.git/blob - WOTestClass.h
Convert WOTest class to use Objective-C 2.0 properties
[WOTest.git] / WOTestClass.h
1 //
2 //  WOTestClass.h
3 //  WOTest
4 //
5 //  Created by Wincent Colaiuta on 12 October 2004.
6 //
7 //  Copyright 2004-2007 Wincent Colaiuta.
8 //  This program is free software: you can redistribute it and/or modify
9 //  it under the terms of the GNU General Public License as published by
10 //  the Free Software Foundation, either version 3 of the License, or
11 //  (at your option) any later version.
12 //
13 //  This program is distributed in the hope that it will be useful,
14 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
15 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 //  GNU General Public License for more details.
17 //
18 //  You should have received a copy of the GNU General Public License
19 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 //
21
22 #import <Foundation/Foundation.h>
23
24 @interface WOTest : NSObject {
25
26     NSDate      *startDate;
27
28     unsigned    testsRun;
29     unsigned    testsPassed;
30     unsigned    testsFailed;
31     unsigned    uncaughtExceptions;
32
33     //! test sense inversion: should only be used during WOTest self-testing
34     unsigned    testsFailedExpected;
35     unsigned    testsPassedUnexpected;
36     BOOL        expectFailures;
37
38     //! low-level exception handling inversion: should only be used during WOTest self-testing
39     //! due to problems with the low-level exception handling this API may eventually be deprecated and removed
40     unsigned    lowLevelExceptionsExpected;
41     unsigned    lowLevelExceptionsUnexpected;
42     BOOL        expectLowLevelExceptions;
43
44     //! Internal use only: used for keeping track of whether low-level exception handlers have been installed or not
45     //! Necessary because tested methods may change the low-level-exception-catching status mid-test
46     BOOL        lowLevelExceptionHandlerInstalled;
47
48     //! 0 = mostly silent operation; 1 = verbose; 2 = very verbose
49     unsigned    verbosity;
50
51     //! Optionally trim leading path components when printing path names to console.
52     unsigned    trimInitialPathComponents;
53
54     //! Cache last reported path and last reported line number for use when printing warnings and errors which don't include file and line information
55     NSString    *lastReportedFile;
56     int         lastReportedLine;
57
58     //! Defaults to YES.
59     BOOL        warnsAboutSignComparisons;
60 }
61
62 #pragma mark -
63 #pragma mark Singleton pattern enforcement methods
64
65 /*! \name Singleton pattern enforcement methods
66 \startgroup */
67
68 + (WOTest *)sharedInstance;
69
70 /*! \endgroup */
71
72 #pragma mark -
73 #pragma mark Utility methods
74
75 /*! \name Utility methods
76     \startgroup */
77
78 /*! Returns an NSString based on sending the "description" selector to anObject, compressing whitespace and truncating if necessary at index and appending an ellipsis. Returns nil if anObject is nil. Optionally returns YES or NO indirectyl via /p didTruncate to indicate whether truncation actually occurred. Pass \p index of 0 to return an untruncated, uncompressed description. */
79 - (NSString *)description:(id)anObject truncatedAt:(unsigned)index didTruncate:(BOOL *)didTruncate;
80
81 /*! Seed the random number generator with current system time, in effect causing the random number generator to produce a different sequence of numbers on each run. The random value generator methods will output values that are equal to WO_TEST_VALUE (or WO_BIG_TEST_VALUE or WO_SMALL_TEST_VALUE) plus or minus a random offset up to WO_RANDOMIZATION_RANGE. If you do not explicitly seed the random number generator, the same seed will be used on each run. */
82 - (void)seedRandomNumberGenerator;
83
84 /*! Seed the random number generator with the value passed as seed. Pass 1 to generate a repeatable sequence of numbers on each run (see the random (3) man page for more information. */
85 - (void)seedRandomNumberGenerator:(unsigned long)seed;
86
87 /*! \endgroup */
88
89 #pragma mark -
90 #pragma mark Test-running methods
91
92 /*! \name Test-running test methods
93     \startgroup */
94
95 /*! Runs all tests currently visible in the runtime. Returns YES if all tests pass, NO if any test fails. */
96 - (BOOL)runAllTests;
97
98 /*! Returns YES if all tests pass, NO if any test fails. Raises an exception if className is nil. */
99 - (BOOL)runTestsForClassName:(NSString *)className;
100
101 /*! Returns YES if all tests pass, NO if any test fails. Raises an exception if aClass is nil. */
102 - (BOOL)runTestsForClass:(Class)aClass;
103
104 /*! Returns a list of class names (NSStrings) corresponding to all classes known to the runtime that conform to the WOTest protocol. */
105 - (NSArray *)testableClasses;
106
107 /*! Like the allTestableClasses method, returns a list of class names (NSStrings) corresponding to all classes known to the runtime that conform to the WOTest protocol, with the additional limitation that only classes belonging to the specified bundle are included. */
108 - (NSArray *)testableClassesFrom:(NSBundle *)aBundle;
109
110 /*! Given a class that conforms to the WOTest protocol, returns a list of method names (NSStrings) in that class that correspond to testable methods (in other words, method names that begin with the string "test"). */
111 - (NSArray *)testableMethodsFrom:(Class)aClass;
112
113 - (void)printTestResultsSummary;
114
115 //! Returns YES if there were no failures.
116 - (BOOL)testsWereSuccessful;
117
118 /*! \endgroup */
119
120 #pragma mark -
121 #pragma mark Growl support
122
123 - (void)growlNotifyTitle:(NSString *)title message:(NSString *)message isWarning:(BOOL)isWarning sticky:(BOOL)sticky;
124
125 #pragma mark -
126 #pragma mark Logging methods
127
128 //! \name Logging methods
129 //! \startgroup
130
131 //! Keep track of last known file and line number
132 - (void)cacheFile:(char *)path line:(int)line;
133
134 - (void)writeLastKnownLocation;
135
136 - (void)writePassed:(BOOL)passed inFile:(char *)path atLine:(int)line message:(NSString *)message, ...;
137
138 - (void)writeErrorInFile:(char *)path atLine:(int)line message:(NSString *)message, ...;
139
140 - (void)writeWarningInFile:(char *)path atLine:(int)line message:(NSString *)message, ...;
141
142 - (void)writeUncaughtException:(NSString *)info inFile:(char *)path atLine:(int)line;
143
144 - (void)writeStatusInFile:(char *)path atLine:(int)line message:(NSString *)message, ...;
145
146 - (void)writeStatus:(NSString *)message, ...;
147
148 - (void)writeWarning:(NSString *)message, ...;
149
150 - (void)writeError:(NSString *)message, ...;
151
152 //! \endgroup
153
154 #pragma mark -
155 #pragma mark Empty (do-nothing) test methods
156
157 /*! \name Empty (do-nothing) test methods
158     \startgroup */
159
160 /*! An empty test which always passes. */
161 - (void)passTestInFile:(char *)path atLine:(int)line;
162
163 /*! An empty test which always fails. */
164 - (void)failTestInFile:(char *)path atLine:(int)line;
165
166 /*! \endgroup */
167
168 #pragma mark -
169 #pragma mark Boolean test methods
170
171 /*! \name Boolean test methods
172     \startgroup */
173
174 - (void)testTrue:(BOOL)expr inFile:(char *)path atLine:(int)line;
175
176 - (void)testFalse:(BOOL)expr inFile:(char *)path atLine:(int)line;
177
178 /*! \endgroup */
179
180 #pragma mark -
181 #pragma mark NSValue-based tests
182
183 /*! \name NSValue-based tests
184     \startgroup */
185
186 - (void)testValue:(NSValue *)actual isEqualTo:(NSValue *)expected inFile:(char *)path atLine:(int)line;
187
188 - (void)testValue:(NSValue *)actual isNotEqualTo:(NSValue *)expected inFile:(char *)path atLine:(int)line;
189
190 - (void)testValue:(NSValue *)actual greaterThan:(NSValue *)expected inFile:(char *)path atLine:(int)line;
191
192 - (void)testValue:(NSValue *)actual notGreaterThan:(NSValue *)expected inFile:(char *)path atLine:(int)line;
193
194 - (void)testValue:(NSValue *)actual lessThan:(NSValue *)expected inFile:(char *)path atLine:(int)line;
195
196 - (void)testValue:(NSValue *)actual notLessThan:(NSValue *)expected inFile:(char *)path atLine:(int)line;
197
198 /*! \endgroup */
199
200 #pragma mark -
201 #pragma mark Pointer to void test methods
202
203 /*! \name Pointer to void test methods
204     \startgroup */
205
206 - (void)testNil:(void *)pointer inFile:(char *)path atLine:(int)line;
207
208 - (void)testNotNil:(void *)pointer inFile:(char *)path atLine:(int)line;
209
210 - (void)testPointer:(void *)actual isEqualTo:(void *)expected inFile:(char *)path atLine:(int)line;
211
212 - (void)testPointer:(void *)actual isNotEqualTo:(void *)expected inFile:(char *)path atLine:(int)line;
213
214 /*! \endgroup */
215
216 #pragma mark -
217 #pragma mark int test methods
218
219 /*! \name int test methods
220     \startgroup */
221
222 /*! The WO_TEST_IS_INT macro uses \@encode(typeof()) to pass a string encoding of the type. */
223 - (void)testIsInt:(char *)type inFile:(char *)path atLine:(int)line;
224
225 /*! The WO_TEST_IS_NOT_INT macro uses \@encode(typeof()) to pass a string encoding of the type. */
226 - (void)testIsNotInt:(char *)type inFile:(char *)path atLine:(int)line;
227
228 - (void)testIntPositive:(int)aInt inFile:(char *)path atLine:(int)line;
229
230 - (void)testIntNegative:(int)aInt inFile:(char *)path atLine:(int)line;
231
232 - (void)testIntZero:(int)aInt inFile:(char *)path atLine:(int)line;
233
234 - (void)testIntNotZero:(int)aInt inFile:(char *)path atLine:(int)line;
235
236 - (void)testInt:(int)actual isEqualTo:(int)expected inFile:(char *)path atLine:(int)line;
237
238 - (void)testInt:(int)actual isNotEqualTo:(int)expected inFile:(char *)path atLine:(int)line;
239
240 - (void)testInt:(int)actual greaterThan:(int)expected inFile:(char *)path atLine:(int)line;
241
242 - (void)testInt:(int)actual notGreaterThan:(int)expected inFile:(char *)path atLine:(int)line;
243
244 - (void)testInt:(int)actual lessThan:(int)expected inFile:(char *)path atLine:(int)line;
245
246 - (void)testInt:(int)actual notLessThan:(int)expected inFile:(char *)path atLine:(int)line;
247
248 /*! \endgroup */
249
250 #pragma mark -
251 #pragma mark unsigned test methods
252
253 /*! \name unsigned test methods
254     \startgroup */
255
256 /*! The WO_TEST_IS_UNSIGNED macro uses \@encode(typeof()) to pass a string encoding of the type. */
257 - (void)testIsUnsigned:(char *)type inFile:(char *)path atLine:(int)line;
258
259 /*! The WO_TEST_IS_NOT_UNSIGNED macro uses \@encode(typeof()) to pass a string encoding of the type. */
260 - (void)testIsNotUnsigned:(char *)type inFile:(char *)path atLine:(int)line;
261
262 - (void)testUnsignedZero:(unsigned)aUnsigned inFile:(char *)path atLine:(int)line;
263
264 - (void)testUnsignedNotZero:(unsigned)aUnsigned inFile:(char *)path atLine:(int)line;
265
266 - (void)testUnsigned:(unsigned)actual isEqualTo:(unsigned)expected inFile:(char *)path atLine:(int)line;
267
268 - (void)testUnsigned:(unsigned)actual isNotEqualTo:(unsigned)expected inFile:(char *)path atLine:(int)line;
269
270 - (void)testUnsigned:(unsigned)actual greaterThan:(unsigned)expected inFile:(char *)path atLine:(int)line;
271
272 - (void)testUnsigned:(unsigned)actual notGreaterThan:(unsigned)expected inFile:(char *)path atLine:(int)line;
273
274 - (void)testUnsigned:(unsigned)actual lessThan:(unsigned)expected inFile:(char *)path atLine:(int)line;
275
276 - (void)testUnsigned:(unsigned)actual notLessThan:(unsigned)expected inFile:(char *)path atLine:(int)line;
277
278 /*! \endgroup */
279
280 #pragma mark -
281 #pragma mark float test methods without error margins
282
283 /*! \name float test methods without error margins
284     \startgroup */
285
286 /*! The WO_TEST_IS_FLOAT macro uses \@encode(typeof()) to pass a string encoding of the type. */
287 - (void)testIsFloat:(char *)type inFile:(char *)path atLine:(int)line;
288
289 /*! The WO_TEST_IS_NOT_FLOAT macro uses \@encode(typeof()) to pass a string encoding of the type. */
290 - (void)testIsNotFloat:(char *)type inFile:(char *)path atLine:(int)line;
291
292 - (void)testFloatPositive:(float)aFloat inFile:(char *)path atLine:(int)line;
293
294 - (void)testFloatNegative:(float)aFloat inFile:(char *)path atLine:(int)line;
295
296 - (void)testFloatZero:(float)aFloat inFile:(char *)path atLine:(int)line;
297
298 - (void)testFloatNotZero:(float)aFloat inFile:(char *)path atLine:(int)line;
299
300 - (void)testFloat:(float)actual isEqualTo:(float)expected inFile:(char *)path atLine:(int)line;
301
302 - (void)testFloat:(float)actual isNotEqualTo:(float)expected inFile:(char *)path atLine:(int)line;
303
304 - (void)testFloat:(float)actual greaterThan:(float)expected inFile:(char *)path atLine:(int)line;
305
306 - (void)testFloat:(float)actual notGreaterThan:(float)expected inFile:(char *)path atLine:(int)line;
307
308 - (void)testFloat:(float)actual lessThan:(float)expected inFile:(char *)path atLine:(int)line;
309
310 - (void)testFloat:(float)actual notLessThan:(float)expected inFile:(char *)path atLine:(int)line;
311
312 /*! \endgroup */
313
314 #pragma mark -
315 #pragma mark float test methods with error margins
316
317 /*! \name float test methods with error margins
318     \startgroup */
319
320 - (void)testFloatPositive:(float)aFloat withinError:(float)error inFile:(char *)path atLine:(int)line;
321
322 - (void)testFloatNegative:(float)aFloat withinError:(float)error inFile:(char *)path atLine:(int)line;
323
324 - (void)testFloatZero:(float)aFloat withinError:(float)error inFile:(char *)path atLine:(int)line;
325
326 - (void)testFloatNotZero:(float)aFloat withinError:(float)error inFile:(char *)path atLine:(int)line;
327
328 - (void)testFloat:(float)actual isEqualTo:(float)expected withinError:(float)error inFile:(char *)path atLine:(int)line;
329
330 - (void)testFloat:(float)actual isNotEqualTo:(float)expected withinError:(float)error inFile:(char *)path atLine:(int)line;
331
332 - (void)testFloat:(float)actual greaterThan:(float)expected withinError:(float)error inFile:(char *)path atLine:(int)line;
333
334 - (void)testFloat:(float)actual notGreaterThan:(float)expected withinError:(float)error inFile:(char *)path atLine:(int)line;
335
336 - (void)testFloat:(float)actual lessThan:(float)expected withinError:(float)error inFile:(char *)path atLine:(int)line;
337
338 - (void)testFloat:(float)actual notLessThan:(float)expected withinError:(float)error inFile:(char *)path atLine:(int)line;
339
340 /*! \endgroup */
341
342 #pragma mark -
343 #pragma mark double test methods without error margins
344
345 /*! \name double test methods without error margins
346     \startgroup */
347
348 /*! The WO_TEST_IS_DOUBLE macro uses \@encode(typeof()) to pass a string encoding of the type. */
349 - (void)testIsDouble:(char *)type inFile:(char *)path atLine:(int)line;
350
351 /*! The WO_TEST_IS_NOT_DOUBLE macro uses \@encode(typeof()) to pass a string encoding of the type. */
352 - (void)testIsNotDouble:(char *)type inFile:(char *)path atLine:(int)line;
353
354 - (void)testDoublePositive:(double)aDouble inFile:(char *)path atLine:(int)line;
355
356 - (void)testDoubleNegative:(double)aDouble inFile:(char *)path atLine:(int)line;
357
358 - (void)testDoubleZero:(double)aDouble inFile:(char *)path atLine:(int)line;
359
360 - (void)testDoubleNotZero:(double)aDouble inFile:(char *)path atLine:(int)line;
361
362 - (void)testDouble:(double)actual isEqualTo:(double)expected inFile:(char *)path atLine:(int)line;
363
364 - (void)testDouble:(double)actual isNotEqualTo:(double)expected inFile:(char *)path atLine:(int)line;
365
366 - (void)testDouble:(double)actual greaterThan:(double)expected inFile:(char *)path atLine:(int)line;
367
368 - (void)testDouble:(double)actual notGreaterThan:(double)expected inFile:(char *)path atLine:(int)line;
369
370 - (void)testDouble:(double)actual lessThan:(double)expected inFile:(char *)path atLine:(int)line;
371
372 - (void)testDouble:(double)actual notLessThan:(double)expected inFile:(char *)path atLine:(int)line;
373
374 /*! \endgroup */
375
376 #pragma mark -
377 #pragma mark double test methods with error margins
378
379 /*! \name double test methods with error margins
380     \startgroup */
381
382 - (void)testDoublePositive:(double)aDouble withinError:(double)error inFile:(char *)path atLine:(int)line;
383
384 - (void)testDoubleNegative:(double)aDouble withinError:(double)error inFile:(char *)path atLine:(int)line;
385
386 - (void)testDoubleZero:(double)aDouble withinError:(double)error inFile:(char *)path atLine:(int)line;
387
388 - (void)testDoubleNotZero:(double)aDouble withinError:(double)error inFile:(char *)path atLine:(int)line;
389
390 - (void)testDouble:(double)actual isEqualTo:(double)expected withinError:(double)error inFile:(char *)path atLine:(int)line;
391
392 - (void)testDouble:(double)actual isNotEqualTo:(double)expected withinError:(double)error inFile:(char *)path atLine:(int)line;
393
394 - (void)testDouble:(double)actual greaterThan:(double)expected withinError:(double)error inFile:(char *)path atLine:(int)line;
395
396 - (void)testDouble:(double)actual notGreaterThan:(double)expected withinError:(double)error inFile:(char *)path atLine:(int)line;
397
398 - (void)testDouble:(double)actual lessThan:(double)expected withinError:(double)error inFile:(char *)path atLine:(int)line;
399
400 - (void)testDouble:(double)actual notLessThan:(double)expected withinError:(float)error inFile:(char *)path atLine:(int)line;
401
402 /*! \endgroup */
403
404 #pragma mark -
405 #pragma mark Object test methods
406
407 /*! \name Object test methods
408     \startgroup */
409
410 - (void)testObject:(id)actual isEqualTo:(id)expected inFile:(char *)path atLine:(int)line;
411
412 - (void)testObject:(id)actual isNotEqualTo:(id)expected inFile:(char *)path atLine:(int)line;
413
414 /*! \endgroup */
415
416 #pragma mark -
417 #pragma mark NSString test methods
418
419 /*! \name NSString test methods
420     \startgroup */
421
422 - (void)testString:(NSString *)actual isEqualTo:(NSString *)expected inFile:(char *)path atLine:(int)line;
423
424 - (void)testString:(NSString *)actual isNotEqualTo:(NSString *)expected inFile:(char *)path atLine:(int)line;
425
426 - (void)testString:(NSString *)actual hasPrefix:(NSString *)expected inFile:(char *)path atLine:(int)line;
427
428 - (void)testString:(NSString *)actual doesNotHavePrefix:(NSString *)expected inFile:(char *)path atLine:(int)line;
429
430 - (void)testString:(NSString *)actual hasSuffix:(NSString *)expected inFile:(char *)path atLine:(int)line;
431
432 - (void)testString:(NSString *)actual doesNotHaveSuffix:(NSString *)expected inFile:(char *)path atLine:(int)line;
433
434 - (void)testString:(NSString *)actual contains:(NSString *)expected inFile:(char *)path atLine:(int)line;
435
436 - (void)testString:(NSString *)actual doesNotContain:(NSString *)expected inFile:(char *)path atLine:(int)line;
437
438 /*! \endgroup */
439
440 #pragma mark -
441 #pragma mark NSArray test methods
442
443 /*! \name NSArray test methods
444     \startgroup */
445
446 - (void)testArray:(NSArray *)actual isEqualTo:(NSArray *)expected inFile:(char *)path atLine:(int)line;
447
448 - (void)testArray:(NSArray *)actual isNotEqualTo:(NSArray *)expected inFile:(char *)path atLine:(int)line;
449
450 /*! \endgroup */
451
452 #pragma mark -
453 #pragma mark NSDictionary test methods
454
455 /*! \name NSDictionary test methods
456     \startgroup */
457
458 - (void)testDictionary:(NSDictionary *)actual isEqualTo:(NSDictionary *)expected inFile:(char *)path atLine:(int)line;
459
460 - (void)testDictionary:(NSDictionary *)actual isNotEqualTo:(NSDictionary *)expected inFile:(char *)path atLine:(int)line;
461
462 /*! \endgroup */
463
464 #pragma mark -
465 #pragma mark Exception test methods
466
467 /*! \name Exception test methods
468     \startgroup */
469
470 - (void)testThrowsException:(id)exception inFile:(char *)path atLine:(int)line;
471
472 - (void)testDoesNotThrowException:(id)exception inFile:(char *)path atLine:(int)line;
473
474 - (void)testThrowsException:(id)exception named:(NSString *)name inFile:(char *)path atLine:(int)line;
475
476 - (void)testDoesNotThrowException:(id)exception named:(NSString *)name inFile:(char *)path atLine:(int)line;
477
478 /*! \endgroup */
479
480 #pragma mark -
481 #pragma mark Random value generator methods
482
483 /*! \name Random value generator methods
484     \startgroup */
485
486
487 - (int)anInt;
488 - (int)aPositiveInt;
489 - (int)aNegativeInt;
490 - (int)aZeroInt;
491 - (int)aBigInt;
492 - (int)aBigPositiveInt;
493 - (int)aBigNegativeInt;
494 - (int)aSmallInt;
495 - (int)aSmallPositiveInt;
496 - (int)aSmallNegativeInt;
497
498 - (unsigned)anUnsigned;
499 - (unsigned)aZeroUnsigned;
500 - (unsigned)aBigUnsigned;
501 - (unsigned)aSmallUnsigned;
502
503 - (float)aFloat;
504 - (float)aPositiveFloat;
505 - (float)aNegativeFloat;
506 - (float)aZeroFloat;
507 - (float)aBigFloat;
508 - (float)aBigPositiveFloat;
509 - (float)aBigNegativeFloat;
510 - (float)aSmallFloat;
511 - (float)aSmallPositiveFloat;
512 - (float)aSmallNegativeFloat;
513
514 - (double)aDouble;
515 - (double)aPositiveDouble;
516 - (double)aNegativeDouble;
517 - (double)aZeroDouble;
518 - (double)aBigDouble;
519 - (double)aBigPositiveDouble;
520 - (double)aBigNegativeDouble;
521 - (double)aSmallDouble;
522 - (double)aSmallPositiveDouble;
523 - (double)aSmallNegativeDouble;
524
525 /*! \endgroup */
526
527 #pragma mark -
528 #pragma mark Properties
529
530 //! \name Properties
531 //! \startgroup
532
533 // BUG: Objective-C 2.0 bug, can't use "readonly" pattern, see implementation file for more details
534 @property(/*readonly,*/ copy) NSDate    *startDate;
535 @property/*(readonly)*/ unsigned        testsRun;
536 @property/*(readonly)*/ unsigned        testsPassed;
537 @property/*(readonly)*/ unsigned        testsFailed;
538
539 // TODO: need sense inversion here as well (for uncaught exceptions) for self-testing purposes
540 @property/*(readonly)*/ unsigned        uncaughtExceptions;
541 @property/*(readonly)*/ unsigned        testsFailedExpected;
542 @property/*(readonly)*/ unsigned        testsPassedUnexpected;
543
544 @property BOOL                      expectFailures;
545
546 @property/*(readonly)*/ unsigned        lowLevelExceptionsExpected;
547 @property/*(readonly)*/ unsigned        lowLevelExceptionsUnexpected;
548
549 @property BOOL                      expectLowLevelExceptions;
550
551 @property unsigned                  verbosity;
552 @property unsigned                  trimInitialPathComponents;
553 @property(/*readonly,*/ copy) NSString  *lastReportedFile;
554 @property/*(readonly)*/ int             lastReportedLine;
555 @property BOOL                      warnsAboutSignComparisons;
556
557 //! \endgroup
558
559 @end