#include "../src/catalog.c" #include "../src/testing.h" #include "slurp.h" static const char *const FNAME = __FILE__ ".txt"; enum TEST_MSGCATALOG_ID { MSG_X_FIRST = 1, MSG_X_1, MSG_X_2, MSG_X_LAST, MSG_STANDALONE, }; static const char *const TEST_MSGS[] = { "", [MSG_X_FIRST]="First line\n", [MSG_X_1]="a second\n", [MSG_X_2]="a third\n", [MSG_X_LAST]="and the last one\n", [MSG_STANDALONE]="single line message\n", NULL }; static int test_i18n_init(void) { int rc = -1; test_start("i18n_init()"); { testing("simple call without touching the environment"); const int should_overwrite = 1; if (setenv(NLSPATH_KEY, "src/%N.en.cat", should_overwrite)) { logerr("setenv(\"%s\", \"src/%%N.en.cat\", 1): %s\n", NLSPATH_KEY, strerror(errno)); goto out; } if (i18n_init()) { logerr("i18n_init()\n"); goto out; } test_ok(); } rc = 0; out: if (i18n_destroy()) { logerr("i18n_destroy()\n"); rc = -1; } return rc; } static int test_s_print_msgs(void) { int rc = -1; test_start("s_print_msgs()"); FILE *file = NULL; char *str = NULL; { testing("message in range"); file = fopen(FNAME, "w"); if (!file) { perror("fopen(FNAME, \"w\")"); goto out; } if (s_print_msgs(TEST_MSGS, file, MSG_X_FIRST, MSG_X_LAST)) { logerr("print_msgs(TEST_MSGS, file, MSG_X_FIRST, MSG_X_LAST)\n"); goto out; } const int ret = fclose(file); file = NULL; if (ret) { logerr("fclose(file): %s\n", strerror(errno)); goto out; } if (slurp_for_tests(FNAME, &str)) { logerr("slurp_for_tests(FNAME, &str)\n"); goto out; } const char *const expected = "First line\n" "a second\n" "a third\n" "and the last one\n" ; assert(strcmp(expected, str) == 0); free(str); str = NULL; test_ok(); } { testing("range begin and end is the same"); file = fopen(FNAME, "w"); if (!file) { logerr("fopen(FNAME, \"w\"): %s\n", strerror(errno)); goto out; } if (s_print_msgs(TEST_MSGS, file, MSG_X_FIRST, MSG_X_FIRST)) { logerr("s_print_msgs(TEST_MSGS, file, MSG_X_FIRST, MSG_X_FIRST)\n"); goto out; } const int ret = fclose(file); file = NULL; if (ret) { logerr("fclose(file): %s\n", strerror(errno)); goto out; } if (slurp_for_tests(FNAME, &str)) { logerr("slurp_for_tests(FNAME, &str)\n"); goto out; } const char *const expected = "First line\n"; assert(strcmp(expected, str) == 0); free(str); str = NULL; test_ok(); } rc = 0; out: if (str) { free(str); } if (file) { if (fclose(file)) { logerr("fclose(file): %s\n", strerror(errno)); rc = -1; } } return rc; } static int test_s(void) { int rc = -1; test_start("_()"); FILE *file = NULL; char *str = NULL; { testing("empty string"); file = fopen(FNAME, "w"); if (!file) { perror("fopen(FNAME, \"w\")"); goto out; } // FIXME: implement correct test test_ok(); } rc = 0; out: if (str) { free(str); } if (file) { if (fclose(file)) { logerr("fclose(file): %s\n", strerror(errno)); rc = -1; } } return rc; } static int test_i18n_destroy(void) { int rc = -1; test_start("i18n_destroy()"); { testing("simple call without init first"); if (i18n_destroy()) { logerr("i18n_destroy()\n"); goto out; } test_ok(); } rc = 0; out: return rc; } static int test_s_print_msg(void) { int rc = -1; test_start("s_print_msg()"); FILE *file = NULL; char *str = NULL; { testing("simple individual message"); file = fopen(FNAME, "w"); if (!file) { logerr("fopen(FNAME, \"w\"): %s\n"); goto out; } if (s_print_msg(TEST_MSGS, file, MSG_STANDALONE)) { logerr("s_print_msg(TEST_MSGS, file, MSG_STANDALONE)\n"); goto out; } const int ret = fclose(file); file = NULL; if (ret) { logerr("fopen(file): %s\n", strerror(errno)); goto out; } if (slurp_for_tests(FNAME, &str)) { logerr("slurp_for_tests(FNAME, &str)\n"); goto out; } const char *const expected = "single line message\n"; assert(strcmp(expected, str) == 0); free(str); str = NULL; test_ok(); } rc = 0; out: if (str) { free(str); } if (file) { if (fclose(file)) { logerr("fclose(file): %s\n", strerror(errno)); rc = -1; } } return rc; } int main(void) { int rc = -1; if (test_i18n_init()) { logerr("test_i18n_init()\n"); goto out; } if (test_i18n_destroy()) { logerr("test_i18n_destroy()\n"); goto out; } if (test_s()) { logerr("test_s()\n"); goto out; } if (test_s_print_msgs()) { logerr("test_s_print_msgs()\n"); goto out; } if (test_s_print_msg()) { logerr("test_s_print_msg()\n"); goto out; } rc = 0; out: return !!rc; }