From 6ac57af143aa023231e4851af5cc16f83f96644d Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Thu, 21 Jul 2022 16:39:23 +0200 Subject: tests: Add tests for new locale verification --- tests/meson.build | 15 +++++++++ tests/util.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 tests/util.c diff --git a/tests/meson.build b/tests/meson.build index 697b4ac..d4a2570 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -70,3 +70,18 @@ else test(test_name, find_program('sh'), args: ['-c', 'exit 77']) endforeach endif + +tests = [ 'util' ] + +deps = [ + gio_unix_dep, + glib_dep, + polkit_gobject_dep, +] + +foreach test_name : tests + exe = executable(test_name, '@0@.c'.format(test_name), + include_directories: top_inc, + dependencies: deps) + test(test_name, exe) +endforeach diff --git a/tests/util.c b/tests/util.c new file mode 100644 index 0000000..b330a82 --- /dev/null +++ b/tests/util.c @@ -0,0 +1,96 @@ +#include +#undef _DEFAULT_SOURCE +#include "src/util.c" + +int +main (int argc, + char **argv) +{ + guint i; + + setlocale(LC_ALL, "C.UTF-8"); + + if (argc > 1) { + for (i = 1; i < argc; i++) { + g_autofree char *language = NULL; + g_autofree char *territory = NULL; + g_autofree char *codeset = NULL; + g_autofree char *modifier = NULL; + + explode_locale (argv[i], + &language, + &territory, + &codeset, + &modifier); + + g_print ("Locale: %s\n", argv[i]); + g_print ("\tlanguage: %s\n", language); + g_print ("\tterritory: %s\n", territory); + g_print ("\tcodeset: %s\n", codeset); + g_print ("\tmodifier: %s\n", modifier); + g_print ("\n"); + } + return 0; + } + + struct { + const char *locale; + const char *lang; + const char *territory; + const char *codeset; + const char *modifier; + } tests[] = { + { "en", "en", NULL, NULL, NULL }, + { "en_GB", "en", "GB", NULL, NULL }, + { "en_GB.UTF-8", "en", "GB", "UTF-8", NULL }, + { "en_GB.UTF-8@latin", "en", "GB", "UTF-8", "latin" }, + { "en_GB@latin", "en", "GB", NULL, "latin" }, + { "en_GB.iso8859-1", "en", "GB", "iso8859-1", NULL }, + { "1234", NULL, NULL, NULL, NULL }, + { "Test Language 1", NULL, NULL, NULL, NULL }, + { "en_GB.UTF-8@latin WOOP", NULL, NULL, NULL, NULL }, + { "ace", "ace", NULL, NULL, NULL }, + { "be@latin", "be", NULL, NULL, "latin" }, + { "ca.us-ascii", "ca", NULL, "us-ascii", NULL }, + { "cs.cp1250", "cs", NULL, "cp1250", NULL }, + /* qaa-qtz is a fake locale erroneously generated by some + * downstream distributions because of a mistaken entry + * shipped in iso-codes. The ISO 639.2 registration authority + * intended all codes starting with "q" less than "qu" to be + * reserved for local use. Ensure the fake locale isn't + * allowed. */ + { "qaa-qtz", NULL, NULL, NULL, NULL }, + { "ru_RU.KOI8-R", "ru", "RU", "KOI8-R", NULL }, + { "", NULL, NULL, NULL, NULL }, + { NULL }, + }; + + for (i = 0; tests[i].locale != NULL; i++) { + guint mask = 0; + g_autofree char *language = NULL; + g_autofree char *territory = NULL; + g_autofree char *codeset = NULL; + g_autofree char *modifier = NULL; + int verify = 0; + + g_test_message ("Testing locale %s", tests[i].locale); + + mask = explode_locale (tests[i].locale, + &language, + &territory, + &codeset, + &modifier); + g_assert_cmpstr (language, ==, tests[i].lang); + g_assert_cmpstr (territory, ==, tests[i].territory); + g_assert_cmpstr (codeset, ==, tests[i].codeset); + g_assert_cmpstr (modifier, ==, tests[i].modifier); + + verify = verify_xpg_locale (tests[i].locale) ? 1 : 0; + g_assert_cmpint (verify, ==, language != NULL); + g_assert_cmpint (!!mask, ==, verify); + } + + g_assert_cmpint (!!verify_locale (""), ==, TRUE); + + return 0; +} -- cgit v1.2.1