testCollections.py
4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# 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, (hr, desc, exc, argErr):
if hr != winerror.DISP_E_BADPARAMCOUNT:
raise error("Expected DISP_E_BADPARAMCOUNT - got %d (%s)" % (hr, desc))
try:
o.Insert("foo", 2)
raise error("Insert worked when it shouldnt have!")
except pythoncom.com_error, (hr, desc, exc, argErr):
if hr != winerror.DISP_E_TYPEMISMATCH:
raise error("Expected DISP_E_TYPEMISMATCH - got %d (%s)" % (hr, desc))
# Remove the sublist for this test!
try:
o.Remove(o.Count())
raise error("Remove worked when it shouldnt have!")
except pythoncom.com_error, (hr, desc, exc, argErr):
if hr != winerror.DISP_E_BADINDEX:
raise error("Expected DISP_E_BADINDEX - got %d (%s)" % (hr, desc))
# 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, (hr, fn, desc, arg):
if hr != winerror.DISP_E_BADINDEX:
raise error("Expected DISP_E_BADINDEX - got %d (%s)" % (hr, desc))
class TestCase(win32com.test.util.TestCase):
def testEnum(self):
TestEnum()
if __name__=='__main__':
unittest.main()