/* 

 * Copyright (c) 2012-2017 The Khronos Group Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdarg.h>

#ifdef _MSC_VER
#include <direct.h>
#elif defined __linux__ || defined __CYGWIN__
#include <unistd.h>
#endif


#define HAVE_TIME_H

#ifdef HAVE_TIME_H
#include <time.h>
#endif

#include "test.h"

char CT_EXTENDED_ARG_BEGIN[] = {'\0'};
char CT_EXTENDED_ARG_END[] = {'\0'};

#ifdef _MSC_VER
#  undef setenv
#  define setenv(name, value, overwrite) _putenv_s(name, value)
#elif defined __linux__
int setenv(const char* name, const char* value, int overwite);
#else
#  define setenv(...)
#endif

#ifdef CT_TEST_TIME

#ifdef HAVE_SYS_TIME_H
#include <sys/time.h> // gettimeofday
#endif
#include <time.h>
#if defined __MACH__ && defined __APPLE__
#include <mach/mach_time.h>
#endif

#if defined WIN32 || defined _WIN32 || defined WINCE
#include <windows.h> // QueryPerformanceFrequency / QueryPerformanceCounter
#endif

static int64_t CT_getTickCount(void)
{
#if defined WIN32 || defined _WIN32 || defined WINCE
    LARGE_INTEGER counter;
    QueryPerformanceCounter(&counter);
    return (int64_t)counter.QuadPart;
#elif defined __linux || defined __linux__
    struct timespec tp;
    clock_gettime(CLOCK_MONOTONIC, &tp);
    return (int64_t)tp.tv_sec * 1e9 + tp.tv_nsec;
#elif defined __MACH__ && defined __APPLE__
    return (int64_t)mach_absolute_time();
#else
    struct timeval tv;
    struct timezone tz;
    gettimeofday(&tv, &tz);
    return (int64_t)tv.tv_sec * 1e6 + tv.tv_usec;
#endif
}

static double CT_getTickFrequency(void)
{
#if defined WIN32 || defined _WIN32 || defined WINCE
    LARGE_INTEGER freq;
    QueryPerformanceFrequency(&freq);
    return (double)freq.QuadPart;
#elif defined __linux || defined __linux__
    return 1e9;
#elif defined __MACH__ && defined __APPLE__
    static double freq = 0;
    if(freq == 0)
    {
        mach_timebase_info_data_t sTimebaseInfo;
        mach_timebase_info(&sTimebaseInfo);
        freq = sTimebaseInfo.denom * 1e9 / sTimebaseInfo.numer;
    }
    return freq;
#else
    return 1e6;
#endif
}

static double g_tickFreq = 0;

static int g_timeShow =
#ifdef CT_TIME_SHOW
        1
#else
        0
#endif
        ;
#endif

#define CT_LOGF(...)            \
    do {                        \
        printf(__VA_ARGS__);    \
        fflush(stdout);         \
    } while(0)

struct CT_GC_Node
{
    CT_GCType           type_;
    void*               object_;
    CT_ObjectDestructor destructor_;
    struct CT_GC_Node*  next_;
};

struct CT_FailedTestEntry
{
    struct CT_TestCaseEntry*   testcase_;
    struct CT_TestEntry*       test_;
    int                        param_idx_;
    struct CT_FailedTestEntry* next_;
};

struct CT_GlobalContextBlackBox
{
    int g_quiet;
    int g_list_tests;

    int num_test_errors_;
    int g_num_failed_tests_;
    int g_num_disabled_tests_;
    struct CT_GC_Node* gc_chain_;

    struct CT_FailedTestEntry* g_failed_tests_;
    struct CT_FailedTestEntry* g_failed_tests_end_;
};

// testing context, it might be converted to be thread local some day
static struct CT_GlobalContextBlackBox g_context_internals = { 0 };
static struct CT_GlobalContext g_context = { 0, 0, 0, 0, &g_context_internals };
static int g_has_running_test = 0;
static int g_option_run_disabled_tests = 0;

struct CT_GlobalContext* CT() { return g_has_running_test ? & g_context : NULL; }

void CT_RecordFailure()
{
    if (!CT()->internal_->num_test_errors_)
        CT()->internal_->g_num_failed_tests_++;
    CT()->internal_->num_test_errors_++;
}

void CT_RecordFailureAt(const char* message, const char* func, const char* file, const int line)
{
    CT_RecordFailure();
    printf("\nFAILED at %20s:%d\n\t%s\n\n", file, line, message);
    fflush(stdout);
}

void CT_RecordFailureAtFormat(const char* message, const char* func, const char* file, const int line, ...)
{
    va_list args;

    CT_RecordFailure();

    printf("\nFAILED at %20s:%d\n\t", file, line);
    fflush(stdout); // just in case of mailformed "message"

    va_start(args, line);
    vprintf(message, args);
    va_end(args);

    printf("\n\n");
    fflush(stdout);
}

void CT_DumpMessage(const char* message, ...)
{
    va_list args;

    va_start(args, message);
    vprintf(message, args);
    va_end(args);

    printf("\n\n");
    fflush(stdout);
}

int CT_HasFailure()
{
    return CT()->internal_->num_test_errors_;
}

void CT_RegisterForGarbageCollection(void *object, CT_ObjectDestructor collector, CT_GCType type)
{
    struct CT_GlobalContextBlackBox* bb = CT()->internal_;
    struct CT_GC_Node* node = (struct CT_GC_Node*)ct_alloc_mem(sizeof(struct CT_GC_Node));

    if (!node)
    {
        CT_RecordFailure();
        return;
    }

    node->type_ = type > 0 ? type : CT_GC_OBJECT;
    node->object_ = object;
    node->destructor_ = collector;
    node->next_ = bb->gc_chain_;
    bb->gc_chain_ = node;
}

void CT_CollectGarbage(int type)
{
    struct CT_GlobalContextBlackBox* bb = CT()->internal_;
    struct CT_GC_Node* node = bb->gc_chain_;
    struct CT_GC_Node stub, *prev = &stub;
    stub.next_ = node;

    while(node)
    {
        struct CT_GC_Node* killme = node;
        node = node->next_;

        if(type == CT_GC_ALL || (CT_GCType)type == killme->type_)
        {
            killme->destructor_(&killme->object_);
            ct_free_mem(killme);
            prev->next_ = node;
        }
        else
        {
            prev = killme;
        }
    }

    bb->gc_chain_ = stub.next_;
}

#ifdef HAVE_VCS_VERSION_INC
# include "vcs_version.inc"
#endif
#ifndef VCS_VERSION_STR
# define VCS_VERSION_STR "unknown"
#endif

static void print_version(const char* version_str)
{
    printf("VxTests version: %s\n", version_str);
    printf("VCS version: " VCS_VERSION_STR "\n");
    printf("Build config: "
#ifdef DEBUG
        "Debug"
#elif NDEBUG
        "Release"
#else
        "unknown"
#endif
        "\n\n");
    fflush(stdout);
}


static int isNameMatches(const char* str, const char *pattern)
{
    switch (*pattern)
    {
    case '?':
        return (*str != '\0' && isNameMatches(str + 1, pattern + 1) != 0) ? 1 : 0;
    case '*':
        return ((*str != '\0' && isNameMatches(str + 1, pattern) != 0) ||
                isNameMatches(str, pattern + 1) != 0) ? 1 : 0;
    case '\0': case ':': case '\n':
        return (*str == '\0' || *str == '/') ? 1 : 0;
    default:
        return (*pattern == *str &&
                isNameMatches(str + 1, pattern + 1) != 0) ? 1 : 0;
    }
}


// accepts filters like gtest with some changes for "negative" tests
static int filterTestName(const char* test_name, const char* fullFilter)
{
    const char *cur_pattern = fullFilter;
    int result = 0;
    if (fullFilter == NULL)
    {
        result = 1; // no filter
    }
    else
    {
        for (;;)
        {
            int negative = 0;
            if (*cur_pattern == '-')
            {
                negative = 1;
                cur_pattern++;
            }
            if (result == 0 || negative == 1)
            {
                if (isNameMatches(test_name, cur_pattern) != 0)
                {
                    if (negative)
                        return 0;
                    result = 1;
                }
            }

            cur_pattern = strchr(cur_pattern, ':');

            if (cur_pattern == NULL)
                break;
            cur_pattern++;
        }
    }

    if (result && !g_option_run_disabled_tests && strstr(test_name, "DISABLED") != NULL)
    {
        g_context.internal_->g_num_disabled_tests_++;
        result = 0;
    }

    return result;
}

static uint64_t fnv1a(const char *str)
{
    uint64_t hval = 0xCBF29CE484222325ULL;
    const unsigned char *s = (const unsigned char *)str;

    while (*s)
    {
        hval ^= (uint64_t)*s++;
        hval *= 0x100000001B3ULL;
    }

    return hval;
}

extern CT_RegisterTestCaseFN g_testcase_register_fns[];
static struct CT_TestCaseEntry* g_firstTestCase = NULL;
static const char* g_test_filter = NULL;

static void* get_test_params(struct CT_TestEntry* test, int param_idx)
{
    return test->args_ ? (void*)(((uint8_t*)test->args_) + test->arg_size_ * param_idx) : NULL;
}

static void get_test_name(char* buf, int bufsz, struct CT_TestCaseEntry* testcase, struct CT_TestEntry* test, void* parg, int param_idx)
{
    const char* test_name = test->name_;
    if (strncmp(test_name, "test_", 5) == 0)
        test_name += 5;
    else if (strncmp(test_name, "test", 4) == 0)
        test_name += 4;
    if (parg)
        snprintf(buf, bufsz, "%s.%s/%d/%s", testcase->name_, test_name, param_idx, *(const char**)parg);
    else
        snprintf(buf, bufsz, "%s.%s", testcase->name_, test_name);
}

static int update_extended_flag(void* parg, int* extended_flag)
{
    if (parg)
    {
        if (*(const char**)parg == CT_EXTENDED_ARG_BEGIN)
        {
            *extended_flag = 1;
            return 1;
        }
        else if (*(const char**)parg == CT_EXTENDED_ARG_END)
        {
            *extended_flag = 0;
            return 1;
        }
    }
    return 0;
}

static int run_test(struct CT_TestCaseEntry* testcase, struct CT_TestEntry* test, int param_idx, int run_tests, int* extended_flag)
{
    char test_name[1024];
    void *parg = get_test_params(test, param_idx);
    get_test_name(test_name, sizeof(test_name), testcase, test, parg, param_idx);

    if (update_extended_flag(parg, extended_flag))
        return 0;

    if (*extended_flag && !ct_check_any_size())
        return 0;

    if (filterTestName(test_name, g_test_filter))
    {
        if (g_context.internal_->g_list_tests)
        {
            CT_LOGF("%s\n", test_name);
            return 0;
        }
        else
        {
            char timestr[256] = {0};
#ifdef CT_TEST_TIME
            int64_t timestart;
#endif

            if (run_tests == 0 && !g_context.internal_->g_quiet)
                CT_LOGF("[ -------- ] tests from %s\n", testcase->name_);

            // setup global test execution context
            g_context.testname_     = test_name;
            g_context.seed_         = fnv1a(test_name);
            g_context.arg_          = parg;
            g_context.user_context_ = NULL;
            g_context.internal_->num_test_errors_ = 0;

            if (g_context.internal_->g_quiet)
            {
                CT_LOGF("[ RUN      ] %s ...\n", test_name);
            }
            else
            {
                CT_LOGF("[ RUN %04d ] %s ...\n", run_tests+1, test_name);
            }

            g_has_running_test = 1; /* GO! */

