/*
====================================================================
Copyright (c) 2008 Ian Blumel.  All rights reserved.

FCTX (Fast C Test) Unit Testing Framework

Copyright (c) 2008, Ian Blumel (ian.blumel@gmail.com)
All rights reserved.

This license is based on the BSD License.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in
    the documentation and/or other materials provided with the
    distribution.

    * Neither the name of, Ian Blumel, nor the names of its
    contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
====================================================================

File: fct.h
*/

#if !defined(FCT_INCLUDED__IMB)
#define FCT_INCLUDED__IMB

/* Configuration Values. You can over-ride these values in your own
header, then include this header. For example, in your file, myfct.h,

    #define FCT_DEFAULT_LOGGER "standard"
    #include "fct.h"

then if your unit tests included, myfct.h, you would default to work
with a standard logger. */

#if !defined(FCT_DEFAULT_LOGGER)
#   define FCT_DEFAULT_LOGGER  "standard"
#endif /* !FCT_DEFAULT_LOGGER */

#define FCT_VERSION_MAJOR 1
#define FCT_VERSION_MINOR 6
#define FCT_VERSION_MICRO 1

#define _FCT_QUOTEME(x) #x
#define FCT_QUOTEME(x) _FCT_QUOTEME(x)

#define FCT_VERSION_STR (FCT_QUOTEME(FCT_VERSION_MAJOR) "."\
                         FCT_QUOTEME(FCT_VERSION_MINOR) "."\
                         FCT_QUOTEME(FCT_VERSION_MICRO))

#include <string.h>
#include <assert.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <float.h>
#include <math.h>
#include <ctype.h>

#define FCT_MAX_NAME           256
#define FCT_MAX_LOG_LINE       256

#define nbool_t int
#define FCT_TRUE   1
#define FCT_FALSE  0

#define FCTMIN(x, y) ( x < y) ? (x) : (y)

#ifndef __INTEL_COMPILER
/* Use regular assertions for non-Intel compilers */
#define FCT_ASSERT(expr) assert(expr)
#else
/* Silence Intel warnings on assert(expr && "str") or assert("str") */
#define FCT_ASSERT(expr) do {             \
    _Pragma("warning(push,disable:279)"); \
    assert(expr);                         \
    _Pragma("warning(pop)");              \
    } while (0)
#endif

#if defined(__cplusplus)
#define FCT_EXTERN_C extern "C"
#else
#define FCT_EXTERN_C
#endif

/* Forward declarations. The following forward declarations are required
because there is a inter-relationship between certain objects that
just can not be untwined. */
typedef struct _fct_logger_evt_t fct_logger_evt_t;
typedef struct _fct_logger_i fct_logger_i;
typedef struct _fct_logger_types_t fct_logger_types_t;
typedef struct _fct_standard_logger_t fct_standard_logger_t;
typedef struct _fct_junit_logger_t fct_junit_logger_t;
typedef struct _fct_minimal_logger_t fct_minimal_logger_t;
typedef struct _fctchk_t fctchk_t;
typedef struct _fct_test_t fct_test_t;
typedef struct _fct_ts_t fct_ts_t;
typedef struct _fctkern_t fctkern_t;

/* Forward declare some functions used throughout. */
static fct_logger_i*
fct_standard_logger_new(void);

static fct_logger_i*
fct_minimal_logger_new(void);

static fct_junit_logger_t *
fct_junit_logger_new(void);

static void
fct_logger__del(fct_logger_i *logger);

static void
fct_logger__on_chk(fct_logger_i *self, fctchk_t const *chk);

static void
fct_logger__on_test_start(fct_logger_i *logger, fct_test_t const *test);

static void
fct_logger__on_test_end(fct_logger_i *logger, fct_test_t *test);

static void
fct_logger__on_test_suite_start(fct_logger_i *logger, fct_ts_t const *ts);

static void
fct_logger__on_test_suite_end(fct_logger_i *logger, fct_ts_t const *ts);

static void
fct_logger__on_test_suite_skip(
    fct_logger_i *logger,
    char const *condition,
    char const *name
);

static void
fct_logger__on_test_skip(
    fct_logger_i *logger,
    char const *condition,
    char const *name
);


static void
fct_logger__on_warn(fct_logger_i *logger, char const *warn);



/* Explicitly indicate a no-op */
#define fct_pass()

#define fct_unused(x)  (void)(x)

/* This is just a little trick to let me put comments inside of macros. I
really only want to bother with this when we are "unwinding" the macros
for debugging purposes. */
#if defined(FCT_CONF_UNWIND)
#	define _fct_cmt(string)		{char*_=string;}
#else
#	define _fct_cmt(string)
#endif

/*
--------------------------------------------------------
UTILITIES
--------------------------------------------------------
*/


/* STDIO and STDERR redirect support */
#define FCT_PIPE_RESERVE_BYTES_DEFAULT  512
static int fct_stdout_pipe[2];
static int fct_stderr_pipe[2];
static int fct_saved_stdout;
static int fct_saved_stderr;

/* Platform indepedent pipe functions. TODO: Look to figure this out in a way
that follows the ISO C++ conformant naming convention. */
#if defined(WIN32)
#    include <io.h>
#    include <fcntl.h>
#    define _fct_pipe(_PFDS_) \
        _pipe((_PFDS_), FCT_PIPE_RESERVE_BYTES_DEFAULT, _O_TEXT)
#    define _fct_dup  _dup
#    define _fct_dup2 _dup2
#    define _fct_close _close
#    define _fct_read  _read
/* Until I can figure a better way to do this, rely on magic numbers. */
#    define STDOUT_FILENO 1
#    define STDERR_FILENO 2
#else
#    include <unistd.h>
#    define _fct_pipe  pipe
#    define _fct_dup   dup
#    define _fct_dup2  dup2
#    define _fct_close close
#    define _fct_read  read
#endif /* WIN32 */




static void
fct_switch_std_to_buffer(int std_pipe[2], FILE *out, int fileno_, int *save_handle)
{
    fflush(out);
    *save_handle = _fct_dup(fileno_);
    if ( _fct_pipe(std_pipe) != 0 )
    {
        exit(1);
    }
    _fct_dup2(std_pipe[1], fileno_);
    _fct_close(std_pipe[1]);
}


static void
fct_switch_std_to_std(FILE *out, int fileno_, int save_handle)
{
    fflush(out);
    _fct_dup2(save_handle, fileno_);
}


#define FCT_SWITCH_STDOUT_TO_BUFFER() \
    fct_switch_std_to_buffer(fct_stdout_pipe, stdout, STDOUT_FILENO, &fct_saved_stdout)
#define FCT_SWITCH_STDOUT_TO_STDOUT() \
    fct_switch_std_to_std(stdout, STDOUT_FILENO, fct_saved_stdout)
#define FCT_SWITCH_STDERR_TO_BUFFER() \
    fct_switch_std_to_buffer(fct_stderr_pipe, stderr, STDERR_FILENO, &fct_saved_stderr)
#define FCT_SWITCH_STDERR_TO_STDERR() \
    fct_switch_std_to_std(stderr, STDERR_FILENO, fct_saved_stderr)


/* Utility for truncated, safe string copies. The NUM
should be the length of DST plus the null-termintor. */
static void
fctstr_safe_cpy(char *dst, char const *src, size_t num)
{
    FCT_ASSERT( dst != NULL );
    FCT_ASSERT( src != NULL );
    FCT_ASSERT( num > 0 );
#if defined(WIN32) && _MSC_VER >= 1400
    strncpy_s(dst, num, src, _TRUNCATE);
#else
    strncpy(dst, src, num);
#endif
    dst[num-1] = '\0';
}

/* Isolate the vsnprintf implementation */
static int
fct_vsnprintf(char *buffer,
              size_t buffer_len,
              char const *format,
              va_list args)
{
    int count =0;
    /* Older microsoft compilers where not ANSI compliant with this
    function and you had to use _vsnprintf. I will assume that newer
    Microsoft Compilers start implementing vsnprintf. */
#if defined(_MSC_VER) && (_MSC_VER < 1400)
    count = _vsnprintf(buffer, buffer_len, format, args);
#elif defined(_MSC_VER) && (_MSC_VER >= 1400)
    count = vsnprintf_s(buffer, buffer_len, _TRUNCATE, format, args);
#else
    count = vsnprintf(buffer, buffer_len, format, args);
#endif
    return count;
}


/* Isolate the snprintf implemenation. */
static int
fct_snprintf(char *buffer, size_t buffer_len, char const *format, ...)
{
    int count =0;
    va_list args;
    va_start(args, format);
    count =fct_vsnprintf(buffer, buffer_len, format, args);
    va_end(args);
    return count;
}


/* Helper to for cloning strings on the heap. Returns NULL for
an out of memory condition. */
static char*
fctstr_clone(char const *s)
{
    char *k =NULL;
    size_t klen =0;
    FCT_ASSERT( s != NULL && "invalid arg");
    klen = strlen(s)+1;
    k = (char*)malloc(sizeof(char)*klen+1);
    fctstr_safe_cpy(k, s, klen);
    return k;
}


/* Clones and returns a lower case version of the original string. */
static char*
fctstr_clone_lower(char const *s)
{
    char *k =NULL;
    size_t klen =0;
    size_t i;
    if ( s == NULL )
    {
        return NULL;
    }
    klen = strlen(s)+1;
    k = (char*)malloc(sizeof(char)*klen+1);
    for ( i=0; i != klen; ++i )
    {
        k[i] = (char)tolower(s[i]);
    }
    return k;
}


/* A very, very simple "filter". This just compares the supplied prefix
against the test_str, to see if they both have the same starting
characters. If they do we return true, otherwise we return false. If the
prefix is a blank string or NULL, then it will return FCT_TRUE.*/
static nbool_t
fct_filter_pass(char const *prefix, char const *test_str)
{
    nbool_t is_match = FCT_FALSE;
    char const *prefix_p;
    char const *test_str_p;

    /* If you got nothing to test against, why test? */
    FCT_ASSERT( test_str != NULL );

    /* When the prefix is NULL or blank, we always return FCT_TRUE. */
    if ( prefix == NULL  || prefix[0] == '\0' )
    {
        return FCT_TRUE;
    }

    /* Iterate through both character arrays at the same time. We are
    going to play a game and see if we can beat the house. */
    for ( prefix_p = prefix, test_str_p = test_str;
            *prefix_p != '\0' && *test_str_p != '\0';
            ++prefix_p, ++test_str_p )
    {
        is_match = *prefix_p == *test_str_p;
        if ( !is_match )
        {
            break;   /* Quit the first time we don't match. */
        }
    }

    /* If the iterator for the test_str is pointing at the null char, and
    the iterator for the prefix string is not, then the prefix string is
    larger than the actual test string, and therefore we failed to pass the
    filter. */
    if ( *test_str_p == '\0' && *prefix_p != '\0' )
    {
        return FCT_FALSE;
    }

    /* is_match will be set to the either FCT_TRUE if we kicked of the loop
    early because our filter ran out of characters or FCT_FALSE if we
    encountered a mismatch before our filter ran out of characters. */
    return is_match;
}


/* Routine checks if two strings are equal. Taken from
http://publications.gbdirect.co.uk/c_book/chapter5/character_handling.html
*/
static int
fctstr_eq(char const *s1, char const *s2)
{
    if ( s1 == s2 )
    {
        return 1;
    }
    if ( (s1 == NULL && s2 != NULL)
            || (s1 != NULL && s2 == NULL) )
    {
        return 0;
    }
    while (*s1 == *s2)
    {
        if (*s1 == '\0')
            return 1;
        s1++;
        s2++;
    }
    /* Difference detected! */
    return 0;
}


static int
fctstr_ieq(char const *s1, char const *s2)
{
    if ( s1 == s2 )
    {
        return 1;
    }
    if ( (s1 == NULL && s2 != NULL)
            || (s1 != NULL && s2 == NULL) )
    {
        return 0;
    }
    while (tolower(*s1) == tolower(*s2))
    {
        if (*s1 == '\0')
            return 1;
        s1++;
        s2++;
    }
    /* Difference detected! */
    return 0;
}


/* Returns 1 if the STR contains the CHECK_INCL substring. NULL's
are handled, and NULL always INCLUDES NULL. This check is case
sensitive. If two strings point to the same place they are
included. */
static int
fctstr_incl(char const *str, char const *check_incl)
{
    static char const *blank_s = "";
    char const *found = NULL;
    if ( str == NULL )
    {
        str = blank_s;
    }
    if ( check_incl == NULL )
    {
        check_incl = blank_s;
    }
    if ( str == check_incl )
    {
        return 1;
    }
    found = strstr(str, check_incl);
    return found != NULL;
}


/* Does a case insensitive include check. */
static int
fctstr_iincl(char const *str, char const *check_incl)
{
    /* Going to do this with a memory allocation to save coding
    time. In the future this can be rewritten. Both clone_lower
    and _incl are NULL tolerant. */
    char *lstr = fctstr_clone_lower(str);
    char *lcheck_incl = fctstr_clone_lower(check_incl);
    int found = fctstr_incl(lstr, lcheck_incl);
    free(lstr);
    free(lcheck_incl);
    return found;
}


/* Returns true if STR starts with CHECK. NULL and NULL is consider
true. */
static int
fctstr_startswith(char const *str, char const *check)
{
    char const *sp;
    if ( str == NULL && check == NULL )
    {
        return 1;
    }
    else if ( ((str == NULL) && (check != NULL))
              || ((str != NULL) && (check == NULL)) )
    {
        return 0;
    }
    sp = strstr(str, check);
    return sp == str;
}


/* Case insenstive variant of fctstr_startswith. */
static int
fctstr_istartswith(char const *str, char const *check)
{
    /* Taking the lazy approach for now. */
    char *istr = fctstr_clone_lower(str);
    char *icheck = fctstr_clone_lower(check);
    /* TODO: check for memory. */
    int startswith = fctstr_startswith(istr, icheck);
    free(istr);
    free(icheck);
    return startswith;
}


