[PATCH 1/3] shell32/tests: Add more tests for FolderItems.

Nikolay Sivov bunglehead at gmail.com
Thu Jul 21 00:12:54 CDT 2016


On 21.07.2016 7:45, Alex Henrie wrote:
> +    for (i = 0; i < sizeof(file_defs)/sizeof(file_defs[0]); i++)
> +    {
> +        switch (file_defs[i].type)
> +        {
> +            case DIRECTORY:
> +                r = CreateDirectoryA(file_defs[i].name, NULL);
> +                ok(r, "file_defs[%d]: CreateDirectory failed: %08x\n", i, GetLastError());
> +                break;
> +
> +            case SHORTCUT:
> +                sl = NULL;
> +                r = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkA, (void**)&sl);
> +                ok(SUCCEEDED(r), "file_defs[%d]: CoCreateInstance failed: %08x\n", i, r);
> +                ok(!!sl, "sl is null\n");
> +
> +                shortcut = NULL;
> +                r = IShellLinkA_QueryInterface(sl, &IID_IPersistFile, (void**)&shortcut);
> +                ok(r == S_OK, "file_defs[%d]: IShellLink::QueryInterface failed: %08x\n", i, r);
> +                ok(!!shortcut, "file_defs[%d]: shortcut is null\n", i);
> +
> +                MultiByteToWideChar(CP_ACP, 0, file_defs[i].name, -1, wstr, sizeof(wstr)/sizeof(WCHAR));
> +                r = IPersistFile_Save(shortcut, wstr, FALSE);
> +                ok(r == S_OK, "file_defs[%d]: IPersistFile::Save failed: %08x\n", i, r);
> +
> +                IPersistFile_Release(shortcut);
> +                IShellLinkA_Release(sl);

If you're only interested in IPersistFile you can request it directly
when calling CoCreateInstance().

> +    r = FolderItems_QueryInterface(items, &IID_FolderItems2, (void**)&items2);
> +    ok(r == S_OK || broken(E_NOINTERFACE) /* xp and later */, "FolderItems::QueryInterface failed: %08x\n", r);
> +    ok(!!items2 || broken(!items2) /* xp and later */, "items2 is null\n");

Second ok() is a bit meaningless, because it's expected to be consistent
with previous return value test. I think it could be placed into if (r
== S_OK), with broken() removed.

> +
> +        bstr = NULL;
> +        r = FolderItem_get_Path(item, &bstr);
> +        ok(r == S_OK, "file_defs[%d]: FolderItem::get_Path failed: %08x\n", i, r);
> +        ok(!!bstr, "file_defs[%d]: bstr is null\n", i);
> +
> +        bstr2 = NULL;
> +        r = FolderItem_get_Path(item, &bstr2);
> +        ok(r == S_OK, "file_defs[%d]: FolderItem::get_Path failed: %08x\n", i, r);
> +        ok(bstr2 != bstr, "file_defs[%d]: bstr and bstr2 are the same\n", i);
> +        SysFreeString(bstr2);

This is a regular convention for [out] BSTR arguments. It only makes
sense to explicitly test it if it differs from expected behavior.

> +
> +    V_I4(&var) = sizeof(file_defs)/sizeof(file_defs[0]);
> +    item = NULL;
> +    r = FolderItems_Item(items, var, &item);
> +todo_wine
> +    ok(r == S_FALSE, "expected S_FALSE, got %08x\n", r);
> +    ok(!item, "item is not null\n");
> +
>      if (0) /* crashes on xp */
>      {
>          r = FolderItems_get_Application(items, NULL);
> @@ -422,12 +623,20 @@ todo_wine
>              ok(r == E_INVALIDARG, "expected E_INVALIDARG, got %08x\n", r);
>          }
>  
> +        verbs = (FolderItemVerbs*)0xdeadbeef;
>          r = FolderItems3_get_Verbs(items3, &verbs);
>  todo_wine
>          ok(r == S_FALSE, "expected S_FALSE, got %08x\n", r);
>          ok(!verbs, "verbs is not null\n");
>      }
>  
> +    for (i = 0; i < sizeof(file_defs)/sizeof(file_defs[0]); i++)
> +    {
> +        if (file_defs[i].type == DIRECTORY)
> +            RemoveDirectoryA(file_defs[i].name);
> +        else
> +            DeleteFileA(file_defs[i].name);
> +    }

Could this cleanup be merged with one of the loops you have earlier?

> 




More information about the wine-devel mailing list