[PATCH 1/8] Cleanup MRU lists tests, add more

Nikolay Sivov nsivov at codeweavers.com
Sat Apr 30 00:18:48 CDT 2011


---
 dlls/comctl32/tests/mru.c |  422 +++++++++++++++++++++++++++++++++------------
 1 files changed, 309 insertions(+), 113 deletions(-)

diff --git a/dlls/comctl32/tests/mru.c b/dlls/comctl32/tests/mru.c
index 24fcff5..5def70f 100644
--- a/dlls/comctl32/tests/mru.c
+++ b/dlls/comctl32/tests/mru.c
@@ -37,42 +37,44 @@
 #define REG_TEST_SUBKEYA "MRUTest"
 #define REG_TEST_FULLKEY REG_TEST_KEYA "\\" REG_TEST_SUBKEYA
 
-/* Undocumented MRU structures & functions */
-typedef struct tagCREATEMRULISTA
+typedef struct tagMRUINFOA
 {
     DWORD   cbSize;
-    DWORD   nMaxItems;
-    DWORD   dwFlags;
+    UINT    uMax;
+    UINT    fFlags;
     HKEY    hKey;
     LPCSTR  lpszSubKey;
     PROC    lpfnCompare;
-} CREATEMRULISTA, *LPCREATEMRULISTA;
+} MRUINFOA;
 
-#define MRUF_STRING_LIST  0
-#define MRUF_BINARY_LIST  1
-#define MRUF_DELAYED_SAVE 2
+typedef struct tagMRUINFOW
+{
+    DWORD   cbSize;
+    UINT    uMax;
+    UINT    fFlags;
+    HKEY    hKey;
+    LPCWSTR lpszSubKey;
+    PROC    lpfnCompare;
+} MRUINFOW;
 
-#define LIST_SIZE 3 /* Max entries for each mru */
+#define MRU_STRING     0  /* name is invented for that */
+#define MRU_BINARY     1
+#define MRU_CACHEWRITE 2
 
-static CREATEMRULISTA mruA =
-{
-    sizeof(CREATEMRULISTA),
-    LIST_SIZE,
-    0,
-    NULL,
-    REG_TEST_SUBKEYA,
-    NULL
-};
+#define LIST_SIZE 3 /* Max entries for each mru */
 
 static HMODULE hComctl32;
-static HANDLE (WINAPI *pCreateMRUListA)(LPCREATEMRULISTA);
+static HANDLE (WINAPI *pCreateMRUListA)(MRUINFOA*);
 static void   (WINAPI *pFreeMRUList)(HANDLE);
 static INT    (WINAPI *pAddMRUStringA)(HANDLE,LPCSTR);
-static INT    (WINAPI *pEnumMRUList)(HANDLE,INT,LPVOID,DWORD);
-static INT    (WINAPI *pEnumMRUListW)(HANDLE,INT,LPVOID,DWORD);
-static HANDLE (WINAPI *pCreateMRUListLazyA)(LPCREATEMRULISTA, DWORD, DWORD, DWORD);
-static INT    (WINAPI *pFindMRUData)(HANDLE, LPCVOID, DWORD, LPINT);
-static INT    (WINAPI *pAddMRUData)(HANDLE, LPCVOID, DWORD);
+static INT    (WINAPI *pEnumMRUListA)(HANDLE,INT, void*, DWORD);
+static INT    (WINAPI *pEnumMRUListW)(HANDLE,INT, void*, DWORD);
+static HANDLE (WINAPI *pCreateMRUListLazyA)(MRUINFOA*, DWORD, DWORD, DWORD);
+static HANDLE (WINAPI *pCreateMRUListLazyW)(MRUINFOW*, DWORD, DWORD, DWORD);
+static INT    (WINAPI *pFindMRUData)(HANDLE, const void*, DWORD, INT*);
+static INT    (WINAPI *pAddMRUData)(HANDLE, const void*, DWORD);
+static HANDLE (WINAPI *pCreateMRUListW)(MRUINFOW*);
+
 /*
 static INT    (WINAPI *pFindMRUStringA)(HANDLE,LPCSTR,LPINT);
 */
@@ -83,11 +85,13 @@ static void InitPointers(void)
     pCreateMRUListA = (void*)GetProcAddress(hComctl32,(LPCSTR)151);
     pFreeMRUList    = (void*)GetProcAddress(hComctl32,(LPCSTR)152);
     pAddMRUStringA  = (void*)GetProcAddress(hComctl32,(LPCSTR)153);
