[PATCH 12/12] kernel32/tests: Add tests for the GeoName API and GetUserGeoID().

João Diogo Ferreira devilj at outlook.pt
Tue Oct 22 12:43:41 CDT 2019


Included tests for:
  * GetGeoInfoEx;
  * EnumSystemGeoNames;
  * GetUserGeoNames;
  * GetUserGeoID.

Changed test_GetGeoInfo to check new GEOTYPEs.

Didn't include SetUserGeoID() and SetUserGeoName() since
normal programs aren't supposed to call those functions.

Signed-off-by: João Diogo Craveiro Ferreira <devilj at outlook.pt>
---
 dlls/kernel32/tests/locale.c | 280 +++++++++++++++++++++++++++++++++++
 1 file changed, 280 insertions(+)

diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 81e74531ea..051045a414 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -97,7 +97,9 @@ static INT (WINAPI *pCompareStringEx)(LPCWSTR, DWORD, LPCWSTR, INT, LPCWSTR, INT
                                       LPNLSVERSIONINFO, LPVOID, LPARAM);
 static INT (WINAPI *pGetGeoInfoA)(GEOID, GEOTYPE, LPSTR, INT, LANGID);
 static INT (WINAPI *pGetGeoInfoW)(GEOID, GEOTYPE, LPWSTR, INT, LANGID);
+static int (WINAPI *pGetGeoInfoEx)(PWSTR, GEOTYPE, PWSTR, int);
 static BOOL (WINAPI *pEnumSystemGeoID)(GEOCLASS, GEOID, GEO_ENUMPROC);
+static BOOL (WINAPI *pEnumSystemGeoNames)(GEOCLASS, GEO_ENUMNAMEPROC, LPARAM);
 static BOOL (WINAPI *pGetSystemPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*);
 static BOOL (WINAPI *pGetThreadPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*);
 static BOOL (WINAPI *pGetUserPreferredUILanguages)(DWORD, ULONG*, WCHAR*, ULONG*);
@@ -108,6 +110,8 @@ static LANGID (WINAPI *pSetThreadUILanguage)(LANGID);
 static LANGID (WINAPI *pGetThreadUILanguage)(VOID);
 static INT (WINAPI *pNormalizeString)(NORM_FORM, LPCWSTR, INT, LPWSTR, INT);
 static INT (WINAPI *pFindStringOrdinal)(DWORD, LPCWSTR lpStringSource, INT, LPCWSTR, INT, BOOL);
+static int (WINAPI *pGetUserDefaultGeoName)(LPWSTR, int);
+static BOOL (WINAPI *pSetUserGeoName)(PWSTR);
 
 static void InitFunctionPointers(void)
 {
@@ -135,7 +139,9 @@ static void InitFunctionPointers(void)
   X(CompareStringEx);
   X(GetGeoInfoA);
   X(GetGeoInfoW);
+  X(GetGeoInfoEx);
   X(EnumSystemGeoID);
+  X(EnumSystemGeoNames);
   X(GetSystemPreferredUILanguages);
   X(GetThreadPreferredUILanguages);
   X(GetUserPreferredUILanguages);
@@ -145,6 +151,8 @@ static void InitFunctionPointers(void)
   X(GetThreadUILanguage);
   X(NormalizeString);
   X(FindStringOrdinal);
+  X(GetUserDefaultGeoName);
+  X(SetUserGeoName);
 
   mod = GetModuleHandleA("ntdll");
   X(RtlUpcaseUnicodeChar);
@@ -4745,6 +4753,106 @@ static void test_CompareStringOrdinal(void)
     }
 }
 
