Misha Koshelev : msi/tests: automation: Add tests for
StringList::_NewEnum.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri May 18 13:56:11 CDT 2007
Module: wine
Branch: master
Commit: 2521111bc7039c70e8eb2be37399a3eaa876e2b7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2521111bc7039c70e8eb2be37399a3eaa876e2b7
Author: Misha Koshelev <mk144210 at bcm.edu>
Date: Fri May 18 11:22:36 2007 -0500
msi/tests: automation: Add tests for StringList::_NewEnum.
---
dlls/msi/tests/automation.c | 111 ++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 110 insertions(+), 1 deletions(-)
diff --git a/dlls/msi/tests/automation.c b/dlls/msi/tests/automation.c
index 39bd272..82fe05e 100644
--- a/dlls/msi/tests/automation.c
+++ b/dlls/msi/tests/automation.c
@@ -1157,6 +1157,15 @@ static HRESULT Record_IntegerDataPut(IDispatch *pRecord, int iField, int iValue)
return invoke(pRecord, "IntegerData", DISPATCH_PROPERTYPUT, &dispparams, &varresult, VT_EMPTY);
}
+static HRESULT StringList__NewEnum(IDispatch *pList, IUnknown **ppEnumVARIANT)
+{
+ VARIANT varresult;
+ DISPPARAMS dispparams = {NULL, NULL, 0, 0};
+ HRESULT hr = invoke(pList, "_NewEnum", DISPATCH_METHOD, &dispparams, &varresult, VT_UNKNOWN);
+ *ppEnumVARIANT = V_UNKNOWN(&varresult);
+ return hr;
+}
+
static HRESULT StringList_Item(IDispatch *pStringList, int iIndex, LPWSTR szString)
{
VARIANT varresult;
@@ -1895,6 +1904,24 @@ static void test_Installer(void)
if (hr == S_OK)
{
int idx;
+ IUnknown *pUnk = NULL;
+ IEnumVARIANT *pEnum = NULL;
+ VARIANT var;
+ ULONG celt;
+
+ /* StringList::_NewEnum */
+ todo_wine
+ {
+ hr = StringList__NewEnum(pStringList, &pUnk);
+ ok(hr == S_OK, "StringList_NewEnum failed, hresult 0x%08x\n", hr);
+ if (hr == S_OK)
+ {
+ hr = IUnknown_QueryInterface(pUnk, &IID_IEnumVARIANT, (void **)&pEnum);
+ ok (hr == S_OK, "IUnknown::QueryInterface returned 0x%08x\n", hr);
+ }
+ }
+ if (!pEnum)
+ skip("IEnumVARIANT tests\n");
/* StringList::Count */
hr = StringList_Count(pStringList, &iCount);
@@ -1907,14 +1934,94 @@ static void test_Installer(void)
hr = StringList_Item(pStringList, idx, szPath);
ok(hr == S_OK, "StringList_Item failed (idx %d, count %d), hresult 0x%08x\n", idx, iCount, hr);
+ /* Installer::ProductState */
if (hr == S_OK)
{
- /* Installer::ProductState */
hr = Installer_ProductState(szPath, &iValue);
ok(hr == S_OK, "Installer_ProductState failed, hresult 0x%08x\n", hr);
if (hr == S_OK)
ok(iValue == INSTALLSTATE_DEFAULT || iValue == INSTALLSTATE_ADVERTISED, "Installer_ProductState returned %d, expected %d or %d\n", iValue, INSTALLSTATE_DEFAULT, INSTALLSTATE_ADVERTISED);
}
+
+ /* IEnumVARIANT::Next */
+ if (pEnum)
+ {
+ hr = IEnumVARIANT_Next(pEnum, 1, &var, &celt);
+ ok(hr == S_OK, "IEnumVARIANT_Next failed (idx %d, count %d), hresult 0x%08x\n", idx, iCount, hr);
+ ok(celt == 1, "%d items were retrieved, expected 1\n", celt);
+ ok(V_VT(&var) == VT_BSTR, "IEnumVARIANT_Next returned variant of type %d, expected %d\n", V_VT(&var), VT_BSTR);
+ ok_w2("%s returned by StringList_Item does not match %s returned by IEnumVARIANT_Next\n", szPath, V_BSTR(&var));
+ VariantClear(&var);
+ }
+ }
+
+ if (pEnum)
+ {
+ IEnumVARIANT *pEnum2 = NULL;
+
+ if (0) /* Crashes on Windows XP */
+ {
+ /* IEnumVARIANT::Clone, NULL pointer */
+ hr = IEnumVARIANT_Clone(pEnum, NULL);
+ }
+
+ /* IEnumVARIANT::Clone */
+ hr = IEnumVARIANT_Clone(pEnum, &pEnum2);
+ ok(hr == S_OK, "IEnumVARIANT_Clone failed, hresult 0x%08x\n", hr);
+ if (hr == S_OK)
+ {
+ /* IEnumVARIANT::Clone is supposed to save the position, but it actually just goes back to the beginning */
+
+ /* IEnumVARIANT::Next of the clone */
+ if (iCount)
+ {
+ hr = IEnumVARIANT_Next(pEnum2, 1, &var, &celt);
+ ok(hr == S_OK, "IEnumVARIANT_Next failed, hresult 0x%08x\n", hr);
+ ok(celt == 1, "%d items were retrieved, expected 0\n", celt);
+ ok(V_VT(&var) == VT_BSTR, "IEnumVARIANT_Next returned variant of type %d, expected %d\n", V_VT(&var), VT_BSTR);
+ VariantClear(&var);
+ }
+ else
+ skip("IEnumVARIANT::Next of clone will not return success with 0 products\n");
+
+ IEnumVARIANT_Release(pEnum2);
+ }
+
+ /* IEnumVARIANT::Skip should fail */
+ hr = IEnumVARIANT_Skip(pEnum, 1);
+ ok(hr == S_FALSE, "IEnumVARIANT_Skip failed, hresult 0x%08x\n", hr);
+
+ /* IEnumVARIANT::Next, NULL variant pointer */
+ hr = IEnumVARIANT_Next(pEnum, 1, NULL, &celt);
+ ok(hr == S_FALSE, "IEnumVARIANT_Next failed, hresult 0x%08x\n", hr);
+ ok(celt == 0, "%d items were retrieved, expected 0\n", celt);
+
+ /* IEnumVARIANT::Next, should not return any more items */
+ hr = IEnumVARIANT_Next(pEnum, 1, &var, &celt);
+ ok(hr == S_FALSE, "IEnumVARIANT_Next failed, hresult 0x%08x\n", hr);
+ ok(celt == 0, "%d items were retrieved, expected 0\n", celt);
+ VariantClear(&var);
+
+ /* IEnumVARIANT::Reset */
+ hr = IEnumVARIANT_Reset(pEnum);
+ ok(hr == S_OK, "IEnumVARIANT_Reset failed, hresult 0x%08x\n", hr);
+
+ if (iCount)
+ {
+ /* IEnumVARIANT::Skip to the last product */
+ hr = IEnumVARIANT_Skip(pEnum, iCount-1);
+ ok(hr == S_OK, "IEnumVARIANT_Skip failed, hresult 0x%08x\n", hr);
+
+ /* IEnumVARIANT::Next should match the very last retrieved value, also makes sure it works with
+ * NULL celt pointer. */
+ hr = IEnumVARIANT_Next(pEnum, 1, &var, NULL);
+ ok(hr == S_OK, "IEnumVARIANT_Next failed (idx %d, count %d), hresult 0x%08x\n", idx, iCount, hr);
+ ok(V_VT(&var) == VT_BSTR, "IEnumVARIANT_Next returned variant of type %d, expected %d\n", V_VT(&var), VT_BSTR);
+ ok_w2("%s returned by StringList_Item does not match %s returned by IEnumVARIANT_Next\n", szPath, V_BSTR(&var));
+ VariantClear(&var);
+ }
+ else
+ skip("IEnumVARIANT::Skip impossible for 0 products\n");
}
/* StringList::Item using an invalid index */
@@ -1922,6 +2029,8 @@ static void test_Installer(void)
hr = StringList_Item(pStringList, iCount, szPath);
ok(hr == DISP_E_BADINDEX, "StringList_Item for an invalid index did not return DISP_E_BADINDEX, hresult 0x%08x\n", hr);
+ if (pEnum) IEnumVARIANT_Release(pEnum);
+ if (pUnk) IUnknown_Release(pUnk);
IDispatch_Release(pStringList);
}
More information about the wine-cvs
mailing list