#include "test.h"

#include "../src/import.h"
#include "../src/resize.h"
#include "../src/resources.h"

static kissat *
new_solver (void)
{
  kissat *solver = kissat_init ();
  tissat_init_solver (solver);
  return solver;
}

static void
test_init_zero (void)
{
#ifndef QUIET
  assert (kissat_verbosity (0) < 0);
#endif
  kissat_warning (0, "YOU SHOULD NOT SEE THIS WARNING!");
  kissat_signal (0, "YOU SHOULD NOT SEE THIS SIGNAL MESSAGE FOR ", 0);
}

static void
test_init_release (void)
{
  kissat *solver = new_solver ();
  kissat_release (solver);
}

static void
test_init_enlarge_release (void)
{
  format format;
  memset (&format, 0, sizeof format);
#ifndef QUIET
  printf ("before allocating solver %s\n",
	  kissat_format_bytes (&format, kissat_maximum_resident_set_size ()));
#endif
  kissat *solver = new_solver ();
  kissat_enlarge_variables (solver, 17);
  for (int i = 1; i < (tissat_big ? 28 : 21); i++)
    {
      kissat_enlarge_variables (solver, solver->vars + 1);
      kissat_enlarge_variables (solver, 1 << i);
#ifndef QUIET
      printf ("after %d << 20 %s\n", i,
	      kissat_format_bytes (&format,
				   kissat_maximum_resident_set_size ()));
#endif
    }
  if (tissat_big)
    {
      kissat_enlarge_variables (solver, EXTERNAL_MAX_VAR);
#ifndef QUIET
      printf ("after %d %s\n", EXTERNAL_MAX_VAR,
	      kissat_format_bytes (&format,
				   kissat_maximum_resident_set_size ()));
#endif
    }
  kissat_release (solver);
#ifndef QUIET
  printf ("after deallocating solver %s\n",
	  kissat_format_bytes (&format, kissat_maximum_resident_set_size ()));
#endif
}

static void
test_init_import_release (void)
{
  kissat *solver = new_solver ();
  (void) kissat_import_literal (solver, -1);
  (void) kissat_import_literal (solver, 42);
  if (tissat_big)
    (void) kissat_import_literal (solver, EXTERNAL_MAX_VAR);
  kissat_release (solver);
}

static void
test_init_add_release (void)
{
#ifndef NDEBUG
  const int max_check = 1;
#else
  const int max_check = 0;
#endif
  for (int check = 0; check <= max_check; check++)
    {
      kissat *solver = new_solver ();
      kissat_set_option (solver, "log", 4);
#ifndef NDEBUG
      kissat_set_option (solver, "check", check);
#endif
      kissat_add (solver, 2);
      kissat_add (solver, -12);
      kissat_add (solver, 0);
      kissat_add (solver, -17);
      kissat_add (solver, -2);
      kissat_add (solver, 0);
      kissat_add (solver, -1);
      kissat_add (solver, 1);
      kissat_add (solver, -1);
      kissat_add (solver, 1);
      kissat_add (solver, 0);
      kissat_add (solver, 7);
      kissat_add (solver, 8);
      kissat_add (solver, 7);
      kissat_add (solver, 8);
      kissat_add (solver, 7);
      kissat_add (solver, 0);
      kissat_add (solver, -7);
      kissat_add (solver, -7);
      kissat_add (solver, -7);
      kissat_add (solver, -7);
      kissat_add (solver, -7);
      kissat_add (solver, 0);
      kissat_add (solver, 9);
      kissat_add (solver, 7);
      kissat_add (solver, 0);
      if (tissat_big)
	{
	  kissat_add (solver, EXTERNAL_MAX_VAR);
	  kissat_add (solver, 0);
	}
      kissat_release (solver);
    }
}

void
tissat_schedule_init (void)
{
  SCHEDULE_FUNCTION (test_init_zero);
  SCHEDULE_FUNCTION (test_init_release);
  SCHEDULE_FUNCTION (test_init_enlarge_release);
  SCHEDULE_FUNCTION (test_init_import_release);
  SCHEDULE_FUNCTION (test_init_add_release);
}