From: Mark Jansen Date: Sun, 15 Jan 2017 00:04:16 +0000 (+0000) Subject: SHLWAPI_APITEST: Add tests for StrFormatByteSizeW. Patch by Doug Lyons. CORE-12661... X-Git-Tag: ReactOS-0.4.4-FOSDEM2017~8^2~50 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=523a1a55899ebcb5dc4c5b3091691facf38a2bad;ds=sidebyside SHLWAPI_APITEST: Add tests for StrFormatByteSizeW. Patch by Doug Lyons. CORE-12661 #resolve svn path=/trunk/; revision=73549 --- diff --git a/rostests/apitests/shlwapi/CMakeLists.txt b/rostests/apitests/shlwapi/CMakeLists.txt index 159243d5e71..3c0c55df447 100644 --- a/rostests/apitests/shlwapi/CMakeLists.txt +++ b/rostests/apitests/shlwapi/CMakeLists.txt @@ -4,6 +4,7 @@ list(APPEND SOURCE PathIsUNCServer.c PathIsUNCServerShare.c PathUnExpandEnvStrings.c + StrFormatByteSizeW.c testlist.c) add_executable(shlwapi_apitest ${SOURCE}) diff --git a/rostests/apitests/shlwapi/StrFormatByteSizeW.c b/rostests/apitests/shlwapi/StrFormatByteSizeW.c new file mode 100644 index 00000000000..5127676c47d --- /dev/null +++ b/rostests/apitests/shlwapi/StrFormatByteSizeW.c @@ -0,0 +1,125 @@ +/* + * Copyright 2017 Doug Lyons + * + * This library 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 2.1 of the License, or (at your option) any later version. + * + * This library 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 library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Documentation: https://msdn.microsoft.com/en-us/library/windows/desktop/bb759975(v=vs.85).aspx */ + +#include +#include +#include + +#define DO_TEST(exp, str) \ +do { \ + StrFormatByteSizeW(exp, lpszDest, cchMax);\ + if (lpszDest[1] == L',') lpszDest[1] = L'.';\ + ok(_wcsicmp(lpszDest, (str)) == 0, "Expected %s got %s\n",\ + wine_dbgstr_w((str)), wine_dbgstr_w((lpszDest)));\ +} while (0) + +WCHAR lpszDest[260]; +UINT cchMax=260; + +/* Returns true if the user interface is in English. Note that this does not + * presume of the formatting of dates, numbers, etc. + * Taken from WINE. + */ +static BOOL is_lang_english(void) +{ + static HMODULE hkernel32 = NULL; + static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL; + static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL; + + if (!hkernel32) + { + hkernel32 = GetModuleHandleA("kernel32.dll"); + pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage"); + pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage"); + } + + if (pGetThreadUILanguage) + return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH; + if (pGetUserDefaultUILanguage) + return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH; + + return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH; +} + +/* Returns true if the dates, numbers, etc. are formatted using English + * conventions. + * Taken from WINE. + */ +static BOOL is_locale_english(void) +{ + /* Surprisingly GetThreadLocale() is irrelevant here */ + LANGID langid = PRIMARYLANGID(GetUserDefaultLangID()); + /* With the checks in DO_TEST, DUTCH can be used here as well. + TODO: Add other combinations that should work. */ + return langid == LANG_ENGLISH || langid == LANG_DUTCH; +} + +START_TEST(StrFormatByteSizeW) +{ + /* language-dependent test */ + if (!is_lang_english() || !is_locale_english()) + { + skip("An English UI and locale is required for the StrFormat*Size tests\n"); + return; + } + DO_TEST(0, L"0 bytes"); // 0x0 + DO_TEST(1, L"1 bytes"); // 0x1 + DO_TEST(1024, L"1.00 KB"); // 0x400 + DO_TEST(1048576, L"1.00 MB"); // 0x100000 + DO_TEST(1073741824, L"1.00 GB"); // 0x40000000 + DO_TEST(0x70000000, L"1.75 GB"); // 0x70000000 + DO_TEST(0x80000000, L"2.00 GB"); // 0x80000000 + DO_TEST(0x100000000, L"4.00 GB"); // 0x100000000 + DO_TEST(1099511627776, L"1.00 TB"); // 0x10000000000 + DO_TEST(1125899906842624, L"1.00 PB"); // 0x4000000000000 + DO_TEST(1152921504606846976, L"1.00 EB"); // 0x1000000000000000 + DO_TEST(2305843009213693952, L"2.00 EB"); // 0x2000000000000000 + DO_TEST(4611686018427387904, L"4.00 EB"); // 0x4000000000000000 + DO_TEST(0x7fffffffffffffff, L"7.99 EB"); // 0x7fffffffffffffff + DO_TEST(0x8000000000000000, L"0 bytes"); // 0x8000000000000000 High Bit Set Here + DO_TEST(0xffffffff00000000, L"0 bytes"); // 0xffffffff00000000 + DO_TEST(0xffffffff00000001, L"1 bytes"); // 0xffffffff00000001 + DO_TEST(0xffffffff70000000, L"1879048192 bytes"); // 0xffffffff70000000 + DO_TEST(0xffffffff7fffffff, L"2147483647 bytes"); // 0xffffffff7fffffff + DO_TEST(0xffffffff80000000, L"-2147483648 bytes"); // 0xffffffff80000000 // Maximum Negative Number -2.00 GB + DO_TEST(0xffffffff80000001, L"-2147483647 bytes"); // 0xffffffff80000001 + DO_TEST(0xffffffff90000000, L"-1879048192 bytes"); // 0xffffffff90000000 + DO_TEST(-1073741824, L"-1073741824 bytes"); // 0xffffffffc0000000 -1.00 GB + DO_TEST(-1048576, L"-1048576 bytes"); // 0xfffffffffff00000 -1.00 MB + DO_TEST(-1024, L"-1024 bytes"); // 0xfffffffffffffc00 -1.00 KB + DO_TEST(0xffffffffffffffff, L"-1 bytes"); // 0xffffffffffffffff + + // Here are some large negative tests and they all return zero bytes + + DO_TEST(-4294967296, L"0 bytes"); // 0xffffffff00000000 + DO_TEST(-8589934592, L"0 bytes"); // 0xfffffffe00000000 + DO_TEST(-17179869184, L"0 bytes"); // 0xfffffffc00000000 + DO_TEST(-34359738368, L"0 bytes"); // 0xfffffff800000000 + DO_TEST(-68719476736, L"0 bytes"); // 0xfffffff000000000 + DO_TEST(-137438953472, L"0 bytes"); // 0xffffffe000000000 + DO_TEST(-274877906944, L"0 bytes"); // 0xffffffc000000000 + DO_TEST(-549755813888, L"0 bytes"); // 0xffffff8000000000 + DO_TEST(-1099511627776, L"0 bytes"); // 0xffffff0000000000 + DO_TEST(-1152921504606846976, L"0 bytes"); // 0xf000000000000000 + + // These statements create compile errors and seem to be compiler conversion related + //DO_TEST(2147483648, L"2.00 GB"); // 2.00 GB & This gives a compile error + //DO_TEST(-2147483648, L"0 bytes"); // -2.00 GB & This gives a compile error +} diff --git a/rostests/apitests/shlwapi/testlist.c b/rostests/apitests/shlwapi/testlist.c index 7a7015fc6e3..c04bbf6a6d8 100644 --- a/rostests/apitests/shlwapi/testlist.c +++ b/rostests/apitests/shlwapi/testlist.c @@ -5,6 +5,7 @@ extern void func_isuncpath(void); extern void func_isuncpathserver(void); extern void func_isuncpathservershare(void); extern void func_PathUnExpandEnvStrings(void); +extern void func_StrFormatByteSizeW(void); const struct test winetest_testlist[] = { @@ -12,5 +13,6 @@ const struct test winetest_testlist[] = { "PathIsUNCServer", func_isuncpathserver }, { "PathIsUNCServerShare", func_isuncpathservershare }, { "PathUnExpandEnvStrings", func_PathUnExpandEnvStrings }, + { "StrFormatByteSizeW", func_StrFormatByteSizeW }, { 0, 0 } };