Home | History | Annotate | Download | only in assert
      1 /* Test assert().
      2  *
      3  * This is hairier than you'd think, involving games with
      4  * stdio and signals.
      5  *
      6  */
      7 
      8 #include <signal.h>
      9 #include <stdlib.h>
     10 #include <stdio.h>
     11 #include <string.h>
     12 #include <setjmp.h>
     13 
     14 jmp_buf rec;
     15 char buf[160];
     16 
     17 static void
     18 sigabrt (int unused)
     19 {
     20   longjmp (rec, 1);  /* recover control */
     21 }
     22 
     23 #undef NDEBUG
     24 #include <assert.h>
     25 static void
     26 assert1 (void)
     27 {
     28   assert (1 == 2);
     29 }
     30 
     31 static void
     32 assert2 (void)
     33 {
     34   assert (1 == 1);
     35 }
     36 
     37 
     38 #define NDEBUG
     39 #include <assert.h>
     40 static void
     41 assert3 (void)
     42 {
     43   assert (2 == 3);
     44 }
     45 
     46 int
     47 main (void)
     48 {
     49 
     50   volatile int failed = 1;
     51 
     52   fclose (stderr);
     53   stderr = tmpfile ();
     54   if(!stderr)
     55     abort ();
     56 
     57   signal (SIGABRT, sigabrt);
     58 
     59   if (!setjmp (rec))
     60     assert1 ();
     61   else
     62     failed = 0;  /* should happen */
     63 
     64   if (!setjmp (rec))
     65     assert2 ();
     66   else
     67     failed = 1; /* should not happen */
     68 
     69   if (!setjmp (rec))
     70     assert3 ();
     71   else
     72     failed = 1; /* should not happen */
     73 
     74   rewind (stderr);
     75   fgets (buf, 160, stderr);
     76   if (!strstr (buf, "1 == 2"))
     77     failed = 1;
     78 
     79   fgets (buf, 160, stderr);
     80   if (strstr (buf, "1 == 1"))
     81     failed = 1;
     82 
     83   fgets (buf, 160, stderr);
     84   if (strstr (buf, "2 == 3"))
     85     failed = 1;
     86 
     87   return failed;
     88 }
     89