def test_BSTR(self): v = VARIANT() v.value = u"abc\x00123\x00" self.failUnlessEqual(v.value, "abc\x00123\x00") v.value = None # manually clear the variant v._.VT_I4 = 0 # NULL pointer BSTR should be handled as empty string v.vt = VT_BSTR self.failUnless(v.value in ("", None))
def test_integers(self): v = VARIANT() if (hasattr(sys, "maxint")): # this test doesn't work in Python 3000 v.value = sys.maxint self.failUnlessEqual(v.value, sys.maxint) self.failUnlessEqual(type(v.value), int) v.value += 1 self.failUnlessEqual(v.value, sys.maxint+1) self.failUnlessEqual(type(v.value), long) v.value = 1L self.failUnlessEqual(v.value, 1) self.failUnlessEqual(type(v.value), int)
def test_int(self): import array for typecode in "bhiBHIlL": a = array.array(typecode, (1, 1, 1, 1)) v = VARIANT() v.value = a self.failUnlessEqual(v.value, (1, 1, 1, 1))
def test_decimal_as_currency(self): value = decimal.Decimal('3.14') v = VARIANT() v.value = value self.failUnlessEqual(v.vt, VT_CY) self.failUnlessEqual(v.value, value)
def test_datetime(self): now = datetime.datetime.now() v = VARIANT() v.value = now self.failUnlessEqual(v.vt, VT_DATE) self.failUnlessEqual(v.value, now)
def test_datetime(self): now = datetime.datetime.now() v = VARIANT() v.value = now self.failUnlessEqual(v.value, now) self.failUnlessEqual(v.vt, VT_DATE)
def test_integers(self): v = VARIANT() if (hasattr(sys, "maxint")): # this test doesn't work in Python 3000 v.value = sys.maxsize self.assertEqual(v.value, sys.maxsize) self.assertEqual(type(v.value), int) v.value += 1 self.assertEqual(v.value, sys.maxsize+1) self.assertEqual(type(v.value), int) v.value = 1 self.assertEqual(v.value, 1) self.assertEqual(type(v.value), int)
def test_datetime(self): now = datetime.datetime.now() v = VARIANT() v.value = now self.assertEqual(v.vt, VT_DATE) self.assertEqual(v.value, now)
def test_decimal(self): pi = Decimal("3.13") v = VARIANT() v.value = pi self.failUnlessEqual(v.vt, VT_CY) self.failUnlessEqual(v.value, pi)
def test_double(self): import array for typecode in "df": # because of FLOAT rounding errors, whi will only work for # certain values! a = array.array(typecode, (1.0, 2.0, 3.0, 4.5)) v = VARIANT() v.value = a self.failUnlessEqual(v.value, (1.0, 2.0, 3.0, 4.5))
def intToVariant(i): ''' helper method, constructs Windows "VARIANT" object representing an integer ''' v = VARIANT() v.vt = VT_I4 v.value = i assert( isinstance(i, int) ) return v
def test_int(self): np = get_numpy() if np is None: return for dtype in ('int8', 'int16', 'int32', 'int64', 'uint8', 'uint16', 'uint32', 'uint64'): a = np.array((1, 1, 1, 1), dtype=dtype) v = VARIANT() v.value = a self.failUnless((v.value == a).all())
def test_VARIANT_array(self): v = VARIANT() v.value = ((1, 2, 3), ("foo", "bar", None)) self.failUnlessEqual(v.vt, VT_ARRAY | VT_VARIANT) self.failUnlessEqual(v.value, ((1, 2, 3), ("foo", "bar", None))) def func(): v = VARIANT((1, 2, 3), ("foo", "bar", None)) bytes = find_memleak(func) self.failIf(bytes, "Leaks %d bytes" % bytes)
def test_double(self): np = get_numpy() if np is None: return for dtype in ('float32', 'float64'): # because of FLOAT rounding errors, whi will only work for # certain values! a = np.array([1.0, 2.0, 3.0, 4.5], dtype=dtype) v = VARIANT() v.value = a self.failUnless((v.value == a).all())
def test_mixed(self): np = get_numpy() if np is None: return now = datetime.datetime.now() a = np.array( [11, "22", None, True, now, decimal.Decimal("3.14")]).reshape(2,3) v = VARIANT() v.value = a self.failUnless((v.value == a).all())
def test_ctypes_in_variant(self): v = VARIANT() objs = [(c_ubyte(3), VT_UI1), (c_char("x"), VT_UI1), (c_byte(3), VT_I1), (c_ushort(3), VT_UI2), (c_short(3), VT_I2), (c_uint(3), VT_UI4), (c_int(3), VT_I4), (c_double(3.14), VT_R8), (c_float(3.14), VT_R4), ] for value, vt in objs: v.value = value self.failUnlessEqual(v.vt, vt)
def test_com_pointers(self): # Storing a COM interface pointer in a VARIANT increments the refcount, # changing the variant to contain something else decrements it tlb = LoadRegTypeLib(GUID("{00020430-0000-0000-C000-000000000046}"), 2, 0, 0) rc = get_refcnt(tlb) v = VARIANT(tlb) self.failUnlessEqual(get_refcnt(tlb), rc+1) p = v.value self.failUnlessEqual(get_refcnt(tlb), rc+2) del p self.failUnlessEqual(get_refcnt(tlb), rc+1) v.value = None self.failUnlessEqual(get_refcnt(tlb), rc)
def test_datetime64(self): np = get_numpy() if np is None: return try: np.datetime64 except AttributeError: return dates = [ np.datetime64("2000-01-01T05:30:00", "s"), np.datetime64("1800-01-01T05:30:00", "ms"), np.datetime64("2000-01-01T12:34:56", "us") ] for date in dates: v = VARIANT() v.value = date self.failUnlessEqual(v.vt, VT_DATE) self.failUnlessEqual(v.value, date.astype(datetime.datetime))
def get_wia_files(self): device_mgr = CreateObject(progid='WiaDevMgr', interface=IWiaDevMgr) targets = [device_mgr.CreateDevice(self.id)] while targets: target = targets.pop() enum = target.EnumChildItems() NUM_OBJECTS_TO_REQUEST = 20 num_fetched = NUM_OBJECTS_TO_REQUEST while num_fetched == NUM_OBJECTS_TO_REQUEST: items = (POINTER(IWiaItem) * NUM_OBJECTS_TO_REQUEST)() num_fetched = enum.Next(NUM_OBJECTS_TO_REQUEST, items) for i in xrange(num_fetched): try: item = items[i] flags = item.GetItemType() if flags & WIA_ITEM_TYPE_FOLDER: targets.append(item) continue property_store = item.QueryInterface(IWiaPropertyStorage) propspec = PROPSPEC() propspec.ulKind = 1 propspec.u.propid = 4098 name = VARIANT() property_store.ReadMultiple(1, byref(propspec), byref(name)) propspec.u.propid = 4123 ext = VARIANT() property_store.ReadMultiple(1, byref(propspec), byref(ext)) try: filename = name.value if ext.value: filename = filename + '.' + ext.value except Exception: unhandled_exc_handler() continue if not image_or_video(filename): TRACE('Skipping %s, not photo or video', filename) continue try: if ext.value and ext.value.lower() == 'bmp': report_bad_assumption('Bitmap in a WIA device') continue except Exception: unhandled_exc_handler() propspec.u.propid = 4116 filesize = VARIANT() property_store.ReadMultiple(1, byref(propspec), byref(filesize)) propspec.u.propid = 4100 filetime = PROPVARIANT() property_store.ReadMultiple(1, byref(propspec), cast(byref(filetime), POINTER(VARIANT))) spec_tymed = PROPSPEC() spec_tymed.ulKind = 1 spec_tymed.u.propid = 4108 var_tymed = VARIANT() var_tymed.value = 128 property_store.WriteMultiple(1, byref(spec_tymed), byref(var_tymed), 4098) filetime = datetime_from_var_date(filetime) yield WiaFile(id=filename, name=filename, size=filesize.value, mtime=filetime, wia_item=item) except Exception as e: self.handle_disconnect_exceptions(e) unhandled_exc_handler()
def test_empty_BSTR(self): v = VARIANT() v.value = "" self.assertEqual(v.vt, VT_BSTR)