kernel32: Wine tests for patch #88300 (Better CompareString implementation)

Juan Luis Boya García ntrrgc at gmail.com
Tue Jul 17 20:03:32 CDT 2012


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I wrote some tests for my previous patch, which is currently as 'Pending'.






-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQIcBAEBAgAGBQJQBgtkAAoJEBQZ1Jcyq17zvpEP/07YQntyrwVbOpImq8JrQB6d
BeiSchrwPVJ3QWSWEgaPwxutqju/z8M5FFUMWO8xwtc6XgHSgxFWZDUEi9KYxGaC
64kfGJJlwEZy2/AGRjVjgdpCUlpC20ZRBpi5VHQbMk3RIQWohY0wff5/DoVPj4aE
tK/YEsvjNvN4TNF4Dq4DREfsdIQNLL2w0QyliLxP0ZbMFUq+q1pZra+AfJ+9/NvS
5icUsQBCEgQciIHOx97aVAskD2d4z7iPFLLUN+tkLvz0gGaN3j+UmGErFPdTAw1A
p5kj3LeARoYgUV+7CLf8zFUIiLzLwhUMNKYJ6Xzm0riqHowOMF111VPiCF39I0A4
8shCWsll9PFcorkh7opQjqA1W4uoiPp/L2Ku09Ov7M7mzBsGeMJ8L5+0ksHurzIO
zlfVb9hjKtDoQ91O9D1w+/dEB30+wzFGCWya8re6HXoF8Qq+3pKVM3Vi9KEZ0ASw
NkeKla90dcKWhwahRSTc6vMjUsGaXcypGr5LeBUtyAaNLZ9oZka/WqH2ho0gu8UM
WKzQ9dVojnpWrjUzp1ycIgDHm2JVTLpdE2NVsvN/V0kBSQTW2oDZwlVHEjA0gRGP
hiQGz4lT4hDSsQNY4AWFyCV6d6GPmADzfJZBL0kd2gdYuVXHRt4rAnk0zb5pW+Ee
ha3CglsWXPIsdHUE9j1q
=mErV
-----END PGP SIGNATURE-----
-------------- next part --------------
From b8b3eefb52d7502bbb433663bb32dfbf7fe51b27 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Luis=20Boya=20Garc=C3=ADa?= <ntrrgc at gmail.com>
Date: Tue, 17 Jul 2012 18:13:33 +0200
Subject: CompareString patch (#88300): Added tests.

Some tests have been added, and previous TODO tests which now pass
with the patch are marked as OK.
---
 dlls/kernel32/tests/locale.c | 72 ++++++++++++++++++++++++++++++++++++++------
 1 file changed, 63 insertions(+), 9 deletions(-)

diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 8079679..c6b6ee1 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -1257,8 +1257,6 @@ static void test_CompareStringA(void)
     ret = lstrcmpA(NULL, "");
     ok (ret == -1 || broken(ret == -2) /* win9x */, "lstrcmpA(NULL, \"\") should return -1, got %d\n", ret);
  
-
-    if (0) { /* this requires collation table patch to make it MS compatible */
     ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, 0, "'o", -1, "-o", -1 );
     ok(ret == CSTR_LESS_THAN, "'o vs -o expected CSTR_LESS_THAN, got %d\n", ret);
 
@@ -1294,8 +1292,6 @@ static void test_CompareStringA(void)
 
     ret = CompareStringA(LOCALE_SYSTEM_DEFAULT, SORT_STRINGSORT, "-m", -1, "`o", -1 );
     ok(ret == CSTR_LESS_THAN, "-m vs `o expected CSTR_LESS_THAN, got %d\n", ret);
-    }
-
 
     /* WinXP handles embedded NULLs differently than earlier versions */
     ret = CompareStringA(LOCALE_USER_DEFAULT, 0, "aLuZkUtZ", 8, "aLuZkUtZ\0A", 10);
@@ -1313,26 +1309,83 @@ static void test_CompareStringA(void)
        "a\\0b vs a expected CSTR_EQUAL or CSTR_GREATER_THAN, got %d\n", ret);
 
     ret = CompareStringA(lcid, 0, "\2", 2, "\1", 2);
-    todo_wine ok(ret != CSTR_EQUAL, "\\2 vs \\1 expected unequal\n");
+    ok(ret != CSTR_EQUAL, "\\2 vs \\1 expected unequal\n");
 
     ret = CompareStringA(lcid, NORM_IGNORECASE | LOCALE_USE_CP_ACP, "#", -1, ".", -1);
-    todo_wine ok(ret == CSTR_LESS_THAN, "\"#\" vs \".\" expected CSTR_LESS_THAN, got %d\n", ret);
+    ok(ret == CSTR_LESS_THAN, "\"#\" vs \".\" expected CSTR_LESS_THAN, got %d\n", ret);
 
     ret = CompareStringA(lcid, NORM_IGNORECASE, "_", -1, ".", -1);
-    todo_wine ok(ret == CSTR_GREATER_THAN, "\"_\" vs \".\" expected CSTR_GREATER_THAN, got %d\n", ret);
+    ok(ret == CSTR_GREATER_THAN, "\"_\" vs \".\" expected CSTR_GREATER_THAN, got %d\n", ret);
+
+    ret = CompareStringA(lcid, NORM_IGNORESYMBOLS, "dream", -1, "dream,", -1);
+    ok(ret == CSTR_EQUAL, "\"dream\" expected to be equal to \"dream,\" when using NORM_IGNORESYMBOLS.\n");
 
     ret = lstrcmpi("#", ".");
