diff options
Diffstat (limited to 'assert/test-assert.c')
-rw-r--r-- | assert/test-assert.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/assert/test-assert.c b/assert/test-assert.c new file mode 100644 index 0000000000..045721e9cd --- /dev/null +++ b/assert/test-assert.c @@ -0,0 +1,88 @@ +/* Test assert(). + * + * This is hairier than you'd think, involving games with + * stdio and signals. + * + */ + +#include <signal.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <setjmp.h> + +jmp_buf rec; +char buf[160]; + +void +sigabrt (int unused) +{ + longjmp (rec, 1); /* recover control */ +} + +#undef NDEBUG +#include <assert.h> +void +assert1 (void) +{ + assert (1 == 2); +} + +void +assert2 (void) +{ + assert (1 == 1); +} + + +#define NDEBUG +#include <assert.h> +void +assert3 (void) +{ + assert (2 == 3); +} + +int +main (void) +{ + + volatile int failed = 1; + + fclose (stderr); + stderr = tmpfile (); + if(!stderr) + abort (); + + signal (SIGABRT, sigabrt); + + if (!setjmp (rec)) + assert1 (); + else + failed = 0; /* should happen */ + + if (!setjmp (rec)) + assert2 (); + else + failed = 1; /* should not happen */ + + if (!setjmp (rec)) + assert3 (); + else + failed = 1; /* should not happen */ + + rewind (stderr); + fgets (buf, 160, stderr); + if (!strstr (buf, "1 == 2")) + failed = 1; + + fgets (buf, 160, stderr); + if (strstr (buf, "1 == 1")) + failed = 1; + + fgets (buf, 160, stderr); + if (strstr (buf, "2 == 3")) + failed = 1; + + return failed; +} |