import array from comtypes import BSTR, IUnknown from comtypes.test import is_resource_enabled, get_numpy from comtypes.test.find_memleak import find_memleak from ctypes import POINTER, PyDLL, byref, c_double, c_long, pointer, py_object from ctypes.wintypes import BOOL import datetime from decimal import Decimal import unittest from comtypes.automation import ( VARIANT, VT_ARRAY, VT_VARIANT, VT_I4, VT_R4, VT_R8, VT_BSTR, VARIANT_BOOL) from comtypes.automation import _midlSAFEARRAY from comtypes.safearray import safearray_as_ndarray from comtypes._safearray import SafeArrayGetVartype def get_array(sa): """Get an array from a safe array type""" with safearray_as_ndarray: return sa[0] def com_refcnt(o): """Return the COM refcount of an interface pointer""" import gc gc.collect() gc.collect() o.AddRef() return o.Release() class VariantTestCase(unittest.TestCase): def test_VARIANT_array(self): v = VARIANT() v.value = ((1, 2, 3), ("foo", "bar", None)) self.assertEqual(v.vt, VT_ARRAY | VT_VARIANT) self.assertEqual(v.value, ((1, 2, 3), ("foo", "bar", None))) def func(): VARIANT((1, 2, 3), ("foo", "bar", None)) bytes = find_memleak(func) self.assertFalse(bytes, "Leaks %d bytes" % bytes) def test_double_array(self): a = array.array("d", (3.14, 2.78)) v = VARIANT(a) self.assertEqual(v.vt, VT_ARRAY | VT_R8) self.assertEqual(tuple(a.tolist()), v.value) def func(): VARIANT(array.array("d", (3.14, 2.78))) bytes = find_memleak(func) self.assertFalse(bytes, "Leaks %d bytes" % bytes) def test_float_array(self): a = array.array("f", (3.14, 2.78)) v = VARIANT(a) self.assertEqual(v.vt, VT_ARRAY | VT_R4) self.assertEqual(tuple(a.tolist()), v.value) def test_2dim_array(self): data = ((1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)) v = VARIANT(data) self.assertEqual(v.value, data) class SafeArrayTestCase(unittest.TestCase): def test_equality(self): a = _midlSAFEARRAY(c_long) b = _midlSAFEARRAY(c_long) self.assertTrue(a is b) c = _midlSAFEARRAY(BSTR) d = _midlSAFEARRAY(BSTR) self.assertTrue(c is d) self.assertNotEqual(a, c) # XXX remove: self.assertEqual((a._itemtype_, a._vartype_), (c_long, VT_I4)) self.assertEqual((c._itemtype_, c._vartype_), (BSTR, VT_BSTR)) def test_nested_contexts(self): np = get_numpy() if np is None: return t = _midlSAFEARRAY(BSTR) sa = t.from_param(["a", "b", "c"]) first = sa[0] with safearray_as_ndarray: second = sa[0] with safearray_as_ndarray: third = sa[0] fourth = sa[0] fifth = sa[0] self.assertTrue(isinstance(first, tuple)) self.assertTrue(isinstance(second, np.ndarray)) self.assertTrue(isinstance(third, np.ndarray)) self.assertTrue(isinstance(fourth, np.ndarray)) self.assertTrue(isinstance(fifth, tuple)) def test_VT_BSTR(self): t = _midlSAFEARRAY(BSTR) sa = t.from_param(["a", "b", "c"]) self.assertEqual(sa[0], ("a", "b", "c")) self.assertEqual(SafeArrayGetVartype(sa), VT_BSTR) def test_VT_BSTR_ndarray(self): np = get_numpy() if np is None: return t = _midlSAFEARRAY(BSTR) sa = t.from_param(["a", "b", "c"]) arr = get_array(sa) self.assertTrue(isinstance(arr, np.ndarray)) self.assertEqual(np.dtype('