[COMCTL32_WINETEST]
[reactos.git] / rostests / winetests / comctl32 / mru.c
index 8ebec86..24fcff5 100644 (file)
@@ -69,11 +69,27 @@ static HANDLE (WINAPI *pCreateMRUListA)(LPCREATEMRULISTA);
 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 *pFindMRUStringA)(HANDLE,LPCSTR,LPINT);
 */
 
 
+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);
+    pCreateMRUListLazyA = (void*)GetProcAddress(hComctl32,(LPCSTR)157);
+    pAddMRUData     = (void*)GetProcAddress(hComctl32,(LPCSTR)167);
+    pFindMRUData    = (void*)GetProcAddress(hComctl32,(LPCSTR)169);
+    pEnumMRUListW   = (void*)GetProcAddress(hComctl32,(LPCSTR)403);
+}
+
 /* Based on RegDeleteTreeW from dlls/advapi32/registry.c */
 static LSTATUS mru_RegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey)
 {
@@ -227,11 +243,6 @@ static void test_MRUListA(void)
     HKEY hKey;
     INT iRet;
 
-    pCreateMRUListA = (void*)GetProcAddress(hComctl32,(LPCSTR)151);
-    pFreeMRUList = (void*)GetProcAddress(hComctl32,(LPCSTR)152);
-    pAddMRUStringA = (void*)GetProcAddress(hComctl32,(LPCSTR)153);
-    pEnumMRUList = (void*)GetProcAddress(hComctl32,(LPCSTR)154);
-
     if (!pCreateMRUListA || !pFreeMRUList || !pAddMRUStringA || !pEnumMRUList)
     {
         skip("MRU entry points not found\n");
@@ -374,7 +385,7 @@ static void test_MRUListA(void)
         /* check entry 0 */
         buffer[0] = 0;
         iRet = pEnumMRUList(hMRU, 0, buffer, 255);
-        todo_wine ok(iRet == lstrlen(checks[3]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[3]), iRet);
+        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);
 
         /* check entry 0 with a too small buffer */
@@ -383,21 +394,21 @@ static void test_MRUListA(void)
         buffer[2] = 'A'; /* unchanged */
         buffer[3] = 0;   /* unchanged */
         iRet = pEnumMRUList(hMRU, 0, buffer, 2);
-        todo_wine ok(iRet == lstrlen(checks[3]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[3]), iRet);
-        todo_wine ok(strcmp(buffer, "T") == 0, "EnumMRUList expected %s, got %s\n", "T", buffer);
+        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);
         /* make sure space after buffer has old values */
         ok(buffer[2] == 'A', "EnumMRUList expected %02x, got %02x\n", 'A', buffer[2]);
 
         /* check entry 1 */
         buffer[0] = 0;
         iRet = pEnumMRUList(hMRU, 1, buffer, 255);
-        todo_wine ok(iRet == lstrlen(checks[1]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[1]), iRet);
+        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);
 
         /* check entry 2 */
         buffer[0] = 0;
         iRet = pEnumMRUList(hMRU, 2, buffer, 255);
-        todo_wine ok(iRet == lstrlen(checks[2]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[2]), iRet);
+        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);
 
         /* check out of bounds entry 3 */
@@ -413,6 +424,89 @@ static void test_MRUListA(void)
     /* FreeMRUList(NULL) crashes on Win98 OSR0 */
 }
 
+static void test_CreateMRUListLazyA(void)
+{
+    HANDLE hMRU;
+    HKEY hKey;
+    CREATEMRULISTA listA = { 0 };
+
+    if (!pCreateMRUListLazyA || !pFreeMRUList)
+    {
+        win_skip("CreateMRUListLazyA or FreeMRUList entry points not found\n");
+        return;
+    }
+
+    /* wrong size */
+    listA.cbSize = sizeof(listA) + 1;
+    hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0);
+    ok(hMRU == NULL, "Expected NULL handle, got %p\n", hMRU);
+    listA.cbSize = 4;
+    hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0);
+    ok(hMRU == NULL, "Expected NULL handle, got %p\n", hMRU);
+    /* NULL hKey */
+    listA.cbSize = sizeof(listA);
+    listA.hKey = NULL;
+    hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0);
+    ok(hMRU == NULL, "Expected NULL handle, got %p\n", hMRU);
+    /* NULL subkey */
+    ok(!RegCreateKeyA(HKEY_CURRENT_USER, REG_TEST_KEYA, &hKey),
+       "Couldn't create test key \"%s\"\n", REG_TEST_KEYA);
+    listA.cbSize = sizeof(listA);
+    listA.hKey = hKey;
+    listA.lpszSubKey = NULL;
+    hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0);
+    ok(hMRU == NULL || broken(hMRU != NULL), /* Win9x */
+       "Expected NULL handle, got %p\n", hMRU);
+    if (hMRU) pFreeMRUList(hMRU);
+}
+
+static void test_EnumMRUList(void)
+{
+    if (!pEnumMRUList || !pEnumMRUListW)
+    {
+        win_skip("EnumMRUListA/EnumMRUListW entry point not found\n");
+        return;
+    }
+
+    /* NULL handle */
+    if (0)
+    {
+        /* crashes on NT4, passed on Win2k, XP, 2k3, Vista, 2k8 */
+        pEnumMRUList(NULL, 0, NULL, 0);
+        pEnumMRUListW(NULL, 0, NULL, 0);
+    }
+}
+
+static void test_FindMRUData(void)
+{
+    INT iRet;
+
+    if (!pFindMRUData)
+    {
+        win_skip("FindMRUData entry point not found\n");
+        return;
+    }
+
+    /* NULL handle */
+    iRet = pFindMRUData(NULL, NULL, 0, NULL);
+    ok(iRet == -1, "FindMRUData expected -1, got %d\n", iRet);
+}
+
+static void test_AddMRUData(void)
+{
+    INT iRet;
+
+    if (!pAddMRUData)
+    {
+        win_skip("AddMRUData entry point not found\n");
+        return;
+    }
+
+    /* NULL handle */
+    iRet = pFindMRUData(NULL, NULL, 0, NULL);
+    ok(iRet == -1, "AddMRUData expected -1, got %d\n", iRet);
+}
+
 START_TEST(mru)
 {
     hComctl32 = GetModuleHandleA("comctl32.dll");
@@ -421,7 +515,13 @@ START_TEST(mru)
     if (!create_reg_entries())
         return;
 
+    InitPointers();
+
     test_MRUListA();
+    test_CreateMRUListLazyA();
+    test_EnumMRUList();
+    test_FindMRUData();
+    test_AddMRUData();
 
     delete_reg_entries();
 }