oleaut32 3/3: [RESEND] Test for correct error codes and return type for VarAnd

Benjamin Arai me at benjaminarai.com
Tue Aug 29 19:51:27 CDT 2006


Hi,

This last patch is separate from the conformance test in 1/3 because
the test run in a loop, so I could not rap todo_wine's around the
tests.

ChangeLog:
  - Adds additional conformance tests to VarAnd to test for correct
error codes and return types.

---
  dlls/oleaut32/tests/vartest.c |  158 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 157 insertions(+), 1 deletions(-)

Copyright: Google
License: LGPL
-- 
Benjamin Arai
http://www.benjaminarai.com
-------------- next part --------------

diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c
index 7e0bf78..fc10c81 100644
--- a/dlls/oleaut32/tests/vartest.c
+++ b/dlls/oleaut32/tests/vartest.c
@@ -5312,13 +5312,169 @@ static void test_VarAnd(void)
     static const WCHAR szTrue[] = { '#','T','R','U','E','#','\0' };
     VARIANT left, right, result;
     BSTR false_str, true_str;
-    HRESULT hres;
+    VARTYPE i;
+    HRESULT hres, expectedhres;
 
     true_str = SysAllocString(szTrue);
     false_str = SysAllocString(szFalse);
 
     CHECKPTR(VarAnd);
 
