/*
*****************************************************************************************
*
*   Copyright (C) 1996-2003, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
*****************************************************************************************
*/


#ifndef CTEST_H
#define CTEST_H

#include <stdarg.h>

#include "unicode/utypes.h"
#include "unicode/utrace.h"

/*Deals with imports and exports of the dynamic library*/
#if defined(_WIN32) || defined(U_CYGWIN)
    #define T_CTEST_EXPORT __declspec(dllexport)
    #define T_CTEST_IMPORT __declspec(dllimport)
#else
    #define T_CTEST_EXPORT
    #define T_CTEST_IMPORT
#endif

#ifdef __cplusplus
    #define C_CTEST_API extern "C"
#else
    #define C_CTEST_API
#endif

#ifdef T_CTEST_IMPLEMENTATION
    #define T_CTEST_API C_CTEST_API  T_CTEST_EXPORT
    #define T_CTEST_EXPORT_API T_CTEST_EXPORT
#else
    #define T_CTEST_API C_CTEST_API  T_CTEST_IMPORT
    #define T_CTEST_EXPORT_API T_CTEST_IMPORT
#endif



/* True and false for sanity. (removes ICU dependancy) */

#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif




/* prototypes *********************************/

typedef void (*TestFunctionPtr)(void);
typedef struct TestNode TestNode;

/**
 * Set this to zero to disable log_verbose() messages.
 * Otherwise nonzero to see log_verbose() messages.
 *
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_EXPORT_API extern int REPEAT_TESTS;

/**
 * Set this to zero to disable log_verbose() messages.
 * Otherwise nonzero to see log_verbose() messages.
 *
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_EXPORT_API extern int VERBOSITY;

/**
 * Set this to zero to disable log_verbose() messages.
 * Otherwise nonzero to see log_verbose() messages.
 *
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_EXPORT_API extern int ERR_MSG;

/**
 * Set this to zero to disable some of the slower tests.
 * Otherwise nonzero to run the slower tests.
 *
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_EXPORT_API extern int QUICK;

/**
 * Set this to nonzero to warn (not error) on missing data. 
 * Otherwise, zero will cause an error to be propagated when data is not available.
 * Affects the behavior of log_dataerr.
 *
 * @see log_data_err
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_EXPORT_API extern int WARN_ON_MISSING_DATA;

/**
 * ICU tracing level, is set by command line option
 *
 * @internal
 */
T_CTEST_EXPORT_API extern UTraceLevel ICU_TRACE;

/**
 * Show the names of all nodes.
 *
 * @param root Subtree of tests.
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_API void showTests ( const TestNode *root);

/**
 * Run a subtree of tests.
 *
 * @param root Subtree of tests.
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_API void runTests ( const TestNode* root);

/**
 * Add a test to the subtree.
 * Example usage:
 * <PRE>
 *     TestNode* root=NULL;
 *     addTest(&root, &mytest, "/a/b/mytest" );
 * </PRE>
 * @param root Pointer to the root pointer.
 * @param test Pointer to 'void function(void)' for actual test.
 * @param path Path from root under which test will be placed. Ex. '/a/b/mytest'
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_API void addTest ( TestNode** root,
           TestFunctionPtr test,
           const char *path);

T_CTEST_API void cleanUpTestTree(TestNode *tn);

/**
 * Retreive a specific subtest. (subtree).
 *
 * @param root Pointer to the root.
 * @param path Path relative to the root, Ex. '/a/b'
 * @return The subtest, or NULL on failure.
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_API const TestNode* getTest (const TestNode* root,
                                     const char *path);


/**
 * Log an error message. (printf style)
 * @param pattern printf-style format string
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_API void log_err(const char* pattern, ...);

/**
 * Log an informational message. (printf style)
 * @param pattern printf-style format string
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_API void log_info(const char* pattern, ...);

/**
 * Log an informational message. (vprintf style)
 * @param prefix a string that is output before the pattern and without formatting
 * @param pattern printf-style format string
 * @param ap variable-arguments list
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_API void vlog_info(const char *prefix, const char *pattern, va_list ap);

/**
 * Log a verbose informational message. (printf style)
 * This message will only appear if the global VERBOSITY is nonzero
 * @param pattern printf-style format string
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_API void log_verbose(const char* pattern, ...);

/**
 * Log an error message concerning missing data. (printf style)
 * If WARN_ON_MISSING_DATA is nonzero, this will case a log_info (warning) to be
 * printed, but if it is zero this will produce an error (log_err).
 * @param pattern printf-style format string
 * @internal Internal APIs for testing purpose only
 */
T_CTEST_API void log_data_err(const char *pattern, ...);

/**
 * Processes the command line arguments.
 * This is a sample implementation
 * <PRE>Usage: %s [ -l ] [ -v ] [ -? ] [ /path/to/test ]
 *        -l List only, do not run\
 *        -v turn OFF verbosity
 *        -? print this message</PRE>
 * @param root Testnode root with tests already attached to it
 * @param argv argument list from main (stdio.h)
 * @param argc argument list count from main (stdio.h)
 * @return positive for error count, 0 for success, negative for illegal argument
 * @internal Internal APIs for testing purpose only
 */

T_CTEST_API int processArgs(const TestNode* root,
                             int argc,
                             const char* const argv[]);


T_CTEST_API 
const char* getTestName(void);



#endif