#ifdef CT_TEST_TIME
            timestart = CT_getTickCount();
#endif

            // test setup
            g_context.user_context_ = (testcase->setupFn_) ? testcase->setupFn_() : NULL;

            if (!CT_HasFailure()) /* no errors during test setup */
            {
                // test body
                test->test_fn_(g_context.user_context_, parg);

                //test teardown
                if (testcase->teardownFn_) testcase->teardownFn_(g_context.user_context_);
            }
            else
            {
                /* do not call teardown if setup is failed*/
                CT_LOGF("[ !FAILED! ] Test setup\n");
            }

            // release automatic resources
            CT_CollectGarbage(CT_GC_ALL);

            g_has_running_test = 0; /* FIN! */

#ifdef CT_TEST_TIME
            if (g_timeShow)
                snprintf(timestr, sizeof(timestr), " (%.1f ms)", (CT_getTickCount() - timestart) * 1000. / g_tickFreq);
#endif

            CT_LOGF("[ %s ] %s%s\n",
                (g_context.internal_->num_test_errors_) ? "!FAILED!" : "    DONE", test_name, timestr);

            if (g_context.internal_->num_test_errors_)
            {
                struct CT_FailedTestEntry* f = (struct CT_FailedTestEntry*)(ct_alloc_mem(sizeof(*f)));
                f->testcase_ = testcase;
                f->test_ = test;
                f->param_idx_ = param_idx;
                f->next_ = NULL;

                if (g_context.internal_->g_failed_tests_end_)
                    g_context.internal_->g_failed_tests_end_->next_ = f;
                else
                    g_context.internal_->g_failed_tests_ = f;
                g_context.internal_->g_failed_tests_end_ = f;
            }
            return 1; // test was executed
        }
    }
    return 0; // test is skipped
}

