diff options
Diffstat (limited to 'src/tests/test-charsets.c')
-rw-r--r-- | src/tests/test-charsets.c | 98 |
1 files changed, 55 insertions, 43 deletions
diff --git a/src/tests/test-charsets.c b/src/tests/test-charsets.c index d2c07297..8735fd22 100644 --- a/src/tests/test-charsets.c +++ b/src/tests/test-charsets.c @@ -317,58 +317,71 @@ test_gsm7_pack_7_chars_offset (void) } static void -test_take_convert_ucs2_hex_utf8 (void) +test_str_ucs2_to_from_utf8 (void) { - gchar *src, *converted, *utf8; - - /* Ensure hex-encoded UCS-2 works */ - src = g_strdup ("0054002d004d006f00620069006c0065"); - converted = mm_charset_take_and_convert_to_utf8 (src, MM_MODEM_CHARSET_UCS2); - g_assert_cmpstr (converted, ==, "T-Mobile"); - utf8 = mm_utf8_take_and_convert_to_charset (converted, MM_MODEM_CHARSET_UCS2); - g_assert_cmpstr (utf8, ==, "0054002D004D006F00620069006C0065"); - g_free (utf8); -} + const gchar *src = "0054002D004D006F00620069006C0065"; + g_autofree gchar *utf8 = NULL; + g_autofree gchar *dst = NULL; + g_autoptr(GError) error = NULL; -static void -test_take_convert_ucs2_bad_ascii (void) -{ - gchar *src, *converted; + utf8 = mm_modem_charset_str_to_utf8 (src, -1, MM_MODEM_CHARSET_UCS2, FALSE, &error); + g_assert_no_error (error); + g_assert_cmpstr (utf8, ==, "T-Mobile"); - /* Test that something mostly ASCII returns most of the original string */ - src = g_strdup ("Orange\241"); - converted = mm_charset_take_and_convert_to_utf8 (src, MM_MODEM_CHARSET_UCS2); - g_assert_cmpstr (converted, ==, "Orange"); - g_free (converted); + dst = mm_modem_charset_str_from_utf8 (utf8, MM_MODEM_CHARSET_UCS2, FALSE, &error); + g_assert_no_error (error); + g_assert_cmpstr (dst, ==, src); } static void -test_take_convert_ucs2_bad_ascii2 (void) +test_str_gsm_to_from_utf8 (void) { - gchar *src, *converted; + const gchar *src = "T-Mobile"; + g_autofree gchar *utf8 = NULL; + g_autofree gchar *dst = NULL; + g_autoptr(GError) error = NULL; + + /* Note: as long as the GSM string doesn't contain the '@' character, str_to_utf8() + * and str_from_utf8() can safely be used */ + + utf8 = mm_modem_charset_str_to_utf8 (src, -1, MM_MODEM_CHARSET_GSM, FALSE, &error); + g_assert_no_error (error); + g_assert_cmpstr (utf8, ==, src); - /* Ensure something completely screwed up doesn't crash */ - src = g_strdup ("\241\255\254\250\244\234"); - converted = mm_charset_take_and_convert_to_utf8 (src, MM_MODEM_CHARSET_UCS2); - g_assert (converted == NULL); + dst = mm_modem_charset_str_from_utf8 (utf8, MM_MODEM_CHARSET_GSM, FALSE, &error); + g_assert_no_error (error); + g_assert_cmpstr (dst, ==, src); } static void -test_take_convert_gsm_utf8 (void) +test_str_gsm_to_from_utf8_with_at (void) { - /* NOTE: this is wrong, charset GSM may contain embedded NULs so we cannot convert - * from a plain UTF-8 string to a NUL-terminated string in GSM, as there is no - * such, thing. */ -#if 0 - gchar *src, *converted, *utf8; + /* The NULs are '@' chars, except for the trailing one which is always taken as end-of-string */ + const gchar src[] = { 'T', '-', 'M', 0x00, 'o', 'b', 'i', 0x00, 'l', 'e', 0x00 }; + const gchar *utf8_expected = "T-M@obi@le"; + const gchar *src_translit = "T-M?obi?le"; + g_autofree gchar *utf8 = NULL; + g_autofree gchar *dst = NULL; + g_autoptr(GError) error = NULL; + + /* Note: as long as the GSM string doesn't contain the '@' character, str_to_utf8() + * and str_from_utf8() can safely be used */ + + utf8 = mm_modem_charset_str_to_utf8 (src, G_N_ELEMENTS (src), MM_MODEM_CHARSET_GSM, FALSE, &error); + g_assert_no_error (error); + g_assert_cmpstr (utf8, ==, utf8_expected); - src = g_strdup ("T-Mobile"); - converted = mm_charset_take_and_convert_to_utf8 (src, MM_MODEM_CHARSET_GSM); - g_assert_cmpstr (converted, ==, "T-Mobile"); - utf8 = mm_utf8_take_and_convert_to_charset (converted, MM_MODEM_CHARSET_GSM); - g_assert_cmpstr (utf8, ==, "T-Mobile"); - g_free (utf8); -#endif + /* if charset conversion from UTF-8 contains '@' chars, running without transliteration + * will return an error */ + dst = mm_modem_charset_str_from_utf8 (utf8, MM_MODEM_CHARSET_GSM, FALSE, &error); + g_assert_nonnull (error); + g_assert_null (dst); + g_clear_error (&error); + + /* with transliteration, '@'->'?' */ + dst = mm_modem_charset_str_from_utf8 (utf8, MM_MODEM_CHARSET_GSM, TRUE, &error); + g_assert_no_error (error); + g_assert_cmpstr (dst, ==, src_translit); } struct charset_can_convert_to_test_s { @@ -452,10 +465,9 @@ int main (int argc, char **argv) g_test_add_func ("/MM/charsets/gsm7/pack/last-septet-alone", test_gsm7_pack_last_septet_alone); g_test_add_func ("/MM/charsets/gsm7/pack/7-chars-offset", test_gsm7_pack_7_chars_offset); - g_test_add_func ("/MM/charsets/take-convert/ucs2/hex", test_take_convert_ucs2_hex_utf8); - g_test_add_func ("/MM/charsets/take-convert/ucs2/bad-ascii", test_take_convert_ucs2_bad_ascii); - g_test_add_func ("/MM/charsets/take-convert/ucs2/bad-ascii-2", test_take_convert_ucs2_bad_ascii2); - g_test_add_func ("/MM/charsets/take-convert/gsm", test_take_convert_gsm_utf8); + g_test_add_func ("/MM/charsets/str-from-to/ucs2", test_str_ucs2_to_from_utf8); + g_test_add_func ("/MM/charsets/str-from-to/gsm", test_str_gsm_to_from_utf8); + g_test_add_func ("/MM/charsets/str-from-to/gsm-with-at", test_str_gsm_to_from_utf8_with_at); g_test_add_func ("/MM/charsets/can-convert-to", test_charset_can_covert_to); |