+    /* Test all possible flag/vt combinations & the resulting vt type */
+    for (i = 0; i < sizeof(ExtraFlags)/sizeof(ExtraFlags[0]); i++)
+    {
+        VARTYPE leftvt, rightvt, resvt;
+
+        for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
+        {
+            SKIPTESTS(leftvt);
+
+            for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
+            {
+                SKIPTESTS(rightvt);
+
+                if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
+                    leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN)
+                    continue;
+
+                memset(&left, 0, sizeof(left));
+                memset(&right, 0, sizeof(right));
+                V_VT(&left) = leftvt | ExtraFlags[i];
+                V_VT(&right) = rightvt | ExtraFlags[i];
+                V_VT(&result) = VT_EMPTY;
+                resvt = VT_EMPTY;
+                if (leftvt == VT_BSTR)
+                    V_BSTR(&left) = true_str;
+                if (rightvt == VT_BSTR)
+                    V_BSTR(&right) = true_str;
+                expectedhres = S_OK;
+
+                /* All extra flags produce errors */
+                if (ExtraFlags[i] == (VT_ARRAY|VT_BYREF) ||
+                    ExtraFlags[i] == (VT_BYREF) ||
+                    ExtraFlags[i] == (VT_ARRAY))
+                {
+                    if ((leftvt >= VT_I2 && leftvt <= VT_DATE) ||
+                        (leftvt >= VT_ERROR && leftvt <= VT_VARIANT) ||
+                        leftvt == VT_DECIMAL || leftvt == VT_RECORD ||
+                        (leftvt >= VT_I1 && leftvt <= VT_UI4) ||
+                        leftvt  == VT_INT || leftvt == VT_UINT ||
+                        leftvt == VT_I8 || leftvt == VT_UI8 ||
+                        leftvt == VT_BSTR)
+                        expectedhres = DISP_E_TYPEMISMATCH;
+                    else
+                        expectedhres = DISP_E_BADVARTYPE;
+                }
+                else if (ExtraFlags[i])
+                    expectedhres = DISP_E_BADVARTYPE;
+                else if (leftvt == VT_ERROR || leftvt == VT_RECORD ||
+                    leftvt == VT_VARIANT)
+                    expectedhres = DISP_E_TYPEMISMATCH;
+                else if (rightvt == VT_RECORD || rightvt == VT_VARIANT ||
+                    rightvt == VT_ERROR)
+                {
+                    if (leftvt == VT_EMPTY || leftvt == VT_NULL ||
+                        leftvt == VT_I2 || leftvt == VT_I4 ||
+                        leftvt == VT_R4 || leftvt == VT_R8 ||
+                        leftvt == VT_CY || leftvt == VT_DATE ||
+                        leftvt == VT_BOOL || leftvt == VT_DECIMAL ||
+                        (leftvt >= VT_I1 && leftvt <= VT_UI4) ||
+                        leftvt == VT_INT || leftvt == VT_UINT ||
+                        leftvt == VT_I8 || leftvt == VT_UI8 ||
+                        leftvt == VT_BSTR)
+                        expectedhres = DISP_E_TYPEMISMATCH;
+                    else
+                        expectedhres = DISP_E_BADVARTYPE;
+                }
+                else if (leftvt == VT_CLSID || rightvt == VT_CLSID)
+                    expectedhres = DISP_E_BADVARTYPE;
+                /*  The following flags/types are invalid for left variant */
+                else if (!((leftvt <= VT_LPWSTR) && leftvt != (VARTYPE)15 &&
+                    (leftvt < VT_VOID || leftvt > VT_LPWSTR)))
+                    expectedhres =  DISP_E_BADVARTYPE;
+                /*  The following flags/types are invalid for right variant */
+                else if (!((rightvt <= VT_LPWSTR) && rightvt != (VARTYPE)15 &&
+                    (rightvt < VT_VOID || rightvt > VT_LPWSTR)))
+                    expectedhres = DISP_E_BADVARTYPE;
+                else if (leftvt == VT_I8 || rightvt == VT_I8)
+                {
+                    if (rightvt == VT_INT || leftvt == VT_INT)
+                        expectedhres = DISP_E_TYPEMISMATCH;
+                    else
+                        resvt = VT_I8;
+                }
+                else if (leftvt == VT_EMPTY || rightvt == VT_EMPTY)
+                {
+                    if (leftvt == rightvt ||
+                        leftvt == VT_I2 || rightvt == VT_I2 ||
+                        leftvt == VT_UI1 || rightvt == VT_UI1 ||
+                        leftvt == VT_BOOL || rightvt == VT_BOOL ||
+                        leftvt == VT_NULL || rightvt == VT_NULL ||
+                        leftvt == VT_BSTR || rightvt == VT_BSTR)
+                        resvt = VT_I2;
+                    else if (leftvt == VT_NULL || rightvt == VT_NULL)
+                        resvt = VT_NULL;
+                    else
+                        resvt = VT_I4;
+                }
+                else if (leftvt == VT_NULL || rightvt == VT_NULL)
+                {
+                    if (leftvt == rightvt || leftvt == VT_BSTR ||
+                        rightvt == VT_BSTR)
+                        resvt = VT_NULL;
+                    else if (leftvt == VT_I2 || rightvt == VT_I2)
+                        resvt = VT_I2;
+                    else if (leftvt == VT_BOOL || rightvt == VT_BOOL)
+                        resvt = VT_BOOL;
+                    else if (leftvt == VT_UI1 || rightvt == VT_UI1)
+                        resvt = VT_UI1;
+                    else
+                        resvt = VT_I4;
+                }
+                else if (leftvt == VT_UI1 || rightvt == VT_UI1)
+                {
+                    if (leftvt == rightvt)
+                        resvt = VT_UI1;
+                    else if (leftvt == VT_I2 || rightvt == VT_I2 ||
+                        leftvt == VT_BOOL || rightvt == VT_BOOL ||
+                        leftvt == VT_BSTR || rightvt == VT_BSTR)
+                        resvt = VT_I2;
+                    else
+                        resvt = VT_I4;
+                }
+                else if (leftvt == VT_I2 || rightvt == VT_I2)
+                {
+                    if (leftvt == rightvt || leftvt == VT_BOOL ||
+                        rightvt == VT_BOOL || leftvt == VT_BSTR ||
+                        rightvt == VT_BSTR)
+                        resvt = VT_I2;
+                    else
+                        resvt = VT_I4;
+                }
+                else if (leftvt == VT_BSTR || rightvt == VT_BSTR)
+                {
+                    if (leftvt == rightvt || leftvt == VT_BOOL ||
+                        rightvt == VT_BOOL)
+                        resvt = VT_BOOL;
+                    else
+                        resvt = VT_I4;
+                }
+                else if (leftvt == VT_BOOL && rightvt == VT_BOOL)
+                    resvt = VT_BOOL;
+                else
+                    resvt = VT_I4;
+
+                hres = pVarAnd(&left, &right, &result);
+
+                /* Check if the expected HRESULT and result variant type is correct */
+                ok(hres == expectedhres && resvt == V_VT(&result),
+                    "VarAnd: %s|0x%X, %s|0x%X: expected vt %s hr 0x%lX, got vt %s hr 0x%lX\n",
+                    vtstr(leftvt), ExtraFlags[i], vtstr(rightvt), ExtraFlags[i], vtstr(resvt),
+                    expectedhres, vtstr(V_VT(&result)), hres);
+            }
+        }
+    }
+
     /*
      * Test returned values. Since we know the returned type is correct
      * and that we handle all combinations of invalid types, just check
-- 
1.4.0


More information about the wine-patches mailing list