/* Returns true if the given string ends with the given
check. Treats NULL as a blank string, and as such, will
pass the ends with (a blank string endswith a blank string). */
static int
fctstr_endswith(char const *str, char const *check)
{
    size_t check_i;
    size_t str_i;
    if ( str == NULL && check == NULL )
    {
        return 1;
    }
    else if ( ((str == NULL) && (check != NULL))
              || ((str != NULL) && (check == NULL)) )
    {
        return 0;
    }
    check_i = strlen(check);
    str_i = strlen(str);
    if ( str_i < check_i )
    {
        return 0;   /* Can't do it string is too small. */
    }
    for ( ; check_i != 0; --check_i, --str_i)
    {
        if ( str[str_i] != check[check_i] )
        {
            return 0; /* Found a case where they are not equal. */
        }
    }
    /* Exahausted check against string, can only be true. */
    return 1;
}


static int
fctstr_iendswith(char const *str, char const *check)
{
    size_t check_i;
    size_t str_i;
    if ( str == NULL && check == NULL )
    {
        return 1;
    }
    else if ( ((str == NULL) && (check != NULL))
              || ((str != NULL) && (check == NULL)) )
    {
        return 0;
    }
    check_i = strlen(check);
    str_i = strlen(str);
    if ( str_i < check_i )
    {
        return 0;   /* Can't do it string is too small. */
    }
    for ( ; check_i != 0; --check_i, --str_i)
    {
        if ( tolower(str[str_i]) != tolower(check[check_i]) )
        {
            return 0; /* Found a case where they are not equal. */
        }
    }
    /* Exahausted check against string, can only be true. */
    return 1;
}


/* Use this with the _end variant to get the

STARTSWITH ........................................ END

effect. Assumes that the line will be maxwidth in characters. The
maxwidth can't be greater than FCT_DOTTED_MAX_LEN. */
#define FCT_DOTTED_MAX_LEN  256
static void
fct_dotted_line_start(size_t maxwidth, char const *startwith)
{
    char line[FCT_DOTTED_MAX_LEN];
    size_t len =0;
    size_t line_len =0;

    memset(line, '.', sizeof(char)*maxwidth);
    len = strlen(startwith);
    line_len = FCTMIN(maxwidth-1, len);
    memcpy(line, startwith, sizeof(char)*line_len);
    if ( len < maxwidth-1)
    {
        line[len] = ' ';
    }
    line[maxwidth-1] = '\0';
    fputs(line, stdout);
}


static void
fct_dotted_line_end(char const *endswith)
{
    printf(" %s\n", endswith);
}


/*
--------------------------------------------------------
TIMER
--------------------------------------------------------
This is a low-res implementation at the moment.

We will improve this in the future, and isolate the
implementation from the rest of the code.
*/

typedef struct _fct_timer_t fct_timer_t;
struct _fct_timer_t
{
    clock_t start;
    clock_t stop;
    double duration;
};


static void
fct_timer__init(fct_timer_t *timer)
{
    FCT_ASSERT(timer != NULL);
    memset(timer, 0, sizeof(fct_timer_t));
}


static void
fct_timer__start(fct_timer_t *timer)
{
    FCT_ASSERT(timer != NULL);
    timer->start = clock();
}


static void
fct_timer__stop(fct_timer_t *timer)
{
    FCT_ASSERT(timer != NULL);
    timer->stop = clock();
    timer->duration = (double) (timer->stop - timer->start) / CLOCKS_PER_SEC;
}


/* Returns the time in seconds. */
static double
fct_timer__duration(fct_timer_t const *timer)
{
    FCT_ASSERT( timer != NULL );
    return timer->duration;
}


/*
--------------------------------------------------------
GENERIC LIST
--------------------------------------------------------
*/

/* For now we will just keep it at a linear growth rate. */
#define FCT_LIST_GROWTH_FACTOR   2

/* Starting size for the list, to keep it simple we will start
at a reasonable size. */
#define FCT_LIST_DEFAULT_START_SZ      8

