#ifndef _tissat_h_INCLUDED
#define _tissat_h_INCLUDED

#include "../src/inline.h"
#include "../src/print.h"

#include "testapplication.h"
#include "testdivert.h"
#include "testmessages.h"
#include "testscheduler.h"

#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>

extern bool tissat_big;
extern bool tissat_found_test_directory;
extern bool tissat_sequential;
extern bool tissat_progress;

#ifndef NPROOFS
extern bool tissat_found_drabt;
extern bool tissat_found_drat_trim;
#endif

#if defined(_POSIX_C_SOURCE) || defined(__APPLE__)
extern bool tissat_found_bzip2;
extern bool tissat_found_gzip;
extern bool tissat_found_lzma;
extern bool tissat_found_xz;
extern bool tissat_found_7z;
#endif

extern const char *tissat_root;

#define tissat_assert(COND) \
  ((COND) ? (void) 0 : \
\
          (tissat_restore_stdout_and_stderr (), \
           printf ("tissat: %s:%ld: %s: Assertion `%s' failed.\n", \
                   __FILE__, (long) __LINE__, __func__, #COND), \
           abort (), (void) 0))

#define tissat_assume(COND) \
  ((COND) \
       ? (void) 0 \
       : \
\
       (tissat_restore_stdout_and_stderr (), \
        tissat_warning ("tissat: %s:%ld: %s: Assumption `%s' failed.\n", \
                        __FILE__, (long) __LINE__, __func__, #COND), \
        tissat_divert_stdout_and_stderr_to_dev_null (), tissat_warnings++, \
        (void) 0))

#ifdef assert
#undef assert
#endif

#define assume tissat_assume
#define assert tissat_assert

#define FATAL(...) \
  do { \
    fflush (stdout); \
    tissat_restore_stdout_and_stderr (); \
    tissat_fatal (__VA_ARGS__); \
  } while (0)

void tissat_init_solver (struct kissat *);

#define DECLARE_AND_INIT_SOLVER(SOLVER) \
  kissat dummy_solver, *solver = &dummy_solver; \
  memset (&dummy_solver, 0, sizeof dummy_solver); \
  tissat_init_solver (solver)

#endif
