Files
allhaileris afb81b8278
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled
init
2026-02-16 15:50:16 +03:00

303 lines
8.4 KiB
C

/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2; tab-width: 2 -*- */
/*
* test-nimf-m17n.c
* This file is part of Nimf.
*
* Copyright (C) 2019 Hodong Kim <cogniti@gmail.com>
*
* Nimf is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Nimf is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; If not, see <http://www.gnu.org/licenses/>.
*/
#include <glib.h>
#include <m17n.h>
#include "nimf-m17n.h"
static gint
on_sort_by_group (gconstpointer a,
gconstpointer b)
{
g_debug (G_STRLOC ": %s", G_STRFUNC);
const NimfMethodInfo *info1 = *(NimfMethodInfo **) a;
const NimfMethodInfo *info2 = *(NimfMethodInfo **) b;
return g_strcmp0 (info1->group, info2->group);
}
static gint
on_sort_by_method_id (gconstpointer a,
gconstpointer b)
{
g_debug (G_STRLOC ": %s", G_STRFUNC);
const NimfMethodInfo *info1 = *(NimfMethodInfo **) a;
const NimfMethodInfo *info2 = *(NimfMethodInfo **) b;
return g_strcmp0 (info1->method_id, info2->method_id);
}
/* This method is very slow */
static NimfMethodInfo **
nimf_m17n_get_method_infos (const gchar *lang_code)
{
g_debug (G_STRLOC ": %s", G_STRFUNC);
NimfMethodInfo *info;
MPlist *imlist, *pl;
M17N_INIT();
GPtrArray *array = g_ptr_array_new ();
imlist = minput_list (Mnil);
for (pl = imlist; mplist_key (pl) != Mnil; pl = mplist_next (pl))
{
MPlist *p = mplist_value (pl);
MSymbol lang, name, sane;
lang = mplist_value (p);
p = mplist_next (p);
name = mplist_value (p);
p = mplist_next (p);
sane = mplist_value (p);
if (sane == Mt)
{
const gchar *code = msymbol_name (lang);
if (lang_code && g_strcmp0 (code, lang_code))
continue;
info = nimf_method_info_new ();
info->method_id = g_strdup_printf ("%s:%s", code, msymbol_name (name));
info->label = g_strdup_printf ("%s", msymbol_name (name));
g_ptr_array_add (array, info);
}
}
g_ptr_array_sort (array, on_sort_by_group);
g_ptr_array_add (array, NULL);
m17n_object_unref (imlist);
M17N_FINI();
return (NimfMethodInfo **) g_ptr_array_free (array, FALSE);
}
static void
test_nimf_m17n_available_languages ()
{
NimfMethodInfo **infos;
GHashTable *code_table;
GHashTable *c_table;
GHashTable *icon_table;
gint i;
GDir *dir;
code_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
c_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
icon_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
infos = nimf_m17n_get_method_infos (NULL);
for (i = 0; infos[i]; i++)
{
gchar **strv;
strv = g_strsplit (infos[i]->method_id, ":", 2);
if (!M17N_CHECK_VERSION (1, 8, 0) && !g_strcmp0 (strv[0], "ua"))
strv[0][1] = 'k';
g_hash_table_add (code_table, g_strdup (strv[0]));
g_strfreev (strv);
}
dir = g_dir_open (".", 0, NULL);
const gchar *filename;
while ((filename = g_dir_read_name (dir)))
{
if (g_str_has_prefix (filename, "nimf-m17n-") &&
g_str_has_suffix (filename, ".c"))
{
gchar *code;
if (!M17N_CHECK_VERSION (1, 8, 0) &&
!g_strcmp0 (filename, "nimf-m17n-hu.c"))
continue;
g_print ("Check if %s available.\n", filename);
code = g_strndup (strlen ("nimf-m17n-") + filename,
strlen (filename) - strlen (".c") - strlen ("nimf-m17n-"));
g_hash_table_add (c_table, code);
g_print ("Added key to c_table: %s\n", code); // 추가된 디버그 메시지
g_assert_true (g_hash_table_contains (code_table, code));
}
}
g_dir_close (dir);
dir = g_dir_open ("./icons/scalable", 0, NULL);
while ((filename = g_dir_read_name (dir)))
{
if (g_str_has_prefix (filename, "nimf-m17n-") &&
g_str_has_suffix (filename, ".svg"))
{
gchar *code;
if (!M17N_CHECK_VERSION (1, 8, 0) &&
!g_strcmp0 (filename, "nimf-m17n-hu.svg"))
continue;
g_print ("Check if %s is available.\n", filename);
code = g_strndup (strlen ("nimf-m17n-") + filename,
strlen (filename) - strlen (".svg") - strlen ("nimf-m17n-"));
g_hash_table_add (icon_table, code);
g_print ("Added key to icon_table: %s\n", code); // 디버그 메시지 추가
g_assert_true (g_hash_table_contains (code_table, code));
}
}
g_dir_close (dir);
GHashTableIter iter;
gpointer key;
g_hash_table_iter_init (&iter, code_table);
while (g_hash_table_iter_next (&iter, &key, NULL))
{
g_print ("Check if %s is exists.\n", (const gchar *) key);
if (!g_strcmp0 (key, "en") ||
!g_strcmp0 (key, "ja") ||
!g_strcmp0 (key, "ko") ||
!g_strcmp0 (key, "zh"))
continue;
g_print ("Checking key in c_table: %s\n", (const gchar *) key); // 추가된 디버그 메시지
g_assert_nonnull (g_hash_table_lookup (c_table, key));
g_print ("Checking key in icon_table: %s\n", (const gchar *) key); // 추가된 디버그 메시지
g_assert_nonnull (g_hash_table_lookup (icon_table, key));
}
g_hash_table_unref (code_table);
g_hash_table_unref (c_table);
g_hash_table_unref (icon_table);
nimf_method_info_freev (infos);
}
static void
test_nimf_m17n_available_method_infos ()
{
GDir *dir;
const gchar *filename;
NimfMethodInfo ** (* get_method_infos) ();
dir = g_dir_open (".libs", 0, NULL);
while ((filename = g_dir_read_name (dir)))
{
if (g_str_has_suffix (filename, ".so") && g_strcmp0 (filename, "libnimf-m17n.so"))
{
gchar *code;
NimfMethodInfo **infos1;
NimfMethodInfo **infos2;
GModule *module;
gchar *path;
gchar *symname;
gint i;
GPtrArray *array1;
GPtrArray *array2;
code = g_strndup (strlen ("libnimf-m17n-") + filename,
strlen (filename) - 3 - strlen ("libnimf-m17n-"));
path = g_build_path ("/", ".libs", filename, NULL);
g_print ("Check method infos of %s\n", path);
module = g_module_open (path, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
symname = g_strdup_printf ("nimf_m17n_%s_get_method_infos", code);
g_module_symbol (module, symname, (gpointer *) &get_method_infos);
if (!M17N_CHECK_VERSION (1, 8, 0) && !g_strcmp0 (code, "uk"))
code[1] = 'a';
infos1 = nimf_m17n_get_method_infos (code);
infos2 = get_method_infos ();
array1 = g_ptr_array_new ();
array2 = g_ptr_array_new ();
for (i = 0; ; i++)
{
if (infos1[i] == NULL)
{
g_assert_null (infos2[i]);
break;
}
g_assert_nonnull (infos2[i]);
g_ptr_array_add (array1, infos1[i]);
g_ptr_array_add (array2, infos2[i]);
}
g_ptr_array_sort (array1, on_sort_by_method_id);
g_ptr_array_sort (array2, on_sort_by_method_id);
g_ptr_array_add (array1, NULL);
g_ptr_array_add (array2, NULL);
g_free (infos1);
g_free (infos2);
infos1 = (NimfMethodInfo **) g_ptr_array_free (array1, FALSE);
infos2 = (NimfMethodInfo **) g_ptr_array_free (array2, FALSE);
for (i = 0; infos1[i]; i++)
{
g_print ("Check %s\n", infos1[i]->method_id);
if (!M17N_CHECK_VERSION (1, 8, 0) && !g_strcmp0 (code, "ua"))
infos1[i]->method_id[1] = 'k';
g_assert_cmpstr (infos1[i]->method_id, ==, infos2[i]->method_id);
g_assert_cmpstr (infos1[i]->label, ==, infos2[i]->label);
g_assert_cmpstr (infos1[i]->group, ==, infos2[i]->group);
}
nimf_method_info_freev (infos1);
nimf_method_info_freev (infos2);
g_module_close (module);
g_free (symname);
g_free (path);
g_free (code);
}
}
g_dir_close (dir);
}
int
main (int argc, char *argv[])
{
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/nimf_m17n_available_languages/test", test_nimf_m17n_available_languages);
g_test_add_func ("/nimf_m17n_available_method_infos/test", test_nimf_m17n_available_method_infos);
return g_test_run ();
}