oleaut32: add conformance test for VarCat

Benjamin Arai me at benjaminarai.com
Mon Jul 3 11:35:02 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 |  191 +++++++++++++++++++++++++++++++++++++++++
  1 files changed, 191 insertions(+), 0 deletions(-)

diff --git a/dlls/oleaut32/tests/vartest.c b/dlls/oleaut32/tests/vartest.c
index e8e4654..8773894 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,195 @@ 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];
+
+    /* 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);
+
+    V_VT(&expected) = VT_BSTR;
+    V_BSTR(&expected) = SysAllocString(sz1234);
+
+    /* Test for string & strings */
+    V_VT(&left) = VT_BSTR;
+    V_VT(&right) = VT_BSTR;
+    V_BSTR(&left) = SysAllocString(sz12);
+    V_BSTR(&right) = SysAllocString(sz34);
+    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 for NULL & NULL */
+    V_VT(&left) = VT_NULL;
+    V_VT(&right) = VT_NULL;
+    VarCat(&left,&right,&result);
+    ok((V_VT(&result)&VT_TYPEMASK) == VT_NULL,
+        "VarCat: VT_NULL concat with VT_NULL should have returned VT_NULL\n");
+
+    VariantClear(&left);
+    VariantClear(&right);
+    VariantClear(&result);
+
+    /* Test for NULL & (Anything but NULL) */
+    V_VT(&left) = VT_NULL;
+    V_VT(&right) = VT_BSTR;
+    V_BSTR(&right) = SysAllocString(sz1234);
+    VarCat(&left,&right,&result);
+    ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
+        "VarCat: VT_NULL concat with VT_BSTR failed to return original VT_BSTR input\n");
+
+    VariantClear(&left);
+    VariantClear(&right);
+    VariantClear(&result);
+
+    V_VT(&left) = VT_BSTR;
+    V_BSTR(&left) = SysAllocString(sz1234);
+    V_VT(&right) = VT_NULL;
+    VarCat(&left,&right,&result);
+    ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
+        "VarCat: VT_BSTR concat with VT_NULL failed to return original VT_BSTR input\n");
+
+    VariantClear(&left);
+    VariantClear(&right);
+    VariantClear(&result);
+
+    todo_wine {	
+    /* Test if expression is VT_ERROR */
+    V_VT(&left) = VT_ERROR;
+    V_VT(&right) = VT_BSTR;
+    VarCat(&left,&right,&result);
+    ok(V_VT(&result) == VT_EMPTY,
+        "VarCat: VT_ERROR concat with VT_BSTR should have returned 0\n");
+
+    VariantClear(&left);
+    VariantClear(&right);
+    VariantClear(&result);
+
+    V_VT(&left) = VT_BSTR;
+    V_VT(&right) = VT_ERROR;
+    VarCat(&left,&right,&result);
+    ok(V_VT(&result) == VT_EMPTY,
+        "VarCat: VT_BSTR concat with VT_ERROR should have returned 0\n");
+
+    VariantClear(&left);
+    VariantClear(&right);
+    VariantClear(&result);
+    }
+
+    todo_wine {
+    /* 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);
+    ok(VarCmp(&result,&expected,lcid,0) == VARCMP_EQ,
+        "VarCat: NUMERER concat with NUMBER returned inncorrect result\n");
+    if (VarCmp(&result,&expected,lcid,0) == VARCMP_EQ)
+    {
+        ok((V_VT(&result)&VT_TYPEMASK) == VT_BSTR,
+            "VarCat: NUMBER concat with a NUMBER should have returned a VT_BSTR\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_BSTR(&left) = SysAllocString(sz_empty);
+    V_BSTR(&right) = 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 +5558,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