Skip to content

Commit 161329c

Browse files
gh-145144: Add more tests for UserList, UserDict, etc (GH-145145)
1 parent 97c725c commit 161329c

File tree

6 files changed

+377
-31
lines changed

6 files changed

+377
-31
lines changed

Lib/test/seq_tests.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -261,23 +261,20 @@ def test_minmax(self):
261261
self.assertEqual(min(u), 0)
262262
self.assertEqual(max(u), 2)
263263

264-
def test_addmul(self):
264+
def test_add(self):
265265
u1 = self.type2test([0])
266266
u2 = self.type2test([0, 1])
267267
self.assertEqual(u1, u1 + self.type2test())
268268
self.assertEqual(u1, self.type2test() + u1)
269269
self.assertEqual(u1 + self.type2test([1]), u2)
270270
self.assertEqual(self.type2test([-1]) + u1, self.type2test([-1, 0]))
271-
self.assertEqual(self.type2test(), u2*0)
272-
self.assertEqual(self.type2test(), 0*u2)
271+
272+
def test_mul(self):
273+
u2 = self.type2test([0, 1])
273274
self.assertEqual(self.type2test(), u2*0)
274275
self.assertEqual(self.type2test(), 0*u2)
275276
self.assertEqual(u2, u2*1)
276277
self.assertEqual(u2, 1*u2)
277-
self.assertEqual(u2, u2*1)
278-
self.assertEqual(u2, 1*u2)
279-
self.assertEqual(u2+u2, u2*2)
280-
self.assertEqual(u2+u2, 2*u2)
281278
self.assertEqual(u2+u2, u2*2)
282279
self.assertEqual(u2+u2, 2*u2)
283280
self.assertEqual(u2+u2+u2, u2*3)
@@ -286,8 +283,9 @@ def test_addmul(self):
286283
class subclass(self.type2test):
287284
pass
288285
u3 = subclass([0, 1])
289-
self.assertEqual(u3, u3*1)
290-
self.assertIsNot(u3, u3*1)
286+
r = u3*1
287+
self.assertEqual(r, u3)
288+
self.assertIsNot(r, u3)
291289

292290
def test_iadd(self):
293291
u = self.type2test([0, 1])
@@ -348,6 +346,21 @@ def test_subscript(self):
348346
self.assertRaises(ValueError, a.__getitem__, slice(0, 10, 0))
349347
self.assertRaises(TypeError, a.__getitem__, 'x')
350348

349+
def _assert_cmp(self, a, b, r):
350+
self.assertIs(a == b, r == 0)
351+
self.assertIs(a != b, r != 0)
352+
self.assertIs(a > b, r > 0)
353+
self.assertIs(a <= b, r <= 0)
354+
self.assertIs(a < b, r < 0)
355+
self.assertIs(a >= b, r >= 0)
356+
357+
def test_cmp(self):
358+
a = self.type2test([0, 1])
359+
self._assert_cmp(a, a, 0)
360+
self._assert_cmp(a, self.type2test([0, 1]), 0)
361+
self._assert_cmp(a, self.type2test([0]), 1)
362+
self._assert_cmp(a, self.type2test([0, 2]), -1)
363+
351364
def test_count(self):
352365
a = self.type2test([0, 1, 2])*3
353366
self.assertEqual(a.count(0), 3)

Lib/test/string_tests.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,43 @@ def _get_teststrings(self, charset, digits):
102102
teststrings = [self.fixtype(ts) for ts in teststrings]
103103
return teststrings
104104

105+
def test_add(self):
106+
s = self.fixtype('ab')
107+
self.assertEqual(s + self.fixtype(''), s)
108+
self.assertEqual(self.fixtype('') + s, s)
109+
self.assertEqual(s + self.fixtype('cd'), self.fixtype('abcd'))
110+
111+
def test_mul(self):
112+
s = self.fixtype('ab')
113+
self.assertEqual(s*0, self.fixtype(''))
114+
self.assertEqual(0*s, self.fixtype(''))
115+
self.assertEqual(s*1, s)
116+
self.assertEqual(1*s, s)
117+
self.assertEqual(s*2, self.fixtype('abab'))
118+
self.assertEqual(2*s, self.fixtype('abab'))
119+
120+
class subclass(self.type2test):
121+
pass
122+
s = subclass(self.fixtype('ab'))
123+
r = s*1
124+
self.assertEqual(r, s)
125+
self.assertIsNot(r, s)
126+
127+
def _assert_cmp(self, a, b, r):
128+
self.assertIs(a == b, r == 0)
129+
self.assertIs(a != b, r != 0)
130+
self.assertIs(a > b, r > 0)
131+
self.assertIs(a <= b, r <= 0)
132+
self.assertIs(a < b, r < 0)
133+
self.assertIs(a >= b, r >= 0)
134+
135+
def test_cmp(self):
136+
a = self.fixtype('ab')
137+
self._assert_cmp(a, a, 0)
138+
self._assert_cmp(a, self.fixtype('ab'), 0)
139+
self._assert_cmp(a, self.fixtype('a'), 1)
140+
self._assert_cmp(a, self.fixtype('ac'), -1)
141+
105142
def test_count(self):
106143
self.checkequal(3, 'aaa', 'count', 'a')
107144
self.checkequal(0, 'aaa', 'count', 'b')
@@ -1304,6 +1341,7 @@ def test_extended_getslice(self):
13041341
slice(start, stop, step))
13051342

13061343
def test_mul(self):
1344+
super().test_mul()
13071345
self.checkequal('', 'abc', '__mul__', -1)
13081346
self.checkequal('', 'abc', '__mul__', 0)
13091347
self.checkequal('abc', 'abc', '__mul__', 1)