int CT_main(int argc, char* argv[], const char* version_str)
{
    const char* testid_str = 0;
    int arg;
    int total_tests = 0;
    int total_testcases = 0;
    int total_run_tests = 0;
    int total_run_testcases = 0;

    //================ OpenVX Specific ===================
    int total_openvx_core_tests = 0;
    int total_openvx_passed_core_tests = 0;
    int total_openvx_failed_core_tests = 0;
#ifdef OPENVX_USE_NN
    int total_openvx_nn_tests = 0;
    int total_openvx_passed_nn_tests = 0;
    int total_openvx_failed_nn_tests = 0;
#endif
#ifdef OPENVX_USE_IX
    int total_openvx_ix_tests = 0;
    int total_openvx_passed_ix_tests = 0;
    int total_openvx_failed_ix_tests = 0;
#endif
    //====================================================

    int use_global_context = 0;

#ifdef CT_TEST_TIME
    int64_t timestart_all;
#endif

    struct CT_TestCaseEntry* testcase = 0;

    for (arg = 1; arg < argc; arg++)
    {
        const char* argStr = argv[arg];
        if (memcmp(argStr, "--filter=", 9) == 0)
        {
            if (g_test_filter)
            {
                // TODO add message
                return 1;
            }
            g_test_filter = argStr + 9;
        }
        else if (strcmp(argStr, "--verbose") == 0)
        {
            setenv("VX_ZONE_LIST", "0,1", 1);
        }
        else if (memcmp(argStr, "--global_context=", 17) == 0)
        {
            use_global_context = atoi(argStr + 17);
        }
        else if (memcmp(argStr, "--run_disabled", 14) == 0)
        {
            g_option_run_disabled_tests = 1;
        }
        else if (memcmp(argStr, "--check_any_size=", 17) == 0)
        {
            ct_set_check_any_size(atoi(argStr + 17) != 0);
        }
        else if (memcmp(argStr, "--testid=", 9) == 0)
        {
            testid_str = argStr + 9;
        }
        else if (memcmp(argStr, "--list_tests", 9) == 0)
        {
            g_context.internal_->g_list_tests = 1;
        }
        else if (memcmp(argStr, "--quiet", 8) == 0)
        {
            g_context.internal_->g_quiet = 1;
        }
        else if (memcmp(argStr, "--show_test_duration=", 21) == 0)
        {
#ifdef CT_TEST_TIME
            g_timeShow = (atoi(argStr + 21) != 0);
#else
            // nothing, ignore option
#endif
        }
        else if (memcmp(argStr, "--help", 7) == 0)
        {
            print_version(version_str);
            printf("Usage:\n");
            printf("    %s [--filter=<filter>] [--run_disabled] [--global_context=0|1] [--check_any_size=0|1] [--show_test_duration=0|1] [--verbose] [--testid=<testid>] [--list_tests] [--quiet]\n", argv[0]);
            printf("\n");
            printf("   <filter> - is GTest like filter, list of patterns separated by colon ':'.\n");
            printf("              Filter-out tests with '-' pattern's prefix.\n");
            printf("              Negative patterns have higher priority than positive patterns.\n\n");
            printf("   <testid> - report custom identifier for tests run\n\n");
            return 0;
        }
        else
        {
            printf("ERROR: Unknown option %s\n", argStr);
            return 1;
        }
    }

    if (!g_context.internal_->g_quiet)
        print_version(version_str);

    {
        struct CT_TestCaseEntry** ppLastTestCase = &g_firstTestCase;
        while (g_testcase_register_fns[total_testcases])
        {
            *ppLastTestCase = g_testcase_register_fns[total_testcases]();
            while (*ppLastTestCase)
                ppLastTestCase = &ppLastTestCase[0]->next_;
            total_testcases++;
        }
    }

    testcase = g_firstTestCase;
    while (testcase)
    {
        struct CT_TestEntry** ppLastTest = &testcase->tests_;
        int testcase_tests = 0;
        int test_id = 0;
        for (; testcase->test_register_fns_[test_id]; test_id++)
        {
            *ppLastTest = testcase->test_register_fns_[test_id]();
            while (*ppLastTest)
            {
                if (ppLastTest[0]->args_)
                {
                    int extended_flag = 0;
                    struct CT_TestEntry* test = ppLastTest[0];
                    int narg = 0;
                    for (; narg < test->args_count_; narg++)
                    {
                        void *parg = get_test_params(test, narg);
                        if (update_extended_flag(parg, &extended_flag))
                            continue;
                        if (extended_flag && !ct_check_any_size())
                            continue;
                        testcase_tests += 1;
                    }
                }
                else
                {
                    testcase_tests += 1;
                }
                ppLastTest[0]->testcase_ = testcase;
                ppLastTest = &ppLastTest[0]->next_;
            }
        }
        testcase->test_count_ = testcase_tests;
        total_tests += testcase_tests;
        testcase = testcase->next_;
    }


    if (!g_context.internal_->g_quiet)
    {
        printf("[ ======== ] Total %d tests from %d test cases\n", total_tests, total_testcases);
        if (g_test_filter)
            printf("Use test filter: %s\n\n", g_test_filter);
        printf("Use global OpenVX context: %s\n\n", use_global_context ? "TRUE" : "FALSE");
        printf("\n");
    }

#ifdef CT_TEST_TIME
    g_tickFreq = CT_getTickFrequency();
#endif

    if (use_global_context)
        ct_create_global_vx_context();

#ifdef CT_TEST_TIME
    timestart_all = CT_getTickCount();
#endif

    for (testcase = g_firstTestCase; testcase; testcase = testcase->next_)
    {
        int run_tests = 0;
        int extended_flag = 0;
        struct CT_TestEntry* test = testcase->tests_;

#ifdef CT_TEST_TIME
        int64_t timestart_testCase = CT_getTickCount();
#endif

        for(; test; test = test->next_)
        {
            if (!test->args_)
                run_tests += run_test(testcase, test, 0, run_tests, &extended_flag);
            else
            {
                int narg = 0;
                for (; narg < test->args_count_; narg++)
                    run_tests += run_test(testcase, test, narg, run_tests, &extended_flag);
            }
        }

        if (run_tests)
        {
            if (!g_context.internal_->g_quiet)
            {
                char timestr[256] = {0};
#ifdef CT_TEST_TIME
                if (g_timeShow)
                    snprintf(timestr, sizeof(timestr), " (%.1f ms)", (CT_getTickCount() - timestart_testCase) * 1000. / g_tickFreq);
#endif
                printf("[ -------- ] %d tests from test case %s%s\n\n", run_tests, testcase->name_, timestr);
            }

            //================ OpenVX Specific ===================
#ifdef OPENVX_USE_NN
            if (strcmp("TensorNN", testcase->name_) == 0) {
                total_openvx_nn_tests += run_tests;
            }
            else
#endif
#ifdef OPENVX_USE_IX
            if (strcmp("ExtensionObject", testcase->name_) == 0) {
                    total_openvx_ix_tests += run_tests;
            }
            else
#endif
            {
                    total_openvx_core_tests += run_tests;
            }
            //====================================================

            total_run_tests += run_tests;
            total_run_testcases++;
        }
    }

    if (!g_context.internal_->g_quiet)
    {
        char timestr[256] = {0};
#ifdef CT_TEST_TIME
        if (g_timeShow)
            snprintf(timestr, sizeof(timestr), " (%.1f ms)", (CT_getTickCount() - timestart_all) * 1000. / g_tickFreq);
#endif
        printf("[ ======== ]\n");
        printf("[ ALL DONE ] %d test(s) from %d test case(s) ran%s\n", total_run_tests, total_run_testcases, timestr);
        printf("[ PASSED   ] %d test(s)\n", total_run_tests - g_context.internal_->g_num_failed_tests_);

        if (g_context.internal_->g_num_failed_tests_ > 0)
        {
            struct CT_FailedTestEntry* f = g_context.internal_->g_failed_tests_;
            printf("[ FAILED   ] %d test(s), listed below:\n", g_context.internal_->g_num_failed_tests_);
            for(; f; f = f->next_)
            {
                char test_name[1024];
                void *parg = get_test_params(f->test_, f->param_idx_);
                get_test_name(test_name, sizeof(test_name), f->testcase_, f->test_, parg, f->param_idx_);
                printf("[ FAILED   ] %s\n", test_name);


                //================ OpenVX Specific ===================
#ifdef OPENVX_USE_NN
                if (strncmp("TensorNN", test_name, sizeof("TensorNN") - 1) == 0) {
                    total_openvx_failed_nn_tests ++;
                }
                else
#endif
#ifdef OPENVX_USE_IX
                if (strncmp("ExtensionObject", test_name, sizeof("ExtensionObject") - 1) == 0) {
                    total_openvx_failed_ix_tests ++;
                }
                else
#endif
                {
                    total_openvx_failed_core_tests ++;
                }
                //====================================================

            }
        }
        else
        {
            printf("[ FAILED   ] %d test(s)\n", g_context.internal_->g_num_failed_tests_);
        }
        printf("[ DISABLED ] %d test(s)\n", g_context.internal_->g_num_disabled_tests_);

        //================ OpenVX Specific ===================
        printf("\n");
        printf("=================================\n");
        printf("OpenVX Conformance report summary\n");
        printf("=================================\n");
        printf("\n");

        total_openvx_passed_core_tests = total_openvx_core_tests - total_openvx_failed_core_tests;
        printf("To be conformant to the OpenVX baseline, %d required test(s) must pass. %d tests passed, %d tests failed. %s.\n",
               total_openvx_core_tests, total_openvx_passed_core_tests, total_openvx_failed_core_tests,
               (total_openvx_failed_core_tests==0?"PASSED":"FAILED")
               );
#ifdef OPENVX_USE_NN
        total_openvx_passed_nn_tests = total_openvx_nn_tests - total_openvx_failed_nn_tests;
        printf("To be conformant to the Neural Network extension, %d required test(s) must pass. %d tests passed, %d tests failed. %s.\n",
               total_openvx_nn_tests, total_openvx_passed_nn_tests, total_openvx_failed_nn_tests,
               (total_openvx_failed_nn_tests==0?"PASSED":"FAILED")
               );
#endif
#ifdef OPENVX_USE_IX
        total_openvx_passed_ix_tests = total_openvx_ix_tests - total_openvx_failed_ix_tests;
        printf("To be conformant to the Import/Export extension, %d required test(s) must pass. %d tests passed, %d tests failed. %s.\n",
               total_openvx_ix_tests, total_openvx_passed_ix_tests, total_openvx_failed_ix_tests,
               (total_openvx_failed_ix_tests==0?"PASSED":"FAILED")
               );
#endif

        printf("Note: The %d disabled tests are optional and are not considered for conformance.\n",
               g_context.internal_->g_num_disabled_tests_);


        //====================================================
    }
    fflush(stdout);
    ct_release_global_vx_context();

    if (testid_str == 0)
    {
        if (g_test_filter)
            testid_str = "FILTERED";
        else
            testid_str = "ALL";
    }

    {
        char timebuf[64] = "YYYYMMDDHHMMSS";
#ifdef HAVE_TIME_H
        time_t t = time(NULL);
        struct tm *tmptr = localtime(&t);
        if (tmptr != NULL)
        {
            sprintf(timebuf, "%04d%02d%02d%02d%02d%02d",
                    tmptr->tm_year + 1900,
                    tmptr->tm_mon + 1,
                    tmptr->tm_mday,
                    tmptr->tm_hour,
                    tmptr->tm_min,
                    tmptr->tm_sec /* [0-60] (1 leap second) */);
        }
#endif
        // <identifier> <time and date> <test identifier> <total number of tests> <total tests disabled> <total tests started> <total tests run to completion> <total tests passed> <total tests failed>
        fprintf(g_context.internal_->g_quiet ? stderr : stdout,
                "\n#REPORT: %s %s %d %d %d %d %d %d (version %s)\n",
                timebuf,
                testid_str,
                total_tests,
                g_context.internal_->g_num_disabled_tests_,
                total_run_tests,
                total_run_tests,
                total_run_tests - g_context.internal_->g_num_failed_tests_,
                g_context.internal_->g_num_failed_tests_,
                version_str);
        fflush(g_context.internal_->g_quiet ? stderr : stdout);
    }

    return (g_context.internal_->g_num_failed_tests_ > 0) ? 1 : 0;
}
