5 * Copyright (c) 2001-2002 Samuel A. Falvo II, William D. Tanksley
6 * See CUT-LICENSE.TXT for details.
8 * Based on WDT's 'TestAssert' package.
19 #ifndef BOOL /* Just in case -- helps in portability */
31 typedef struct NameStackItem NameStackItem
;
32 typedef struct NameStackItem
*NameStack
;
38 CUTTakedownFunction
*takedown
;
41 static int breakpoint
= 0;
43 static BOOL test_hit_error
= FALSE
;
44 static NameStack nameStack
;
46 static void traceback( void );
47 static void cut_exit( void );
51 static void print_string( char *string
)
53 printf( "%s", string
);
57 static void print_string_as_error( char *filename
, int lineNumber
, char *string
)
59 printf( "%s(%d): %s", filename
, lineNumber
, string
);
63 static void print_integer_as_expected( int i
)
65 printf( "(signed) %d (unsigned) %u (hex) 0x%08X", i
, i
, i
);
68 static void print_integer( int i
)
74 static void print_integer_in_field( int i
, int width
)
76 printf( "%*d", width
, i
);
80 static void new_line( void )
86 static void print_character( char ch
)
92 static void dot( void )
94 print_character( '.' );
97 static void space( void )
99 print_character( ' ' );
102 /* Name Stack Functions */
104 static NameStackItem
*stack_topOf( NameStack
*stack
)
109 static BOOL
stack_isEmpty( NameStack
*stack
)
111 return stack_topOf( stack
) == NULL
;
114 static BOOL
stack_isNotEmpty( NameStack
*stack
)
116 return !( stack_isEmpty( stack
) );
119 static void stack_push( NameStack
*stack
, char *name
, CUTTakedownFunction
*tdfunc
)
123 item
= (NameStackItem
*)( malloc( sizeof( NameStackItem
) ) );
126 item
-> next
= stack_topOf( stack
);
128 item
-> takedown
= tdfunc
;
134 static void stack_drop( NameStack
*stack
)
136 NameStackItem
*oldItem
;
138 if( stack_isNotEmpty( stack
) )
140 oldItem
= stack_topOf( stack
);
141 *stack
= oldItem
-> next
;
147 /* CUT Initialization and Takedown Functions */
149 void cut_init( int brkpoint
)
151 breakpoint
= brkpoint
;
153 test_hit_error
= FALSE
;
158 print_string( "Breakpoint at test " );
159 print_integer( brkpoint
);
164 void cut_exit( void )
166 exit( test_hit_error
!= FALSE
);
169 /* User Interface functions */
171 static void print_group( int position
, int base
, int leftover
)
176 print_integer_in_field( base
, position
);
181 static void print_recap( int count
)
183 int countsOnLastLine
= count
% 50;
184 int groupsOnLastLine
= countsOnLastLine
/ 10;
185 int dotsLeftOver
= countsOnLastLine
% 10;
186 int lastGroupLocation
=
187 countsOnLastLine
- dotsLeftOver
+ ( 4 * groupsOnLastLine
) + 5;
189 if( dotsLeftOver
== 0 )
191 if( countsOnLastLine
== 0 )
192 lastGroupLocation
= 61;
194 lastGroupLocation
-= 14;
196 print_group( lastGroupLocation
, countsOnLastLine
-10, 10);
202 countsOnLastLine
- dotsLeftOver
,
208 void cut_break_formatting( void ) // DEPRECATED: Do not use in future software
213 void cut_resume_formatting( void )
216 print_recap( count
);
219 void cut_interject( const char *comment
, ... )
222 va_start(marker
,comment
);
224 cut_break_formatting();
225 vprintf(comment
,marker
);
226 cut_resume_formatting();
231 /* Test Progress Accounting functions */
233 void __cut_mark_point( char *filename
, int lineNumber
)
235 if( ( count
% 10 ) == 0 )
237 if( ( count
% 50 ) == 0 )
240 print_integer_in_field( count
, 5 );
246 if( count
== breakpoint
)
248 print_string_as_error( filename
, lineNumber
, "Breakpoint hit" );
255 void __cut_assert_equals( // DEPRECATED: Do not use in future software
264 __cut_mark_point( filename
, lineNumber
);
266 if( success
!= FALSE
)
269 cut_break_formatting();
270 print_string_as_error( filename
, lineNumber
, message
);
272 print_string_as_error( filename
, lineNumber
, "Failed expression: " );
273 print_string( expression
);
275 print_string_as_error( filename
, lineNumber
, "Actual value: " );
276 print_integer_as_expected( expected
);
279 test_hit_error
= TRUE
;
280 cut_resume_formatting();
292 __cut_mark_point( filename
, lineNumber
);
294 if( success
!= FALSE
)
297 cut_break_formatting();
298 print_string_as_error( filename
, lineNumber
, message
);
300 print_string_as_error( filename
, lineNumber
, "Failed expression: " );
301 print_string( expression
);
304 test_hit_error
= TRUE
;
305 cut_resume_formatting();
309 /* Test Delineation and Teardown Support Functions */
311 static void traceback()
313 if( stack_isNotEmpty( &nameStack
) )
314 print_string( "Traceback" );
316 print_string( "(No traceback available.)" );
318 while( stack_isNotEmpty( &nameStack
) )
320 print_string( ": " );
321 print_string( stack_topOf( &nameStack
) -> name
);
323 if( stack_topOf( &nameStack
) -> takedown
!= NULL
)
325 print_string( "(taking down)" );
326 stack_topOf( &nameStack
) -> takedown();
329 stack_drop( &nameStack
);
331 if( stack_isNotEmpty( &nameStack
) )
338 void cut_start( char *name
, CUTTakedownFunction
*takedownFunction
)
340 stack_push( &nameStack
, name
, takedownFunction
);
343 int __cut_check_errors( char *filename
, int lineNumber
)
345 if( test_hit_error
|| stack_isEmpty( &nameStack
) )
347 cut_break_formatting();
348 if( stack_isEmpty( &nameStack
) )
349 print_string_as_error( filename
, lineNumber
, "Missing cut_start(); no traceback possible." );
358 void __cut_end( char *filename
, int lineNumber
, char *closingFrame
)
360 if( test_hit_error
|| stack_isEmpty( &nameStack
) )
362 cut_break_formatting();
363 if( stack_isEmpty( &nameStack
) )
364 print_string_as_error( filename
, lineNumber
, "Missing cut_start(); no traceback possible." );
372 if( strcmp( stack_topOf( &nameStack
) -> name
, closingFrame
) == 0 )
373 stack_drop( &nameStack
);
376 print_string_as_error( filename
, lineNumber
, "Mismatched cut_end()." );