Add unit test for Turkish variant
authorAki Niemi <aki.niemi@nokia.com>
Fri, 4 Sep 2009 14:35:43 +0000 (17:35 +0300)
committerAki Niemi <aki.niemi@nokia.com>
Tue, 8 Sep 2009 11:16:23 +0000 (14:16 +0300)
Also fixes an error in the default table unit test.

unit/test-util.c

index 42372de..69a7b95 100644 (file)
@@ -49,7 +49,7 @@ unsigned short gsm_to_unicode_map[] =
 0x06,  0x00F9,
 0x07,  0x00EC,
 0x08,  0x00F2,
-0x09,  0x00E7,
+0x09,  0x00C7,
 0x0A,  0x000A,
 0x0B,  0x00D8,
 0x0C,  0x00F8,
@@ -180,6 +180,159 @@ unsigned short gsm_to_unicode_map[] =
 0x7F,  0x00E0,
 };
 
+unsigned short gsm_turkish_to_unicode_map[] =
+{
+0x00, 0x0040,
+0x01, 0x00A3,
+0x02, 0x0024,
+0x03, 0x00A5,
+0x04, 0x20AC,
+0x05, 0x00E9,
+0x06, 0x00F9,
+0x07, 0x0131,
+0x08, 0x00F2,
+0x09, 0x00C7,
+0x0A, 0x000A,
+0x0B, 0x011E,
+0x0C, 0x011F,
+0x0D, 0x000D,
+0x0E, 0x00C5,
+0x0F, 0x00E5,
+0x10, 0x0394,
+0x11, 0x005F,
+0x12, 0x03A6,
+0x13, 0x0393,
+0x14, 0x039B,
+0x15, 0x03A9,
+0x16, 0x03A0,
+0x17, 0x03A8,
+0x18, 0x03A3,
+0x19, 0x0398,
+0x1A, 0x039E,
+/* We're not including some of the single shift codes to this map,
+* because the turkish variant isn't symmetric, i.e., the same
+* character is present in both the locking shift table as well as the
+* single shift table */
+0x1B0A, 0x000C,
+0x1B14, 0x005E,
+0x1B28, 0x007B,
+0x1B29, 0x007D,
+0x1B2F, 0x005C,
+0x1B3C, 0x005B,
+0x1B3D, 0x007E,
+0x1B3E, 0x005D,
+0x1B40, 0x007C,
+/*0x1B47, 0x011E,*/
+/*0x1B49, 0x0130,*/
+/*0x1B53, 0x015E,*/
+/*0x1B63, 0x00E7,*/
+/*0x1B65, 0x20AC,*/
+/*0x1B67, 0x011F,*/
+/*0x1B69, 0x0131,*/
+/*0x1B73, 0x015F,*/
+0x1C, 0x015E,
+0x1D, 0x015F,
+0x1E, 0x00DF,
+0x1F, 0x00C9,
+0x20, 0x0020,
+0x21, 0x0021,
+0x22, 0x0022,
+0x23, 0x0023,
+0x24, 0x00A4,
+0x25, 0x0025,
+0x26, 0x0026,
+0x27, 0x0027,
+0x28, 0x0028,
+0x29, 0x0029,
+0x2A, 0x002A,
+0x2B, 0x002B,
+0x2C, 0x002C,
+0x2D, 0x002D,
+0x2E, 0x002E,
+0x2F, 0x002F,
+0x30, 0x0030,
+0x31, 0x0031,
+0x32, 0x0032,
+0x33, 0x0033,
+0x34, 0x0034,
+0x35, 0x0035,
+0x36, 0x0036,
+0x37, 0x0037,
+0x38, 0x0038,
+0x39, 0x0039,
+0x40, 0x0130,
+0x3A, 0x003A,
+0x3B, 0x003B,
+0x3C, 0x003C,
+0x3D, 0x003D,
+0x3E, 0x003E,
+0x3F, 0x003F,
+0x40, 0x0130,
+0x41, 0x0041,
+0x42, 0x0042,
+0x43, 0x0043,
+0x44, 0x0044,
+0x45, 0x0045,
+0x46, 0x0046,
+0x47, 0x0047,
+0x48, 0x0048,
+0x49, 0x0049,
+0x4A, 0x004A,
+0x4B, 0x004B,
+0x4C, 0x004C,
+0x4D, 0x004D,
+0x4E, 0x004E,
+0x4F, 0x004F,
+0x50, 0x0050,
+0x51, 0x0051,
+0x52, 0x0052,
+0x53, 0x0053,
+0x54, 0x0054,
+0x55, 0x0055,
+0x56, 0x0056,
+0x57, 0x0057,
+0x58, 0x0058,
+0x59, 0x0059,
+0x5A, 0x005A,
+0x5B, 0x00C4,
+0x5C, 0x00D6,
+0x5D, 0x00D1,
+0x5E, 0x00DC,
+0x5F, 0x00A7,
+0x60, 0x00E7,
+0x61, 0x0061,
+0x62, 0x0062,
+0x63, 0x0063,
+0x64, 0x0064,
+0x65, 0x0065,
+0x66, 0x0066,
+0x67, 0x0067,
+0x68, 0x0068,
+0x69, 0x0069,
+0x6A, 0x006A,
+0x6B, 0x006B,
+0x6C, 0x006C,
+0x6D, 0x006D,
+0x6E, 0x006E,
+0x6F, 0x006F,
+0x70, 0x0070,
+0x71, 0x0071,
+0x72, 0x0072,
+0x73, 0x0073,
+0x74, 0x0074,
+0x75, 0x0075,
+0x76, 0x0076,
+0x77, 0x0077,
+0x78, 0x0078,
+0x79, 0x0079,
+0x7A, 0x007A,
+0x7B, 0x00E4,
+0x7C, 0x00F6,
+0x7D, 0x00F1,
+0x7E, 0x00FC,
+0x7F, 0x00E0
+};
+
 #define UTF8_LENGTH(c) \
        ((c) < 0x80 ? 1 : \
         ((c) < 0x800 ? 2 : 3))
