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
14jmp_buf rec;
15char buf[160];
16
17static void
18sigabrt (int unused)
19{
20  longjmp (rec, 1);  /* recover control */
21}
22
23#undef NDEBUG
24#include <assert.h>
25static void
26assert1 (void)
27{
28  assert (1 == 2);
29}
30
31static void
32assert2 (void)
33{
34  assert (1 == 1);
35}
36
37
38#define NDEBUG
39#include <assert.h>
40static void
41assert3 (void)
42{
43  assert (2 == 3);
44}
45
46int
47main (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