Lib/test/test_bytes.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2363,13 +2363,20 @@ def fixtype(self, obj):
23632363

23642364
contains_bytes = True
23652365

2366+
def test_mixed_cmp(self):
2367+
a = self.type2test(b'ab')
2368+
for t in bytes, bytearray, BytesSubclass, ByteArraySubclass:
2369+
with self.subTest(t.__name__):
2370+
self._assert_cmp(a, t(b'ab'), 0)
2371+
self._assert_cmp(a, t(b'a'), 1)
2372+
self._assert_cmp(a, t(b'ac'), -1)
2373+
23662374
class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
23672375
type2test = bytearray
23682376

23692377
class BytesAsStringTest(FixedStringTest, unittest.TestCase):
23702378
type2test = bytes
23712379

2372-
23732380
class SubclassTest:
23742381

23752382
def test_basic(self):

Lib/test/test_userdict.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
# Check every path through every method of UserDict
22

3+
from collections import UserDict
34
from test import mapping_tests
45
import unittest
56
import collections
7+
import types
8+
9+
10+
class UserDictSubclass(UserDict):
11+
pass
12+
13+
class UserDictSubclass2(UserDict):
14+
pass
15+
616

717
d0 = {}
818
d1 = {"one": 1}
@@ -155,6 +165,25 @@ def test_init(self):
155165
self.assertRaises(TypeError, collections.UserDict, (), ())
156166
self.assertRaises(TypeError, collections.UserDict.__init__)
157167

168+
def test_data(self):
169+
u = UserDict()
170+
self.assertEqual(u.data, {})
171+
self.assertIs(type(u.data), dict)
172+
d = {'a': 1, 'b': 2}
173+
u = UserDict(d)
174+
self.assertEqual(u.data, d)
175+
self.assertIsNot(u.data, d)
176+
self.assertIs(type(u.data), dict)
177+
u = UserDict(u)
178+
self.assertEqual(u.data, d)
179+
self.assertIs(type(u.data), dict)
180+
u = UserDict([('a', 1), ('b', 2)])
181+
self.assertEqual(u.data, d)
182+
self.assertIs(type(u.data), dict)
183+
u = UserDict(a=1, b=2)
184+
self.assertEqual(u.data, d)
185+
self.assertIs(type(u.data), dict)
186+
158187
def test_update(self):
159188
for kw in 'self', 'dict', 'other', 'iterable':
160189
d = collections.UserDict()
@@ -215,6 +244,69 @@ class G(collections.UserDict):
215244

216245
test_repr_deep = mapping_tests.TestHashMappingProtocol.test_repr_deep
217246

247+
def test_mixed_or(self):
248+
for t in UserDict, dict, types.MappingProxyType:
249+
with self.subTest(t.__name__):
250+
u = UserDict({0: 'a', 1: 'b'}) | t({1: 'c', 2: 'd'})
251+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
252+
self.assertIs(type(u), UserDict)
253+
254+
u = t({0: 'a', 1: 'b'}) | UserDict({1: 'c', 2: 'd'})
255+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
256+
self.assertIs(type(u), UserDict)
257+
258+
u = UserDict({0: 'a', 1: 'b'}) | UserDictSubclass({1: 'c', 2: 'd'})
259+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
260+
self.assertIs(type(u), UserDict)
261+
262+
u = UserDictSubclass({0: 'a', 1: 'b'}) | UserDict({1: 'c', 2: 'd'})
263+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
264+
self.assertIs(type(u), UserDictSubclass)
265+
266+
u = UserDictSubclass({0: 'a', 1: 'b'}) | UserDictSubclass2({1: 'c', 2: 'd'})
267+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
268+
self.assertIs(type(u), UserDictSubclass)
269+
270+
u = UserDict({1: 'c', 2: 'd'}).__ror__(UserDict({0: 'a', 1: 'b'}))
271+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
272+
self.assertIs(type(u), UserDict)
273+
274+
u = UserDictSubclass({1: 'c', 2: 'd'}).__ror__(UserDictSubclass2({0: 'a', 1: 'b'}))
275+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
276+
self.assertIs(type(u), UserDictSubclass)
277+
278+
def test_mixed_ior(self):
279+
for t in UserDict, dict, types.MappingProxyType:
280+
with self.subTest(t.__name__):
281+
u = u2 = UserDict({0: 'a', 1: 'b'})
282+
u |= t({1: 'c', 2: 'd'})
283+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
284+
self.assertIs(type(u), UserDict)
285+
self.assertIs(u, u2)
286+
287+
u = dict({0: 'a', 1: 'b'})
288+
u |= UserDict({1: 'c', 2: 'd'})
289+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
290+
self.assertIs(type(u), dict)
291+
292+
u = u2 = UserDict({0: 'a', 1: 'b'})
293+
u |= UserDictSubclass({1: 'c', 2: 'd'})
294+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
295+
self.assertIs(type(u), UserDict)
296+
self.assertIs(u, u2)
297+
298+
u = u2 = UserDictSubclass({0: 'a', 1: 'b'})
299+
u |= UserDict({1: 'c', 2: 'd'})
300+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
301+
self.assertIs(type(u), UserDictSubclass)
302+
self.assertIs(u, u2)
303+
304+
u = u2 = UserDictSubclass({0: 'a', 1: 'b'})
305+
u |= UserDictSubclass2({1: 'c', 2: 'd'})
306+
self.assertEqual(u, {0: 'a', 1: 'c', 2: 'd'})
307+
self.assertIs(type(u), UserDictSubclass)
308+
self.assertIs(u, u2)
309+
218310

219311
if __name__ == "__main__":
220312
unittest.main()

0 commit comments

Comments
 (0)