-    pEnumMRUList    = (void*)GetProcAddress(hComctl32,(LPCSTR)154);
+    pEnumMRUListA   = (void*)GetProcAddress(hComctl32,(LPCSTR)154);
     pCreateMRUListLazyA = (void*)GetProcAddress(hComctl32,(LPCSTR)157);
     pAddMRUData     = (void*)GetProcAddress(hComctl32,(LPCSTR)167);
     pFindMRUData    = (void*)GetProcAddress(hComctl32,(LPCSTR)169);
+    pCreateMRUListW = (void*)GetProcAddress(hComctl32,(LPCSTR)400);
     pEnumMRUListW   = (void*)GetProcAddress(hComctl32,(LPCSTR)403);
+    pCreateMRUListLazyW = (void*)GetProcAddress(hComctl32,(LPCSTR)404);
 }
 
 /* Based on RegDeleteTreeW from dlls/advapi32/registry.c */
@@ -226,71 +230,94 @@ static INT CALLBACK cmp_mru_strA(LPCVOID data1, LPCVOID data2)
     return lstrcmpiA(data1, data2);
 }
 
-static HANDLE create_mruA(HKEY hKey, DWORD flags, PROC cmp)
-{
-    mruA.dwFlags = flags;
-    mruA.lpfnCompare = cmp;
-    mruA.hKey = hKey;
-
-    SetLastError(0);
-    return pCreateMRUListA(&mruA);
-}
-
 static void test_MRUListA(void)
 {
     const char *checks[LIST_SIZE+1];
+    MRUINFOA infoA;
     HANDLE hMRU;
     HKEY hKey;
-    INT iRet;
 
-    if (!pCreateMRUListA || !pFreeMRUList || !pAddMRUStringA || !pEnumMRUList)
+    if (!pCreateMRUListA || !pFreeMRUList || !pAddMRUStringA || !pEnumMRUListA)
     {
-        skip("MRU entry points not found\n");
+        win_skip("MRU entry points not found\n");
         return;
     }
 
     if (0)
     {
-    /* Create (NULL) - crashes native */
-    hMRU = pCreateMRUListA(NULL);
+       /* Create (NULL) - crashes native */
+       hMRU = pCreateMRUListA(NULL);
     }
 
-    /* Create (size too small) */
-    mruA.cbSize = sizeof(mruA) - 2;
-    hMRU = create_mruA(NULL, MRUF_STRING_LIST, (PROC)cmp_mru_strA);
+    /* size too small */
+    infoA.cbSize = sizeof(infoA) - 2;
+    infoA.uMax = LIST_SIZE;
+    infoA.fFlags = MRU_STRING;
+    infoA.hKey = NULL;
+    infoA.lpszSubKey = REG_TEST_SUBKEYA;
+    infoA.lpfnCompare = (PROC)cmp_mru_strA;
+
+    SetLastError(0);
+    hMRU = pCreateMRUListA(&infoA);
     ok (!hMRU && !GetLastError(),
         "CreateMRUListA(too small) expected NULL,0 got %p,%d\n",
         hMRU, GetLastError());
-    mruA.cbSize = sizeof(mruA);
 
-    /* Create (size too big) */
-    mruA.cbSize = sizeof(mruA) + 2;
-    hMRU = create_mruA(NULL, MRUF_STRING_LIST, (PROC)cmp_mru_strA);
+    /* size too big */
+    infoA.cbSize = sizeof(infoA) + 2;
+    infoA.uMax = LIST_SIZE;
+    infoA.fFlags = MRU_STRING;
+    infoA.hKey = NULL;
+    infoA.lpszSubKey = REG_TEST_SUBKEYA;
+    infoA.lpfnCompare = (PROC)cmp_mru_strA;
+
+    SetLastError(0);
+    hMRU = pCreateMRUListA(&infoA);
     ok (!hMRU && !GetLastError(),
         "CreateMRUListA(too big) expected NULL,0 got %p,%d\n",
         hMRU, GetLastError());
-    mruA.cbSize = sizeof(mruA);
 
-    /* Create (NULL hKey) */
-    hMRU = create_mruA(NULL, MRUF_STRING_LIST, (PROC)cmp_mru_strA);
+    /* NULL hKey */
+    infoA.cbSize = sizeof(infoA);
+    infoA.uMax = LIST_SIZE;
+    infoA.fFlags = MRU_STRING;
+    infoA.hKey = NULL;
+    infoA.lpszSubKey = REG_TEST_SUBKEYA;
+    infoA.lpfnCompare = (PROC)cmp_mru_strA;
+
+    SetLastError(0);
+    hMRU = pCreateMRUListA(&infoA);
     ok (!hMRU && !GetLastError(),
         "CreateMRUListA(NULL key) expected NULL,0 got %p,%d\n",
         hMRU, GetLastError());
 
-    /* Create (NULL name) */
-    mruA.lpszSubKey = NULL;
-    hMRU = create_mruA(NULL, MRUF_STRING_LIST, (PROC)cmp_mru_strA);
+    /* NULL subkey name */
+    infoA.cbSize = sizeof(infoA);
+    infoA.uMax = LIST_SIZE;
+    infoA.fFlags = MRU_STRING;
+    infoA.hKey = NULL;
+    infoA.lpszSubKey = NULL;
+    infoA.lpfnCompare = (PROC)cmp_mru_strA;
+
+    SetLastError(0);
+    hMRU = pCreateMRUListA(&infoA);
     ok (!hMRU && !GetLastError(),
         "CreateMRUListA(NULL name) expected NULL,0 got %p,%d\n",
         hMRU, GetLastError());
-    mruA.lpszSubKey = REG_TEST_SUBKEYA;
 
     /* Create a string MRU */
     ok(!RegCreateKeyA(HKEY_CURRENT_USER, REG_TEST_KEYA, &hKey),
        "Couldn't create test key \"%s\"\n", REG_TEST_KEYA);
-    if (!hKey)
-        return;
-    hMRU = create_mruA(hKey, MRUF_STRING_LIST, (PROC)cmp_mru_strA);
+    if (!hKey) return;
+
+    infoA.cbSize = sizeof(infoA);
+    infoA.uMax = LIST_SIZE;
+    infoA.fFlags = MRU_STRING;
+    infoA.hKey = hKey;
+    infoA.lpszSubKey = REG_TEST_SUBKEYA;
+    infoA.lpfnCompare = (PROC)cmp_mru_strA;
+
+    hMRU = pCreateMRUListA(&infoA);
     ok(hMRU && !GetLastError(),
        "CreateMRUListA(string) expected non-NULL,0 got %p,%d\n",
        hMRU, GetLastError());
@@ -298,6 +325,8 @@ static void test_MRUListA(void)
     if (hMRU)
     {
         char buffer[255];
+        INT ret;
+
         checks[0] = "Test 1";
         checks[1] = "Test 2";
         checks[2] = "Test 3";
@@ -305,117 +334,117 @@ static void test_MRUListA(void)
 
         /* Add (NULL list) */
         SetLastError(0);
-        iRet = pAddMRUStringA(NULL, checks[0]);
-        ok(iRet == -1 && !GetLastError(),
+        ret = pAddMRUStringA(NULL, checks[0]);
+        ok(ret == -1 && !GetLastError(),
            "AddMRUStringA(NULL list) expected -1,0 got %d,%d\n",
-           iRet, GetLastError());
+           ret, GetLastError());
 
         /* Add (NULL string) */
         if (0)
         {
 	/* Some native versions crash when passed NULL or fail to SetLastError()  */
         SetLastError(0);
-        iRet = pAddMRUStringA(hMRU, NULL);
-        ok(iRet == 0 && GetLastError() == ERROR_INVALID_PARAMETER,
+        ret = pAddMRUStringA(hMRU, NULL);
+        ok(ret == 0 && GetLastError() == ERROR_INVALID_PARAMETER,
            "AddMRUStringA(NULL str) expected 0,ERROR_INVALID_PARAMETER got %d,%d\n",
-           iRet, GetLastError());
+           ret, GetLastError());
         }
 
         /* Add 3 strings. Check the registry is correct after each add */
         SetLastError(0);
-        iRet = pAddMRUStringA(hMRU, checks[0]);
-        ok(iRet == 0 && !GetLastError(),
+        ret = pAddMRUStringA(hMRU, checks[0]);
+        ok(ret == 0 && !GetLastError(),
            "AddMRUStringA(1) expected 0,0 got %d,%d\n",
-           iRet, GetLastError());
+           ret, GetLastError());
         check_reg_entries("a", checks);
 
         SetLastError(0);
-        iRet = pAddMRUStringA(hMRU, checks[1]);
-        ok(iRet == 1 && !GetLastError(),
+        ret = pAddMRUStringA(hMRU, checks[1]);
+        ok(ret == 1 && !GetLastError(),
            "AddMRUStringA(2) expected 1,0 got %d,%d\n",
-           iRet, GetLastError());
+           ret, GetLastError());
         check_reg_entries("ba", checks);
 
         SetLastError(0);
-        iRet = pAddMRUStringA(hMRU, checks[2]);
-        ok(iRet == 2 && !GetLastError(),
+        ret = pAddMRUStringA(hMRU, checks[2]);
+        ok(ret == 2 && !GetLastError(),
            "AddMRUStringA(2) expected 2,0 got %d,%d\n",
-           iRet, GetLastError());
+           ret, GetLastError());
         check_reg_entries("cba", checks);
 
         /* Add a duplicate of the 2nd string - it should move to the front,
          * but keep the same index in the registry.
          */
         SetLastError(0);
-        iRet = pAddMRUStringA(hMRU, checks[1]);
-        ok(iRet == 1 && !GetLastError(),
+        ret = pAddMRUStringA(hMRU, checks[1]);
+        ok(ret == 1 && !GetLastError(),
            "AddMRUStringA(re-add 1) expected 1,0 got %d,%d\n",
-           iRet, GetLastError());
+           ret, GetLastError());
         check_reg_entries("bca", checks);
 
         /* Add a new string - replaces the oldest string + moves to the front */
         SetLastError(0);
-        iRet = pAddMRUStringA(hMRU, checks[3]);
-        ok(iRet == 0 && !GetLastError(),
+        ret = pAddMRUStringA(hMRU, checks[3]);
+        ok(ret == 0 && !GetLastError(),
            "AddMRUStringA(add new) expected 0,0 got %d,%d\n",
-           iRet, GetLastError());
+           ret, GetLastError());
         checks[0] = checks[3];
         check_reg_entries("abc", checks);
 
         /* NULL buffer = get list size */
-        iRet = pEnumMRUList(hMRU, 0, NULL, 0);
-        ok(iRet == 3 || iRet == -1 /* Vista */, "EnumMRUList expected %d or -1, got %d\n", LIST_SIZE, iRet);
+        ret = pEnumMRUListA(hMRU, 0, NULL, 0);
+        ok(ret == 3 || ret == -1 /* Vista */, "EnumMRUListA expected %d or -1, got %d\n", LIST_SIZE, ret);
 
         /* negative item pos = get list size */
-        iRet = pEnumMRUList(hMRU, -1, NULL, 0);
-        ok(iRet == 3 || iRet == -1 /* Vista */, "EnumMRUList expected %d or -1, got %d\n", LIST_SIZE, iRet);
+        ret = pEnumMRUListA(hMRU, -1, NULL, 0);
+        ok(ret == 3 || ret == -1 /* Vista */, "EnumMRUListA expected %d or -1, got %d\n", LIST_SIZE, ret);
 
         /* negative item pos = get list size */
-        iRet = pEnumMRUList(hMRU, -5, NULL, 0);
-        ok(iRet == 3 || iRet == -1 /* Vista */, "EnumMRUList expected %d or -1, got %d\n", LIST_SIZE, iRet);
+        ret = pEnumMRUListA(hMRU, -5, NULL, 0);
+        ok(ret == 3 || ret == -1 /* Vista */, "EnumMRUListA expected %d or -1, got %d\n", LIST_SIZE, ret);
 
         /* negative item pos = get list size */
-        iRet = pEnumMRUList(hMRU, -1, buffer, 255);
-        ok(iRet == 3, "EnumMRUList expected %d, got %d\n", LIST_SIZE, iRet);
+        ret = pEnumMRUListA(hMRU, -1, buffer, 255);
+        ok(ret == 3, "EnumMRUListA expected %d, got %d\n", LIST_SIZE, ret);
 
         /* negative item pos = get list size */
-        iRet = pEnumMRUList(hMRU, -5, buffer, 255);
-        ok(iRet == 3, "EnumMRUList expected %d, got %d\n", LIST_SIZE, iRet);
+        ret = pEnumMRUListA(hMRU, -5, buffer, 255);
+        ok(ret == 3, "EnumMRUListA expected %d, got %d\n", LIST_SIZE, ret);
 
         /* check entry 0 */
         buffer[0] = 0;
-        iRet = pEnumMRUList(hMRU, 0, buffer, 255);
-        ok(iRet == lstrlen(checks[3]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[3]), iRet);
-        ok(strcmp(buffer, checks[3]) == 0, "EnumMRUList expected %s, got %s\n", checks[3], buffer);
+        ret = pEnumMRUListA(hMRU, 0, buffer, 255);
+        ok(ret == lstrlen(checks[3]), "EnumMRUListA expected %d, got %d\n", lstrlen(checks[3]), ret);
+        ok(strcmp(buffer, checks[3]) == 0, "EnumMRUListA expected %s, got %s\n", checks[3], buffer);
 
         /* check entry 0 with a too small buffer */
         buffer[0] = 0;   /* overwritten with 'T' */
         buffer[1] = 'A'; /* overwritten with 0   */
         buffer[2] = 'A'; /* unchanged */
         buffer[3] = 0;   /* unchanged */
-        iRet = pEnumMRUList(hMRU, 0, buffer, 2);
-        ok(iRet == lstrlen(checks[3]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[3]), iRet);
-        ok(strcmp(buffer, "T") == 0, "EnumMRUList expected %s, got %s\n", "T", buffer);
+        ret = pEnumMRUListA(hMRU, 0, buffer, 2);
+        ok(ret == lstrlen(checks[3]), "EnumMRUListA expected %d, got %d\n", lstrlen(checks[3]), ret);
+        ok(strcmp(buffer, "T") == 0, "EnumMRUListA expected %s, got %s\n", "T", buffer);
         /* make sure space after buffer has old values */
-        ok(buffer[2] == 'A', "EnumMRUList expected %02x, got %02x\n", 'A', buffer[2]);
+        ok(buffer[2] == 'A', "EnumMRUListA expected %02x, got %02x\n", 'A', buffer[2]);
 
         /* check entry 1 */
         buffer[0] = 0;
-        iRet = pEnumMRUList(hMRU, 1, buffer, 255);
-        ok(iRet == lstrlen(checks[1]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[1]), iRet);
-        ok(strcmp(buffer, checks[1]) == 0, "EnumMRUList expected %s, got %s\n", checks[1], buffer);
+        ret = pEnumMRUListA(hMRU, 1, buffer, 255);
+        ok(ret == lstrlen(checks[1]), "EnumMRUListA expected %d, got %d\n", lstrlen(checks[1]), ret);
+        ok(strcmp(buffer, checks[1]) == 0, "EnumMRUListA expected %s, got %s\n", checks[1], buffer);
 
         /* check entry 2 */
         buffer[0] = 0;
-        iRet = pEnumMRUList(hMRU, 2, buffer, 255);
-        ok(iRet == lstrlen(checks[2]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[2]), iRet);
-        ok(strcmp(buffer, checks[2]) == 0, "EnumMRUList expected %s, got %s\n", checks[2], buffer);
+        ret = pEnumMRUListA(hMRU, 2, buffer, 255);
+        ok(ret == lstrlen(checks[2]), "EnumMRUListA expected %d, got %d\n", lstrlen(checks[2]), ret);
+        ok(strcmp(buffer, checks[2]) == 0, "EnumMRUListA expected %s, got %s\n", checks[2], buffer);
 
         /* check out of bounds entry 3 */
         strcpy(buffer, "dummy");
-        iRet = pEnumMRUList(hMRU, 3, buffer, 255);
-        ok(iRet == -1, "EnumMRUList expected %d, got %d\n", -1, iRet);
-        ok(strcmp(buffer, "dummy") == 0, "EnumMRUList expected unchanged buffer %s, got %s\n", "dummy", buffer);
+        ret = pEnumMRUListA(hMRU, 3, buffer, 255);
+        ok(ret == -1, "EnumMRUListA expected %d, got %d\n", -1, ret);
+        ok(strcmp(buffer, "dummy") == 0, "EnumMRUListA expected unchanged buffer %s, got %s\n", "dummy", buffer);
 
         /* Finished with this MRU */
         pFreeMRUList(hMRU);
@@ -428,7 +457,7 @@ static void test_CreateMRUListLazyA(void)
 {
     HANDLE hMRU;
     HKEY hKey;
-    CREATEMRULISTA listA = { 0 };
+    MRUINFOA listA = { 0 };
 
     if (!pCreateMRUListLazyA || !pFreeMRUList)
     {
@@ -462,7 +491,7 @@ static void test_CreateMRUListLazyA(void)
 
 static void test_EnumMRUList(void)
 {
-    if (!pEnumMRUList || !pEnumMRUListW)
+    if (!pEnumMRUListA || !pEnumMRUListW)
     {
         win_skip("EnumMRUListA/EnumMRUListW entry point not found\n");
         return;
@@ -472,14 +501,14 @@ static void test_EnumMRUList(void)
     if (0)
     {
         /* crashes on NT4, passed on Win2k, XP, 2k3, Vista, 2k8 */
-        pEnumMRUList(NULL, 0, NULL, 0);
+        pEnumMRUListA(NULL, 0, NULL, 0);
         pEnumMRUListW(NULL, 0, NULL, 0);
     }
 }
 
 static void test_FindMRUData(void)
 {
-    INT iRet;
+    INT ret;
 
     if (!pFindMRUData)
     {
@@ -488,13 +517,13 @@ static void test_FindMRUData(void)
     }
 
     /* NULL handle */
-    iRet = pFindMRUData(NULL, NULL, 0, NULL);
-    ok(iRet == -1, "FindMRUData expected -1, got %d\n", iRet);
+    ret = pFindMRUData(NULL, NULL, 0, NULL);
+    ok(ret == -1, "FindMRUData expected -1, got %d\n", ret);
 }
 
 static void test_AddMRUData(void)
 {
-    INT iRet;
+    INT ret;
 
     if (!pAddMRUData)
     {
@@ -503,8 +532,173 @@ static void test_AddMRUData(void)
     }
 
     /* NULL handle */
-    iRet = pFindMRUData(NULL, NULL, 0, NULL);
-    ok(iRet == -1, "AddMRUData expected -1, got %d\n", iRet);
+    ret = pFindMRUData(NULL, NULL, 0, NULL);
+    ok(ret == -1, "AddMRUData expected -1, got %d\n", ret);
+}
+
+static void test_CreateMRUListW(void)
+{
+    static const WCHAR mrutestW[] = {'M','R','U','T','e','s','t',0};
+    MRUINFOW infoW;
+    void *named;
+    HKEY hKey;
+    HANDLE hMru;
+
+    if (!pCreateMRUListW)
+    {
+        win_skip("CreateMRUListW entry point not found\n");
+        return;
+    }
+
+    /* exported by name too on recent versions */
+    named = GetProcAddress(hComctl32, "CreateMRUListW");
+    if (named)
+        ok(named == pCreateMRUListW, "got %p, expected %p\n", named, pCreateMRUListW);
+
+    ok(!RegCreateKeyA(HKEY_CURRENT_USER, REG_TEST_KEYA, &hKey),
+       "Couldn't create test key \"%s\"\n", REG_TEST_KEYA);
+
+    infoW.cbSize = sizeof(infoW);
+    infoW.uMax = 1;
+    infoW.fFlags = 0;
+    infoW.lpszSubKey = mrutestW;
+    infoW.hKey = hKey;
+    infoW.lpfnCompare = NULL;
+
+    hMru = pCreateMRUListW(&infoW);
+    ok(hMru != NULL, "got %p\n", hMru);
+    pFreeMRUList(hMru);
+
+    /* smaller size */
+    infoW.cbSize = sizeof(infoW) - 1;
+    infoW.uMax = 1;
+    infoW.fFlags = 0;
+    infoW.lpszSubKey = mrutestW;
+    infoW.hKey = hKey;
+    infoW.lpfnCompare = NULL;
+
+    hMru = pCreateMRUListW(&infoW);
+    todo_wine ok(hMru != NULL, "got %p\n", hMru);
+    pFreeMRUList(hMru);
+
+    /* increased size */
+    infoW.cbSize = sizeof(infoW) + 1;
+    infoW.uMax = 1;
+    infoW.fFlags = 0;
+    infoW.lpszSubKey = mrutestW;
+    infoW.hKey = hKey;
+    infoW.lpfnCompare = NULL;
+
+    hMru = pCreateMRUListW(&infoW);
+    todo_wine ok(hMru != NULL, "got %p\n", hMru);
+    pFreeMRUList(hMru);
+
+    /* zero size */
+    infoW.cbSize = 0;
+    infoW.uMax = 1;
+    infoW.fFlags = 0;
+    infoW.lpszSubKey = mrutestW;
+    infoW.hKey = hKey;
+    infoW.lpfnCompare = NULL;
+
+    hMru = pCreateMRUListW(&infoW);
+    todo_wine ok(hMru != NULL, "got %p\n", hMru);
+    pFreeMRUList(hMru);
+
+    /* NULL hKey */
+    infoW.cbSize = sizeof(infoW);
+    infoW.uMax = 1;
+    infoW.fFlags = 0;
+    infoW.lpszSubKey = mrutestW;
+    infoW.hKey = NULL;
+    infoW.lpfnCompare = NULL;
+
+    hMru = pCreateMRUListW(&infoW);
+    ok(hMru == NULL, "got %p\n", hMru);
+
+    RegCloseKey(hKey);
+}
+
+static void test_CreateMRUListLazyW(void)
+{
+    static const WCHAR mrutestW[] = {'M','R','U','T','e','s','t',0};
+    MRUINFOW infoW;
+    void *named;
+    HKEY hKey;
+    HANDLE hMru;
+
+    if (!pCreateMRUListLazyW)
+    {
+        win_skip("CreateMRUListLazyW entry point not found\n");
+        return;
+    }
+
+    /* check that it's not exported by name */
+    named = GetProcAddress(hComctl32, "CreateMRUListLazyW");
+    ok(named == NULL, "got %p\n", named);
+
+    ok(!RegCreateKeyA(HKEY_CURRENT_USER, REG_TEST_KEYA, &hKey),
+       "Couldn't create test key \"%s\"\n", REG_TEST_KEYA);
+
+    infoW.cbSize = sizeof(infoW);
+    infoW.uMax = 1;
+    infoW.fFlags = 0;
+    infoW.lpszSubKey = mrutestW;
+    infoW.hKey = hKey;
+    infoW.lpfnCompare = NULL;
+
+    hMru = pCreateMRUListLazyW(&infoW, 0, 0, 0);
+    ok(hMru != NULL, "got %p\n", hMru);
+    pFreeMRUList(hMru);
+
+    /* smaller size */
+    infoW.cbSize = sizeof(infoW) - 1;
+    infoW.uMax = 1;
+    infoW.fFlags = 0;
+    infoW.lpszSubKey = mrutestW;
+    infoW.hKey = hKey;
+    infoW.lpfnCompare = NULL;
+
+    hMru = pCreateMRUListLazyW(&infoW, 0, 0, 0);
+    todo_wine ok(hMru != NULL, "got %p\n", hMru);
+    pFreeMRUList(hMru);
+
+    /* increased size */
+    infoW.cbSize = sizeof(infoW) + 1;
+    infoW.uMax = 1;
+    infoW.fFlags = 0;
+    infoW.lpszSubKey = mrutestW;
+    infoW.hKey = hKey;
+    infoW.lpfnCompare = NULL;
+
+    hMru = pCreateMRUListLazyW(&infoW, 0, 0, 0);
+    todo_wine ok(hMru != NULL, "got %p\n", hMru);
+    pFreeMRUList(hMru);
+
+    /* zero size */
+    infoW.cbSize = 0;
+    infoW.uMax = 1;
+    infoW.fFlags = 0;
+    infoW.lpszSubKey = mrutestW;
+    infoW.hKey = hKey;
+    infoW.lpfnCompare = NULL;
+
+    hMru = pCreateMRUListLazyW(&infoW, 0, 0, 0);
+    todo_wine ok(hMru != NULL, "got %p\n", hMru);
+    pFreeMRUList(hMru);
+
+    /* NULL hKey */
+    infoW.cbSize = sizeof(infoW);
+    infoW.uMax = 1;
+    infoW.fFlags = 0;
+    infoW.lpszSubKey = mrutestW;
+    infoW.hKey = NULL;
+    infoW.lpfnCompare = NULL;
+
+    hMru = pCreateMRUListLazyW(&infoW, 0, 0, 0);
+    ok(hMru == NULL, "got %p\n", hMru);
+
+    RegCloseKey(hKey);
 }
 
 START_TEST(mru)
@@ -519,9 +713,11 @@ START_TEST(mru)
 
     test_MRUListA();
     test_CreateMRUListLazyA();
+    test_CreateMRUListLazyW();
     test_EnumMRUList();
     test_FindMRUData();
     test_AddMRUData();
+    test_CreateMRUListW();
 
     delete_reg_entries();
 }
-- 
1.5.6.5



--------------010800000308090408060004--



More information about the wine-patches mailing list