+static void test_GetUserGeoID(void)
+{
+    GEOID id;
+
+    if (pGetUserDefaultGeoName)
+    {
+        ok(GEOID_NOT_AVAILABLE != GetUserGeoID(GEOCLASS_NATION),
+            "GEOCLASS_NATION: should return GEOID_NOT_AVAILABLE when GeoName API is available.\n");
+        ok(GEOID_NOT_AVAILABLE != GetUserGeoID(GEOCLASS_REGION),
+            "GEOCLASS_REGION: should never return GEOID_NOT_AVAILABLE when GeoName API is available.\n");
+    }
+    else
+        win_skip("This platform allows returning GEOID_NOT_AVAILABLE on success.\n");
+
+    id = GetUserGeoID(GEOCLASS_ALL);
+    ok(id == GEOID_NOT_AVAILABLE,
+        "GEOCLASS_ALL: Expected GEOID_NOT_AVAILABLE, got %d.\n", id);
+    id = GetUserGeoID(12345);
+    ok(id == GEOID_NOT_AVAILABLE,
+        "Gibberish argument: Expected GEOID_NOT_AVAILABLE, got %d.\n", id);
+}
+
+static void test_GetUserDefaultGeoName(void)
+{
+    WCHAR name[10] = {0};
+    int result, count;
+
+    if (!(pGetUserDefaultGeoName))
+    {
+        win_skip("GetUserDefaultGeoName: procedure not implemented on this platform.\n");
+        return;
+    }
+    SetLastError(ERROR_SUCCESS);
+    count = result = pGetUserDefaultGeoName(NULL, 0);
+    ok(result > 0,
+       "(NULL, 0): Expected ret > 0, got %d; last error was %d.\n",
+       result, GetLastError());
+
+    SetLastError(ERROR_SUCCESS);
+    result = pGetUserDefaultGeoName(name, 0);
+    ok(result == count,
+       "(buffer, 0): Expected ret to match previous result (%d), got %d; last error was %d.\n",
+       result, count, GetLastError());
+
+    SetLastError(ERROR_SUCCESS);
+    result = pGetUserDefaultGeoName(NULL, 10);
+    ok(result == 0 && (GetLastError() == ERROR_INVALID_PARAMETER),
+        "(NULL, 10): Expected ret=0, got %d; and expected last error = ERROR_INVALID_PARAMETER (87), got %d\n",
+        result, GetLastError());
+
+    SetLastError(ERROR_SUCCESS);
+    result = pGetUserDefaultGeoName(NULL, -1);
+    ok(result == 0 && (GetLastError() == ERROR_INVALID_PARAMETER),
+        "(NULL, -1): Expected ret=0, got %d; and expected last error = ERROR_INVALID_PARAMETER (87), got %d.\n",
+        result, GetLastError());
+
+    SetLastError(ERROR_SUCCESS);
+    result = pGetUserDefaultGeoName(name, 1);
+    ok(result == 0 && (GetLastError() == ERROR_INSUFFICIENT_BUFFER),
+        "(buffer, 1): Expected ret == 0, got %d; and expected last error = ERROR_INSUFFICIENT_BUFFER (122), got %d.\n",
+        result, GetLastError());
+
+    SetLastError(ERROR_SUCCESS);
+    result = pGetUserDefaultGeoName(name, -1);
+    ok(result == 0 && (GetLastError() == ERROR_INVALID_PARAMETER),
+        "(buffer, -1): Expected ret=0, got %d; and expected last error = ERROR_INVALID_PARAMETER (87), got %d.\n",
+        result, GetLastError());
+
+    if (count <= ARRAY_SIZE(name))
+    {
+        SetLastError(ERROR_SUCCESS);
+        result = pGetUserDefaultGeoName(name, count);
+        ok(result,
+           "(buffer, reported length): Expected non-zero ret, got otherwise with error = %d.\n", GetLastError());
+        ok(result == count,
+           "(buffer, reported length): Expected character count == %d, got %d; last error was %d.\n",
+        count, result, GetLastError());
+        ok(result == strlenW(name) + 1,
+           "(buffer, reported length): Expected string length to match ret (%d), got %d.\n",
+           result, strlenW(name) + 1);
+
+        if (count < ARRAY_SIZE(name))
+        {
+            SetLastError(ERROR_SUCCESS);
+            result = pGetUserDefaultGeoName(name, ARRAY_SIZE(name));
+            ok(result,
+               "(buffer, larger length): Expected non-zero ret, got otherwise with error = %d.\n", GetLastError());
+            ok(result == count,
+               "(buffer, larger length): Expected character count == %d, got %d; last error was %d.\n",
+            count, result, GetLastError());
+            ok(result == strlenW(name) + 1,
+               "(buffer, larger length): Expected string length to match ret (%d), got %d.\n",
+            result, strlenW(name) + 1);
+        }
+    }
+    else
+        skip("GetUserDefaultGeoName: Couldn't test successful operation: GeoName string too large (%d > %lu).\n",
+            count, ARRAY_SIZE(name));
+}
+
 static void test_GetGeoInfo(void)
 {
     char buffA[20];
@@ -4798,6 +4906,17 @@ static void test_GetGeoInfo(void)
     ok(ret == 4, "got %d\n", ret);
     ok(!strcmp(buffA, "203"), "got %s\n", buffA);
 
+    /* GEO_ID should behave like GEO_NATION */
+    buffA[0] = 0;
+    ret = pGetGeoInfoA(203, GEO_ID, buffA, 20, 0);
+    if (ret)
+    {
+        ok(ret == 4, "got %d\n", ret);
+        ok(!strcmp(buffA, "203"), "got %s\n", buffA);
+    }
+    else
+        win_skip("GEO_ID not supported.\n");
+
     /* GEO_PARENT */
     buffA[0] = 0;
     ret = pGetGeoInfoA(203, GEO_PARENT, buffA, 20, 0);
@@ -4819,11 +4938,54 @@ static void test_GetGeoInfo(void)
         ok(!strcmp(buffA, "643"), "got %s\n", buffA);
     }
 