-    todo_wine ok(ret == -1, "\"#\" vs \".\" expected -1, got %d\n", ret);
+    ok(ret == -1, "\"#\" vs \".\" expected -1, got %d\n", ret);
 
     lcid = MAKELCID(MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT), SORT_DEFAULT);
 
     /* \xB9 character lies between a and b */
     ret = CompareStringA(lcid, 0, "a", 1, "\xB9", 1);
-    todo_wine ok(ret == CSTR_LESS_THAN, "\'\\xB9\' character should be greater than \'a\'\n");
+    ok(ret == CSTR_LESS_THAN, "\'\\xB9\' character should be greater than \'a\'\n");
     ret = CompareStringA(lcid, 0, "\xB9", 1, "b", 1);
     ok(ret == CSTR_LESS_THAN, "\'\\xB9\' character should be smaller than \'b\'\n");
 }
 
+static void test_CompareStringW(void) {
+    int ret;
+
+    const WCHAR anime_hiragana[] = { 0x3042, 0x306B, 0x3081, 0 }; /* あにめ */
+    const WCHAR anime_full_katakana[] = { 0x30A2, 0x30CB, 0x30E1, 0 }; /* アニメ */
+    const WCHAR anime_half_katakana[] = { 0xFF71, 0xFF86, 0xFF92, 0 }; /* アニメ */
+    const WCHAR hello[] = { 'h', 'e', 'l', 'l', 'o', 0 };
+    const WCHAR Hello[] = { 'H', 'e', 'l', 'l', 'o', 0 };
+    const WCHAR wide_hello[] = { 0xFF48, 0xFF45, 0xFF4C, 0xFF4C, 0xFF4F, 0 }; /* hello */
+    const WCHAR wide_Hello[] = { 0xFF28, 0xFF45, 0xFF4C, 0xFF4C, 0xFF4F, 0 }; /* Hello */
+    const WCHAR cafe[] = { 'c', 'a', 'f', 'e', 0 };
+    const WCHAR acuted_cafe[] = { 'c', 'a', 'f', 0xE9, 0 }; /* café */
+    const WCHAR acuted_caFE[] = { 'c', 'a', 'F', 0xC9, 0 }; /* caFÉ */
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, 0, anime_hiragana, -1, anime_full_katakana, -1);
+    ok(ret != CSTR_EQUAL, "Hiragana string should not be equal to katakana string without NORM_IGNOREKANATYPE set.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNOREKANATYPE, anime_hiragana, -1, anime_full_katakana, -1);
+    ok(ret == CSTR_EQUAL, "Hiragana string should be equal to (fullwidth) katakana string with NORM_IGNOREKANATYPE set.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, anime_hiragana, -1, anime_full_katakana, -1);
+    ok(ret != CSTR_EQUAL, "Kana insensitive matching should not be done without NORM_IGNOREKANATYPE set.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNOREWIDTH, anime_full_katakana, -1, anime_half_katakana, -1);
+    ok(ret == CSTR_EQUAL, "Width insensitive matching should be done with NORM_IGNOREWIDTH set.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNOREKANATYPE, anime_full_katakana, -1, anime_half_katakana, -1);
+    ok(ret != CSTR_EQUAL, "Width insensitive matching should not be done without NORM_IGNOREWIDTH set.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNOREKANATYPE|NORM_IGNOREWIDTH, anime_half_katakana, -1, anime_hiragana, -1);
+    ok(ret == CSTR_EQUAL, "Kana and width insensible match should be done with NORM_IGNOREKANATYPE and NORM_IGNOREWIDTH set.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNOREKANATYPE, Hello, -1, hello, -1);
+    ok(ret != CSTR_EQUAL, "NORM_IGNOREKANATYPE should not act as a synonym of NORM_IGNORECASE.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, 0, Hello, -1, wide_Hello, -1);
+    ok(ret != CSTR_EQUAL, "Width insensitive match should not be done by default.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNOREWIDTH, Hello, -1, wide_Hello, -1);
+    ok(ret == CSTR_EQUAL, "NORM_IGNOREWIDTH should work for latin characters.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNOREWIDTH|NORM_IGNORECASE, Hello, -1, wide_hello, -1);
+    ok(ret == CSTR_EQUAL, "Wide letters should have case insensitive comparation with NORM_IGNORECASE and NORM_IGNOREWIDTH set.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORENONSPACE, cafe, -1, acuted_cafe, -1);
+    ok(ret == CSTR_EQUAL, "NORM_IGNORENONSPACE should do diacritic insensitive compare.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, 0, cafe, -1, acuted_cafe, -1);
+    ok(ret != CSTR_EQUAL, "Diacritic insensitive compare should not be done without NORM_IGNORENONSPACE.\n");
+
+    ret = CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORENONSPACE|NORM_IGNORECASE, acuted_cafe, -1, acuted_caFE, -1);
+    ok(ret == CSTR_EQUAL, "Case insensitive match should work with diacritic insensitive match too.\n");
+}
+
 static void test_LCMapStringA(void)
 {
     int ret, ret2;
@@ -3218,6 +3271,7 @@ START_TEST(locale)
   test_GetCurrencyFormatA(); /* Also tests the W version */
   test_GetNumberFormatA();   /* Also tests the W version */
   test_CompareStringA();
+  test_CompareStringW();
   test_LCMapStringA();
   test_LCMapStringW();
   test_LCMapStringEx();
-- 
1.7.11.2



More information about the wine-patches mailing list