1 # Check every path through every method of UserDict
3 from test
.test_support
import verify
, verbose
4 from UserDict
import UserDict
, IterableUserDict
8 d2
= {"one": 1, "two": 2}
9 d3
= {"one": 1, "two": 3, "three": 5}
10 d4
= {"one": None, "two": None}
11 d5
= {"one": 1, "two": 1}
18 u2
= IterableUserDict(d2
)
25 verify(UserDict(one
=1, two
=2) == d2
) # keyword arg constructor
26 verify(UserDict([('one',1), ('two',2)]) == d2
) # item sequence constructor
27 verify(UserDict(dict=[('one',1), ('two',2)]) == d2
)
28 verify(UserDict([('one',1), ('two',2)], two
=3, three
=5) == d3
) # both together
30 verify(UserDict
.fromkeys('one two'.split()) == d4
) # alternate constructor
31 verify(UserDict().fromkeys('one two'.split()) == d4
)
32 verify(UserDict
.fromkeys('one two'.split(), 1) == d5
)
33 verify(UserDict().fromkeys('one two'.split(), 1) == d5
)
34 verify(u1
.fromkeys('one two'.split()) is not u1
)
35 verify(isinstance(u1
.fromkeys('one two'.split()), UserDict
))
36 verify(isinstance(u2
.fromkeys('one two'.split()), IterableUserDict
))
40 verify(str(u0
) == str(d0
))
41 verify(repr(u1
) == repr(d1
))
44 # Test __cmp__ and __len__
46 all
= [d0
, d1
, d2
, u
, u0
, u1
, u2
, uu
, uu0
, uu1
, uu2
]
49 verify(cmp(a
, b
) == cmp(len(a
), len(b
)))
53 verify(u2
["one"] == 1)
59 verify(0, "u1['two'] shouldn't exist")
75 verify(0, "u3['three'] shouldn't exist")
87 class MyUserDict(UserDict
):
88 def display(self
): print self
94 # SF bug #476616 -- copy() of UserDict subclass shared data
98 # Test keys, items, values
100 verify(u2
.keys() == d2
.keys())
101 verify(u2
.items() == d2
.items())
102 verify(u2
.values() == d2
.values())
104 # Test has_key and "in".
107 verify(u2
.has_key(i
) == 1)
108 verify((i
in u2
) == 1)
109 verify(u1
.has_key(i
) == d1
.has_key(i
))
110 verify((i
in u1
) == (i
in d1
))
111 verify(u0
.has_key(i
) == d0
.has_key(i
))
112 verify((i
in u0
) == (i
in d0
))
123 verify(u2
.get(i
) == u2
[i
])
124 verify(u1
.get(i
) == d1
.get(i
))
125 verify(u0
.get(i
) == d0
.get(i
))
127 # Test "in" iteration.
136 verify(ikeys
== keys
)
138 ##########################
141 from UserDict
import DictMixin
143 class SeqDict(DictMixin
):
144 """Dictionary lookalike implemented with lists.
146 Used to test and demonstrate DictMixin
151 def __getitem__(self
, key
):
153 i
= self
.keylist
.index(key
)
156 return self
.valuelist
[i
]
157 def __setitem__(self
, key
, value
):
159 i
= self
.keylist
.index(key
)
160 self
.valuelist
[i
] = value
162 self
.keylist
.append(key
)
163 self
.valuelist
.append(value
)
164 def __delitem__(self
, key
):
166 i
= self
.keylist
.index(key
)
170 self
.valuelist
.pop(i
)
172 return list(self
.keylist
)
174 ## Setup test and verify working of the test class
175 s
= SeqDict() # check init
176 s
[10] = 'ten' # exercise setitem
179 del s
[20] # exercise delitem
180 verify(s
[10] == 'ten') # check getitem and setitem
181 verify(s
.keys() == [10, 30]) # check keys() and delitem
183 ## Now, test the DictMixin methods one by one
184 verify(s
.has_key(10)) # has_key
185 verify(not s
.has_key(20))
187 verify(10 in s
) # __contains__
190 verify([k
for k
in s
] == [10, 30]) # __iter__
192 verify(len(s
) == 2) # __len__
194 verify(list(s
.iteritems()) == [(10,'ten'), (30, 'thirty')]) # iteritems
196 verify(list(s
.iterkeys()) == [10, 30]) # iterkeys
198 verify(list(s
.itervalues()) == ['ten', 'thirty']) # itervalues
200 verify(s
.values() == ['ten', 'thirty']) # values
202 verify(s
.items() == [(10,'ten'), (30, 'thirty')]) # items
204 verify(s
.get(10) == 'ten') # get
205 verify(s
.get(15,'fifteen') == 'fifteen')
206 verify(s
.get(15) == None)
208 verify(s
.setdefault(40, 'forty') == 'forty') # setdefault
209 verify(s
.setdefault(10, 'null') == 'ten')
212 verify(s
.pop(10) == 'ten') # pop
216 k
, v
= s
.popitem() # popitem
228 verify(0, "popitem from an empty list should raise KeyError")
230 s
.update({10: 'ten', 20:'twenty'}) # update
231 verify(s
[10]=='ten' and s
[20]=='twenty')
233 verify(s
== {10: 'ten', 20:'twenty'}) # cmp