+    buffA[0] = 0;
+    ret = pGetGeoInfoA(193, GEO_NAME, buffA, 20, 0); /* LOCATION_NATION */
+    if (ret == 0)
+        win_skip("GEO_NAME not supported.\n");
+    else
+    {
+        ok(ret == 3, "expected ret == 3, got %d", ret);
+        ok(!strcmp(buffA, "PT"), "expected \"PT\", got %s\n", buffA);
+
+        buffA[0] = 0;
+        ret = pGetGeoInfoA(39070, GEO_NAME, buffA, 20, 0); /* LOCATION_REGION */
+        ok(ret == 4, "expected ret == 4, got %d", ret);
+        ok(!strcmp(buffA, "001"), "expected \"001\", got %s\n", buffA);
+
+        buffA[0] = 0;
+        ret = pGetGeoInfoA(333, GEO_NAME, buffA, 20, 0); /* LOCATION_BOTH */
+        ok(ret == 3, "expected ret == 3, got %d", ret);
+        ok(!strcmp(buffA, "AN"), "expected \"AN\", got %s\n", buffA);
+    }
+
     /* try invalid type value */
     SetLastError(0xdeadbeef);
     ret = pGetGeoInfoA(203, GEO_ID + 1, NULL, 0, 0);
     ok(ret == 0, "got %d\n", ret);
     ok(GetLastError() == ERROR_INVALID_FLAGS, "got %d\n", GetLastError());
+
+    if (pGetGeoInfoEx)
+    {
+        WCHAR buffer[10], pt[] = {'P','T',0};
+
+        /* Test types disallowed by GetGeoInfoEx */
+        SetLastError(0xdeadbeef);
+        ret = pGetGeoInfoEx(pt, GEO_LCID, buffer, ARRAY_SIZE(buffer));
+        ok(ret == 0, "expected ret == 0, got %d\n", ret);
+        ok(GetLastError() == ERROR_INVALID_FLAGS, "expected error 1004, got %d\n", GetLastError());
+
+        SetLastError(0xdeadbeef);
+        ret = pGetGeoInfoEx(pt, GEO_NATION, buffer, ARRAY_SIZE(buffer));
+        ok(ret == 0, "expected ret == 0, got %d\n", ret);
+        ok(GetLastError() == ERROR_INVALID_FLAGS, "expected error 1004, got %d\n", GetLastError());
+
+        SetLastError(0xdeadbeef);
+        ret = pGetGeoInfoEx(pt, GEO_RFC1766, buffer, ARRAY_SIZE(buffer));
+        ok(ret == 0, "expected ret == 0, got %d\n", ret);
+        ok(GetLastError() == ERROR_INVALID_FLAGS, "expected error 1004, got %d\n", GetLastError());
+    }
+    else
+        win_skip("GetGeoInfoEx not supported.\n");
 }
 
 static int geoidenum_count;
@@ -4891,6 +5053,121 @@ static void test_EnumSystemGeoID(void)
         ret = pEnumSystemGeoID(GEOCLASS_REGION, 0, test_geoid_enumproc2);
         ok(ret && geoidenum_count > 0, "got %d, count %d\n", ret, geoidenum_count);
     }
