]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - tools/src/infra/testsuite/cyginfra/tassert6.cxx
Initial revision
[karo-tx-redboot.git] / tools / src / infra / testsuite / cyginfra / tassert6.cxx
1 //==========================================================================
2 //
3 //      tassert6.cxx
4 //
5 //      Assertion test case                                                                
6 //
7 //==========================================================================
8 //####COPYRIGHTBEGIN####
9 //                                                                          
10 // ----------------------------------------------------------------------------
11 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
12 //
13 // This file is part of the eCos host tools.
14 //
15 // This program is free software; you can redistribute it and/or modify it 
16 // under the terms of the GNU General Public License as published by the Free 
17 // Software Foundation; either version 2 of the License, or (at your option) 
18 // any later version.
19 // 
20 // This program is distributed in the hope that it will be useful, but WITHOUT 
21 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
22 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
23 // more details.
24 // 
25 // You should have received a copy of the GNU General Public License along with
26 // this program; if not, write to the Free Software Foundation, Inc., 
27 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
28 //
29 // ----------------------------------------------------------------------------
30 //                                                                          
31 //####COPYRIGHTEND####
32 //==========================================================================
33 //#####DESCRIPTIONBEGIN####                                             
34 //
35 // Author(s):           bartv
36 // Contributors:        bartv
37 // Date:                1998-12-22
38 // Purpose:
39 // Description:         This routine checks that all the assertions can
40 //                      be triggered.
41 //
42 //####DESCRIPTIONEND####
43 //==========================================================================
44
45
46 #define CYG_DECLARE_HOST_ASSERTION_SUPPORT
47 #define CYGDBG_USE_ASSERTS
48 #define CYGDBG_INFRA_DEBUG_PRECONDITIONS
49 #define CYGDBG_INFRA_DEBUG_POSTCONDITIONS
50 #define CYGDBG_INFRA_DEBUG_LOOP_INVARIANTS
51 #define CYGDBG_INFRA_DEBUG_INVARIANTS
52
53 // Also redefine the zeal
54 #define CYG_ASSERT_CLASS_ZEAL (cyg_extreme)
55
56 #include <cyg/infra/testcase.h>
57 #include <cyg/infra/cyg_ass.h>
58 #include <cstdlib>
59 #include <csetjmp>
60 #include <cstring>
61
62
63 // This is used to "recover" from an assertion failure
64 static jmp_buf setjmp_buffer;
65
66 // The number of assertions that have triggered.
67 static int failed_assertions = 0;
68
69 // The number of assertions that have been triggered.
70 static int   counter = 0;
71
72 static const char message[] = "beware of the leopard";
73
74 // A dummy class is needed for some of the assertions.
75 class dummy {
76   private:
77     int       random;
78   public:
79     dummy() {
80         random = rand();
81     }
82     ~dummy() {
83         random = 0;
84     }
85     void assertions();
86     void invariant1();
87     void invariant2();
88     static void invariant3(dummy&);
89     static void invariant4(dummy&);
90     static void invariant5(dummy*);
91     static void invariant6(dummy*);
92     static void extern_assertions(dummy*);
93     bool check_this(cyg_assert_class_zeal) const;
94 };
95
96 bool
97 dummy::check_this(cyg_assert_class_zeal zeal) const
98 {
99     // The default zeal should be cyg_quick.
100     switch(zeal) {
101     case cyg_extreme:
102         return false;
103     case cyg_system_test:
104     case cyg_thorough:
105     case cyg_quick:
106     case cyg_trivial:
107     case cyg_none:
108         CYG_TEST_FAIL_FINISH("incorrect default zeal passed to check_this() member function");
109         break;
110     default:
111         CYG_TEST_FAIL_FINISH("invalid zeal passed to check_this() member function");
112         break;
113     }
114     return false;
115 }
116
117 void
118 dummy::invariant1(void)
119 {
120     CYG_INVARIANT_THIS(dummy, message);
121     CYG_TEST_FAIL("CYG_INVARIANT_THIS() did not trigger");
122 }
123
124 void
125 dummy::invariant2(void)
126 {
127     CYG_INVARIANT_THISC(dummy);
128     CYG_TEST_FAIL("CYG_INVARIANT_THISC() did not trigger");
129 }
130
131 void
132 dummy::invariant3(dummy& obj)
133 {
134     CYG_INVARIANT_CLASSO(dummy, obj, message);
135     CYG_TEST_FAIL("CYG_INVARIANT_CLASSO() did not trigger");
136 }
137
138 void
139 dummy::invariant4(dummy& obj)
140 {
141     CYG_INVARIANT_CLASSOC(dummy, obj);
142     CYG_TEST_FAIL("CYG_INVARIANT_CLASSOC() did not trigger");
143 }
144
145 void
146 dummy::invariant5(dummy* obj)
147 {
148     CYG_INVARIANT_CLASS(dummy, obj, message);
149     CYG_TEST_FAIL("CYG_INVARIANT_CLASS() did not trigger");
150 }
151
152 void
153 dummy::invariant6(dummy* obj)
154 {
155     CYG_INVARIANT_CLASSC(dummy, obj);
156     CYG_TEST_FAIL("CYG_INVARIANT_CLASSC() did not trigger");
157 }
158
159 void
160 dummy::assertions(void)
161 {
162     switch(counter) {
163
164     case 33:
165         CYG_ASSERT_THIS(message);
166         CYG_TEST_FAIL("CYG_ASSERT_THIS() did not trigger");
167         break;
168
169     case 34:
170         CYG_ASSERT_THISC();
171         CYG_TEST_FAIL("CYG_ASSERT_THISC() did not trigger");
172         break;
173
174     case 35:
175         CYG_PRECONDITION_THIS(message);
176         CYG_TEST_FAIL("CYG_PRECONDITION_THIS() did not trigger");
177         break;
178
179     case 36:
180         CYG_PRECONDITION_THISC();
181         CYG_TEST_FAIL("CYG_PRECONDITION_THISC() did not trigger");
182         break;
183
184     case 37:
185         CYG_POSTCONDITION_THIS(message);
186         CYG_TEST_FAIL("CYG_POSTCONDITION_THIS() did not trigger");
187         break;
188
189     case 38:
190         CYG_POSTCONDITION_THISC();
191         CYG_TEST_FAIL("CYG_POSTCONDITION_THISC() did not trigger");
192         break;
193
194     case 39:
195         CYG_LOOP_INVARIANT_THIS(message);
196         CYG_TEST_FAIL("CYG_LOOP_INVARIANT_THIS() did not trigger");
197         break;
198
199     case 40:
200         CYG_LOOP_INVARIANT_THISC();
201         CYG_TEST_FAIL("CYG_LOOP_INVARIANT_THISC() did not trigger");
202         break;
203
204     default:
205         CYG_TEST_FAIL("dummy::assertions() invoked for no reason");
206         break;
207     }
208 }
209
210 void
211 dummy::extern_assertions(dummy* obj)
212 {
213     switch(counter) {
214     case 41:
215         CYG_ASSERT_ZERO_OR_CLASS(obj, message);
216         CYG_TEST_FAIL("CYG_ASSERT_ZERO_OR_CLASS() did not trigger");
217         break;
218
219     case 42:
220         CYG_ASSERT_ZERO_OR_CLASSC(obj);
221         CYG_TEST_FAIL("CYG_ASSERT_ZERO_OR_CLASSC() did not trigger");
222         break;
223
224     case 43:
225         CYG_PRECONDITION_ZERO_OR_CLASS(obj, message);
226         CYG_TEST_FAIL("CYG_PRECONDITION_ZERO_OR_CLASS() did not trigger");
227         break;
228
229     case 44:
230         CYG_PRECONDITION_ZERO_OR_CLASSC(obj);
231         CYG_TEST_FAIL("CYG_PRECONDITION_ZERO_OR_CLASSC() did not trigger");
232         break;
233
234     case 45:
235         CYG_POSTCONDITION_ZERO_OR_CLASS(obj, message);
236         CYG_TEST_FAIL("CYG_POSTCONDITION_ZERO_OR_CLASS() did not trigger");
237         break;
238
239     case 46:
240         CYG_POSTCONDITION_ZERO_OR_CLASSC(obj);
241         CYG_TEST_FAIL("CYG_POSTCONDITION_ZERO_OR_CLASSC() did not trigger");
242         break;
243
244     case 47:
245         CYG_LOOP_INVARIANT_ZERO_OR_CLASS(obj, message);
246         CYG_TEST_FAIL("CYG_LOOP_INVARIANT_ZERO_OR_CLASS() did not trigger");
247         break;
248
249     case 48:
250         CYG_LOOP_INVARIANT_ZERO_OR_CLASSC(obj);
251         CYG_TEST_FAIL("CYG_LOOP_INVARIANT_ZERO_OR_CLASSC() did not trigger");
252         break;
253
254     default:
255         CYG_TEST_FAIL("dummy::extern_assertions() invoked for no reason");
256         break;
257     }
258     
259 }
260
261 extern "C"
262 bool
263 failure_handler(const char* fn, const char* file, cyg_uint32 line, const char* msg)
264 {
265     failed_assertions++;
266     counter++;
267     longjmp(setjmp_buffer, 1);
268     return true;
269 }
270
271 int
272 main(int argc, char** argv)
273 {
274     dummy object;
275
276     cyg_assert_install_failure_handler(&failure_handler);
277     setjmp(setjmp_buffer);
278     
279     for ( bool done = false; !done; counter++ ) {
280         switch(counter) {
281         case 0:
282             CYG_ASSERT(false, message);
283             CYG_TEST_FAIL("CYG_ASSERT() did not trigger");
284             break;
285
286         case 1:
287             CYG_ASSERTC(false);
288             CYG_TEST_FAIL("CYG_ASSERTC() did not trigger");
289             break;
290
291         case 2:
292             CYG_FAIL(message);
293             CYG_TEST_FAIL("CYG_FAIL() did not trigger");
294             break;
295
296         case 3:
297             CYG_CHECK_DATA_PTR(0, message);
298             CYG_TEST_FAIL("CHECK_CHECK_DATA_PTR() did not trigger");
299             break;
300
301         case 4:
302             CYG_CHECK_DATA_PTRC(0);
303             CYG_TEST_FAIL("CHECK_CHECK_DATA_PTRC() did not trigger");
304             break;
305
306         case 5:
307             CYG_CHECK_FUNC_PTR(0, message);
308             CYG_TEST_FAIL("CHECK_CHECK_FUNC_PTR() did not trigger");
309             break;
310
311         case 6:
312             CYG_CHECK_DATA_PTRC(0);
313             CYG_TEST_FAIL("CHECK_CHECK_FUNC_PTRC() did not trigger");
314             break;
315
316         case 7:
317             CYG_ASSERT_CLASS(&object, message);
318             CYG_TEST_FAIL("CYG_ASSERT_CLASS() did not trigger");
319             break;
320
321         case 8:
322             CYG_ASSERT_CLASSC(&object);
323             CYG_TEST_FAIL("CYG_ASSERT_CLASSC() did not trigger");
324             break;
325
326         case 9:
327             CYG_ASSERT_CLASSO(object, message);
328             CYG_TEST_FAIL("CYG_ASSERT_CLASSO() did not trigger");
329             break;
330
331         case 10:
332             CYG_ASSERT_CLASSOC(object);
333             CYG_TEST_FAIL("CYG_ASSERT_CLASSOC() did not trigger");
334             break;
335
336         case 11:
337             CYG_PRECONDITION(false, message);
338             CYG_TEST_FAIL("CYG_PRECONDITION() did not trigger");
339             break;
340
341         case 12:
342             CYG_PRECONDITIONC(false);
343             CYG_TEST_FAIL("CYG_PRECONDITIONC() did not trigger");
344             break;
345
346         case 13:
347             CYG_PRECONDITION_CLASS(&object, message);
348             CYG_TEST_FAIL("CYG_PRECONDITION_CLASS() did not trigger");
349             break;
350
351         case 14:
352             CYG_PRECONDITION_CLASSC(&object);
353             CYG_TEST_FAIL("CYG_PRECONDITION_CLASSC() did not trigger");
354             break;
355
356         case 15:
357             CYG_PRECONDITION_CLASSO(object, message);
358             CYG_TEST_FAIL("CYG_PRECONDITION_CLASSO() did not trigger");
359             break;
360
361         case 16:
362             CYG_PRECONDITION_CLASSOC(object);
363             CYG_TEST_FAIL("CYG_PRECONDITION_CLASSOC() did not trigger");
364             break;
365             
366         case 17:
367             CYG_POSTCONDITION(false, message);
368             CYG_TEST_FAIL("CYG_POSTCONDITION() did not trigger");
369             break;
370
371         case 18:
372             CYG_POSTCONDITIONC(false);
373             CYG_TEST_FAIL("CYG_POSTCONDITIONC() did not trigger");
374             break;
375
376         case 19:
377             CYG_POSTCONDITION_CLASS(&object, message);
378             CYG_TEST_FAIL("CYG_POSTCONDITION_CLASS() did not trigger");
379             break;
380
381         case 20:
382             CYG_POSTCONDITION_CLASSC(&object);
383             CYG_TEST_FAIL("CYG_POSTCONDITION_CLASSC() did not trigger");
384             break;
385
386         case 21:
387             CYG_POSTCONDITION_CLASSO(object, message);
388             CYG_TEST_FAIL("CYG_POSTCONDITION_CLASSO() did not trigger");
389             break;
390
391         case 22:
392             CYG_POSTCONDITION_CLASSOC(object);
393             CYG_TEST_FAIL("CYG_POSTCONDITION_CLASSOC() did not trigger");
394             break;
395
396         case 23:
397             CYG_LOOP_INVARIANT(false, message);
398             CYG_TEST_FAIL("CYG_LOOP_INVARIANT() did not trigger");
399             break;
400
401         case 24:
402             CYG_LOOP_INVARIANTC(false);
403             CYG_TEST_FAIL("CYG_LOOP_INVARIANTC() did not trigger");
404             break;
405
406         case 25:
407             CYG_LOOP_INVARIANT_CLASS(&object, message);
408             CYG_TEST_FAIL("CYG_LOOP_INVARIANT_CLASS() did not trigger");
409             break;
410
411         case 26:
412             CYG_LOOP_INVARIANT_CLASSC(&object);
413             CYG_TEST_FAIL("CYG_LOOP_INVARIANT_CLASSC() did not trigger");
414             break;
415
416         case 27:
417             CYG_LOOP_INVARIANT_CLASSO(object, message);
418             CYG_TEST_FAIL("CYG_LOOP_INVARIANT_CLASSO() did not trigger");
419             break;
420
421         case 28:
422             CYG_LOOP_INVARIANT_CLASSOC(object);
423             CYG_TEST_FAIL("CYG_LOOP_INVARIANT_CLASSOC() did not trigger");
424             break;
425
426         case 29:
427             CYG_INVARIANT(false, message);
428             CYG_TEST_FAIL("CYG_INVARIANT() did not trigger");
429             break;
430
431         case 30:
432             CYG_INVARIANTC(false);
433             CYG_TEST_FAIL("CYG_INVARIANTC() did not trigger");
434             break;
435
436         case 31:
437             object.invariant1();
438             break;
439             
440         case 32:
441             object.invariant2();
442             break;
443             
444         case 33:
445         case 34:
446         case 35:
447         case 36:
448         case 37:
449         case 38:
450         case 39:
451         case 40:
452             object.assertions();
453             break;
454
455         case 41:
456         case 42:
457         case 43:
458         case 44:
459         case 45:
460         case 46:
461         case 47:
462         case 48:
463             dummy::extern_assertions(&object);
464             break;
465
466         case 49:
467             dummy::invariant3(object);
468             break;
469             
470         case 50:
471             dummy::invariant4(object);
472             break;
473             
474         case 51:
475             dummy::invariant5(&object);
476             break;
477             
478         case 52:
479             dummy::invariant6(&object);
480             break;
481             
482         default:
483             done = true;
484             counter--;  // About to get incremented again...
485             break;
486         }
487     }
488
489     if (failed_assertions != 53) {
490         CYG_TEST_FAIL("Broken test case, not all assertions have been tried");
491     }
492     
493     if (failed_assertions == counter) {
494         CYG_TEST_PASS("All assertions trigger successfully");
495     } else {
496         CYG_TEST_FAIL("Not all assertions trigger");
497     }
498     
499     return 0;
500 }
501