PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/External.LCA_RESTRICTED/Languages/IronPython/27/Lib/site-packages/win32com/test/testIterators.py

http://github.com/IronLanguages/main
Python | 132 lines | 99 code | 15 blank | 18 comment | 20 complexity | 282b9460291549f6d9d4b9954db42394 MD5 | raw file
Possible License(s): CPL-1.0, BSD-3-Clause, ISC, GPL-2.0, MPL-2.0-no-copyleft-exception
  1. from __future__ import generators
  2. # Some raw iter tests. Some "high-level" iterator tests can be found in
  3. # testvb.py and testOutlook.py
  4. import sys
  5. import unittest
  6. from win32com.client.gencache import EnsureDispatch
  7. from win32com.client import Dispatch
  8. import win32com.server.util
  9. import win32com.test.util
  10. import pythoncom
  11. def yield_iter(iter):
  12. while 1:
  13. yield iter.next()
  14. class _BaseTestCase(win32com.test.util.TestCase):
  15. def test_enumvariant_vb(self):
  16. ob, iter = self.iter_factory()
  17. got=[]
  18. for v in iter:
  19. got.append(v)
  20. self.assertEquals(got, self.expected_data)
  21. def test_yield(self):
  22. ob, i = self.iter_factory()
  23. got=[]
  24. for v in yield_iter(iter(i)):
  25. got.append(v)
  26. self.assertEquals(got, self.expected_data)
  27. def _do_test_nonenum(self, object):
  28. try:
  29. for i in object:
  30. pass
  31. self.fail("Could iterate over a non-iterable object")
  32. except TypeError:
  33. pass # this is expected.
  34. self.assertRaises(TypeError, iter, object)
  35. self.assertRaises(AttributeError, getattr, object, "next")
  36. def test_nonenum_wrapper(self):
  37. # Check our raw PyIDispatch
  38. ob = self.object._oleobj_
  39. try:
  40. for i in ob:
  41. pass
  42. self.fail("Could iterate over a non-iterable object")
  43. except TypeError:
  44. pass # this is expected.
  45. self.assertRaises(TypeError, iter, ob)
  46. self.assertRaises(AttributeError, getattr, ob, "next")
  47. # And our Dispatch wrapper
  48. ob = self.object
  49. try:
  50. for i in ob:
  51. pass
  52. self.fail("Could iterate over a non-iterable object")
  53. except TypeError:
  54. pass # this is expected.
  55. # Note that as our object may be dynamic, we *do* have a __getitem__
  56. # method, meaning we *can* call iter() on the object. In this case
  57. # actual iteration is what fails.
  58. # So either the 'iter(); will raise a type error, or an attempt to
  59. # fetch it
  60. try:
  61. iter(ob).next()
  62. self.fail("Expected a TypeError fetching this iterator")
  63. except TypeError:
  64. pass
  65. # And it should never have a 'next' method
  66. self.assertRaises(AttributeError, getattr, ob, "next")
  67. class VBTestCase(_BaseTestCase):
  68. def setUp(self):
  69. def factory():
  70. # Our VB test harness exposes a property with IEnumVariant.
  71. ob = self.object.EnumerableCollectionProperty
  72. for i in self.expected_data:
  73. ob.Add(i)
  74. # Get the raw IEnumVARIANT.
  75. invkind = pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET
  76. iter = ob._oleobj_.InvokeTypes(pythoncom.DISPID_NEWENUM,0,invkind,(13, 10),())
  77. return ob, iter.QueryInterface(pythoncom.IID_IEnumVARIANT)
  78. # We *need* generated dispatch semantics, so dynamic __getitem__ etc
  79. # don't get in the way of our tests.
  80. self.object = EnsureDispatch("PyCOMVBTest.Tester")
  81. self.expected_data = [1, "Two", "3"]
  82. self.iter_factory = factory
  83. def tearDown(self):
  84. self.object = None
  85. # Test our client semantics, but using a wrapped Python list object.
  86. # This has the effect of re-using our client specific tests, but in this
  87. # case is exercising the server side.
  88. class SomeObject:
  89. _public_methods_ = ["GetCollection"]
  90. def __init__(self, data):
  91. self.data = data
  92. def GetCollection(self):
  93. return win32com.server.util.NewCollection(self.data)
  94. class WrappedPythonCOMServerTestCase(_BaseTestCase):
  95. def setUp(self):
  96. def factory():
  97. ob = self.object.GetCollection()
  98. flags = pythoncom.DISPATCH_METHOD | pythoncom.DISPATCH_PROPERTYGET
  99. enum = ob._oleobj_.Invoke(pythoncom.DISPID_NEWENUM, 0, flags, 1)
  100. return ob, enum.QueryInterface(pythoncom.IID_IEnumVARIANT)
  101. self.expected_data = [1,'Two',3]
  102. sv = win32com.server.util.wrap(SomeObject(self.expected_data))
  103. self.object = Dispatch(sv)
  104. self.iter_factory = factory
  105. def tearDown(self):
  106. self.object = None
  107. def suite():
  108. # We dont want our base class run
  109. suite = unittest.TestSuite()
  110. for item in globals().itervalues():
  111. if type(item)==type(unittest.TestCase) and \
  112. issubclass(item, unittest.TestCase) and \
  113. item != _BaseTestCase:
  114. suite.addTest(unittest.makeSuite(item))
  115. return suite
  116. if __name__=='__main__':
  117. unittest.main(argv=sys.argv + ['suite'])