+
+    geoidenum_count = 0;
+    ret = pEnumSystemGeoID(GEOCLASS_ALL, 39070, test_geoid_enumproc2);
+    if (ret == 0)
+         win_skip("GEOCLASS_ALL is not supported in EnumSystemGeoID.\n");
+    else
+    {
+        ok(ret && geoidenum_count > 0, "got %d, count %d\n", ret, geoidenum_count);
+
+        geoidenum_count = 0;
+        ret = pEnumSystemGeoID(GEOCLASS_ALL, 0, test_geoid_enumproc2);
+        ok(ret && geoidenum_count > 0, "got %d, count %d\n", ret, geoidenum_count);
+    }
+}
+
+static BOOL CALLBACK test_geoname_enumproc_deadbeef(PWSTR name, LPARAM data)
+{
+    (void)name;
+    ok(data == 0xdeadbeef, "deadbeef: expected 0xdeadbeef, got 0x%lx", data);
+    return FALSE;
+}
+
+struct test_enum_geoname_count_types {
+    unsigned int total, nation, region, both;
+};
+
+static BOOL CALLBACK test_geoname_enumproc_counts(PWSTR name, LPARAM data)
+{
+    struct test_enum_geoname_count_types *ptr = (void*)data;
+
+    /* Known names */
+    static const WCHAR nation[] = {'A','U',0},
+                       region[] = {'0','0','1',0},
+                       both[] = {'A','N',0};
+
+    if (!ptr)
+    {
+        ok((INT_PTR)ptr, "geoname_enumproc_counts: expected some pointer, got %p\n", ptr);
+        return FALSE;
+    }
+
+    ptr->total++;
+
+    if (!winetest_strcmpW(name, nation))
+        ptr->nation++;
+    if (!winetest_strcmpW(name, region))
+        ptr->region++;
+    if (!winetest_strcmpW(name, both))
+        ptr->both++;
+
+    return TRUE;
+}
+
+static BOOL CALLBACK test_geoname_enumproc_dummy(PWSTR name, LPARAM data)
+{
+    (void)name;
+    (void)data;
+    return FALSE;
+}
+
+static void test_EnumSystemGeoNames(void)
+{
+    struct test_enum_geoname_count_types counts;
+    BOOL ret;
+
+    if (!pEnumSystemGeoNames)
+    {
+        win_skip("unsupported platorm.\n");
+        return;
+    }
+
+    ok(pEnumSystemGeoNames(GEOCLASS_ALL, test_geoname_enumproc_deadbeef, 0xdeadbeef),
+       "deadbeef: expected non-zero ret, got otherwise with error=%d.\n", GetLastError());
+
+    ZeroMemory(&counts, sizeof(counts));
+    ret = pEnumSystemGeoNames(GEOCLASS_NATION, test_geoname_enumproc_counts, (LPARAM)&counts);
+    if (ret)
+    {
+        ok(counts.total > 0 && counts.nation > 0 && counts.region == 0 && counts.both == 0,
+           "GEOCLASS_NATION: got total=%u, nation=%u, region=%u, both=%u\n",
+           counts.total, counts.nation, counts.region, counts.both);
+    }
+    else
+        ok(ret, "GEONAME_NATION: expected non-zero, got otherwise.\n");
+
+    ZeroMemory(&counts, sizeof(counts));
+    ret = pEnumSystemGeoNames(GEOCLASS_REGION, test_geoname_enumproc_counts, (LPARAM)&counts);
+    if (ret)
+    {
+        ok(counts.total > 0 && counts.nation == 0 && counts.region > 0 && counts.both > 0,
+           "GEOCLASS_REGION: got total=%u, nation=%u, region=%u, both=%u\n",
+           counts.total, counts.nation, counts.region, counts.both);
+    }
+    else
+        ok(ret, "GEONAME_REGION: expected ret != 0, got otherwise.\n");
+
+    ZeroMemory(&counts, sizeof(counts));
+    ret = pEnumSystemGeoNames(GEOCLASS_ALL, test_geoname_enumproc_counts, (LPARAM)&counts);
+    if (ret)
+    {
+        ok(counts.total > 0 && counts.nation > 0 && counts.region > 0 && counts.both > 0,
+           "GEOCLASS_ALL: got total=%u, nation=%u, region=%u, both=%u\n",
+           counts.total, counts.nation, counts.region, counts.both);
+    }
+    else
+        ok(ret, "GEONAME_ALL: expected ret != 0, got otherwise.\n");
+
+    /* Try invalid values */
+    ret = pEnumSystemGeoNames(GEOCLASS_ALL, NULL, 0xdeadbeef);
+    ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
+       "null enumproc: expected ret=0 and error=87, got ret=%d and error=%d\n", ret, GetLastError());
+
+    ret = pEnumSystemGeoNames(-1, test_geoname_enumproc_dummy, 0xdeadbeef);
+    ok(!ret && GetLastError() == ERROR_INVALID_FLAGS,
+       "invalid geoclass: expected ret=0 and error=1004, got ret=%d and error=%d\n", ret, GetLastError());
 }
 
 struct invariant_entry {
@@ -6049,6 +6326,7 @@ START_TEST(locale)
   test_CompareStringOrdinal();
   test_GetGeoInfo();
   test_EnumSystemGeoID();
+  test_EnumSystemGeoNames();
   test_invariant();
   test_GetSystemPreferredUILanguages();
   test_GetThreadPreferredUILanguages();
@@ -6058,6 +6336,8 @@ START_TEST(locale)
   test_SetThreadUILanguage();
   test_NormalizeString();
   test_SpecialCasing();
+  test_GetUserGeoID();
+  test_GetUserDefaultGeoName();
   /* this requires collation table patch to make it MS compatible */
   if (0) test_sorting();
 }
-- 
2.23.0



More information about the wine-devel mailing list