#include <stdio.h>
#include <stdlib.h>
#include <check.h>

#include "libharkio3.h"

START_TEST(test_setlevel_env)
{
    printf("Don't set env log level:\n");
    harkio_Log_printf(harkio_Log_Trace, "trace msg");
    harkio_Log_printf(harkio_Log_Debug, "debug msg");
    harkio_Log_printf(harkio_Log_Info, "info msg");
    harkio_Log_printf(harkio_Log_Warning, "warning msg");
    harkio_Log_printf(harkio_Log_Error, "error msg");

    printf("Set env Log_Error:\n");
    harkio_Log_setLevel(-1); // reset
    putenv("HARKIO_LOG_LEVEL=Error");
    harkio_Log_printf(harkio_Log_Trace, "trace msg");
    harkio_Log_printf(harkio_Log_Debug, "debug msg");
    harkio_Log_printf(harkio_Log_Info, "info msg");
    harkio_Log_printf(harkio_Log_Warning, "warning msg");
    harkio_Log_printf(harkio_Log_Error, "error msg");

    printf("Set env Log_Warning:\n");
    harkio_Log_setLevel(-1); // reset
    putenv("HARKIO_LOG_LEVEL=Warning");
    harkio_Log_printf(harkio_Log_Trace, "trace msg");
    harkio_Log_printf(harkio_Log_Debug, "debug msg");
    harkio_Log_printf(harkio_Log_Info, "info msg");
    harkio_Log_printf(harkio_Log_Warning, "warning msg");
    harkio_Log_printf(harkio_Log_Error, "error msg");

    printf("Set env Log_Info:\n");
    harkio_Log_setLevel(-1); // reset
    putenv("HARKIO_LOG_LEVEL=Info");
    harkio_Log_printf(harkio_Log_Trace, "trace msg");
    harkio_Log_printf(harkio_Log_Debug, "debug msg");
    harkio_Log_printf(harkio_Log_Info, "info msg");
    harkio_Log_printf(harkio_Log_Warning, "warning msg");
    harkio_Log_printf(harkio_Log_Error, "error msg");

    printf("Set env Log_Debug:\n");
    harkio_Log_setLevel(-1); // reset
    putenv("HARKIO_LOG_LEVEL=Debug");
    harkio_Log_printf(harkio_Log_Trace, "trace msg");
    harkio_Log_printf(harkio_Log_Debug, "debug msg");
    harkio_Log_printf(harkio_Log_Info, "info msg");
    harkio_Log_printf(harkio_Log_Warning, "warning msg");
    harkio_Log_printf(harkio_Log_Error, "error msg");

    printf("Set env Log_Trace:\n");
    harkio_Log_setLevel(-1); // reset
    putenv("HARKIO_LOG_LEVEL=Trace");
    harkio_Log_printf(harkio_Log_Trace, "trace msg");
    harkio_Log_printf(harkio_Log_Debug, "debug msg");
    harkio_Log_printf(harkio_Log_Info, "info msg");
    harkio_Log_printf(harkio_Log_Warning, "warning msg");
    harkio_Log_printf(harkio_Log_Error, "error msg");
}
END_TEST

START_TEST(test_setlevel)
{
    printf("Set Log_Error:\n");
    harkio_Log_setLevel(harkio_Log_Error);
    harkio_Log_printf(harkio_Log_Trace, "trace msg");
    harkio_Log_printf(harkio_Log_Debug, "debug msg");
    harkio_Log_printf(harkio_Log_Info, "info msg");
    harkio_Log_printf(harkio_Log_Warning, "warning msg");
    harkio_Log_printf(harkio_Log_Error, "error msg");

    printf("Set Log_Warning:\n");
    harkio_Log_setLevel(harkio_Log_Warning);
    harkio_Log_printf(harkio_Log_Trace, "trace msg");
    harkio_Log_printf(harkio_Log_Debug, "debug msg");
    harkio_Log_printf(harkio_Log_Info, "info msg");
    harkio_Log_printf(harkio_Log_Warning, "warning msg");
    harkio_Log_printf(harkio_Log_Error, "error msg");

    printf("Set Log_Info:\n");
    harkio_Log_setLevel(harkio_Log_Info);
    harkio_Log_printf(harkio_Log_Trace, "trace msg");
    harkio_Log_printf(harkio_Log_Debug, "debug msg");
    harkio_Log_printf(harkio_Log_Info, "info msg");
    harkio_Log_printf(harkio_Log_Warning, "warning msg");
    harkio_Log_printf(harkio_Log_Error, "error msg");

    printf("Set Log_Debug:\n");
    harkio_Log_setLevel(harkio_Log_Debug);
    harkio_Log_printf(harkio_Log_Trace, "trace msg");
    harkio_Log_printf(harkio_Log_Debug, "debug msg");
    harkio_Log_printf(harkio_Log_Info, "info msg");
    harkio_Log_printf(harkio_Log_Warning, "warning msg");
    harkio_Log_printf(harkio_Log_Error, "error msg");

    printf("Set Log_Trace:\n");
    harkio_Log_setLevel(harkio_Log_Trace);
    harkio_Log_printf(harkio_Log_Trace, "trace msg");
    harkio_Log_printf(harkio_Log_Debug, "debug msg");
    harkio_Log_printf(harkio_Log_Info, "info msg");
    harkio_Log_printf(harkio_Log_Warning, "warning msg");
    harkio_Log_printf(harkio_Log_Error, "error msg");
}
END_TEST

START_TEST(test_printlog)
{
    printf("test_printlog:\n");
    harkio_Log_printf(harkio_Log_Trace, "trace msg %-03u", 0);
    harkio_Log_printf(harkio_Log_Debug, "debug msg %+03d", 1);
    harkio_Log_printf(harkio_Log_Info, "info msg %f %#x", -2.5, 15);
    harkio_Log_printf(harkio_Log_Warning, "warning msg %s %#o %e", "日本語", 511, HARK_EPS);
    harkio_Log_printf(harkio_Log_Error, "error msg %c %s %d %o %x\n%16s %ld %1.0f %u %i", '1', "2", 3, 4, 5, "6", 7l, 8.0, 9, 10);
}
END_TEST

START_TEST(test_helper)
{
    printf("test_helper:\n");
    harkio_Log_FileOpenFailed("test");
    harkio_Log_WrongValue("test1", "test2");
    harkio_Log_NullPointer("test");
}
END_TEST


Suite* str_suite(void)
{
    Suite *suite = suite_create("libharkio3_log");

    TCase *tcase1 = tcase_create("output log");
    tcase_add_test(tcase1, test_setlevel_env);
    tcase_add_test(tcase1, test_setlevel);
    tcase_add_test(tcase1, test_printlog);
    tcase_add_test(tcase1, test_helper);
    suite_add_tcase(suite, tcase1);

    return suite;
}

int main(int argc, char *argv[])
{
    int number_failed;
    Suite *suite = str_suite();
    SRunner *runner = srunner_create(suite);
    srunner_run_all(runner, CK_NORMAL);
    number_failed = srunner_ntests_failed(runner);
    srunner_free(runner);
    return number_failed;
}