@@ -272,6 +425,67 @@ static void test_valid()
        }
 }
 
+static void test_valid_turkish()
+{
+       long nwritten;
+       long nread;
+       char *res;
+       int i;
+       long size;
+       gunichar *verify;
+       unsigned char *back;
+
+       unsigned char buf[2];
+
+       static int map_size =
+               sizeof(gsm_turkish_to_unicode_map) / sizeof(unsigned short) / 2;
+
+       for (i = 0; i < map_size; i++) {
+               unsigned short c = gsm_turkish_to_unicode_map[i*2];
+
+               if (c & 0x1b00) {
+                       buf[0] = 0x1b;
+                       buf[1] = c & 0x7f;
+                       size = 2;
+               } else {
+                       size = 1;
+                       buf[0] = c & 0x7f;
+               }
+
+               res = convert_gsm_to_utf8_with_lang(buf, size, &nread, &nwritten, 0, 1, 1);
+               g_assert(res);
+
+               if (g_test_verbose())
+                       g_print("size: %ld, nread:%ld, nwritten:%ld, %s\n",
+                               size, nread, nwritten, res);
+
+               g_assert(nread == size);
+
+               verify = g_utf8_to_ucs4(res, -1, NULL, NULL, NULL);
+
+               g_assert(verify[0] == gsm_turkish_to_unicode_map[i*2+1]);
+               g_assert(verify[1] == 0);
+
+               g_assert(nwritten == UTF8_LENGTH(verify[0]));
+
+               back = convert_utf8_to_gsm_with_lang(res, -1, &nread, &nwritten, 0, 1, 1);
+
+               g_assert(back);
+
+               g_assert(nwritten == size);
+               if (c & 0x1b00) {
+                       g_assert(back[0] == 0x1b);
+                       g_assert(back[1] == (c & 0x7f));
+               } else {
+                       g_assert(back[0] == (c & 0x7f));
+               }
+
+               g_free(back);
+               g_free(verify);
+               g_free(res);
+       }
+}
+
 static const char hex_packed[] = "493A283D0795C3F33C88FE06C9CB6132885EC6D34"
                                        "1EDF27C1E3E97E7207B3A0C0A5241E377BB1D"
                                        "7693E72E";
@@ -697,6 +911,7 @@ int main(int argc, char **argv)
 
        g_test_add_func("/testutil/Invalid Conversions", test_invalid);
        g_test_add_func("/testutil/Valid Conversions", test_valid);
+       g_test_add_func("/testutil/Valid Turkish National Variant Conversions", test_valid_turkish);
        g_test_add_func("/testutil/Decode Encode", test_decode_encode);
        g_test_add_func("/testutil/Pack Size", test_pack_size);
        g_test_add_func("/testutil/CBS CR Handling", test_cr_handling);