[PATCH] oledb32/tests: Add convert to DBTYPE_NUMERIC tests

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Thu Mar 23 20:11:17 CDT 2017


Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
 dlls/oledb32/tests/convert.c | 147 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 147 insertions(+)

diff --git a/dlls/oledb32/tests/convert.c b/dlls/oledb32/tests/convert.c
index b8b3c6f..4e49058 100644
--- a/dlls/oledb32/tests/convert.c
+++ b/dlls/oledb32/tests/convert.c
@@ -3264,6 +3264,152 @@ static void test_converttoiunknown(void)
     ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
+#define test_numberic_val(dst, array) _test_numberic_val(__LINE__, dst, array);
+static inline void _test_numberic_val(unsigned line, DB_NUMERIC *dst, BYTE *array)
+{
+    int same = !memcmp(dst->val, array, sizeof(dst->val));
+    ok_(__FILE__,line) (same, "Invalid byte array\n");
+    if(!same)
+    {
+        int i;
+        for(i=0; i < sizeof(dst->val); i++)
+            ok_(__FILE__,line) (dst->val[i] == array[i], " byte %d got 0x%02x\n", i, dst->val[i]);
+    }
+}
+
+static inline void set_numberic_array(BYTE *dst,
+                                 BYTE x0, BYTE x1, BYTE x2,  BYTE x3,  BYTE x4,  BYTE x5,  BYTE x6,
+                                 BYTE x7, BYTE x8, BYTE x9,  BYTE x10, BYTE x11, BYTE x12, BYTE x13,
+                                 BYTE x14, BYTE x15)
+{
+    dst[0]  = x0;  dst[1]  = x1;  dst[2]  = x2;  dst[3]  = x3;
+    dst[4]  = x4;  dst[5]  = x5;  dst[6]  = x6;  dst[7]  = x7;
+    dst[8]  = x8;  dst[9]  = x9;  dst[10] = x10; dst[11] = x11;
+    dst[12] = x12; dst[13] = x13; dst[14] = x14; dst[15] = x15;
+}
+
+static void test_converttonumeric(void)
+{
+    HRESULT hr;
+    DBSTATUS dst_status;
+    DBLENGTH dst_len;
+    DB_NUMERIC dst;
+    BYTE src[20];
+    static WCHAR strW[] = {'1','2','3','.','4','5',0};
+    static WCHAR largeW[] = {'1','2','3','4','5','6','7','8','9','0',0};
+    BSTR bstr;
+    FLOAT fvalue = 543.21f;
+    VARIANT_BOOL boolean = VARIANT_TRUE;
+    LARGE_INTEGER i8;
+    BYTE array[16];
+
+    *(INT *)src = 4098;
+    dst_len = 0x1234;
+    dst.scale = 30;
+    memset(dst.val, 0xfe, sizeof(dst.val));
+    hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_NUMERIC, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
+    todo_wine ok(hr == S_OK, "got %08x\n", hr);
+    todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
+    todo_wine ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
+    todo_wine ok(dst.precision == 10, "returned %d\n", dst.precision);
+    todo_wine ok(dst.scale == 0, "returned %d\n", dst.scale);
+    todo_wine ok(dst.sign == 1, "returned %d\n", dst.sign);
+    set_numberic_array(array, 0x02, 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
+    todo_wine test_numberic_val(&dst, array);
+
+    i8.QuadPart = 12345;
+    dst_len = 0x1234;
+    dst.scale = 30;
+    memset(dst.val, 0xfe, sizeof(dst.val));
+    hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_NUMERIC, sizeof(i8), &dst_len, &i8, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
+    todo_wine ok(hr == S_OK, "got %08x\n", hr);
+    todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
+    todo_wine ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
+    todo_wine ok(dst.precision == 10, "returned %d\n", dst.precision);
+    todo_wine ok(dst.scale == 0, "returned %d\n", dst.scale);
+    todo_wine ok(dst.sign == 1, "returned %d\n", dst.sign);
+    set_numberic_array(array, 0x39, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
+    todo_wine test_numberic_val(&dst, array);
+
+    dst_len = 0x1234;
+    dst.scale = 30;
+    dst.sign = 1;
+    memset(dst.val, 0xfe, sizeof(dst.val));
+    hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_NUMERIC, sizeof(boolean), &dst_len, &boolean, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
+    todo_wine ok(hr == S_OK, "got %08x\n", hr);
+    todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
+    todo_wine ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
+    todo_wine ok(dst.precision == 10, "returned %d\n", dst.precision);
+    todo_wine ok(dst.scale == 0, "returned %d\n", dst.scale);
+    todo_wine ok(dst.sign == 0, "returned %d\n", dst.sign);
+    set_numberic_array(array, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
+    todo_wine test_numberic_val(&dst, array);
+
+    dst_len = 0x1234;
+    dst.scale = 30;
+    dst.sign = 0;
+    memset(dst.val, 0xfe, sizeof(dst.val));
+    hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_NUMERIC, sizeof(fvalue), &dst_len, &fvalue, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
+    todo_wine ok(hr == S_OK, "got %08x\n", hr);
+    todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
+    todo_wine ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
+    todo_wine ok(dst.precision == 10, "returned %d\n", dst.precision);
+    todo_wine ok(dst.scale == 0, "returned %d\n", dst.scale);
+    todo_wine ok(dst.sign == 1, "returned %d\n", dst.sign);
+    set_numberic_array(array, 0x1f, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
+    todo_wine test_numberic_val(&dst, array);
+
+    dst_len = 0x1234;
+    dst.scale = 30;
+    dst.sign = 0;
+    memset(dst.val, 0xfe, sizeof(dst.val));
+    hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_NUMERIC, sizeof(strW), &dst_len, strW, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
+    todo_wine ok(hr == S_OK, "got %08x\n", hr);
+    todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
+    todo_wine ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
+    todo_wine ok(dst.precision == 10, "returned %d\n", dst.precision);
+    todo_wine ok(dst.scale == 0, "returned %d\n", dst.scale);
+    todo_wine ok(dst.sign == 1, "returned %d\n", dst.sign);
+    set_numberic_array(array, 0x7b, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
+    todo_wine test_numberic_val(&dst, array);
+
+    bstr = SysAllocString(strW);
+    *(BSTR *)src = bstr;
+    dst_status = 0;
+    dst.scale = 30;
+    dst.sign = 0;
+    dst_len = sizeof(strW);
+    memset(dst.val, 0xfe, sizeof(dst.val));
+    hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_NUMERIC, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
+    todo_wine ok(hr == S_OK, "got %08x\n", hr);
+    todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
+    todo_wine ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
+    todo_wine ok(dst.precision == 10, "returned %d\n", dst.precision);
+    todo_wine ok(dst.scale == 0, "returned %d\n", dst.scale);
+    todo_wine ok(dst.sign == 1, "returned %d\n", dst.sign);
+    SysFreeString(bstr);
+    set_numberic_array(array, 0x7b, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
+    todo_wine test_numberic_val(&dst, array);
+
+    bstr = SysAllocString(largeW);
+    *(BSTR *)src = bstr;
+    dst_status = 0;
+    dst.scale = 30;
+    dst.sign = 0;
+    dst_len = sizeof(largeW);
+    memset(dst.val, 0xfe, sizeof(dst.val));
+    hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_NUMERIC, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
+    todo_wine ok(hr == S_OK, "got %08x\n", hr);
+    todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
+    todo_wine ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
+    todo_wine ok(dst.precision == 10, "returned %d\n", dst.precision);
+    todo_wine ok(dst.scale == 0, "returned %d\n", dst.scale);
+    todo_wine ok(dst.sign == 1, "returned %d\n", dst.sign);
+    SysFreeString(bstr);
+    set_numberic_array(array, 0xd2, 0x02, 0x96, 0x49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
+    todo_wine test_numberic_val(&dst, array);
+}
+
 START_TEST(convert)
 {
     HRESULT hr;
@@ -3304,6 +3450,7 @@ START_TEST(convert)
     test_getconversionsize();
     test_converttotimestamp();
     test_converttoiunknown();
+    test_converttonumeric();
 
     IDataConvert_Release(convert);
 
-- 
1.9.1




More information about the wine-patches mailing list