TakeTwo: [PATCH] The patch adds a conformance test for the
oleaut32.dll VarCat
Benjamin Arai
me at benjaminarai.com
Thu Jul 6 01:34:35 CDT 2006
See http://bugs.winehq.org/show_bug.cgi?id=5545
License: LGPL
Changelog:
oleaut32: add conformance test for VarCat
Tests pass on Windows XP SP1; several still fail on Wine.
---
dlls/oleaut32/tests/vartest.c | 246 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 246 insertions(+), 0 deletions(-)
diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c
index e8e4654..c69fd6d 100644
--- a/dlls/oleaut32/tests/vartest.c
+++ b/dlls/oleaut32/tests/vartest.c
@@ -2,6 +2,7 @@
* VARIANT test program
*
* Copyright 1998 Jean-Claude Cote
+ * Copyright 2006 Google (Benjamin Arai)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -5074,6 +5075,250 @@ static void test_VarAdd(void)
SysFreeString(rbstr);
}
+static void test_VarCat(void)
+{
+ LCID lcid;
+ VARIANT left, right, result, expected;
+ static const WCHAR sz12[] = {'1','2','\0'};
+ static const WCHAR sz34[] = {'3','4','\0'};
+ static const WCHAR sz1234[] = {'1','2','3','4','\0'};
+ static const WCHAR date_sz12[] = {'9','/','3','0','/','1','9','8','0','1','2','\0'};
+ static const WCHAR sz12_date[] = {'1','2','9','/','3','0','/','1','9','8','0','\0'};
+ static const WCHAR sz_empty[] = {'\0'};
+ TCHAR orig_date_format[128];
+ VARTYPE leftvt, rightvt, resultvt;
+ HRESULT hres;
+
+ /* Set date format for testing */
+ lcid = LOCALE_USER_DEFAULT;
+ GetLocaleInfo(lcid,LOCALE_SSHORTDATE,orig_date_format,128);
+ SetLocaleInfo(lcid,LOCALE_SSHORTDATE,"M/d/yyyy");
+
+ VariantInit(&left);
+ VariantInit(&right);
+ VariantInit(&result);
+ VariantInit(&expected);
+
+ /* Check expected types for all combinations */
+ for (leftvt = 0; leftvt <= VT_BSTR_BLOB; leftvt++)
+ {
+
+ SKIPTESTS(leftvt);
+
+ for (rightvt = 0; rightvt <= VT_BSTR_BLOB; rightvt++)
+ {
+ BOOL bFail = FALSE;
+ SKIPTESTS(rightvt);
+
+ if (leftvt == VT_DISPATCH || rightvt == VT_DISPATCH ||
+ leftvt == VT_UNKNOWN || rightvt == VT_UNKNOWN ||
+ leftvt == VT_RECORD || rightvt == VT_RECORD ||
+ leftvt == VT_CLSID || rightvt == VT_CLSID ||
+ leftvt == VT_BSTR_BLOB || rightvt == VT_BSTR_BLOB
+ )
+ continue;
+
+ if (leftvt == VT_ERROR || rightvt == VT_ERROR)
+ resultvt = VT_EMPTY;
+ else if (leftvt == VT_NULL && rightvt == VT_NULL)
+ resultvt = VT_NULL;
+ else if ((leftvt == VT_I2 || leftvt == VT_I4 ||
+ leftvt == VT_R4 || leftvt == VT_R8 ||
+ leftvt == VT_CY || leftvt == VT_BOOL ||
+ leftvt == VT_BSTR || leftvt == VT_I1 ||
+ leftvt == VT_UI1 || leftvt == VT_UI2 ||
+ leftvt == VT_UI4 || leftvt == VT_I8 ||
+ leftvt == VT_UI8 || leftvt == VT_INT ||
+ leftvt == VT_UINT || leftvt == VT_EMPTY ||
+ leftvt == VT_NULL)
+ &&
+ (rightvt == VT_I2 || rightvt == VT_I4 ||
+ rightvt == VT_R4 || rightvt == VT_R8 ||
+ rightvt == VT_CY || rightvt == VT_BOOL ||
+ rightvt == VT_BSTR || rightvt == VT_I1 ||
+ rightvt == VT_UI1 || rightvt == VT_UI2 ||
+ rightvt == VT_UI4 || rightvt == VT_I8 ||
+ rightvt == VT_UI8 || rightvt == VT_INT ||
+ rightvt == VT_UINT || rightvt == VT_EMPTY ||
+ rightvt == VT_NULL))
+ {
+ resultvt = VT_BSTR;
+ }
+ else
+ resultvt = VT_EMPTY;
+
+ if (leftvt == VT_DATE || rightvt == VT_DATE ||
+ leftvt == VT_ERROR || rightvt == VT_ERROR ||
+ rightvt == VT_DECIMAL || leftvt == VT_DECIMAL
+ )
+ {
+ bFail = TRUE;
+ }
+
+ if (leftvt == VT_BSTR)
+ V_BSTR(&left) = SysAllocString(sz_empty);
+ if (rightvt == VT_BSTR)
+ V_BSTR(&right) = SysAllocString(sz_empty);
+
+ V_VT(&left) = leftvt;
+ V_VT(&right) = rightvt;
+
+ hres = VarCat(&left, &right, &result);
+ if (bFail) {
+ todo_wine {
+ ok(hres == DISP_E_BADVARTYPE || hres == E_INVALIDARG ||
+ hres == DISP_E_TYPEMISMATCH,
+ "VarCat: %d, %d: Expected failure, got 0x%lX\n",
+ leftvt, rightvt, hres);
+ }
+ }
+ else
+ {
+ todo_wine {
+ ok(V_VT(&result) == resultvt,
+ "VarCat: %d, %d: expected vt %d, got vt %d\n",
+ leftvt, rightvt, resultvt, V_VT(&result));
+ }
+ }
+
+ VariantClear(&left);
+ VariantClear(&right);
+ VariantClear(&result);
+ }
+ }
+
+ /* Test concat strings */
+ V_VT(&left) = VT_BSTR;
+ V_VT(&right) = VT_BSTR;
+ V_VT(&expected) = VT_BSTR;
+ V_BSTR(&left) = SysAllocString(sz12);
+ V_BSTR(&right) = SysAllocString(sz34);
+ V_BSTR(&expected) = SysAllocString(sz1234);
+ VarCat(&left,&right,&result);
+ ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
+ "VarCat: VT_BSTR concat with VT_BSTR failed to return correct result\n");
+
+ VariantClear(&left);
+ VariantClear(&right);
+ VariantClear(&result);
+
+ /* Test if expression is VT_ERROR */
+ V_VT(&left) = VT_ERROR;
+ V_VT(&right) = VT_BSTR;
+ VarCat(&left,&right,&result);
+ todo_wine {
+ ok(V_VT(&result) == VT_EMPTY,
+ "VarCat: VT_ERROR concat with VT_BSTR should have returned VT_EMPTY\n");
+ }
+
+ VariantClear(&left);
+ VariantClear(&right);
+ VariantClear(&result);
+
+ V_VT(&left) = VT_BSTR;
+ V_VT(&right) = VT_ERROR;
+ VarCat(&left,&right,&result);
+ todo_wine {
+ ok(V_VT(&result) == VT_EMPTY,
+ "VarCat: VT_BSTR concat with VT_ERROR should have returned VT_EMPTY\n");
+ }
+
+ VariantClear(&left);
+ VariantClear(&right);
+ VariantClear(&result);
+
+
+ /* Test when both expressions are numeric */
+ V_VT(&left) = VT_INT;
+ V_VT(&right) = VT_INT;
+ V_INT(&left) = 12;
+ V_INT(&right) = 34;
+ VarCat(&left,&right,&result);
+ todo_wine {
+ ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
+ "VarCat: NUMERER concat with NUMBER returned inncorrect result\n");
+ }
+
+ VariantClear(&left);
+ VariantClear(&right);
+ VariantClear(&result);
+
+ /* Test if one expression is numeric and the other is a string */
+ V_VT(&left) = VT_INT;
+ V_VT(&right) = VT_BSTR;
+ V_INT(&left) = 12;
+ V_BSTR(&right) = SysAllocString(sz34);
+ VarCat(&left,&right,&result);
+ ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
+ "VarCat: NUMERIC concat with VT_BSTR, inncorrect result\n");
+
+ VariantClear(&left);
+ VariantClear(&right);
+ VariantClear(&result);
+
+ V_VT(&left) = VT_BSTR;
+ V_VT(&right) = VT_INT;
+ V_BSTR(&left) = SysAllocString(sz12);
+ V_INT(&right) = 34;
+ VarCat(&left,&right,&result);
+ ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
+ "VarCat: VT_BSTR concat with NUMERIC, inncorrect result\n");
+
+ VariantClear(&left);
+ VariantClear(&right);
+ VariantClear(&result);
+
+ /* Test concat dates with strings */
+ V_VT(&left) = VT_BSTR;
+ V_VT(&right) = VT_DATE;
+ V_VT(&expected) = VT_BSTR;
+ V_BSTR(&left) = SysAllocString(sz12);
+ V_DATE(&right) = 29494.0;
+ V_BSTR(&expected)= SysAllocString(sz12_date);
+ VarCat(&left,&right,&result);
+ ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
+ "VarCat: VT_BSTR concat with VT_DATE returned inncorrect result\n");
+
+ VariantClear(&left);
+ VariantClear(&right);
+ VariantClear(&result);
+ VariantClear(&expected);
+
+ V_VT(&left) = VT_DATE;
+ V_VT(&right) = VT_BSTR;
+ V_VT(&expected) = VT_BSTR;
+ V_DATE(&left) = 29494.0;
+ V_BSTR(&right) = SysAllocString(sz12);
+ V_BSTR(&expected)= SysAllocString(date_sz12);
+ VarCat(&left,&right,&result);
+ ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
+ "VarCat: VT_DATE concat with VT_BSTR returned inncorrect result\n");
+
+ VariantClear(&left);
+ VariantClear(&right);
+ VariantClear(&result);
+ VariantClear(&expected);
+
+ /* Test of both expressions are empty */
+ V_VT(&left) = VT_BSTR;
+ V_VT(&right) = VT_BSTR;
+ V_VT(&expected) = VT_BSTR;
+ V_BSTR(&left) = SysAllocString(sz_empty);
+ V_BSTR(&right) = SysAllocString(sz_empty);
+ V_BSTR(&expected)= SysAllocString(sz_empty);
+ VarCat(&left,&right,&result);
+ ok(VarCmp(&result,&left,lcid,0) == VARCMP_EQ,
+ "VarCat: EMPTY concat with EMPTY did not return empty VT_BSTR\n");
+
+ /* Restore original date format settings */
+ SetLocaleInfo(lcid,LOCALE_SSHORTDATE,orig_date_format);
+
+ VariantClear(&left);
+ VariantClear(&right);
+ VariantClear(&result);
+ VariantClear(&expected);
+}
+
static HRESULT (WINAPI *pVarCmp)(LPVARIANT,LPVARIANT,LCID,ULONG);
/* ERROR from wingdi.h is interfering here */
@@ -5368,5 +5613,6 @@ START_TEST(vartest)
test_VarEqv();
test_VarMul();
test_VarAdd();
+ test_VarCat();
test_VarCmp();
}
--
1.4.0
More information about the wine-patches
mailing list