/* Helper macros for quickly iterating through a list. You should be able
to do something like,

  FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, my_list)
  {
     fct_logger__on_blah(logger);
  }
  FCT_NLIST_FOREACH_END();

*/
#define FCT_NLIST_FOREACH_BGN(Type, Var, List)\
{\
   if ( List != NULL ) {\
      size_t item_i##Var;\
      size_t num_items##Var = fct_nlist__size(List);\
      for( item_i##Var =0; item_i##Var != num_items##Var; ++item_i##Var )\
      {\
         Type Var = (Type) fct_nlist__at((List), item_i##Var);

#define FCT_NLIST_FOREACH_END() }}}

/* Used to manage a list of loggers. This works mostly like
the STL vector, where the array grows as more items are
appended. */
typedef struct _fct_nlist_t fct_nlist_t;
struct _fct_nlist_t
{
    /* Item's are stored as pointers to void. */
    void **itm_list;

    /* Indicates the number of element's in the array. */
    size_t avail_itm_num;

    /* Indicates the number of actually elements in the array. */
    size_t used_itm_num;
};
typedef void (*fct_nlist_on_del_t)(void*);


/* Clears the contents of the list, and sets the list count to 0. The
actual count remains unchanged. If on_del is supplied it is executed
against each list element. */
static void
fct_nlist__clear(fct_nlist_t *list, fct_nlist_on_del_t on_del)
{
    size_t itm_i__ =0;
    FCT_ASSERT( list != NULL );
    if ( on_del != NULL )
    {
        for ( itm_i__=0; itm_i__ != list->used_itm_num; ++itm_i__ )
        {
            on_del(list->itm_list[itm_i__]);
        }
    }
    list->used_itm_num =0;
}


/* If you used init, then close with final. This is useful for
working with structures that live on the stack. */
static void
fct_nlist__final(fct_nlist_t *list, fct_nlist_on_del_t on_del)
{
    FCT_ASSERT( list != NULL );
    fct_nlist__clear(list, on_del);
    free(list->itm_list);
}


static int
fct_nlist__init2(fct_nlist_t *list, size_t start_sz)
{
    FCT_ASSERT( list != NULL );
    if ( start_sz == 0 )
    {
        list->itm_list = NULL;
    }
    else
    {
        list->itm_list = (void**)malloc(sizeof(void*)*start_sz);
        if ( list->itm_list == NULL )
        {
            return 0;
        }
    }
    /* If these are both 0, then they are equal and that means
    that the first append operation will allocate memory. The beauty
    here is that if the list remains empty, then we save a malloc.
    Empty lists are relatively common in FCT (consider an error list). */
    list->avail_itm_num = start_sz;
    list->used_itm_num =0;
    return 1;
}


/* Initializes a list. Useful for populating existing structures.
Returns 0 if there was an error allocating memory. Returns 1 otherwise. */
#define fct_nlist__init(_LIST_PTR_) \
   (fct_nlist__init2((_LIST_PTR_), FCT_LIST_DEFAULT_START_SZ))


/* Returns the number of elements within the list. */
static size_t
fct_nlist__size(fct_nlist_t const *list)
{
    FCT_ASSERT( list != NULL );
    return list->used_itm_num;
}


/* Returns the item at idx, asserts otherwise. */
static void*
fct_nlist__at(fct_nlist_t const *list, size_t idx)
{
    FCT_ASSERT( list != NULL );
    FCT_ASSERT( idx < list->used_itm_num );
    return list->itm_list[idx];
}


static void
fct_nlist__append(fct_nlist_t *list, void *itm)
{
    FCT_ASSERT( list != NULL );
    /* If we ran out of room, then the last increment should be equal to the
    available space, in this case we need to grow a little more. If this
    list started as size 0, then we should encounter the same effect as
    "running out of room." */
    if ( list->used_itm_num == list->avail_itm_num )
    {
        /* Use multiple and add, since the avail_itm_num could be 0. */
        list->avail_itm_num = list->avail_itm_num*FCT_LIST_GROWTH_FACTOR+\
                              FCT_LIST_GROWTH_FACTOR;
        list->itm_list = (void**)realloc(
                             list->itm_list, sizeof(void*)*list->avail_itm_num
                         );
        FCT_ASSERT( list->itm_list != NULL && "memory check");
    }

    list->itm_list[list->used_itm_num] = itm;
    ++(list->used_itm_num);
}



/*
-----------------------------------------------------------
A SINGLE CHECK
-----------------------------------------------------------
This defines a single check. It indicates what the check was,
and where it occurred. A "Test" object will have-a bunch
of "checks".
*/

struct _fctchk_t
{
    /* This string that represents the condition. */
    char cndtn[FCT_MAX_LOG_LINE];

    /* These indicate where the condition occurred. */
    char file[FCT_MAX_LOG_LINE];

    int lineno;

    nbool_t is_pass;

    /* This is a message that we can "format into", if
    no format string is specified this should be
    equivalent to the cntdn. */
    char msg[FCT_MAX_LOG_LINE];
};

#define fctchk__is_pass(_CHK_) ((_CHK_)->is_pass)
#define fctchk__file(_CHK_)    ((_CHK_)->file)
#define fctchk__lineno(_CHK_)  ((_CHK_)->lineno)
#define fctchk__cndtn(_CHK_)   ((_CHK_)->cndtn)
#define fctchk__msg(_CHK_)     ((_CHK_)->msg)

static fctchk_t*
fctchk_new(int is_pass,
           char const *cndtn,
           char const *file,
           int lineno,
           char const *format,
           va_list args)
{
    fctchk_t *chk = NULL;

    FCT_ASSERT( cndtn != NULL );
    FCT_ASSERT( file != NULL );
    FCT_ASSERT( lineno > 0 );

    chk = (fctchk_t*)calloc(1, sizeof(fctchk_t));
    if ( chk == NULL )
    {
        return NULL;
    }

    fctstr_safe_cpy(chk->cndtn, cndtn, FCT_MAX_LOG_LINE);
    fctstr_safe_cpy(chk->file, file, FCT_MAX_LOG_LINE);
    chk->lineno = lineno;

    chk->is_pass =is_pass;

    if ( format != NULL )
    {
        fct_vsnprintf(chk->msg, FCT_MAX_LOG_LINE, format, args);
    }
    else
    {
        /* Default to make the condition be the message, if there was no format
        specified. */
        fctstr_safe_cpy(chk->msg, cndtn, FCT_MAX_LOG_LINE);
    }

    return chk;
}


/* Cleans up a "check" object. If the `chk` is NULL, this function does
nothing. */
static void
fctchk__del(fctchk_t *chk)
{
    if ( chk == NULL )
    {
        return;
    }
    free( chk );
}


/*
-----------------------------------------------------------
A TEST
-----------------------------------------------------------
A suite will have-a list of tests. Where each test will have-a
list of failed and passed checks.
*/

struct _fct_test_t
{
    /* List of failed and passed "checks" (fctchk_t). Two seperate
    lists make it faster to determine how many checks passed and how
    many checks failed. */
    fct_nlist_t failed_chks;
    fct_nlist_t passed_chks;

    /* To store the test run time */
    fct_timer_t timer;

    /* The name of the test case. */
    char name[FCT_MAX_NAME];
};

#define fct_test__name(_TEST_) ((_TEST_)->name)

/* Clears the failed tests ... partly for internal testing. */
#define fct_test__clear_failed(test) \
    fct_nlist__clear(test->failed_chks, (fct_nlist_on_del_t)fctchk__del);\
 

static void
fct_test__del(fct_test_t *test)
{
    if (test == NULL )
    {
        return;
    }
    fct_nlist__final(&(test->passed_chks), (fct_nlist_on_del_t)fctchk__del);
    fct_nlist__final(&(test->failed_chks), (fct_nlist_on_del_t)fctchk__del);
    free(test);
}


static fct_test_t*
fct_test_new(char const *name)
{
    nbool_t ok =FCT_FALSE;
    fct_test_t *test =NULL;

    test = (fct_test_t*)malloc(sizeof(fct_test_t));
    if ( test == NULL )
    {
        return NULL;
    }

    fctstr_safe_cpy(test->name, name, FCT_MAX_NAME);

    /* Failures are an exception, so lets not allocate up
    the list until we need to. */
    fct_nlist__init2(&(test->failed_chks), 0);
    if (!fct_nlist__init(&(test->passed_chks)))
    {
        ok =FCT_FALSE;
        goto finally;
    }

    fct_timer__init(&(test->timer));

    ok =FCT_TRUE;
finally:
    if ( !ok )
    {
        fct_test__del(test);
        test =NULL;
    }
    return test;
}


static void
fct_test__start_timer(fct_test_t *test)
{
    FCT_ASSERT( test != NULL );
    fct_timer__start(&(test->timer));
}


static void
fct_test__stop_timer(fct_test_t *test)
{
    FCT_ASSERT( test != NULL );
    fct_timer__stop(&(test->timer));
}


static double
fct_test__duration(fct_test_t const *test)
{
    FCT_ASSERT( test != NULL );
    return fct_timer__duration(&(test->timer));
}


static nbool_t
fct_test__is_pass(fct_test_t const *test)
{
    FCT_ASSERT( test != NULL );
    return fct_nlist__size(&(test->failed_chks)) == 0;
}


static void
fct_test__add(fct_test_t *test, fctchk_t *chk)
{

    FCT_ASSERT( test != NULL );
    FCT_ASSERT( chk != NULL );

    if ( fctchk__is_pass(chk) )
    {
        fct_nlist__append(&(test->passed_chks), (void*)chk);
    }
    else
    {
        fct_nlist__append(&(test->failed_chks), (void*)chk);
    }
}

/* Returns the number of checks made throughout the test. */
static size_t
fct_test__chk_cnt(fct_test_t const *test)
{
    FCT_ASSERT( test != NULL );
    return fct_nlist__size(&(test->failed_chks)) \
           + fct_nlist__size(&(test->passed_chks));
}


/*
-----------------------------------------------------------
TEST SUITE (TS)
-----------------------------------------------------------
*/


/* The different types of 'modes' that a test suite can be in.

While the test suite is iterating through all the tests, its "State"
can change from "setup mode", to "test mode" to "tear down" mode.
These help to indicate what mode are currently in. Think of it as a
basic FSM.

            if the count was 0                                 end
           +--------->---------------------> ending_mode-----+-+
           |                                       ^         |
           ^                                       |         ^
start      |                              [if no more tests] |
  |        |                                       |         |
  +-count_mode -> setup_mode -> test_mode -> teardown_mode->-+
                   |  ^                           |          |
                   |  +-----------<---------------+          |
                   +----------->---[if fct_req fails]--------+

*/
enum ts_mode
{
    ts_mode_cnt,         /* To setup when done counting. */
    ts_mode_setup,       /* To test when done setup. */
    ts_mode_teardown,    /* To ending mode, when no more tests. */
    ts_mode_test,        /* To tear down mode. */
    ts_mode_ending,      /* To ... */
    ts_mode_end,         /* .. The End. */
    ts_mode_abort        /* Abort */
};

/* Types of states the test could be in. */
typedef enum
{
    fct_test_status_SUCCESS,
    fct_test_status_FAILURE
} fct_test_status;


struct _fct_ts_t
{
    /* For counting our 'current' test number, and the total number of
    tests. */
    int  curr_test_num;
    int  total_test_num;

    /* Keeps track of the current state of the object while it is walking
    through its "FSM" */
    enum ts_mode mode;

    /* The name of the test suite. */
    char name[FCT_MAX_NAME];

    /* List of tests that where executed within the test suite. */
    fct_nlist_t test_list;
};


#define fct_ts__is_setup_mode(ts)     ((ts)->mode == ts_mode_setup)
#define fct_ts__is_teardown_mode(ts)  ((ts)->mode == ts_mode_teardown)
#define fct_ts__is_test_mode(ts)      ((ts)->mode == ts_mode_test)
#define fct_ts__is_ending_mode(ts)    ((ts)->mode == ts_mode_ending)
#define fct_ts__is_end(ts)            ((ts)->mode == ts_mode_end)
#define fct_ts__is_cnt_mode(ts)       ((ts)->mode == ts_mode_cnt)
#define fct_ts__is_abort_mode(ts)     ((ts)->mode == ts_mode_abort)

/* This cndtn is set when we have iterated through all the tests, and
there was nothing more to do. */
#define fct_ts__ending(ts)          ((ts)->mode = ts_mode_ending)

/* Flag a test suite as complete. It will no longer accept any more tests. */
#define fct_ts__end(ts)  ((ts)->mode = ts_mode_end)

#define fct_ts__name(ts)              ((ts)->name)


static void
fct_ts__del(fct_ts_t *ts)
{
    if ( ts == NULL )
    {
        return;
    }
    fct_nlist__final(&(ts->test_list), (fct_nlist_on_del_t)fct_test__del);
    free(ts);
}

static fct_ts_t *
fct_ts_new(char const *name)
{
    fct_ts_t *ts =NULL;
    ts = (fct_ts_t*)calloc(1, sizeof(fct_ts_t));
    FCT_ASSERT( ts != NULL );

    fctstr_safe_cpy(ts->name, name, FCT_MAX_NAME);
    ts->mode = ts_mode_cnt;
    fct_nlist__init(&(ts->test_list));
    return ts;
}



static nbool_t
fct_ts__is_more_tests(fct_ts_t const *ts)
{
    FCT_ASSERT( ts != NULL );
    FCT_ASSERT( !fct_ts__is_end(ts) );
    return ts->curr_test_num < ts->total_test_num;
}


/* Indicates that we have started a test case. */
static void
fct_ts__test_begin(fct_ts_t *ts)
{
    FCT_ASSERT( !fct_ts__is_end(ts) );
    ++(ts->curr_test_num);
}


/* Takes OWNERSHIP of a test object, and warehouses it for later stat
generation. */
static void
fct_ts__add_test(fct_ts_t *ts, fct_test_t *test)
{
    FCT_ASSERT( ts != NULL && "invalid arg");
    FCT_ASSERT( test != NULL && "invalid arg");
    FCT_ASSERT( !fct_ts__is_end(ts) );
    fct_nlist__append(&(ts->test_list), test);
}


static void
fct_ts__test_end(fct_ts_t *ts)
{
    FCT_ASSERT( ts != NULL );
    /* After a test has completed, move to teardown mode. */
    ts->mode = ts_mode_teardown;
}


/* Increments the internal count by 1. */
static void
fct_ts__inc_total_test_num(fct_ts_t *ts)
{
    FCT_ASSERT( ts != NULL );
    FCT_ASSERT( fct_ts__is_cnt_mode(ts) );
    FCT_ASSERT( !fct_ts__is_end(ts) );
    ++(ts->total_test_num);
}


/* Flags the end of the setup, which implies we are going to move into
setup mode. You must be already in setup mode for this to work! */
static void
fct_ts__setup_end(fct_ts_t *ts)
{
    if ( ts->mode != ts_mode_abort )
    {
        ts->mode = ts_mode_test;
    }
}


static fct_test_t *
fct_ts__make_abort_test(fct_ts_t *ts)
{
    char setup_testname[FCT_MAX_LOG_LINE+1] = {'\0'};
    char const *suitename = fct_ts__name(ts);
    fct_snprintf(setup_testname, FCT_MAX_LOG_LINE, "setup_%s", suitename);
    return fct_test_new(setup_testname);
}

/* Flags a pre-mature abort of a setup (like a failed fct_req). */
static void
fct_ts__setup_abort(fct_ts_t *ts)
{
    FCT_ASSERT( ts != NULL );
    ts->mode = ts_mode_abort;
}

/* Flags the end of the teardown, which implies we are going to move
into setup mode (for the next 'iteration'). */
static void
fct_ts__teardown_end(fct_ts_t *ts)
{
    if ( ts->mode == ts_mode_abort )
    {
        return; /* Because we are aborting . */
    }
    /* We have to decide if we should keep on testing by moving into tear down
    mode or if we have reached the real end and should be moving into the
    ending mode. */
    if ( fct_ts__is_more_tests(ts) )
    {
        ts->mode = ts_mode_setup;
    }
    else
    {
        ts->mode = ts_mode_ending;
    }
}


/* Flags the end of the counting, and proceeding to the first setup.
Consider the special case when a test suite has NO tests in it, in
that case we will have a current count that is zero, in which case
we can skip right to 'ending'. */
static void
fct_ts__cnt_end(fct_ts_t *ts)
{
    FCT_ASSERT( ts != NULL );
    FCT_ASSERT( fct_ts__is_cnt_mode(ts) );
    FCT_ASSERT( !fct_ts__is_end(ts) );
    if (ts->total_test_num == 0  )
    {
        ts->mode = ts_mode_ending;
    }
    else
    {
        ts->mode = ts_mode_setup;
    }
}


static nbool_t
fct_ts__is_test_cnt(fct_ts_t const *ts, int test_num)
{
    FCT_ASSERT( ts != NULL );
    FCT_ASSERT( 0 <= test_num );
    FCT_ASSERT( test_num < ts->total_test_num );
    FCT_ASSERT( !fct_ts__is_end(ts) );

    /* As we roll through the tests we increment the count. With this
    count we can decide if we need to execute a test or not. */
    return test_num == ts->curr_test_num;
}


/* Returns the # of tests on the FCT TS object. This is the actual
# of tests executed. */
static size_t
fct_ts__tst_cnt(fct_ts_t const *ts)
{
    FCT_ASSERT( ts != NULL );
    FCT_ASSERT(
        fct_ts__is_end(ts)
        && "can't count number of tests executed until the test suite ends"
    );
    return fct_nlist__size(&(ts->test_list));
}


/* Returns the # of tests in the TS object that passed. */
static size_t
fct_ts__tst_cnt_passed(fct_ts_t const *ts)
{
    size_t tally =0;

    FCT_ASSERT( ts != NULL );
    FCT_ASSERT( fct_ts__is_end(ts) );

    FCT_NLIST_FOREACH_BGN(fct_test_t*, test, &(ts->test_list))
    {
        if ( fct_test__is_pass(test) )
        {
            tally += 1;
        }
    }
    FCT_NLIST_FOREACH_END();
    return tally;
}


/* Returns the # of checks made throughout a test suite. */
static size_t
fct_ts__chk_cnt(fct_ts_t const *ts)
{
    size_t tally =0;

    FCT_ASSERT( ts != NULL );

    FCT_NLIST_FOREACH_BGN(fct_test_t *, test, &(ts->test_list))
    {
        tally += fct_test__chk_cnt(test);
    }
    FCT_NLIST_FOREACH_END();
    return tally;
}

/* Currently the duration is simply a sum of all the tests. */
static double
fct_ts__duration(fct_ts_t const *ts)
{
    double tally =0.0;
    FCT_ASSERT( ts != NULL );
    FCT_NLIST_FOREACH_BGN(fct_test_t *, test, &(ts->test_list))
    {
        tally += fct_test__duration(test);
    }
    FCT_NLIST_FOREACH_END();
    return tally;
}


/*
--------------------------------------------------------
FCT COMMAND LINE OPTION INITIALIZATION (fctcl_init)
--------------------------------------------------------

Structure used for command line initialization. To keep it clear that we do
not delete the char*'s present on this structure.
*/


typedef enum
{
    FCTCL_STORE_UNDEFINED,
    FCTCL_STORE_TRUE,
    FCTCL_STORE_VALUE
} fctcl_store_t;


typedef struct _fctcl_init_t
{
    /* What to parse for this option. --long versus -s. */
    char const *long_opt;     /* i.e. --help */
    char const *short_opt;    /* i.e. -h */

    /* What action to take when the option is activated. */
    fctcl_store_t action;

    /* The help string for the action. */
    char const *help;
} fctcl_init_t;


/* Use when defining the option list. */
#define FCTCL_INIT_NULL  \
    {NULL, NULL, FCTCL_STORE_UNDEFINED, NULL}


/*
--------------------------------------------------------
FCT COMMAND LINE OPTION (fctcl)
--------------------------------------------------------

Specifies the command line configuration options. Use this
to help initialize the fct_clp (command line parser).
*/


/* Handy strings for storing "true" and "false". We can reference
these strings throughout the parse operation and not have to
worry about dealing with memory. */
#define FCTCL_TRUE_STR "1"


typedef struct _fctcl_t
{
    /* What to parse for this option. --long versus -s. */
    char *long_opt;     /* i.e. --help */
    char *short_opt;    /* i.e. -h */

    /* What action to take when the option is activated. */
    fctcl_store_t action;

    /* The help string for the action. */
    char *help;

    /* The result. */
    char *value;
} fctcl_t;


#define fctcl_new()  ((fctcl_t*)calloc(1, sizeof(fctcl_t)))


static void
fctcl__del(fctcl_t *clo)
{
    if ( clo == NULL )
    {
        return;
    }
    if ( clo->long_opt )
    {
        free(clo->long_opt);
    }
    if ( clo->short_opt)
    {
        free(clo->short_opt);
    }
    if ( clo->value )
    {
        free(clo->value);
    }
    if ( clo->help )
    {
        free(clo->help);
    }
    free(clo);
}


static fctcl_t*
fctcl_new2(fctcl_init_t const *clo_init)
{
    fctcl_t *clone = NULL;
    int ok =0;
    clone = fctcl_new();
    if ( clone == NULL )
    {
        return NULL;
    }
    clone->action = clo_init->action;
    if ( clo_init->help == NULL )
    {
        clone->help = NULL;
    }
    else
    {
        clone->help = fctstr_clone(clo_init->help);
        if ( clone->help == NULL )
        {
            ok =0;
            goto finally;
        }
    }
    if ( clo_init->long_opt == NULL )
    {
        clone->long_opt = NULL;
    }
    else
    {
        clone->long_opt = fctstr_clone(clo_init->long_opt);
        if ( clone->long_opt == NULL )
        {
            ok = 0;
            goto finally;
        }
    }
    if ( clo_init->short_opt == NULL )
    {
        clone->short_opt = NULL;
    }
    else
    {
        clone->short_opt = fctstr_clone(clo_init->short_opt);
        if ( clone->short_opt == NULL )
        {
            ok =0;
            goto finally;
        }
    }
    ok = 1;
finally:
    if ( !ok )
    {
        fctcl__del(clone);
        clone = NULL;
    }
    return clone;
}


static int
fctcl__is_option(fctcl_t const *clo, char const *option)
{
    FCT_ASSERT( clo != NULL );
    if ( option == NULL )
    {
        return 0;
    }
    return ((clo->long_opt != NULL
             && fctstr_eq(clo->long_opt, option))
            ||
            (clo->short_opt != NULL
             && fctstr_eq(clo->short_opt, option))
           );
}


#define fctcl__set_value(_CLO_, _VAL_) \
    (_CLO_)->value = fctstr_clone((_VAL_));

/*
--------------------------------------------------------
FCT COMMAND PARSER (fct_clp)
--------------------------------------------------------
*/

#define FCT_CLP_MAX_ERR_MSG_LEN     256

typedef struct _fct_clp_t
{
    /* List of command line options. */
    fct_nlist_t clo_list;

    /* List of parameters (not options). */
    fct_nlist_t param_list;

    char error_msg[FCT_CLP_MAX_ERR_MSG_LEN];
    int is_error;
} fct_clp_t;


static void
fct_clp__final(fct_clp_t *clp)
{
    fct_nlist__final(&(clp->clo_list), (fct_nlist_on_del_t)fctcl__del);
    fct_nlist__final(&(clp->param_list), (fct_nlist_on_del_t)free);
}


/* Add an configuration options. */
static int
fct_clp__add_options(fct_clp_t *clp, fctcl_init_t const *options)
{
    fctcl_init_t const *pclo =NULL;
    int ok;
    for ( pclo = options; pclo->action != FCTCL_STORE_UNDEFINED; ++pclo )
    {
        fctcl_t *cpy = fctcl_new2(pclo);
        if ( cpy == NULL )
        {
            ok = 0;
            goto finally;
        }
        fct_nlist__append(&(clp->clo_list), (void*)cpy);
    }
    ok =1;
finally:
    return ok;
}

/* Returns false if we ran out of memory. */
static int
fct_clp__init(fct_clp_t *clp, fctcl_init_t const *options)
{
    int ok =0;
    FCT_ASSERT( clp != NULL );
    /* It is just much saner to manage a clone of the options. Then we know
    who is in charge of the memory. */
    ok = fct_nlist__init(&(clp->clo_list));
    if ( !ok )
    {
        goto finally;
    }
    if ( options != NULL )
    {
        ok = fct_clp__add_options(clp, options);
        if ( !ok )
        {
            goto finally;
        }
    }
    ok = fct_nlist__init(&(clp->param_list));
    if ( !ok )
    {
        goto finally;
    }
    ok =1;
finally:
    if ( !ok )
    {
        fct_clp__final(clp);
    }
    return ok;
}


/* Parses the command line arguments. Use fct_clp__is_error and
fct_clp__get_error to figure out if something went awry. */
static void
fct_clp__parse(fct_clp_t *clp, int argc, char const *argv[])
{
    int argi =1;
    int is_option =0;
    char *arg =NULL;
    char *token =NULL;
    char *next_token =NULL;

    clp->error_msg[0] = '\0';
    clp->is_error =0;

    while ( argi < argc )
    {
        is_option =0;
        token =NULL;
        next_token = NULL;
        arg = fctstr_clone(argv[argi]);

#if defined(_MSC_VER) && _MSC_VER > 1300
        token = strtok_s(arg, "=", &next_token);
#else
        token = strtok(arg, "=");
        next_token = strtok(NULL, "=");
#endif

        FCT_NLIST_FOREACH_BGN(fctcl_t*, pclo, &(clp->clo_list))
        {
            /* Need to reset for each search. strtok below is destructive. */
            if ( fctcl__is_option(pclo, token) )
            {
                is_option =1;
                if ( pclo->action == FCTCL_STORE_VALUE )
                {
                    /* If this is --xxxx=value then the next strtok should succeed.
                    Otherwise, we need to chew up the next argument. */
                    if ( next_token != NULL && strlen(next_token) > 0 )
                    {
                        fctcl__set_value(pclo, next_token);
                    }
                    else
                    {
                        ++argi; /* Chew up the next value */
                        if ( argi >= argc )
                        {
                            /* error */
                            fct_snprintf(
                                clp->error_msg,
                                FCT_CLP_MAX_ERR_MSG_LEN,
                                "missing argument for %s",
                                token
                            );
                            clp->is_error =1;
                            break;
                        }
                        fctcl__set_value(pclo, argv[argi]);
                    }
                }
                else if (pclo->action == FCTCL_STORE_TRUE)
                {
                    fctcl__set_value(pclo, FCTCL_TRUE_STR);
                }
                else
                {
                    FCT_ASSERT("undefined action requested");
                }
                break;  /* No need to parse this argument further. */
            }
        }
        FCT_NLIST_FOREACH_END();
        /* If we have an error, exit. */
        if ( clp->is_error )
        {
            break;
        }
        /* If we walked through all the options, and didn't find
        anything, then we must have a parameter. Forget the fact that
        an unknown option will be treated like a parameter... */
        if ( !is_option )
        {
            fct_nlist__append(&(clp->param_list), arg);
            arg =NULL;  /* Owned by the nlist */
        }
        ++argi;
        if ( arg != NULL )
        {
            free(arg);
            arg =NULL;
        }
    }
}


static fctcl_t const*
fct_clp__get_clo(fct_clp_t const *clp, char const *option)
{
    fctcl_t const *found =NULL;

    FCT_NLIST_FOREACH_BGN(fctcl_t const*, pclo, &(clp->clo_list))
    {
        if ( fctcl__is_option(pclo, option) )
        {
            found = pclo;
            break;
        }
    }
    FCT_NLIST_FOREACH_END();
    return found;
}


#define fct_clp__optval(_CLP_, _OPTION_) \
    fct_clp__optval2((_CLP_), (_OPTION_), NULL)


/* Returns the value parsed at the command line, and equal to OPTION.
If the value wasn't parsed, the DEFAULT_VAL is returned instead. */
static char const*
fct_clp__optval2(fct_clp_t *clp, char const *option, char const *default_val)
{
    fctcl_t const *clo =NULL;
    FCT_ASSERT( clp != NULL );
    FCT_ASSERT( option != NULL );
    clo = fct_clp__get_clo(clp, option);
    if ( clo == NULL || clo->value == NULL)
    {
        return default_val;
    }
    return clo->value;
}



/* Mainly used for unit tests. */
static int
fct_clp__is_param(fct_clp_t *clp, char const *param)
{
    if ( clp == NULL || param == NULL )
    {
        return 0;
    }
    FCT_NLIST_FOREACH_BGN(char *, aparam, &(clp->param_list))
    {
        if ( fctstr_eq(aparam, param) )
        {
            return 1;
        }
    }
    FCT_NLIST_FOREACH_END();
    return 0;
}


#define fct_clp__is_error(_CLP_) ((_CLP_)->is_error)
#define fct_clp__get_error(_CLP_) ((_CLP_)->error_msg);

#define fct_clp__num_clo(_CLP_) \
    (fct_nlist__size(&((_CLP_)->clo_list)))

#define fct_clp__param_cnt(_CLP_) \
    (fct_nlist__size(&((_CLP_)->param_list)))

/* Returns a *reference* to the parameter at _IDX_. Do not modify
its contents. */
#define fct_clp__param_at(_CLP_, _IDX_) \
    ((char const*)fct_nlist__at(&((_CLP_)->param_list), (_IDX_)))


/* Returns true if the given option was on the command line.
Use either the long or short option name to check against. */
#define fct_clp__is(_CLP_, _OPTION_) \
    (fct_clp__optval((_CLP_), (_OPTION_)) != NULL)



/*
--------------------------------------------------------
FCT NAMESPACE
--------------------------------------------------------

The macros below start to pollute the watch window with
lots of "system" variables. This NAMESPACE is an
attempt to hide all the "system" variables in one place.
*/
typedef struct _fct_namespace_t
{
    /* The currently active test suite. */
    fct_ts_t *ts_curr;
    int ts_is_skip_suite;
    char const *ts_skip_cndtn;

    /* Current test name. */
    char const* curr_test_name;
    fct_test_t *curr_test;
    const char *test_skip_cndtn;
    int test_is_skip;

    /* Counts the number of tests in a test suite. */
    int test_num;

    /* Set at the end of the test suites. */
    size_t num_total_failed;
} fct_namespace_t;


static void
fct_namespace_init(fct_namespace_t *ns)
{
    FCT_ASSERT( ns != NULL && "invalid argument!");
    memset(ns, 0, sizeof(fct_namespace_t));
}


/*
--------------------------------------------------------
FCT KERNAL
--------------------------------------------------------

The "fctkern" is a singleton that is defined throughout the
system.
*/

struct _fctkern_t
{
    /* Holds variables used throughout MACRO MAGIC. In order to reduce
    the "noise" in the watch window during a debug trace. */
    fct_namespace_t ns;

    /* Command line parsing. */
    fct_clp_t cl_parser;

    /* Hold onto the command line arguments. */
    int cl_argc;
    char const **cl_argv;
    /* Track user options. */
    fctcl_init_t const *cl_user_opts;

    /* Tracks the delay parsing. */
    int cl_is_parsed;

    /* This is an list of loggers that can be used in the fct system. */
    fct_nlist_t logger_list;

    /* Array of custom types, you have built-in system ones and you
    have optionally supplied user ones.. */
    fct_logger_types_t *lt_usr;
    fct_logger_types_t *lt_sys;

    /* This is a list of prefix's that can be used to determine if a
    test is should be run or not. */
    fct_nlist_t prefix_list;

    /* This is a list of test suites that where generated throughout the
    testing process. */
    fct_nlist_t ts_list;

    /* Records what we expect to fail. */
    size_t num_expected_failures;
};


#define FCT_OPT_VERSION       "--version"
#define FCT_OPT_VERSION_SHORT "-v"
#define FCT_OPT_HELP          "--help"
#define FCT_OPT_HELP_SHORT    "-h"
#define FCT_OPT_LOGGER        "--logger"
#define FCT_OPT_LOGGER_SHORT  "-l"
static fctcl_init_t FCT_CLP_OPTIONS[] =
{
    /* Totally unsafe, since we are assuming we can clean out this data,
    what I need to do is have an "initialization" object, full of
    const objects. But for now, this should work. */
    {
        FCT_OPT_VERSION,
        FCT_OPT_VERSION_SHORT,
        FCTCL_STORE_TRUE,
        "Displays the FCTX version number and exits."
    },
    {
        FCT_OPT_HELP,
        FCT_OPT_HELP_SHORT,
        FCTCL_STORE_TRUE,
        "Shows this help."
    },
    {
        FCT_OPT_LOGGER,
        FCT_OPT_LOGGER_SHORT,
        FCTCL_STORE_VALUE,
        NULL
    },
    FCTCL_INIT_NULL /* Sentinel */
};

typedef fct_logger_i* (*fct_logger_new_fn)(void);
struct _fct_logger_types_t
{
    char const *name;
    fct_logger_new_fn logger_new_fn;
    char const *desc;
};

static fct_logger_types_t FCT_LOGGER_TYPES[] =
{
    {
        "standard",
        (fct_logger_new_fn)fct_standard_logger_new,
        "the basic fctx logger"
    },
    {
        "minimal",
        (fct_logger_new_fn)fct_minimal_logger_new,
        "the least amount of logging information."
    },
    {
        "junit",
        (fct_logger_new_fn)fct_junit_logger_new,
        "junit compatable xml"
    },
    {NULL, (fct_logger_new_fn)NULL, NULL} /* Sentinel */
};


/* Returns the number of filters defined for the fct kernal. */
#define fctkern__filter_cnt(_NK_) (fct_nlist__size(&((_NK_)->prefix_list)))


static void
fctkern__add_logger(fctkern_t *nk, fct_logger_i *logger_owns)
{
    FCT_ASSERT(nk != NULL && "invalid arg");
    FCT_ASSERT(logger_owns != NULL && "invalid arg");
    fct_nlist__append(&(nk->logger_list), logger_owns);
}


static void
fctkern__write_help(fctkern_t *nk, FILE *out)
{
    fct_clp_t *clp = &(nk->cl_parser);
    fprintf(out, "test.exe [options] prefix_filter ...\n\n");
    FCT_NLIST_FOREACH_BGN(fctcl_t*, clo, &(clp->clo_list))
    {
        if ( clo->short_opt != NULL )
        {
            fprintf(out, "%s, %s\n", clo->short_opt, clo->long_opt);
        }
        else
        {
            fprintf(out, "%s\n", clo->long_opt);
        }
        if ( !fctstr_ieq(clo->long_opt, FCT_OPT_LOGGER) )
        {
            /* For now lets not get to fancy with the text wrapping. */
            fprintf(out, "  %s\n", clo->help);
        }
        else
        {
            fct_logger_types_t *types[2];
            int type_i;
            fct_logger_types_t *itr;
            types[0] = nk->lt_sys;
            types[1] = nk->lt_usr;
            fputs("  Sets the logger. The types of loggers currently "
                  "available are,\n", out);
            for (type_i =0; type_i != 2; ++type_i )
            {
                for ( itr=types[type_i]; itr && itr->name != NULL; ++itr )
                {
                    fprintf(out, "   =%s : %s\n", itr->name, itr->desc);
                }
            }
            fprintf(out, "  default is '%s'.\n", FCT_DEFAULT_LOGGER);
        }
    }
    FCT_NLIST_FOREACH_END();
    fputs("\n", out);
}


/* Appends a prefix filter that is used to determine if a test can
be executed or not. If the test starts with the same characters as
the prefix, then it should be "runnable". The prefix filter must be
a non-NULL, non-Blank string. */
static void
fctkern__add_prefix_filter(fctkern_t *nk, char const *prefix_filter)
{
    char *filter =NULL;
    size_t filter_len =0;
    FCT_ASSERT( nk != NULL && "invalid arg" );
    FCT_ASSERT( prefix_filter != NULL && "invalid arg" );
    FCT_ASSERT( strlen(prefix_filter) > 0 && "invalid arg" );
    /* First we make a copy of the prefix, then we store it away
    in our little list. */
    filter_len = strlen(prefix_filter);
    filter = (char*)malloc(sizeof(char)*(filter_len+1));
    fctstr_safe_cpy(filter, prefix_filter, filter_len+1);
    fct_nlist__append(&(nk->prefix_list), (void*)filter);
}


/* Cleans up the contents of a fctkern. NULL does nothing. */
static void
fctkern__final(fctkern_t *nk)
{
    if ( nk == NULL )
    {
        return;
    }
    fct_clp__final(&(nk->cl_parser));
    fct_nlist__final(&(nk->logger_list), (fct_nlist_on_del_t)fct_logger__del);
    /* The prefix list is a list of malloc'd strings. */
    fct_nlist__final(&(nk->prefix_list), (fct_nlist_on_del_t)free);
    fct_nlist__final(&(nk->ts_list), (fct_nlist_on_del_t)fct_ts__del);
}


#define fctkern__cl_is_parsed(_NK_) ((_NK_)->cl_is_parsed)


static int
fctkern__cl_is(fctkern_t *nk, char const *opt_str)
{
    FCT_ASSERT( opt_str != NULL );
    return opt_str[0] != '\0'
           && fct_clp__is(&(nk->cl_parser), opt_str);
}


/* Returns the command line value given by OPT_STR. If OPT_STR was not defined
at the command line, DEF_STR is returned (you can use NULL for the DEF_STR).
The result returned should not be mofidied, and MAY even be the same pointer
to DEF_STR. */
static char const *
fctkern__cl_val2(fctkern_t *nk, char const *opt_str, char const *def_str)
{
    FCT_ASSERT( opt_str != NULL );
    if ( nk == NULL )
    {
        return NULL;
    }
    return fct_clp__optval2(&(nk->cl_parser), opt_str, def_str);
}


/* Selects a logger from the list based on the selection name.
May return NULL if the name doesn't exist in the list. */
static fct_logger_i*
fckern_sel_log(fct_logger_types_t *search, char const *sel_logger)
{
    fct_logger_types_t *iter;
    FCT_ASSERT(search != NULL);
    FCT_ASSERT(sel_logger != NULL);
    FCT_ASSERT(strlen(sel_logger) > 0);
    for ( iter = search; iter->name != NULL; ++iter)
    {
        if ( fctstr_ieq(iter->name, sel_logger) )
        {
            return iter->logger_new_fn();
        }
    }
    return NULL;
}

static int
fctkern__cl_parse_config_logger(fctkern_t *nk)
{
    fct_logger_i *logger =NULL;
    char const *sel_logger =NULL;
    char const *def_logger =FCT_DEFAULT_LOGGER;
    sel_logger = fctkern__cl_val2(nk, FCT_OPT_LOGGER, def_logger);
    FCT_ASSERT(sel_logger != NULL && "should never be NULL");
    /* First search the user selected types, then search the
    built-in types. */
    if ( nk->lt_usr != NULL )
    {
        logger = fckern_sel_log(nk->lt_usr, sel_logger);
    }
    if ( nk->lt_sys != NULL && logger == NULL )
    {
        logger = fckern_sel_log(nk->lt_sys, sel_logger);
    }
    if ( logger == NULL )
    {
        /* No logger configured, you must have supplied an invalid selection. */
        fprintf(stderr, "error: unknown logger selected - '%s'", sel_logger);
        return 0;
    }
    fctkern__add_logger(nk, logger);
    logger = NULL;  /* owned by nk. */
    return 1;
}



/* Call this if you want to (re)parse the command line options with a new
set of options. Returns -1 if you are to abort with EXIT_SUCCESS, returns
0 if you are to abort with EXIT_FAILURE and returns 1 if you are to continue. */
static int
fctkern__cl_parse(fctkern_t *nk)
{
    int status =0;
    size_t num_params =0;
    size_t param_i =0;
    if ( nk == NULL )
    {
        return 0;
    }
    if ( nk->cl_user_opts != NULL )
    {
        if ( !fct_clp__add_options(&(nk->cl_parser), nk->cl_user_opts) )
        {
            status =0;
            goto finally;
        }
    }
    /* You want to add the "house options" after the user defined ones. The
    options are stored as a list so it means that any option listed after
    the above ones won't get parsed. */
    if ( !fct_clp__add_options(&(nk->cl_parser), FCT_CLP_OPTIONS) )
    {
        status =0;
        goto finally;
    }
    fct_clp__parse(&(nk->cl_parser), nk->cl_argc, nk->cl_argv);
    if ( fct_clp__is_error(&(nk->cl_parser)) )
    {
        char *err = fct_clp__get_error(&(nk->cl_parser));
        fprintf(stderr, "error: %s", err);
        status =0;
        goto finally;
    }
    num_params = fct_clp__param_cnt(&(nk->cl_parser));
    for ( param_i =0; param_i != num_params; ++param_i )
    {
        char const *param = fct_clp__param_at(&(nk->cl_parser), param_i);
        fctkern__add_prefix_filter(nk, param);
    }
    if ( fctkern__cl_is(nk, FCT_OPT_VERSION) )
    {
        (void)printf("Built using FCTX version %s.\n", FCT_VERSION_STR);
        status = -1;
        goto finally;
    }
    if ( fctkern__cl_is(nk, FCT_OPT_HELP) )
    {
        fctkern__write_help(nk, stdout);
        status = -1;
        goto finally;
    }
    if ( !fctkern__cl_parse_config_logger(nk) )
    {
        status = -1;
        goto finally;
    }
    status =1;
    nk->cl_is_parsed =1;
finally:
    return status;
}



/* Parses the command line and sets up the framework. The argc and argv
should be directly from the program's main. */
static int
fctkern__init(fctkern_t *nk, int argc, const char *argv[])
{
    if ( argc == 0 && argv == NULL )
    {
        return 0;
    }
    memset(nk, 0, sizeof(fctkern_t));
    fct_clp__init(&(nk->cl_parser), NULL);
    fct_nlist__init(&(nk->logger_list));
    nk->lt_usr = NULL;  /* Supplied via 'install' mechanics. */
    nk->lt_sys = FCT_LOGGER_TYPES;
    fct_nlist__init2(&(nk->prefix_list), 0);
    fct_nlist__init2(&(nk->ts_list), 0);
    nk->cl_is_parsed =0;
    /* Save a copy of the arguments. We do a delay parse of the command
    line arguments in order to allow the client code to optionally configure
    the command line parser.*/
    nk->cl_argc = argc;
    nk->cl_argv = argv;
    fct_namespace_init(&(nk->ns));
    return 1;
}


/* Takes OWNERSHIP of the test suite after we have finished executing
its contents. This way we can build up all kinds of summaries at the end
of a run. */
static void
fctkern__add_ts(fctkern_t *nk, fct_ts_t *ts)
{
    FCT_ASSERT( nk != NULL );
    FCT_ASSERT( ts != NULL );
    fct_nlist__append(&(nk->ts_list), ts);
}


/* Returns FCT_TRUE if the supplied test_name passes the filters set on
this test suite. If there are no filters, we return FCT_TRUE always. */
static nbool_t
fctkern__pass_filter(fctkern_t *nk, char const *test_name)
{
    size_t prefix_i =0;
    size_t prefix_list_size =0;
    FCT_ASSERT( nk != NULL && "invalid arg");
    FCT_ASSERT( test_name != NULL );
    FCT_ASSERT( strlen(test_name) > 0 );
    prefix_list_size = fctkern__filter_cnt(nk);
    /* If there is no filter list, then we return FCT_TRUE always. */
    if ( prefix_list_size == 0 )
    {
        return FCT_TRUE;
    }
    /* Iterate through the prefix filter list, and see if we have
    anything that does not pass. All we require is ONE item that
    passes the test in order for us to succeed here. */
    for ( prefix_i = 0; prefix_i != prefix_list_size; ++prefix_i )
    {
        char const *prefix = (char const*)fct_nlist__at(
                                 &(nk->prefix_list), prefix_i
                             );
        nbool_t pass = fct_filter_pass(prefix, test_name);
        if ( pass )
        {
            return FCT_TRUE;
        }
    }
    /* Otherwise, we never managed to find a prefix that satisfied the
    supplied test name. Therefore we have failed to pass to the filter
    list test. */
    return FCT_FALSE;
}


/* Returns the number of tests that were performed. */
static size_t
fctkern__tst_cnt(fctkern_t const *nk)
{
    size_t tally =0;
    FCT_ASSERT( nk != NULL );
    FCT_NLIST_FOREACH_BGN(fct_ts_t *, ts, &(nk->ts_list))
    {
        tally += fct_ts__tst_cnt(ts);
    }
    FCT_NLIST_FOREACH_END();
    return tally;
}


/* Returns the number of tests that passed. */
static size_t
fctkern__tst_cnt_passed(fctkern_t const *nk)
{
    size_t tally =0;
    FCT_ASSERT( nk != NULL );

    FCT_NLIST_FOREACH_BGN(fct_ts_t*, ts, &(nk->ts_list))
    {
        tally += fct_ts__tst_cnt_passed(ts);
    }
    FCT_NLIST_FOREACH_END();

    return tally;
}


/* Returns the number of tests that failed. */
#define fctkern__tst_cnt_failed(nk) \
    (fctkern__tst_cnt(nk) - fctkern__tst_cnt_passed(nk))


/* Returns the number of checks made throughout the entire test. */
#if defined(FCT_USE_TEST_COUNT)
static size_t
fctkern__chk_cnt(fctkern_t const *nk)
{
    size_t tally =0;
    FCT_ASSERT( nk != NULL );

    FCT_NLIST_FOREACH_BGN(fct_ts_t *, ts, &(nk->ts_list))
    {
        tally += fct_ts__chk_cnt(ts);
    }
    FCT_NLIST_FOREACH_END();
    return tally;
}
#endif /* FCT_USE_TEST_COUNT */


/* Indicates the very end of all the tests. */
#define fctkern__end(nk) /* unused */


static void
fctkern__log_suite_start(fctkern_t *nk, fct_ts_t const *ts)
{
    FCT_ASSERT( nk != NULL );
    FCT_ASSERT( ts != NULL );
    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
    {
        fct_logger__on_test_suite_start(logger, ts);
    }
    FCT_NLIST_FOREACH_END();
}


static void
fctkern__log_suite_end(fctkern_t *nk, fct_ts_t const *ts)
{
    FCT_ASSERT( nk != NULL );
    FCT_ASSERT( ts != NULL );
    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
    {
        fct_logger__on_test_suite_end(logger, ts);
    }
    FCT_NLIST_FOREACH_END();
}


static void
fctkern__log_suite_skip(fctkern_t *nk, char const *condition, char const *name)
{
    if ( nk == NULL )
    {
        return;
    }
    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
    {
        fct_logger__on_test_suite_skip(logger, condition, name);
    }
    FCT_NLIST_FOREACH_END();
}


static void
fctkern__log_test_skip(fctkern_t *nk, char const *condition, char const *name)
{
    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
    {
        fct_logger__on_test_skip(logger, condition, name);
    }
    FCT_NLIST_FOREACH_END();
}


/* Use this for displaying information about a "Check" (i.e.
a condition). */
static void
fctkern__log_chk(fctkern_t *nk, fctchk_t const *chk)
{
    FCT_ASSERT( nk != NULL );
    FCT_ASSERT( chk != NULL );
    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
    {
        fct_logger__on_chk(logger, chk);
    }
    FCT_NLIST_FOREACH_END();
}


/* Use this for displaying warning messages. */
static void
fctkern__log_warn(fctkern_t *nk, char const *warn)
{
    FCT_ASSERT( nk != NULL );
    FCT_ASSERT( warn != NULL );
    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
    {
        fct_logger__on_warn(logger, warn);
    }
    FCT_NLIST_FOREACH_END();
}


/* Called whenever a test is started. */
static void
fctkern__log_test_start(fctkern_t *nk, fct_test_t const *test)
{
    FCT_ASSERT( nk != NULL );
    FCT_ASSERT( test != NULL );
    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
    {
        fct_logger__on_test_start(logger, test);
    }
    FCT_NLIST_FOREACH_END();
}


static void
fctkern__log_test_end(fctkern_t *nk, fct_test_t *test)
{
    FCT_ASSERT( nk != NULL );
    FCT_ASSERT( test != NULL );
    FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &(nk->logger_list))
    {
        fct_logger__on_test_end(logger, test);
    }
    FCT_NLIST_FOREACH_END();
}


#define fctkern__log_start(_NK_) \
   {\
       FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &((_NK_)->logger_list))\
       {\
          fct_logger__on_fctx_start(logger, (_NK_));\
       }\
       FCT_NLIST_FOREACH_END();\
   }


#define fctkern__log_end(_NK_) \
    {\
       FCT_NLIST_FOREACH_BGN(fct_logger_i*, logger, &((_NK_)->logger_list))\
       {\
          fct_logger__on_fctx_end(logger, (_NK_));\
       }\
       FCT_NLIST_FOREACH_END();\
    }




/*
-----------------------------------------------------------
LOGGER INTERFACE

Defines an interface to a logging system. A logger
must define the following functions in order to hook
into the logging system.

See the "Standard Logger" and "Minimal Logger" as examples
of the implementation.
-----------------------------------------------------------
*/

/* Common event argument. The values of the each event may or may not be
defined depending on the event in question. */
struct _fct_logger_evt_t
{
    fctkern_t const *kern;
    fctchk_t const *chk;
    fct_test_t const *test;
    fct_ts_t const *ts;
    char const *msg;
    char const *cndtn;
    char const *name;
};


typedef struct _fct_logger_i_vtable_t
{
    /* 1
     * Fired when an "fct_chk*" (check) function is completed. The event
     * will contain a reference to the "chk" object created.
     * */
    void (*on_chk)(fct_logger_i *logger, fct_logger_evt_t const *e);

    /* 2
     * Fired when a test starts and before any checks are made. The
     * event will have its "test" object set. */
    void (*on_test_start)(
        fct_logger_i *logger,
        fct_logger_evt_t const *e
    );
    /* 3 */
    void (*on_test_end)(
        fct_logger_i *logger,
        fct_logger_evt_t const *e
    );
    /* 4 */
    void (*on_test_suite_start)(
        fct_logger_i *logger,
        fct_logger_evt_t const *e
    );
    /* 5 */
    void (*on_test_suite_end)(
        fct_logger_i *logger,
        fct_logger_evt_t const *e
    );
    /* 6 */
    void (*on_fctx_start)(
        fct_logger_i *logger,
        fct_logger_evt_t const *e
    );
    /* 7 */
    void (*on_fctx_end)(
        fct_logger_i *logger,
        fct_logger_evt_t const *e
    );
    /* 8
    Called when the logger object must "clean up". */
    void (*on_delete)(
        fct_logger_i *logger,
        fct_logger_evt_t const *e
    );
    /* 9 */
    void (*on_warn)(
        fct_logger_i *logger,
        fct_logger_evt_t const *e
    );
    /* -- new in 1.2 -- */
    /* 10 */
    void (*on_test_suite_skip)(
        fct_logger_i *logger,
        fct_logger_evt_t const *e
    );
    /* 11 */
    void (*on_test_skip)(
        fct_logger_i *logger,
        fct_logger_evt_t const *e
    );
} fct_logger_i_vtable_t;

#define _fct_logger_head \
    fct_logger_i_vtable_t vtable; \
    fct_logger_evt_t evt

struct _fct_logger_i
{
    _fct_logger_head;
};


static void
fct_logger__stub(fct_logger_i *l, fct_logger_evt_t const *e)
{
    fct_unused(l);
    fct_unused(e);
}


static fct_logger_i_vtable_t fct_logger_default_vtable =
{
    fct_logger__stub,   /* 1.  on_chk */
    fct_logger__stub,   /* 2.  on_test_start */
    fct_logger__stub,   /* 3.  on_test_end */
    fct_logger__stub,   /* 4.  on_test_suite_start */
    fct_logger__stub,   /* 5.  on_test_suite_end */
    fct_logger__stub,   /* 6.  on_fctx_start */
    fct_logger__stub,   /* 7.  on_fctx_end */
    fct_logger__stub,   /* 8.  on_delete */
    fct_logger__stub,   /* 9.  on_warn */
    fct_logger__stub,   /* 10. on_test_suite_skip */
    fct_logger__stub,   /* 11. on_test_skip */
};


/* Initializes the elements of a logger interface so they are at their
standard values. */
static void
fct_logger__init(fct_logger_i *logger)
{
    FCT_ASSERT( logger != NULL );
    memcpy(
        &(logger->vtable),
        &fct_logger_default_vtable,
        sizeof(fct_logger_i_vtable_t)
    );
    memset(&(logger->evt),0, sizeof(fct_logger_evt_t));
}

static void
fct_logger__del(fct_logger_i *logger)
{
    if ( logger )
    {
        logger->vtable.on_delete(logger, &(logger->evt));
    }
}


static void
fct_logger__on_test_start(fct_logger_i *logger, fct_test_t const *test)
{
    logger->evt.test = test;
    logger->vtable.on_test_start(logger, &(logger->evt));
}


static void
fct_logger__on_test_end(fct_logger_i *logger, fct_test_t *test)
{
    logger->evt.test = test;
    logger->vtable.on_test_end(logger, &(logger->evt));
}


static void
fct_logger__on_test_suite_start(fct_logger_i *logger, fct_ts_t const *ts)
{
    logger->evt.ts = ts;
    logger->vtable.on_test_suite_start(logger, &(logger->evt));
}


static void
fct_logger__on_test_suite_end(fct_logger_i *logger, fct_ts_t const *ts)
{
    logger->evt.ts = ts;
    logger->vtable.on_test_suite_end(logger, &(logger->evt));
}


static void
fct_logger__on_test_suite_skip(
    fct_logger_i *logger,
    char const *condition,
    char const *name
)
{
    logger->evt.cndtn = condition;
    logger->evt.name = name;
    logger->vtable.on_test_suite_skip(logger, &(logger->evt));
}


static void
fct_logger__on_test_skip(
    fct_logger_i *logger,
    char const *condition,
    char const *name
)
{
    logger->evt.cndtn = condition;
    logger->evt.name = name;
    logger->vtable.on_test_skip(logger, &(logger->evt));
}


static void
fct_logger__on_chk(fct_logger_i *logger, fctchk_t const *chk)
{
    logger->evt.chk = chk;
    logger->vtable.on_chk(logger, &(logger->evt));
}

/* When we start all our tests. */
#define fct_logger__on_fctx_start(LOGGER, KERN) \
   (LOGGER)->evt.kern = (KERN);\
   (LOGGER)->vtable.on_fctx_start((LOGGER), &((LOGGER)->evt));


/* When we have reached the end of ALL of our testing. */
#define fct_logger__on_fctx_end(LOGGER, KERN) \
    (LOGGER)->evt.kern = (KERN);\
    (LOGGER)->vtable.on_fctx_end((LOGGER), &((LOGGER)->evt));


static void
fct_logger__on_warn(fct_logger_i *logger, char const *msg)
{
    logger->evt.msg = msg;
    logger->vtable.on_warn(logger, &(logger->evt));
}


/* Commmon routine to record strings representing failures. The
chk should be a failure before we call this, and the list is a list
of char*'s that will eventually be free'd by the logger. */
static void
fct_logger_record_failure(fctchk_t const* chk, fct_nlist_t* fail_list)
{
    /* For now we will truncate the string to some set amount, later
    we can work out a dynamic string object. */
    char *str = (char*)malloc(sizeof(char)*FCT_MAX_LOG_LINE);
    FCT_ASSERT( str != NULL );
    fct_snprintf(
        str,
        FCT_MAX_LOG_LINE,
        "%s(%d):\n    %s",
        fctchk__file(chk),
        fctchk__lineno(chk),
        fctchk__msg(chk)
    );
    /* Append it to the listing ... */
    fct_nlist__append(fail_list, (void*)str);
}


/* Another common routine, to print the failures at the end of a run. */
static void
fct_logger_print_failures(fct_nlist_t const *fail_list)
{
    puts(
        "\n----------------------------------------------------------------------------\n"
    );
    puts("FAILED TESTS\n\n");
    FCT_NLIST_FOREACH_BGN(char *, cndtn_str, fail_list)
    {
        printf("%s\n", cndtn_str);
    }
    FCT_NLIST_FOREACH_END();

    puts("\n");
}




/*
-----------------------------------------------------------
MINIMAL LOGGER
-----------------------------------------------------------

At the moment the MINIMAL LOGGER is currently disabled. Hope
to bring it back online soon. The only reason it is
disabled is that we don't currently have the ability to specify
loggers.
*/


/* Minimal logger, reports the minimum amount of information needed
to determine "something is happening". */
struct _fct_minimal_logger_t
{
    _fct_logger_head;
    /* A list of char*'s that needs to be cleaned up. */
    fct_nlist_t failed_cndtns_list;
};


static void
fct_minimal_logger__on_chk(
    fct_logger_i *self_,
    fct_logger_evt_t const *e
)
{
    fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_;
    if ( fctchk__is_pass(e->chk) )
    {
        fputs(".", stdout);
    }
    else
    {
        fputs("x", stdout);
        fct_logger_record_failure(e->chk, &(self->failed_cndtns_list));

    }
}

static void
fct_minimal_logger__on_fctx_end(
    fct_logger_i *self_,
    fct_logger_evt_t const *e
)
{
    fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_;
    fct_unused(e);
    if ( fct_nlist__size(&(self->failed_cndtns_list)) >0 )
    {
        fct_logger_print_failures(&(self->failed_cndtns_list));
    }
}


static void
fct_minimal_logger__on_delete(
    fct_logger_i *self_,
    fct_logger_evt_t const *e
)
{
    fct_minimal_logger_t *self = (fct_minimal_logger_t*)self_;
    fct_unused(e);
    fct_nlist__final(&(self->failed_cndtns_list), free);
    free(self);

}


fct_logger_i*
fct_minimal_logger_new(void)
{
    fct_minimal_logger_t *self = (fct_minimal_logger_t*)\
                                 calloc(1,sizeof(fct_minimal_logger_t));
    if ( self == NULL )
    {
        return NULL;
    }
    fct_logger__init((fct_logger_i*)self);
    self->vtable.on_chk = fct_minimal_logger__on_chk;
    self->vtable.on_fctx_end = fct_minimal_logger__on_fctx_end;
    self->vtable.on_delete = fct_minimal_logger__on_delete;
    fct_nlist__init2(&(self->failed_cndtns_list), 0);
    return (fct_logger_i*)self;
}


/*
-----------------------------------------------------------
STANDARD LOGGER
-----------------------------------------------------------
*/

struct _fct_standard_logger_t
{
    _fct_logger_head;

    /* Start time. For now we use the low-accuracy time_t version. */
    fct_timer_t timer;

    /* A list of char*'s that needs to be cleaned up. */
    fct_nlist_t failed_cndtns_list;
};


#define FCT_STANDARD_LOGGER_MAX_LINE 68


/* When a failure occurrs, we will record the details so we can display
them when the log "finishes" up. */
static void
fct_standard_logger__on_chk(
    fct_logger_i *logger_,
    fct_logger_evt_t const *e
)
{
    fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
    /* Only record failures. */
    if ( !fctchk__is_pass(e->chk) )
    {
        fct_logger_record_failure(e->chk, &(logger->failed_cndtns_list));
    }
}


static void
fct_standard_logger__on_test_skip(
    fct_logger_i* logger_,
    fct_logger_evt_t const *e
)
{
    char const *condition = e->cndtn;
    char const *name = e->name;
    char msg[256] = {'\0'};
    fct_unused(logger_);
    fct_unused(condition);
    fct_snprintf(msg, sizeof(msg), "%s (%s)", name, condition);
    msg[sizeof(msg)-1] = '\0';
    fct_dotted_line_start(FCT_STANDARD_LOGGER_MAX_LINE, msg);
    fct_dotted_line_end("- SKIP -");
}


static void
fct_standard_logger__on_test_start(
    fct_logger_i *logger_,
    fct_logger_evt_t const *e
)
{
    fct_unused(logger_);
    fct_dotted_line_start(
        FCT_STANDARD_LOGGER_MAX_LINE,
        fct_test__name(e->test)
    );
}


static void
fct_standard_logger__on_test_end(
    fct_logger_i *logger_,
    fct_logger_evt_t const *e
)
{
    nbool_t is_pass;
    fct_unused(logger_);
    is_pass = fct_test__is_pass(e->test);
    fct_dotted_line_end((is_pass) ? "PASS" : "FAIL ***" );
}


static void
fct_standard_logger__on_fctx_start(
    fct_logger_i *logger_,
    fct_logger_evt_t const *e
)
{
    fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
    fct_unused(e);
    fct_timer__start(&(logger->timer));
}


static void
fct_standard_logger__on_fctx_end(
    fct_logger_i *logger_,
    fct_logger_evt_t const *e
)
{
    fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
    nbool_t is_success =1;
    double elasped_time =0;
    size_t num_tests =0;
    size_t num_passed =0;

    fct_timer__stop(&(logger->timer));

    is_success = fct_nlist__size(&(logger->failed_cndtns_list)) ==0;

    if (  !is_success )
    {
        fct_logger_print_failures(&(logger->failed_cndtns_list));
    }
    puts(
        "\n----------------------------------------------------------------------------\n"
    );
    num_tests = fctkern__tst_cnt(e->kern);
    num_passed = fctkern__tst_cnt_passed(e->kern);
    printf(
        "%s (%lu/%lu tests",
        (is_success) ? "PASSED" : "FAILED",
        (unsigned long) num_passed,
        (unsigned long) num_tests
    );
    elasped_time = fct_timer__duration(&(logger->timer));
    if ( elasped_time > 0.0000001 )
    {
        printf(" in %.6fs)\n", elasped_time);
    }
    else
    {
        /* Don't bother displaying the time to execute. */
        puts(")\n");
    }
}


static void
fct_standard_logger__on_delete(
    fct_logger_i *logger_,
    fct_logger_evt_t const *e
)
{
    fct_standard_logger_t *logger = (fct_standard_logger_t*)logger_;
    fct_unused(e);
    fct_nlist__final(&(logger->failed_cndtns_list), free);
    free(logger);
    logger_ =NULL;
}


static void
fct_standard_logger__on_warn(
    fct_logger_i* logger_,
    fct_logger_evt_t const *e
)
{
    fct_unused(logger_);
    (void)printf("WARNING: %s", e->msg);
}


fct_logger_i*
fct_standard_logger_new(void)
{
    fct_standard_logger_t *logger = (fct_standard_logger_t *)calloc(
                                        1, sizeof(fct_standard_logger_t)
                                    );
    if ( logger == NULL )
    {
        return NULL;
    }
    fct_logger__init((fct_logger_i*)logger);
    logger->vtable.on_chk = fct_standard_logger__on_chk;
    logger->vtable.on_test_start = fct_standard_logger__on_test_start;
    logger->vtable.on_test_end = fct_standard_logger__on_test_end;
    logger->vtable.on_fctx_start = fct_standard_logger__on_fctx_start;
    logger->vtable.on_fctx_end = fct_standard_logger__on_fctx_end;
    logger->vtable.on_delete = fct_standard_logger__on_delete;
    logger->vtable.on_warn = fct_standard_logger__on_warn;
    logger->vtable.on_test_skip = fct_standard_logger__on_test_skip;
    fct_nlist__init2(&(logger->failed_cndtns_list), 0);
    fct_timer__init(&(logger->timer));
    return (fct_logger_i*)logger;
}


/*
-----------------------------------------------------------
JUNIT LOGGER
-----------------------------------------------------------
*/


/* JUnit logger */
struct _fct_junit_logger_t
{
    _fct_logger_head;
};


static void
fct_junit_logger__on_test_suite_start(
    fct_logger_i *l,
    fct_logger_evt_t const *e
)
{
    fct_unused(l);
    fct_unused(e);
    FCT_SWITCH_STDOUT_TO_BUFFER();
    FCT_SWITCH_STDERR_TO_BUFFER();
}


static void
fct_junit_logger__on_test_suite_end(
    fct_logger_i *logger_,
    fct_logger_evt_t const *e
)
{
    fct_ts_t const *ts = e->ts; /* Test Suite */
    nbool_t is_pass;
    double elasped_time = 0;
    char std_buffer[1024];
    int read_length;
    int first_out_line;

    fct_unused(logger_);

    elasped_time = fct_ts__duration(ts);

    FCT_SWITCH_STDOUT_TO_STDOUT();
    FCT_SWITCH_STDERR_TO_STDERR();

    /* opening testsuite tag */
    printf("\t<testsuite errors=\"%lu\" failures=\"0\" tests=\"%lu\" "
           "name=\"%s\" time=\"%.4f\">\n",
           (unsigned long)   fct_ts__tst_cnt(ts)
           - fct_ts__tst_cnt_passed(ts),
           (unsigned long) fct_ts__tst_cnt(ts),
           fct_ts__name(ts),
           elasped_time);

    FCT_NLIST_FOREACH_BGN(fct_test_t*, test, &(ts->test_list))
    {
        is_pass = fct_test__is_pass(test);

        /* opening testcase tag */
        if (is_pass)
        {
            printf("\t\t<testcase name=\"%s\" time=\"%.3f\"",
                   fct_test__name(test),
                   fct_test__duration(test)
                  );
        }
        else
        {
            printf("\t\t<testcase name=\"%s\" time=\"%.3f\">\n",
                   fct_test__name(test),
                   fct_test__duration(test)
                  );
        }

        FCT_NLIST_FOREACH_BGN(fctchk_t*, chk, &(test->failed_chks))
        {
            /* error tag */
            printf("\t\t\t<error message=\"%s\" "
                   "type=\"fctx\">", chk->msg);
            printf("file:%s, line:%d", chk->file, chk->lineno);
            printf("</error>\n");
        }
        FCT_NLIST_FOREACH_END();

        /* closing testcase tag */
        if (is_pass)
        {
            printf(" />\n");
        }
        else
        {
            printf("\t\t</testcase>\n");
        }
    }
    FCT_NLIST_FOREACH_END();

    /* print the std streams */
    first_out_line = 1;
    printf("\t\t<system-out>\n\t\t\t<![CDATA[");
    while ( (read_length = _fct_read(fct_stdout_pipe[0], std_buffer, 1024)) > 0)
    {
        if (first_out_line)
        {
            printf("\n");
            first_out_line = 0;
        }
        printf("%.*s", read_length, std_buffer);
    }
    printf("]]>\n\t\t</system-out>\n");

    first_out_line = 1;
    printf("\t\t<system-err>\n\t\t\t<![CDATA[");
    while ((read_length = _fct_read(fct_stderr_pipe[0], std_buffer, 1024)) > 0)
    {
        if (first_out_line)
        {
            printf("\n");
            first_out_line = 0;
        }
        printf("%.*s", read_length, std_buffer);
    }
    printf("]]>\n\t\t</system-err>\n");

    /* closing testsuite tag */
    printf("\t</testsuite>\n");
}

static void
fct_junit_logger__on_fct_start(
    fct_logger_i *logger_,
    fct_logger_evt_t const *e
)
{
    fct_unused(logger_);
    fct_unused(e);
    printf("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
    printf("<testsuites>\n");
}

static void
fct_junit_logger__on_fctx_end(
    fct_logger_i *logger_,
    fct_logger_evt_t const *e
)
{
    fct_unused(logger_);
    fct_unused(e);
    printf("</testsuites>\n");
}

static void
fct_junit_logger__on_delete(
    fct_logger_i *logger_,
    fct_logger_evt_t const *e
)
{
    fct_junit_logger_t *logger = (fct_junit_logger_t*)logger_;
    fct_unused(e);
    free(logger);
    logger_ =NULL;
}


fct_junit_logger_t *
fct_junit_logger_new(void)
{
    fct_junit_logger_t *logger =
        (fct_junit_logger_t *)calloc(1, sizeof(fct_junit_logger_t));
    if ( logger == NULL )
    {
        return NULL;
    }
    fct_logger__init((fct_logger_i*)logger);
    logger->vtable.on_test_suite_start = fct_junit_logger__on_test_suite_start;
    logger->vtable.on_test_suite_end = fct_junit_logger__on_test_suite_end;
    logger->vtable.on_fctx_start = fct_junit_logger__on_fct_start;
    logger->vtable.on_fctx_end = fct_junit_logger__on_fctx_end;
    logger->vtable.on_delete = fct_junit_logger__on_delete;
    return logger;
}


/*
------------------------------------------------------------
MACRO MAGIC
------------------------------------------------------------
This is where the show begins!
*/

/* This macro invokes a bunch of functions that need to be referenced in
order to avoid  a "unreferenced local function has been removed" warning.
The logical acrobatics below try and make it appear to the compiler that
they are needed, but at runtime, only the cheap, first call is made. */
#define FCT_REFERENCE_FUNCS() \
    {\
        int check = 0 && fctstr_ieq(NULL, NULL);\
        if ( check ) {\
            _fct_cmt("not to be executed");\
            (void)_fct_chk_empty_str(NULL);\
            (void)_fct_chk_full_str(NULL);\
            (void)fct_test__start_timer(NULL);\
            (void)fct_test__stop_timer(NULL);\
            (void)fct_ts_new(NULL);\
            (void)fct_ts__test_begin(NULL);\
            (void)fct_ts__add_test(NULL, NULL);\
            (void)fct_ts__test_end(NULL);\
            (void)fct_ts__inc_total_test_num(NULL);\
            (void)fct_ts__make_abort_test(NULL);\
            (void)fct_ts__setup_abort(NULL);\
            (void)fct_ts__setup_end(NULL);\
            (void)fct_ts__teardown_end(NULL);\
            (void)fct_ts__cnt_end(NULL);\
            (void)fct_ts__is_test_cnt(NULL, 0);\
            (void)fct_xchk_fn(0, "");\
            (void)fct_xchk2_fn(NULL, 0, "");\
            (void)fctkern__cl_parse(NULL);\
            (void)fctkern__add_ts(NULL, NULL);\
            (void)fctkern__pass_filter(NULL, NULL);\
            (void)fctkern__log_suite_start(NULL, NULL);\
            (void)fctkern__log_suite_end(NULL, NULL);\
            (void)fctkern__log_test_skip(NULL, NULL, NULL);\
            (void)fctkern__log_test_start(NULL, NULL);\
            (void)fctkern__log_test_end(NULL, NULL);\
            (void)fctstr_endswith(NULL,NULL);\
            (void)fctstr_iendswith(NULL,NULL);\
            (void)fctstr_ieq(NULL,NULL);\
            (void)fctstr_incl(NULL, NULL);\
            (void)fctstr_iincl(NULL, NULL);\
            (void)fctstr_iendswith(NULL,NULL);\
            (void)fctstr_istartswith(NULL,NULL);\
            (void)fctstr_clone_lower(NULL);\
            (void)fctstr_startswith(NULL,NULL);\
            (void)fctkern__init(NULL, 0, NULL);\
            (void)fctkern__cl_is(NULL, "");\
            (void)fctkern__cl_val2(NULL, NULL, NULL);\
            fctkern__log_suite_skip(NULL, NULL, NULL);\
            (void)fct_clp__is_param(NULL,NULL);\
	    _fct_cmt("should never construct an object");\
            (void)fct_test_new(NULL);\
            (void)fct_ts__chk_cnt(NULL);\
        }\
    }


#define FCT_INIT(_ARGC_, _ARGV_)                                    \
   fctkern_t  fctkern__;                                            \
   fctkern_t* fctkern_ptr__ = &fctkern__;                           \
   FCT_REFERENCE_FUNCS();                                           \
   if ( !fctkern__init(fctkern_ptr__, argc, (const char **)argv) ) {\
        (void)fprintf(                                              \
            stderr, "FATAL ERROR: Unable to initialize FCTX Kernel."\
        );                                                          \
        exit(EXIT_FAILURE);                                         \
   }                                                                \


#define FCT_FINAL()                                                \
   fctkern_ptr__->ns.num_total_failed = fctkern__tst_cnt_failed(   \
            (fctkern_ptr__)                                        \
           );                                                      \
   fctkern__log_end(fctkern_ptr__);                                \
   fctkern__end(fctkern_ptr__);                                    \
   fctkern__final(fctkern_ptr__);                                  \
   FCT_ASSERT( !((int)fctkern_ptr__->ns.num_total_failed < 0)      \
               && "or we got truncated!");                         \
   if ( fctkern_ptr__->ns.num_total_failed ==                      \
        fctkern_ptr__->num_expected_failures) {                    \
       fctkern_ptr__->ns.num_total_failed = 0;                     \
   }                                                               \
   


#define FCT_NUM_FAILED()       \
    fctkern_ptr__->ns.num_total_failed \
    


/* Typically used internally only, this mentions to FCTX that you EXPECT
to _NUM_FAILS_. If you the expected matches the actual, a 0 value is returned
from the program. */
#define FCT_EXPECTED_FAILURES(_NUM_FAILS_) \
    ((fctkern_ptr__->num_expected_failures = (_NUM_FAILS_)))


#define FCT_BGN_FN(_FNNAME_)            \
    int _FNNAME_(int argc, char* argv[])\
    {                                   \
        FCT_INIT(argc, argv)
 
#define FCT_END_FN() FCT_END()

/* This defines our start. The fctkern__ is a kernal object
that lives throughout the lifetime of our program. The
fctkern_ptr__ makes it easier to abstract out macros.  */
#define FCT_BGN() FCT_BGN_FN(main)


/* Silence Intel complaints about unspecified operand order in user's code */
#ifndef __INTEL_COMPILER
# define FCT_END_WARNINGFIX_BGN
# define FCT_END_WARNINGFIX_END
#else
# define FCT_END_WARNINGFIX_BGN _Pragma("warning(push,disable:981)");
# define FCT_END_WARNINGFIX_END _Pragma("warning(pop)");
#endif

/* Ends the test suite by returning the number failed. The "chk_cnt" call is
made in order allow strict compilers to pass when it encounters unreferenced
functions. */
#define FCT_END()             \
   {                          \
      FCT_END_WARNINGFIX_BGN  \
      FCT_FINAL();            \
      return FCT_NUM_FAILED();\
      FCT_END_WARNINGFIX_END  \
   }\
}

#define fctlog_install(_CUST_LOGGER_LIST_) \
    fctkern_ptr__->lt_usr = (_CUST_LOGGER_LIST_)

/* Re-parses the command line options with the addition of user defined
options. */
#define fctcl_install(_CLO_INIT_) \
    {\
        fctkern_ptr__->cl_user_opts = (_CLO_INIT_);\
        _fct_cmt("Delay parse in order to allow for user customization.");\
        if ( !fctkern__cl_is_parsed((fctkern_ptr__)) ) {\
              int status = fctkern__cl_parse((fctkern_ptr__));\
              _fct_cmt("Need to parse command line before we start logger.");\
              fctkern__log_start((fctkern_ptr__));\
              switch( status ) {\
              case -1:\
              case 0:\
                  fctkern__final(fctkern_ptr__);\
                  exit( (status == 0) ? (EXIT_FAILURE) : (EXIT_SUCCESS) );\
                  break;\
              default:\
                  fct_pass();\
              }\
          }\
    }


#define fctcl_is(_OPT_STR_) (fctkern__cl_is(fctkern_ptr__, (_OPT_STR_)))

#define fctcl_val(_OPT_STR_) (fctcl_val2((_OPT_STR_), NULL))

#define fctcl_val2(_OPT_STR_, _DEF_STR_) \
   (fctkern__cl_val2(fctkern_ptr__, (_OPT_STR_), (_DEF_STR_)))


/* We delay the first parse of the command line until we get the first
test fixture. This allows the user to possibly add their own parse
specification. */
#define FCT_FIXTURE_SUITE_BGN(_NAME_) \
   {\
      fctkern_ptr__->ns.ts_curr = fct_ts_new( #_NAME_ );\
      _fct_cmt("Delay parse in order to allow for user customization.");\
      if ( !fctkern__cl_is_parsed((fctkern_ptr__)) ) {\
          int status = fctkern__cl_parse((fctkern_ptr__));\
          _fct_cmt("Need to parse command line before we start logger.");\
          fctkern__log_start((fctkern_ptr__));\
          switch( status ) {\
          case -1:\
          case 0:\
              fct_ts__del((fctkern_ptr__->ns.ts_curr));\
              fctkern__final(fctkern_ptr__);\
              exit( (status == 0) ? (EXIT_FAILURE) : (EXIT_SUCCESS) );\
              break;\
          default:\
              fct_pass();\
          }\
      }\
      if ( fctkern_ptr__->ns.ts_curr == NULL ) {\
         fctkern__log_warn((fctkern_ptr__), "out of memory");\
      }\
      else\
      {\
         fctkern__log_suite_start((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\
         for (;;)\
         {\
             fctkern_ptr__->ns.test_num = -1;\
             if ( fct_ts__is_ending_mode(fctkern_ptr__->ns.ts_curr) \
                  || fct_ts__is_abort_mode(fctkern_ptr__->ns.ts_curr) )\
             {\
               _fct_cmt("flag the test suite as complete.");\
               fct_ts__end(fctkern_ptr__->ns.ts_curr);\
               break;\
             }



/*  Closes off a "Fixture" test suite. */
#define FCT_FIXTURE_SUITE_END() \
             if ( fct_ts__is_cnt_mode(fctkern_ptr__->ns.ts_curr) )\
             {\
                fct_ts__cnt_end(fctkern_ptr__->ns.ts_curr);\
             }\
          }\
          fctkern__add_ts((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\
          fctkern__log_suite_end((fctkern_ptr__), fctkern_ptr__->ns.ts_curr);\
          fct_ts__end(fctkern_ptr__->ns.ts_curr);\
          fctkern_ptr__->ns.ts_curr = NULL;\
          }\
      }

#define FCT_FIXTURE_SUITE_BGN_IF(_CONDITION_, _NAME_) \
    fctkern_ptr__->ns.ts_is_skip_suite = !(_CONDITION_);\
    fctkern_ptr__->ns.ts_skip_cndtn = #_CONDITION_;\
    if ( fctkern_ptr__->ns.ts_is_skip_suite ) {\
       fctkern__log_suite_skip((fctkern_ptr__), #_CONDITION_, #_NAME_);\
    }\
    FCT_FIXTURE_SUITE_BGN(_NAME_);

#define FCT_FIXTURE_SUITE_END_IF() \
    FCT_FIXTURE_SUITE_END();\
    fctkern_ptr__->ns.ts_is_skip_suite =0;\
    fctkern_ptr__->ns.ts_skip_cndtn =NULL;\
 
#define FCT_SETUP_BGN()\
   if ( fct_ts__is_setup_mode(fctkern_ptr__->ns.ts_curr) ) {

#define FCT_SETUP_END() \
   fct_ts__setup_end(fctkern_ptr__->ns.ts_curr); }

#define FCT_TEARDOWN_BGN() \
   if ( fct_ts__is_teardown_mode(fctkern_ptr__->ns.ts_curr) ) {\
 
#define FCT_TEARDOWN_END() \
   fct_ts__teardown_end(fctkern_ptr__->ns.ts_curr); \
   continue; \
   }

/* Lets you create a test suite, where maybe you don't want a fixture. We
do it by 'stubbing' out the setup/teardown logic. */
#define FCT_SUITE_BGN(Name) \
   FCT_FIXTURE_SUITE_BGN(Name) {\
   FCT_SETUP_BGN() {_fct_cmt("stubbed"); } FCT_SETUP_END()\
   FCT_TEARDOWN_BGN() {_fct_cmt("stubbed");} FCT_TEARDOWN_END()\
 
#define FCT_SUITE_END() } FCT_FIXTURE_SUITE_END()

#define FCT_SUITE_BGN_IF(_CONDITION_, _NAME_) \
    FCT_FIXTURE_SUITE_BGN_IF(_CONDITION_, (_NAME_)) {\
    FCT_SETUP_BGN() {_fct_cmt("stubbed"); } FCT_SETUP_END()\
    FCT_TEARDOWN_BGN() {_fct_cmt("stubbed");} FCT_TEARDOWN_END()\
 
#define FCT_SUITE_END_IF() } FCT_FIXTURE_SUITE_END_IF()

typedef enum
{
    FCT_TEST_END_FLAG_Default    = 0x0000,
    FCT_TEST_END_FLAG_ClearFail  = 0x0001
} FCT_TEST_END_FLAG;


#define FCT_TEST_BGN_IF(_CONDITION_, _NAME_) { \
    fctkern_ptr__->ns.test_is_skip = !(_CONDITION_);\
    fctkern_ptr__->ns.test_skip_cndtn = #_CONDITION_;\
    FCT_TEST_BGN(_NAME_) {\
 
#define FCT_TEST_END_IF() \
    } FCT_TEST_END();\
    fctkern_ptr__->ns.test_is_skip = 0;\
    fctkern_ptr__->ns.test_skip_cndtn = NULL;\
    }


/* Depending on whether or not we are counting the tests, we will have to
first determine if the test is the "current" count. Then we have to determine
if we can pass the filter. Finally we will execute everything so that when a
check fails, we can "break" out to the end of the test. And in between all
that we do a memory check and fail a test if we can't build a fct_test
object (should be rare). */
#define FCT_TEST_BGN(_NAME_) \
         {\
            fctkern_ptr__->ns.curr_test_name = #_NAME_;\
            ++(fctkern_ptr__->ns.test_num);\
            if ( fct_ts__is_cnt_mode(fctkern_ptr__->ns.ts_curr) )\
            {\
               fct_ts__inc_total_test_num(fctkern_ptr__->ns.ts_curr);\
            }\
            else if ( fct_ts__is_test_mode(fctkern_ptr__->ns.ts_curr) \
                      && fct_ts__is_test_cnt(fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.test_num) )\
            {\
               fct_ts__test_begin(fctkern_ptr__->ns.ts_curr);\
               if ( fctkern__pass_filter(fctkern_ptr__,  fctkern_ptr__->ns.curr_test_name ) )\
               {\
                  fctkern_ptr__->ns.curr_test = fct_test_new( fctkern_ptr__->ns.curr_test_name );\
                  if ( fctkern_ptr__->ns.curr_test  == NULL ) {\
                    fctkern__log_warn(fctkern_ptr__, "out of memory");\
                  } else if ( fctkern_ptr__->ns.ts_is_skip_suite \
                              || fctkern_ptr__->ns.test_is_skip ) {\
                       fct_ts__test_begin(fctkern_ptr__->ns.ts_curr);\
                       fctkern__log_test_skip(\
                            fctkern_ptr__,\
                            fctkern_ptr__->ns.curr_test_name,\
                            (fctkern_ptr__->ns.test_is_skip) ?\
                                (fctkern_ptr__->ns.test_skip_cndtn) :\
                                (fctkern_ptr__->ns.ts_skip_cndtn)\
                       );\
                       fct_ts__test_end(fctkern_ptr__->ns.ts_curr);\
                       continue;\
                 } else {\
                      fctkern__log_test_start(fctkern_ptr__, fctkern_ptr__->ns.curr_test);\
                      fct_test__start_timer(fctkern_ptr__->ns.curr_test);\
                      for (;;) \
                      {




#define FCT_TEST_END() \
                         break;\
                      }\
                      fct_test__stop_timer(fctkern_ptr__->ns.curr_test);\
                 }\
                 fct_ts__add_test(fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.curr_test);\
                 fctkern__log_test_end(fctkern_ptr__, fctkern_ptr__->ns.curr_test);\
               }\
               fct_ts__test_end(fctkern_ptr__->ns.ts_curr);\
               continue;\
            }\
         }\
 


/*
---------------------------------------------------------
CHECKING MACROS
----------------------------------------------------------

The chk variants will continue on while the req variants will abort
a test if a chk condition fails. The req variants are useful when you
no longer want to keep checking conditions because a critical condition
is not being met. */


/* To support older compilers that do not have macro variable argument lists
we have to use a function. The macro manages to store away the line/file
location into a global before it runs this function, a trick I picked up from
the error handling in the APR library. The unfortunate thing is that we can
not carry forth the actual test through a "stringize" operation, but if you
wanted to do that you should use fct_chk. */

static int fct_xchk_lineno =0;
static char const *fct_xchk_file = NULL;
static fct_test_t *fct_xchk_test = NULL;
static fctkern_t *fct_xchk_kern =NULL;


static int
_fct_xchk_fn_varg(
    char const *condition,
    int is_pass,
    char const *format,
    va_list args
)
{
    fctchk_t *chk =NULL;
    chk = fctchk_new(
              is_pass,
              condition,
              fct_xchk_file,
              fct_xchk_lineno,
              format,
              args
          );
    if ( chk == NULL )
    {
        fctkern__log_warn(fct_xchk_kern, "out of memory (aborting test)");
        goto finally;
    }

    fct_test__add(fct_xchk_test, chk);
    fctkern__log_chk(fct_xchk_kern, chk);
finally:
    fct_xchk_lineno =0;
    fct_xchk_file =NULL;
    fct_xchk_test =NULL;
    fct_xchk_kern =NULL;
    return is_pass;
}


static int
fct_xchk2_fn(const char *condition, int is_pass, char const *format, ...)
{
    int r =0;
    va_list args;
    va_start(args, format);
    r = _fct_xchk_fn_varg(condition, is_pass, format, args);
    va_end(args);
    return r;
}


static int
fct_xchk_fn(int is_pass, char const *format, ...)
{
    int r=0;
    va_list args;
    va_start(args, format);
    r = _fct_xchk_fn_varg("<none-from-xchk>", is_pass, format, args);
    va_end(args);
    return r;
}


/* Call this with the following argument list:

   fct_xchk(test_condition, format_str, ...)

the bulk of this macro presets some globals to allow us to support
variable argument lists on older compilers. The idea came from the APR
libraries error checking routines. */
#define fct_xchk  fct_xchk_kern = fctkern_ptr__,\
                  fct_xchk_test = fctkern_ptr__->ns.curr_test,\
                  fct_xchk_lineno =__LINE__,\
                  fct_xchk_file=__FILE__,\
                  fct_xchk_fn

#define fct_xchk2  fct_xchk_kern = fctkern_ptr__,\
                   fct_xchk_test = fctkern_ptr__->ns.curr_test,\
                   fct_xchk_lineno =__LINE__,\
                   fct_xchk_file=__FILE__,\
                   fct_xchk2_fn


/* This checks the condition and reports the condition as a string
if it fails. */
#define fct_chk(_CNDTN_)  (fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_))

#define _fct_req(_CNDTN_)  \
    if ( !(fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_)) ) { break; }


/* When in test mode, construct a mock test object for fct_xchk to operate
with. If we fail a setup up, then we go directly to a teardown mode. */
#define fct_req(_CNDTN_) 				                 \
    if ( fct_ts__is_test_mode(fctkern_ptr__->ns.ts_curr) ) {             \
       _fct_req((_CNDTN_));                                              \
    }                                                                    \
    else if ( fct_ts__is_setup_mode(fctkern_ptr__->ns.ts_curr)           \
              || fct_ts__is_teardown_mode(fctkern_ptr__->ns.ts_curr) ) { \
       fctkern_ptr__->ns.curr_test = fct_ts__make_abort_test(            \
            fctkern_ptr__->ns.ts_curr                                    \
            );                                                           \
       if ( !(fct_xchk((_CNDTN_) ? 1 : 0, #_CNDTN_)) ) {                 \
           fct_ts__setup_abort(fctkern_ptr__->ns.ts_curr);               \
           fct_ts__add_test(                                             \
                fctkern_ptr__->ns.ts_curr, fctkern_ptr__->ns.curr_test   \
                );                                                       \
       }                                                                 \
    } else {                                                             \
       assert("invalid condition for fct_req!");                         \
       _fct_req((_CNDTN_));                                              \
    }


#define fct_chk_eq_dbl(V1, V2) \
    fct_xchk(\
        ((int)(fabs((V1)-(V2)) < DBL_EPSILON)),\
        "chk_eq_dbl: %f != %f",\
        (V1),\
        (V2)\
        )


#define fct_chk_neq_dbl(V1, V2) \
    fct_xchk(\
        ((int)(fabs((V1)-(V2)) >= DBL_EPSILON)),\
        "chk_neq_dbl: %f == %f",\
        (V1),\
        (V2)\
        )


#define fct_chk_eq_str(V1, V2) \
    fct_xchk(fctstr_eq((V1), (V2)),\
          "chk_eq_str: '%s' != '%s'",\
          (V1),\
          (V2)\
          )


#define fct_chk_neq_str(V1, V2) \
    fct_xchk(!fctstr_eq((V1), (V2)),\
          "chk_neq_str: '%s' == '%s'",\
          (V1),\
          (V2)\
          )

/* To quiet warnings with GCC, who think we are being silly and passing
in NULL to strlen, we will filter the predicate through these little
functions */
static int
_fct_chk_empty_str(char const *s)
{
    if ( s == NULL )
    {
        return 1;
    }
    return strlen(s) ==0;
}
static int
_fct_chk_full_str(char const *s)
{
    if ( s == NULL )
    {
        return 0;
    }
    return strlen(s) >0;
}


#define fct_chk_empty_str(V) \
    fct_xchk(_fct_chk_empty_str((V)),\
             "string not empty: '%s'",\
             (V)\
             )

#define fct_chk_full_str(V) \
    fct_xchk(_fct_chk_full_str((V)),\
             "string is full: '%s'",\
             (V)\
             )


#define fct_chk_eq_istr(V1, V2) \
    fct_xchk(fctstr_ieq((V1), (V2)),\
          "chk_eq_str: '%s' != '%s'",\
          (V1),\
          (V2)\
          )


#define fct_chk_neq_istr(V1, V2) \
    fct_xchk(!fctstr_ieq((V1), (V2)),\
          "chk_neq_str: '%s' == '%s'",\
          (V1),\
          (V2)\
          )


#define fct_chk_endswith_str(STR, CHECK)\
    fct_xchk(fctstr_endswith((STR),(CHECK)),\
            "fct_chk_endswith_str: '%s' doesn't end with '%s'",\
            (STR),\
            (CHECK)\
            )


#define fct_chk_iendswith_str(STR, CHECK)\
    fct_xchk(fctstr_iendswith((STR), (CHECK)),\
             "fch_chk_iendswith_str: '%s' doesn't end with '%s'.",\
             (STR),\
             (CHECK)\
             )

#define fct_chk_excl_str(STR, CHECK_EXCLUDE) \
    fct_xchk(!fctstr_incl((STR), (CHECK_EXCLUDE)),\
	  "fct_chk_excl_str: '%s' is included in '%s'",\
	  (STR),\
          (CHECK_EXCLUDE)\
	  )

#define fct_chk_excl_istr(ISTR, ICHECK_EXCLUDE) \
    fct_xchk(!fctstr_iincl((ISTR), (ICHECK_EXCLUDE)),\
	  "fct_chk_excl_istr (case insensitive): '%s' is "\
          "included in'%s'",\
          (ISTR),\
          (ICHECK_EXCLUDE)\
          )

#define fct_chk_incl_str(STR, CHECK_INCLUDE) \
    fct_xchk(fctstr_incl((STR), (CHECK_INCLUDE)),\
          "fct_chk_incl_str: '%s' does not include '%s'",\
	      (STR),\
          (CHECK_INCLUDE)\
	  )


#define fct_chk_incl_istr(ISTR, ICHECK_INCLUDE) \
    fct_xchk(fctstr_iincl((ISTR), (ICHECK_INCLUDE)),\
          "fct_chk_incl_istr (case insensitive): '%s' does "\
          "not include '%s'",\
	      (ISTR),\
          (ICHECK_INCLUDE)\
	  )


#define fct_chk_startswith_str(STR, CHECK)\
    fct_xchk(fctstr_startswith((STR), (CHECK)),\
          "'%s' does not start with '%s'",\
          (STR),\
          (CHECK)\
    )


#define fct_chk_startswith_istr(STR, CHECK)\
    fct_xchk(fctstr_istartswith((STR), (CHECK)),\
          "case insensitive check: '%s' does not start with '%s'",\
          (STR),\
          (CHECK)\
    )

#define fct_chk_eq_int(V1, V2) \
    fct_xchk(\
        ((V1) == (V2)),\
        "chq_eq_int: %d != %d",\
        (V1),\
        (V2)\
        )


#define fct_chk_neq_int(V1, V2) \
    fct_xchk(\
        ((V1) != (V2)),\
        "chq_neq_int: %d == %d",\
        (V1),\
        (V2)\
        )

#define fct_chk_ex(EXCEPTION, CODE)   \
   {                                  \
      bool pass_chk_ex = false;       \
      try {                           \
          CODE;                       \
          pass_chk_ex = false;        \
      } catch ( EXCEPTION ) {         \
          pass_chk_ex = true;         \
      } catch ( ... ) {               \
          pass_chk_ex = false;        \
      }                               \
      fct_xchk(                       \
	pass_chk_ex,                  \
        "%s exception not generated", \
        #EXCEPTION                    \
      );                              \
   }                                  \
 
/*
---------------------------------------------------------
GUT CHECK MACROS
----------------------------------------------------------

The following macros are used to help check the "guts" of
the FCT, and to confirm that it all works according to spec.
*/

/* Generates a message to STDERR and exits the application with a
non-zero number. */
#define _FCT_GUTCHK(_CNDTN_) \
   if ( !(_CNDTN_) ) {\
      fprintf(stderr, "gutchk fail: '"  #_CNDTN_ "' was not true.\n");\
      exit(1);\
   }\
   else {\
      fprintf(stdout, "gutchk pass:  '" #_CNDTN_ "'\n");\
   }

/*
---------------------------------------------------------
MULTI-FILE TEST SUITE MACROS
----------------------------------------------------------

I struggled trying to figure this out in a way that was
as simple as possible. I wanted to be able to define
the test suite in one object file, then refer it within
the other one within the minimum amount of typing.

Unfortunately without resorting to some supermacro
work, I could only find a happy comprimise.

See test_multi.c for an example.
*/

/* The following macros are used in your separate object
file to define your test suite.  */


#define FCTMF_FIXTURE_SUITE_BGN(NAME) \
	void NAME (fctkern_t *fctkern_ptr__) {\
        FCT_REFERENCE_FUNCS();\
        FCT_FIXTURE_SUITE_BGN( NAME ) {

#define FCTMF_FIXTURE_SUITE_END() \
		} FCT_FIXTURE_SUITE_END();\
	}

#define FCTMF_SUITE_BGN(NAME) \
	void NAME (fctkern_t *fctkern_ptr__) {\
        FCT_REFERENCE_FUNCS();\
        FCT_SUITE_BGN( NAME ) {
#define FCTMF_SUITE_END() \
       } FCT_SUITE_END(); \
   }


/* Deprecated, no longer required. */
#define FCTMF_SUITE_DEF(NAME)


/* Executes a test suite defined by FCTMF_SUITE* */
#define FCTMF_SUITE_CALL(NAME)  {\
    void NAME (fctkern_t *);\
    NAME (fctkern_ptr__);\
    }


/*
---------------------------------------------------------
FCT QUICK TEST API
----------------------------------------------------------
The goal of these little macros is to try and get you
up and running with a test as quick as possible.

The basic idea is that there is one test per test suite.
*/

#define FCT_QTEST_BGN(NAME) \
	FCT_SUITE_BGN(NAME) {\
		FCT_TEST_BGN(NAME) {\
 
#define FCT_QTEST_END() \
		} FCT_TEST_END();\
	} FCT_SUITE_END();


#define FCT_QTEST_BGN_IF(_CONDITION_, _NAME_) \
	FCT_SUITE_BGN(_NAME_) {\
		FCT_TEST_BGN_IF(_CONDITION_, _NAME_) {\
 
#define FCT_QTEST_END_IF() \
		} FCT_TEST_END_IF();\
	} FCT_SUITE_END();

#endif /* !FCT_INCLUDED__IMB */
