From: Juan Luis Boya García Subject: kernel32: Wine tests for patch #88300 (Better CompareString implementation) Message-Id: <50060B64.6040305@gmail.com> Date: Wed, 18 Jul 2012 03:03:32 +0200 -----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----- From b8b3eefb52d7502bbb433663bb32dfbf7fe51b27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Luis=20Boya=20Garc=C3=ADa?= 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