/*
 * Check: a unit test framework for C
 * Copyright (C) 2001,2002 Arien Malec
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

#ifndef CHECK_IMPL_H
#define CHECK_IMPL_H


/* This header should be included by any module that needs
   to know the implementation details of the check structures
   Include stdio.h & list.h before this header
*/

typedef struct TF {
  TFun fn;
  int loop_start;
  int loop_end;
  const char *name;
  int signal;
  unsigned char allowed_exit_value;
} TF;

struct Suite {
  const char *name;
  List *tclst; /* List of test cases */
};

typedef struct Fixture 
{
  int ischecked;
  SFun fun;
} Fixture;

struct TCase {
  const char *name;
  int timeout;
  List *tflst; /* list of test functions */
  List *unch_sflst;
  List *unch_tflst;
  List *ch_sflst;
  List *ch_tflst;
};

typedef struct TestStats {
  int n_checked;
  int n_failed;
  int n_errors;
} TestStats;

struct TestResult {
  enum test_result rtype;     /* Type of result */
  enum ck_result_ctx ctx;     /* When the result occurred */
  char *file;    /* File where the test occured */
  int line;      /* Line number where the test occurred */
  int iter;      /* The iteration value for looping tests */
  const char *tcname;  /* Test case that generated the result */
  const char *tname;  /* Test that generated the result */
  char *msg;     /* Failure message */
};

TestResult *tr_create(void);
void tr_reset(TestResult *tr);

enum cl_event {
  CLINITLOG_SR,
  CLENDLOG_SR,
  CLSTART_SR,
  CLSTART_S,
  CLEND_SR,
  CLEND_S,
  CLSTART_T, /* A test case is about to run */
  CLEND_T
};

typedef void (*LFun) (SRunner *, FILE*, enum print_output,
		      void *, enum cl_event);

typedef struct Log {
  FILE *lfile;
  LFun lfun;
  int close;
  enum print_output mode;
} Log;

struct SRunner {
  List *slst; /* List of Suite objects */
  TestStats *stats; /* Run statistics */
  List *resultlst; /* List of unit test results */
  const char *log_fname; /* name of log file */
  const char *xml_fname; /* name of xml output file */
  List *loglst; /* list of Log objects */
  enum fork_status fstat; /* controls if suites are forked or not
			     NOTE: Don't use this value directly,
			     instead use srunner_fork_status */
};


void set_fork_status(enum fork_status fstat);
enum fork_status cur_fork_status (void);

#endif /* CHECK_IMPL_H */
