Blame assert/test-assert.c

Packit 6c4009
/* Test assert().
Packit 6c4009
 *
Packit 6c4009
 * This is hairier than you'd think, involving games with
Packit 6c4009
 * stdio and signals.
Packit 6c4009
 *
Packit 6c4009
 */
Packit 6c4009
Packit 6c4009
#include <signal.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <setjmp.h>
Packit 6c4009
Packit 6c4009
jmp_buf rec;
Packit 6c4009
char buf[160];
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
sigabrt (int unused)
Packit 6c4009
{
Packit 6c4009
  longjmp (rec, 1);  /* recover control */
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#undef NDEBUG
Packit 6c4009
#include <assert.h>
Packit 6c4009
static void
Packit 6c4009
assert1 (void)
Packit 6c4009
{
Packit 6c4009
  assert (1 == 2);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
assert2 (void)
Packit 6c4009
{
Packit 6c4009
  assert (1 == 1);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
#define NDEBUG
Packit 6c4009
#include <assert.h>
Packit 6c4009
static void
Packit 6c4009
assert3 (void)
Packit 6c4009
{
Packit 6c4009
  assert (2 == 3);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
int
Packit 6c4009
main (void)
Packit 6c4009
{
Packit 6c4009
Packit 6c4009
  volatile int failed = 1;
Packit 6c4009
Packit 6c4009
  fclose (stderr);
Packit 6c4009
  stderr = tmpfile ();
Packit 6c4009
  if(!stderr)
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  signal (SIGABRT, sigabrt);
Packit 6c4009
Packit 6c4009
  if (!setjmp (rec))
Packit 6c4009
    assert1 ();
Packit 6c4009
  else
Packit 6c4009
    failed = 0;  /* should happen */
Packit 6c4009
Packit 6c4009
  if (!setjmp (rec))
Packit 6c4009
    assert2 ();
Packit 6c4009
  else
Packit 6c4009
    failed = 1; /* should not happen */
Packit 6c4009
Packit 6c4009
  if (!setjmp (rec))
Packit 6c4009
    assert3 ();
Packit 6c4009
  else
Packit 6c4009
    failed = 1; /* should not happen */
Packit 6c4009
Packit 6c4009
  rewind (stderr);
Packit 6c4009
  fgets (buf, 160, stderr);
Packit 6c4009
  if (!strstr (buf, "1 == 2"))
Packit 6c4009
    failed = 1;
Packit 6c4009
Packit 6c4009
  fgets (buf, 160, stderr);
Packit 6c4009
  if (strstr (buf, "1 == 1"))
Packit 6c4009
    failed = 1;
Packit 6c4009
Packit 6c4009
  fgets (buf, 160, stderr);
Packit 6c4009
  if (strstr (buf, "2 == 3"))
Packit 6c4009
    failed = 1;
Packit 6c4009
Packit 6c4009
  return failed;
Packit 6c4009
}