You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
4.9 KiB
158 lines
4.9 KiB
import unittest
|
|
from comtypes.client import CreateObject
|
|
from ctypes import ArgumentError
|
|
|
|
from comtypes.test.find_memleak import find_memleak
|
|
|
|
|
|
class Test(unittest.TestCase):
|
|
|
|
def test_IEnumVARIANT(self):
|
|
# The XP firewall manager.
|
|
fwmgr = CreateObject('HNetCfg.FwMgr')
|
|
# apps has a _NewEnum property that implements IEnumVARIANT
|
|
services = fwmgr.LocalPolicy.CurrentProfile.Services
|
|
|
|
self.assertEqual(services.Count, len(services))
|
|
|
|
cv = iter(services)
|
|
|
|
names = [p.Name for p in cv]
|
|
self.assertEqual(len(services), len(names))
|
|
|
|
# The iterator is consumed now:
|
|
self.assertEqual([p.Name for p in cv], [])
|
|
|
|
# But we can reset it:
|
|
cv.Reset()
|
|
self.assertEqual([p.Name for p in cv], names)
|
|
|
|
# Reset, then skip:
|
|
cv.Reset()
|
|
cv.Skip(3)
|
|
self.assertEqual([p.Name for p in cv], names[3:])
|
|
|
|
# Reset, then skip:
|
|
cv.Reset()
|
|
cv.Skip(300)
|
|
self.assertEqual([p.Name for p in cv], names[300:])
|
|
|
|
# Hm, do we want to allow random access to the iterator?
|
|
# Should the iterator support __getitem__ ???
|
|
self.assertEqual(cv[0].Name, names[0])
|
|
self.assertEqual(cv[0].Name, names[0])
|
|
self.assertEqual(cv[0].Name, names[0])
|
|
|
|
if len(names) > 1:
|
|
self.assertEqual(cv[1].Name, names[1])
|
|
self.assertEqual(cv[1].Name, names[1])
|
|
self.assertEqual(cv[1].Name, names[1])
|
|
|
|
# We can now call Next(celt) with celt != 1, the call always returns a
|
|
# list:
|
|
cv.Reset()
|
|
self.assertEqual(names[:3],
|
|
[p.Name for p in cv.Next(3)])
|
|
|
|
# calling Next(0) makes no sense, but should work anyway:
|
|
self.assertEqual(cv.Next(0), [])
|
|
|
|
cv.Reset()
|
|
self.assertEqual(len(cv.Next(len(names) * 2)), len(names))
|
|
|
|
# slicing is not (yet?) supported
|
|
cv.Reset()
|
|
self.assertRaises(ArgumentError, lambda: cv[:])
|
|
|
|
def test_leaks_1(self):
|
|
# The XP firewall manager.
|
|
fwmgr = CreateObject('HNetCfg.FwMgr')
|
|
# apps has a _NewEnum property that implements IEnumVARIANT
|
|
apps = fwmgr.LocalPolicy.CurrentProfile.AuthorizedApplications
|
|
|
|
def doit():
|
|
for item in iter(apps):
|
|
item.ProcessImageFileName
|
|
bytes = find_memleak(doit, (20, 20))
|
|
self.assertFalse(bytes, "Leaks %d bytes" % bytes)
|
|
|
|
def test_leaks_2(self):
|
|
# The XP firewall manager.
|
|
fwmgr = CreateObject('HNetCfg.FwMgr')
|
|
# apps has a _NewEnum property that implements IEnumVARIANT
|
|
apps = fwmgr.LocalPolicy.CurrentProfile.AuthorizedApplications
|
|
|
|
def doit():
|
|
iter(apps).Next(99)
|
|
bytes = find_memleak(doit, (20, 20))
|
|
self.assertFalse(bytes, "Leaks %d bytes" % bytes)
|
|
|
|
def test_leaks_3(self):
|
|
# The XP firewall manager.
|
|
fwmgr = CreateObject('HNetCfg.FwMgr')
|
|
# apps has a _NewEnum property that implements IEnumVARIANT
|
|
apps = fwmgr.LocalPolicy.CurrentProfile.AuthorizedApplications
|
|
|
|
def doit():
|
|
for i in range(2):
|
|
for what in iter(apps):
|
|
pass
|
|
bytes = find_memleak(doit, (20, 20))
|
|
self.assertFalse(bytes, "Leaks %d bytes" % bytes)
|
|
|
|
|
|
class TestCollectionInterface(unittest.TestCase):
|
|
""" Test the early-bound collection interface. """
|
|
|
|
def setUp(self):
|
|
self.d = CreateObject("Scripting.Dictionary", dynamic=False)
|
|
|
|
def tearDown(self):
|
|
del self.d
|
|
|
|
def assertAccessInterface(self, d):
|
|
""" Asserts access via indexing and named property """
|
|
self.assertEqual(d.CompareMode, 42)
|
|
self.assertEqual(d["foo"], 1)
|
|
self.assertEqual(d.Item["foo"], d["foo"])
|
|
self.assertEqual(d.Item("foo"), d["foo"])
|
|
self.assertEqual(d["bar"], "spam foo")
|
|
self.assertEqual(d.Item("bar"), "spam foo")
|
|
self.assertEqual(d["baz"], 3.14)
|
|
self.assertEqual(d.Item("baz"), d["baz"])
|
|
self.assertIsNone(d["asdlfkj"])
|
|
self.assertIsNone(d.Item["asdlfkj"])
|
|
self.assertIsNone(d.Item("asdlfkj"))
|
|
|
|
items = iter(d)
|
|
self.assertEqual(items[0], "foo")
|
|
self.assertEqual(items[1], "bar")
|
|
self.assertEqual(items[2], "baz")
|
|
self.assertEqual(items[3], "asdlfkj")
|
|
|
|
def test_index_setter(self):
|
|
d = self.d
|
|
d.CompareMode = 42
|
|
d["foo"] = 1
|
|
d["bar"] = "spam foo"
|
|
d["baz"] = 3.14
|
|
self.assertAccessInterface(d)
|
|
|
|
def test_named_property_setter(self):
|
|
d = self.d
|
|
d.CompareMode = 42
|
|
d.Item["foo"] = 1
|
|
d.Item["bar"] = "spam foo"
|
|
d.Item["baz"] = 3.14
|
|
self.assertAccessInterface(d)
|
|
|
|
def test_named_property_no_length(self):
|
|
self.assertRaises(TypeError, len, self.d.Item)
|
|
|
|
def test_named_property_not_iterable(self):
|
|
self.assertRaises(TypeError, list, self.d.Item)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|