123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- # testCollections.py
- #
- # This code tests both the client and server side of collections
- # and enumerators.
- #
- # Also has the side effect of testing some of the PythonCOM error semantics.
- import sys
- import win32com.server.util
- import win32com.test.util
- import win32com.client
- import traceback
- import pythoncom
- import pywintypes
- import winerror
- L=pywintypes.Unicode
- import unittest
- error = "collection test error"
- def MakeEmptyEnum():
- # create the Python enumerator object as a real COM object
- o = win32com.server.util.wrap( win32com.server.util.Collection() )
- return win32com.client.Dispatch(o)
- def MakeTestEnum():
- # create a sub-collection, just to make sure it works :-)
- sub = win32com.server.util.wrap( win32com.server.util.Collection( ['Sub1', 2, 'Sub3']) )
- # create the Python enumerator object as a real COM object
- o = win32com.server.util.wrap( win32com.server.util.Collection( [1,'Two',3, sub]))
- return win32com.client.Dispatch(o)
- def TestEnumAgainst(o,check):
- for i in range(len(check)):
- if o(i) != check[i]:
- raise error("Using default method gave the incorrect value - %s/%s" % (repr(o(i)), repr(check[i])))
- for i in range(len(check)):
- if o.Item(i) != check[i]:
- raise error("Using Item method gave the incorrect value - %s/%s" % (repr(o(i)), repr(check[i])))
- # First try looping.
- cmp = []
- for s in o:
- cmp.append(s)
- if cmp[:len(check)] != check:
- raise error("Result after looping isnt correct - %s/%s" % (repr(cmp[:len(check)]), repr(check)))
- for i in range(len(check)):
- if o[i] != check[i]:
- raise error("Using indexing gave the incorrect value")
- def TestEnum(quiet=None):
- if quiet is None:
- quiet = not "-v" in sys.argv
- if not quiet: print("Simple enum test")
- o = MakeTestEnum()
- check = [1,'Two',3]
- TestEnumAgainst(o, check)
- if not quiet: print("sub-collection test")
- sub = o[3]
- TestEnumAgainst(sub ,['Sub1', 2, 'Sub3'])
- # Remove the sublist for this test!
- o.Remove(o.Count()-1)
- if not quiet: print("Remove item test")
- del check[1]
- o.Remove(1)
- TestEnumAgainst(o, check)
- if not quiet: print("Add item test")
- o.Add('New Item')
- check.append('New Item')
- TestEnumAgainst(o, check)
- if not quiet: print("Insert item test")
- o.Insert(2, -1)
- check.insert(2, -1)
- TestEnumAgainst(o, check)
- ### This does not work!
- # if not quiet: print "Indexed replace item test"
- # o[2] = 'Replaced Item'
- # check[2] = 'Replaced Item'
- # TestEnumAgainst(o, check)
- try:
- o()
- raise error("default method with no args worked when it shouldnt have!")
- except pythoncom.com_error as exc:
- if exc.hresult != winerror.DISP_E_BADPARAMCOUNT:
- raise error("Expected DISP_E_BADPARAMCOUNT - got %s" % (exc,))
- try:
- o.Insert("foo", 2)
- raise error("Insert worked when it shouldnt have!")
- except pythoncom.com_error as exc:
- if exc.hresult != winerror.DISP_E_TYPEMISMATCH:
- raise error("Expected DISP_E_TYPEMISMATCH - got %s" % (exc,))
- # Remove the sublist for this test!
- try:
- o.Remove(o.Count())
- raise error("Remove worked when it shouldnt have!")
- except pythoncom.com_error as exc:
- if exc.hresult != winerror.DISP_E_BADINDEX:
- raise error("Expected DISP_E_BADINDEX - got %s" % (exc,))
- # Test an empty collection
- if not quiet: print("Empty collection test")
- o = MakeEmptyEnum()
- for item in o:
- raise error("Empty list performed an iteration")
- try:
- ob = o[1]
- raise error("Empty list could be indexed")
- except IndexError:
- pass
- try:
- ob = o[0]
- raise error("Empty list could be indexed")
- except IndexError:
- pass
- try:
- ob = o(0)
- raise error("Empty list could be indexed")
- except pythoncom.com_error as exc:
- if exc.hresult != winerror.DISP_E_BADINDEX:
- raise error("Expected DISP_E_BADINDEX - got %s" % (exc,))
- class TestCase(win32com.test.util.TestCase):
- def testEnum(self):
- TestEnum()
- if __name__=='__main__':
- unittest.main()
|