blob: 382ca03e5ad2b8deb843b504d5ad55b0e9c9ec6e [file] [log] [blame]
Guido van Rossum85f18201992-11-27 22:53:50 +00001# Python test set -- part 6, built-in types
2
Zachary Ware38c707e2015-04-13 15:00:43 -05003from test.support import run_with_locale
Yury Selivanov75445082015-05-11 22:57:16 -04004import collections.abc
5import inspect
Eric Snowb5c8f922013-02-16 16:32:39 -07006import pickle
Eric Smithb2c7af82008-04-30 02:12:09 +00007import locale
Victor Stinner0db176f2012-04-16 00:16:30 +02008import sys
9import types
Yury Selivanov00e33722015-06-24 11:44:51 -040010import unittest.mock
11import weakref
Guido van Rossum85f18201992-11-27 22:53:50 +000012
Thomas Wouters89f507f2006-12-13 04:49:30 +000013class TypesTests(unittest.TestCase):
Guido van Rossum85f18201992-11-27 22:53:50 +000014
Thomas Wouters89f507f2006-12-13 04:49:30 +000015 def test_truth_values(self):
16 if None: self.fail('None is true instead of false')
17 if 0: self.fail('0 is true instead of false')
Thomas Wouters89f507f2006-12-13 04:49:30 +000018 if 0.0: self.fail('0.0 is true instead of false')
19 if '': self.fail('\'\' is true instead of false')
20 if not 1: self.fail('1 is false instead of true')
Thomas Wouters89f507f2006-12-13 04:49:30 +000021 if not 1.0: self.fail('1.0 is false instead of true')
22 if not 'x': self.fail('\'x\' is false instead of true')
23 if not {'x': 1}: self.fail('{\'x\': 1} is false instead of true')
24 def f(): pass
25 class C: pass
Thomas Wouters89f507f2006-12-13 04:49:30 +000026 x = C()
27 if not f: self.fail('f is false instead of true')
28 if not C: self.fail('C is false instead of true')
29 if not sys: self.fail('sys is false instead of true')
30 if not x: self.fail('x is false instead of true')
Guido van Rossum85f18201992-11-27 22:53:50 +000031
Thomas Wouters89f507f2006-12-13 04:49:30 +000032 def test_boolean_ops(self):
33 if 0 or 0: self.fail('0 or 0 is true instead of false')
34 if 1 and 1: pass
35 else: self.fail('1 and 1 is false instead of true')
36 if not 1: self.fail('not 1 is true instead of false')
Neil Schemenauereff72442002-03-24 01:24:54 +000037
Thomas Wouters89f507f2006-12-13 04:49:30 +000038 def test_comparisons(self):
39 if 0 < 1 <= 1 == 1 >= 1 > 0 != 1: pass
40 else: self.fail('int comparisons failed')
Thomas Wouters89f507f2006-12-13 04:49:30 +000041 if 0.0 < 1.0 <= 1.0 == 1.0 >= 1.0 > 0.0 != 1.0: pass
42 else: self.fail('float comparisons failed')
43 if '' < 'a' <= 'a' == 'a' < 'abc' < 'abd' < 'b': pass
44 else: self.fail('string comparisons failed')
45 if None is None: pass
46 else: self.fail('identity test failed')
Neil Schemenauereff72442002-03-24 01:24:54 +000047
Thomas Wouters89f507f2006-12-13 04:49:30 +000048 def test_float_constructor(self):
49 self.assertRaises(ValueError, float, '')
50 self.assertRaises(ValueError, float, '5\0')
Brett Cannona721aba2016-09-09 14:57:09 -070051 self.assertRaises(ValueError, float, '5_5\0')
Neil Schemenauereff72442002-03-24 01:24:54 +000052
Thomas Wouters89f507f2006-12-13 04:49:30 +000053 def test_zero_division(self):
54 try: 5.0 / 0.0
55 except ZeroDivisionError: pass
56 else: self.fail("5.0 / 0.0 didn't raise ZeroDivisionError")
Neil Schemenauereff72442002-03-24 01:24:54 +000057
Thomas Wouters89f507f2006-12-13 04:49:30 +000058 try: 5.0 // 0.0
59 except ZeroDivisionError: pass
60 else: self.fail("5.0 // 0.0 didn't raise ZeroDivisionError")
Neil Schemenauereff72442002-03-24 01:24:54 +000061
Thomas Wouters89f507f2006-12-13 04:49:30 +000062 try: 5.0 % 0.0
63 except ZeroDivisionError: pass
64 else: self.fail("5.0 % 0.0 didn't raise ZeroDivisionError")
Neil Schemenauereff72442002-03-24 01:24:54 +000065
Guido van Rossume2a383d2007-01-15 16:59:06 +000066 try: 5 / 0
Thomas Wouters89f507f2006-12-13 04:49:30 +000067 except ZeroDivisionError: pass
Christian Heimes7131fd92008-02-19 14:21:46 +000068 else: self.fail("5 / 0 didn't raise ZeroDivisionError")
Neil Schemenauereff72442002-03-24 01:24:54 +000069
Guido van Rossume2a383d2007-01-15 16:59:06 +000070 try: 5 // 0
Thomas Wouters89f507f2006-12-13 04:49:30 +000071 except ZeroDivisionError: pass
Christian Heimes7131fd92008-02-19 14:21:46 +000072 else: self.fail("5 // 0 didn't raise ZeroDivisionError")
Neil Schemenauereff72442002-03-24 01:24:54 +000073
Guido van Rossume2a383d2007-01-15 16:59:06 +000074 try: 5 % 0
Thomas Wouters89f507f2006-12-13 04:49:30 +000075 except ZeroDivisionError: pass
Christian Heimes7131fd92008-02-19 14:21:46 +000076 else: self.fail("5 % 0 didn't raise ZeroDivisionError")
Tim Petersa3c01ce2001-12-04 23:05:10 +000077
Thomas Wouters89f507f2006-12-13 04:49:30 +000078 def test_numeric_types(self):
Mark Dickinson5c2db372009-12-05 20:28:34 +000079 if 0 != 0.0 or 1 != 1.0 or -1 != -1.0:
80 self.fail('int/float value not equal')
Thomas Wouters89f507f2006-12-13 04:49:30 +000081 # calling built-in types without argument must return 0
82 if int() != 0: self.fail('int() does not return 0')
Thomas Wouters89f507f2006-12-13 04:49:30 +000083 if float() != 0.0: self.fail('float() does not return 0.0')
84 if int(1.9) == 1 == int(1.1) and int(-1.1) == -1 == int(-1.9): pass
85 else: self.fail('int() does not round properly')
Thomas Wouters89f507f2006-12-13 04:49:30 +000086 if float(1) == 1.0 and float(-1) == -1.0 and float(0) == 0.0: pass
87 else: self.fail('float() does not work properly')
Neil Schemenauereff72442002-03-24 01:24:54 +000088
Christian Heimesc3f30c42008-02-22 16:37:40 +000089 def test_float_to_string(self):
90 def test(f, result):
91 self.assertEqual(f.__format__('e'), result)
92 self.assertEqual('%e' % f, result)
93
94 # test all 2 digit exponents, both with __format__ and with
95 # '%' formatting
96 for i in range(-99, 100):
97 test(float('1.5e'+str(i)), '1.500000e{0:+03d}'.format(i))
98
99 # test some 3 digit exponents
100 self.assertEqual(1.5e100.__format__('e'), '1.500000e+100')
101 self.assertEqual('%e' % 1.5e100, '1.500000e+100')
102
103 self.assertEqual(1.5e101.__format__('e'), '1.500000e+101')
104 self.assertEqual('%e' % 1.5e101, '1.500000e+101')
105
106 self.assertEqual(1.5e-100.__format__('e'), '1.500000e-100')
107 self.assertEqual('%e' % 1.5e-100, '1.500000e-100')
108
109 self.assertEqual(1.5e-101.__format__('e'), '1.500000e-101')
110 self.assertEqual('%e' % 1.5e-101, '1.500000e-101')
111
Eric Smith0923d1d2009-04-16 20:16:10 +0000112 self.assertEqual('%g' % 1.0, '1')
113 self.assertEqual('%#g' % 1.0, '1.00000')
114
Thomas Wouters89f507f2006-12-13 04:49:30 +0000115 def test_normal_integers(self):
116 # Ensure the first 256 integers are shared
117 a = 256
118 b = 128*2
119 if a is not b: self.fail('256 is not shared')
120 if 12 + 24 != 36: self.fail('int op')
121 if 12 + (-24) != -12: self.fail('int op')
122 if (-12) + 24 != 12: self.fail('int op')
123 if (-12) + (-24) != -36: self.fail('int op')
124 if not 12 < 24: self.fail('int op')
125 if not -24 < -12: self.fail('int op')
126 # Test for a particular bug in integer multiply
127 xsize, ysize, zsize = 238, 356, 4
128 if not (xsize*ysize*zsize == zsize*xsize*ysize == 338912):
129 self.fail('int mul commutativity')
130 # And another.
Christian Heimesa37d4c62007-12-04 23:02:19 +0000131 m = -sys.maxsize - 1
Thomas Wouters89f507f2006-12-13 04:49:30 +0000132 for divisor in 1, 2, 4, 8, 16, 32:
133 j = m // divisor
134 prod = divisor * j
135 if prod != m:
136 self.fail("%r * %r == %r != %r" % (divisor, j, prod, m))
137 if type(prod) is not int:
138 self.fail("expected type(prod) to be int, not %r" %
139 type(prod))
Mark Dickinson5c2db372009-12-05 20:28:34 +0000140 # Check for unified integral type
Thomas Wouters89f507f2006-12-13 04:49:30 +0000141 for divisor in 1, 2, 4, 8, 16, 32:
142 j = m // divisor - 1
143 prod = divisor * j
Guido van Rossume2a383d2007-01-15 16:59:06 +0000144 if type(prod) is not int:
Mark Dickinson5c2db372009-12-05 20:28:34 +0000145 self.fail("expected type(%r) to be int, not %r" %
Thomas Wouters89f507f2006-12-13 04:49:30 +0000146 (prod, type(prod)))
Mark Dickinson5c2db372009-12-05 20:28:34 +0000147 # Check for unified integral type
Christian Heimesa37d4c62007-12-04 23:02:19 +0000148 m = sys.maxsize
Thomas Wouters89f507f2006-12-13 04:49:30 +0000149 for divisor in 1, 2, 4, 8, 16, 32:
150 j = m // divisor + 1
151 prod = divisor * j
Guido van Rossume2a383d2007-01-15 16:59:06 +0000152 if type(prod) is not int:
Mark Dickinson5c2db372009-12-05 20:28:34 +0000153 self.fail("expected type(%r) to be int, not %r" %
Thomas Wouters89f507f2006-12-13 04:49:30 +0000154 (prod, type(prod)))
Neil Schemenauereff72442002-03-24 01:24:54 +0000155
Christian Heimesa37d4c62007-12-04 23:02:19 +0000156 x = sys.maxsize
Ezio Melottie9615932010-01-24 19:26:24 +0000157 self.assertIsInstance(x + 1, int,
158 "(sys.maxsize + 1) should have returned int")
159 self.assertIsInstance(-x - 1, int,
160 "(-sys.maxsize - 1) should have returned int")
161 self.assertIsInstance(-x - 2, int,
162 "(-sys.maxsize - 2) should have returned int")
Neil Schemenauereff72442002-03-24 01:24:54 +0000163
Thomas Wouters89f507f2006-12-13 04:49:30 +0000164 try: 5 << -5
165 except ValueError: pass
166 else: self.fail('int negative shift <<')
Neil Schemenauereff72442002-03-24 01:24:54 +0000167
Thomas Wouters89f507f2006-12-13 04:49:30 +0000168 try: 5 >> -5
169 except ValueError: pass
170 else: self.fail('int negative shift >>')
Guido van Rossum85f18201992-11-27 22:53:50 +0000171
Thomas Wouters89f507f2006-12-13 04:49:30 +0000172 def test_floats(self):
173 if 12.0 + 24.0 != 36.0: self.fail('float op')
174 if 12.0 + (-24.0) != -12.0: self.fail('float op')
175 if (-12.0) + 24.0 != 12.0: self.fail('float op')
176 if (-12.0) + (-24.0) != -36.0: self.fail('float op')
177 if not 12.0 < 24.0: self.fail('float op')
178 if not -24.0 < -12.0: self.fail('float op')
Guido van Rossum85f18201992-11-27 22:53:50 +0000179
Thomas Wouters89f507f2006-12-13 04:49:30 +0000180 def test_strings(self):
181 if len('') != 0: self.fail('len(\'\')')
182 if len('a') != 1: self.fail('len(\'a\')')
183 if len('abcdef') != 6: self.fail('len(\'abcdef\')')
184 if 'xyz' + 'abcde' != 'xyzabcde': self.fail('string concatenation')
185 if 'xyz'*3 != 'xyzxyzxyz': self.fail('string repetition *3')
186 if 0*'abcde' != '': self.fail('string repetition 0*')
187 if min('abc') != 'a' or max('abc') != 'c': self.fail('min/max string')
188 if 'a' in 'abc' and 'b' in 'abc' and 'c' in 'abc' and 'd' not in 'abc': pass
189 else: self.fail('in/not in string')
190 x = 'x'*103
191 if '%s!'%x != x+'!': self.fail('nasty string formatting bug')
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000192
Thomas Wouters89f507f2006-12-13 04:49:30 +0000193 #extended slices for strings
194 a = '0123456789'
195 self.assertEqual(a[::], a)
196 self.assertEqual(a[::2], '02468')
197 self.assertEqual(a[1::2], '13579')
198 self.assertEqual(a[::-1],'9876543210')
199 self.assertEqual(a[::-2], '97531')
200 self.assertEqual(a[3::-2], '31')
201 self.assertEqual(a[-100:100:], a)
202 self.assertEqual(a[100:-100:-1], a[::-1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000203 self.assertEqual(a[-100:100:2], '02468')
Thomas Wouters89f507f2006-12-13 04:49:30 +0000204
Thomas Wouters89f507f2006-12-13 04:49:30 +0000205 def test_type_function(self):
206 self.assertRaises(TypeError, type, 1, 2)
207 self.assertRaises(TypeError, type, 1, 2, 3, 4)
Guido van Rossum85f18201992-11-27 22:53:50 +0000208
Christian Heimes7131fd92008-02-19 14:21:46 +0000209 def test_int__format__(self):
210 def test(i, format_spec, result):
Mark Dickinson5c2db372009-12-05 20:28:34 +0000211 # just make sure we have the unified type for integers
Christian Heimes7131fd92008-02-19 14:21:46 +0000212 assert type(i) == int
213 assert type(format_spec) == str
214 self.assertEqual(i.__format__(format_spec), result)
215
216 test(123456789, 'd', '123456789')
217 test(123456789, 'd', '123456789')
218
219 test(1, 'c', '\01')
220
221 # sign and aligning are interdependent
222 test(1, "-", '1')
223 test(-1, "-", '-1')
224 test(1, "-3", ' 1')
225 test(-1, "-3", ' -1')
226 test(1, "+3", ' +1')
227 test(-1, "+3", ' -1')
228 test(1, " 3", ' 1')
229 test(-1, " 3", ' -1')
230 test(1, " ", ' 1')
231 test(-1, " ", '-1')
232
233 # hex
234 test(3, "x", "3")
235 test(3, "X", "3")
236 test(1234, "x", "4d2")
237 test(-1234, "x", "-4d2")
238 test(1234, "8x", " 4d2")
239 test(-1234, "8x", " -4d2")
240 test(1234, "x", "4d2")
241 test(-1234, "x", "-4d2")
242 test(-3, "x", "-3")
243 test(-3, "X", "-3")
244 test(int('be', 16), "x", "be")
245 test(int('be', 16), "X", "BE")
246 test(-int('be', 16), "x", "-be")
247 test(-int('be', 16), "X", "-BE")
248
249 # octal
250 test(3, "o", "3")
251 test(-3, "o", "-3")
252 test(65, "o", "101")
253 test(-65, "o", "-101")
254 test(1234, "o", "2322")
255 test(-1234, "o", "-2322")
256 test(1234, "-o", "2322")
257 test(-1234, "-o", "-2322")
258 test(1234, " o", " 2322")
259 test(-1234, " o", "-2322")
260 test(1234, "+o", "+2322")
261 test(-1234, "+o", "-2322")
262
263 # binary
264 test(3, "b", "11")
265 test(-3, "b", "-11")
266 test(1234, "b", "10011010010")
267 test(-1234, "b", "-10011010010")
268 test(1234, "-b", "10011010010")
269 test(-1234, "-b", "-10011010010")
270 test(1234, " b", " 10011010010")
271 test(-1234, " b", "-10011010010")
272 test(1234, "+b", "+10011010010")
273 test(-1234, "+b", "-10011010010")
274
Eric Smithb1ebcc62008-07-15 13:02:41 +0000275 # alternate (#) formatting
276 test(0, "#b", '0b0')
277 test(0, "-#b", '0b0')
278 test(1, "-#b", '0b1')
279 test(-1, "-#b", '-0b1')
280 test(-1, "-#5b", ' -0b1')
281 test(1, "+#5b", ' +0b1')
282 test(100, "+#b", '+0b1100100')
Eric Smithd68af8f2008-07-16 00:15:35 +0000283 test(100, "#012b", '0b0001100100')
284 test(-100, "#012b", '-0b001100100')
Eric Smithb1ebcc62008-07-15 13:02:41 +0000285
286 test(0, "#o", '0o0')
287 test(0, "-#o", '0o0')
288 test(1, "-#o", '0o1')
289 test(-1, "-#o", '-0o1')
290 test(-1, "-#5o", ' -0o1')
291 test(1, "+#5o", ' +0o1')
292 test(100, "+#o", '+0o144')
Eric Smithd68af8f2008-07-16 00:15:35 +0000293 test(100, "#012o", '0o0000000144')
294 test(-100, "#012o", '-0o000000144')
Eric Smithb1ebcc62008-07-15 13:02:41 +0000295
296 test(0, "#x", '0x0')
297 test(0, "-#x", '0x0')
298 test(1, "-#x", '0x1')
299 test(-1, "-#x", '-0x1')
300 test(-1, "-#5x", ' -0x1')
301 test(1, "+#5x", ' +0x1')
302 test(100, "+#x", '+0x64')
Eric Smithd68af8f2008-07-16 00:15:35 +0000303 test(100, "#012x", '0x0000000064')
304 test(-100, "#012x", '-0x000000064')
305 test(123456, "#012x", '0x000001e240')
306 test(-123456, "#012x", '-0x00001e240')
Eric Smithb1ebcc62008-07-15 13:02:41 +0000307
308 test(0, "#X", '0X0')
309 test(0, "-#X", '0X0')
310 test(1, "-#X", '0X1')
311 test(-1, "-#X", '-0X1')
312 test(-1, "-#5X", ' -0X1')
313 test(1, "+#5X", ' +0X1')
314 test(100, "+#X", '+0X64')
Eric Smithd68af8f2008-07-16 00:15:35 +0000315 test(100, "#012X", '0X0000000064')
316 test(-100, "#012X", '-0X000000064')
317 test(123456, "#012X", '0X000001E240')
318 test(-123456, "#012X", '-0X00001E240')
Eric Smithb1ebcc62008-07-15 13:02:41 +0000319
Eric Smitha3b1ac82009-04-03 14:45:06 +0000320 test(123, ',', '123')
321 test(-123, ',', '-123')
322 test(1234, ',', '1,234')
323 test(-1234, ',', '-1,234')
324 test(123456, ',', '123,456')
325 test(-123456, ',', '-123,456')
326 test(1234567, ',', '1,234,567')
327 test(-1234567, ',', '-1,234,567')
328
Eric Smith937491d2009-04-22 17:04:27 +0000329 # issue 5782, commas with no specifier type
330 test(1234, '010,', '00,001,234')
331
Mark Dickinson5c2db372009-12-05 20:28:34 +0000332 # Unified type for integers
333 test(10**100, 'd', '1' + '0' * 100)
334 test(10**100+100, 'd', '1' + '0' * 97 + '100')
335
Christian Heimes7131fd92008-02-19 14:21:46 +0000336 # make sure these are errors
337
338 # precision disallowed
339 self.assertRaises(ValueError, 3 .__format__, "1.3")
340 # sign not allowed with 'c'
341 self.assertRaises(ValueError, 3 .__format__, "+c")
342 # format spec must be string
343 self.assertRaises(TypeError, 3 .__format__, None)
344 self.assertRaises(TypeError, 3 .__format__, 0)
Eric Smitha3b1ac82009-04-03 14:45:06 +0000345 # can't have ',' with 'n'
346 self.assertRaises(ValueError, 3 .__format__, ",n")
Eric Smith0923d1d2009-04-16 20:16:10 +0000347 # can't have ',' with 'c'
348 self.assertRaises(ValueError, 3 .__format__, ",c")
Eric V. Smitha12572f2014-04-15 22:37:55 -0400349 # can't have '#' with 'c'
350 self.assertRaises(ValueError, 3 .__format__, "#c")
Christian Heimes7131fd92008-02-19 14:21:46 +0000351
352 # ensure that only int and float type specifiers work
353 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
354 [chr(x) for x in range(ord('A'), ord('Z')+1)]):
355 if not format_spec in 'bcdoxXeEfFgGn%':
356 self.assertRaises(ValueError, 0 .__format__, format_spec)
357 self.assertRaises(ValueError, 1 .__format__, format_spec)
358 self.assertRaises(ValueError, (-1) .__format__, format_spec)
359
360 # ensure that float type specifiers work; format converts
361 # the int to a float
Eric Smith5807c412008-05-11 21:00:57 +0000362 for format_spec in 'eEfFgG%':
Christian Heimes7131fd92008-02-19 14:21:46 +0000363 for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]:
364 self.assertEqual(value.__format__(format_spec),
365 float(value).__format__(format_spec))
366
Eric Smithabb28c62010-02-23 00:22:24 +0000367 # Issue 6902
368 test(123456, "0<20", '12345600000000000000')
369 test(123456, "1<20", '12345611111111111111')
370 test(123456, "*<20", '123456**************')
371 test(123456, "0>20", '00000000000000123456')
372 test(123456, "1>20", '11111111111111123456')
373 test(123456, "*>20", '**************123456')
374 test(123456, "0=20", '00000000000000123456')
375 test(123456, "1=20", '11111111111111123456')
376 test(123456, "*=20", '**************123456')
377
Eric Smithb2c7af82008-04-30 02:12:09 +0000378 @run_with_locale('LC_NUMERIC', 'en_US.UTF8')
379 def test_float__format__locale(self):
380 # test locale support for __format__ code 'n'
381
382 for i in range(-10, 10):
383 x = 1234567890.0 * (10.0 ** i)
384 self.assertEqual(locale.format('%g', x, grouping=True), format(x, 'n'))
385 self.assertEqual(locale.format('%.10g', x, grouping=True), format(x, '.10n'))
386
Eric Smith5807c412008-05-11 21:00:57 +0000387 @run_with_locale('LC_NUMERIC', 'en_US.UTF8')
388 def test_int__format__locale(self):
389 # test locale support for __format__ code 'n' for integers
390
391 x = 123456789012345678901234567890
392 for i in range(0, 30):
393 self.assertEqual(locale.format('%d', x, grouping=True), format(x, 'n'))
394
395 # move to the next integer to test
396 x = x // 10
397
Eric Smithb151a452008-06-24 11:21:04 +0000398 rfmt = ">20n"
399 lfmt = "<20n"
400 cfmt = "^20n"
401 for x in (1234, 12345, 123456, 1234567, 12345678, 123456789, 1234567890, 12345678900):
402 self.assertEqual(len(format(0, rfmt)), len(format(x, rfmt)))
403 self.assertEqual(len(format(0, lfmt)), len(format(x, lfmt)))
404 self.assertEqual(len(format(0, cfmt)), len(format(x, cfmt)))
405
Christian Heimes7131fd92008-02-19 14:21:46 +0000406 def test_float__format__(self):
Christian Heimes7131fd92008-02-19 14:21:46 +0000407 def test(f, format_spec, result):
Christian Heimes7131fd92008-02-19 14:21:46 +0000408 self.assertEqual(f.__format__(format_spec), result)
Eric Smith984bb582010-11-25 16:08:06 +0000409 self.assertEqual(format(f, format_spec), result)
Christian Heimes7131fd92008-02-19 14:21:46 +0000410
411 test(0.0, 'f', '0.000000')
412
413 # the default is 'g', except for empty format spec
414 test(0.0, '', '0.0')
415 test(0.01, '', '0.01')
416 test(0.01, 'g', '0.01')
417
Eric Smith2ad79e82008-07-19 00:33:23 +0000418 # test for issue 3411
419 test(1.23, '1', '1.23')
420 test(-1.23, '1', '-1.23')
421 test(1.23, '1g', '1.23')
422 test(-1.23, '1g', '-1.23')
423
Christian Heimes7131fd92008-02-19 14:21:46 +0000424 test( 1.0, ' g', ' 1')
425 test(-1.0, ' g', '-1')
426 test( 1.0, '+g', '+1')
427 test(-1.0, '+g', '-1')
428 test(1.1234e200, 'g', '1.1234e+200')
429 test(1.1234e200, 'G', '1.1234E+200')
430
431
432 test(1.0, 'f', '1.000000')
433
434 test(-1.0, 'f', '-1.000000')
435
436 test( 1.0, ' f', ' 1.000000')
437 test(-1.0, ' f', '-1.000000')
438 test( 1.0, '+f', '+1.000000')
439 test(-1.0, '+f', '-1.000000')
Mark Dickinson33841c32009-05-01 15:37:04 +0000440
441 # Python versions <= 3.0 switched from 'f' to 'g' formatting for
442 # values larger than 1e50. No longer.
443 f = 1.1234e90
444 for fmt in 'f', 'F':
445 # don't do a direct equality check, since on some
446 # platforms only the first few digits of dtoa
447 # will be reliable
448 result = f.__format__(fmt)
449 self.assertEqual(len(result), 98)
450 self.assertEqual(result[-7], '.')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000451 self.assertIn(result[:12], ('112340000000', '112339999999'))
Mark Dickinson33841c32009-05-01 15:37:04 +0000452 f = 1.1234e200
453 for fmt in 'f', 'F':
454 result = f.__format__(fmt)
455 self.assertEqual(len(result), 208)
456 self.assertEqual(result[-7], '.')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000457 self.assertIn(result[:12], ('112340000000', '112339999999'))
Mark Dickinson33841c32009-05-01 15:37:04 +0000458
Christian Heimes7131fd92008-02-19 14:21:46 +0000459
Christian Heimesc3f30c42008-02-22 16:37:40 +0000460 test( 1.0, 'e', '1.000000e+00')
461 test(-1.0, 'e', '-1.000000e+00')
462 test( 1.0, 'E', '1.000000E+00')
463 test(-1.0, 'E', '-1.000000E+00')
464 test(1.1234e20, 'e', '1.123400e+20')
465 test(1.1234e20, 'E', '1.123400E+20')
Christian Heimes7131fd92008-02-19 14:21:46 +0000466
Christian Heimesb186d002008-03-18 15:15:01 +0000467 # No format code means use g, but must have a decimal
468 # and a number after the decimal. This is tricky, because
469 # a totaly empty format specifier means something else.
470 # So, just use a sign flag
471 test(1e200, '+g', '+1e+200')
Eric Smith0923d1d2009-04-16 20:16:10 +0000472 test(1e200, '+', '+1e+200')
473
Christian Heimesb186d002008-03-18 15:15:01 +0000474 test(1.1e200, '+g', '+1.1e+200')
475 test(1.1e200, '+', '+1.1e+200')
476
Eric Smith0923d1d2009-04-16 20:16:10 +0000477 # 0 padding
478 test(1234., '010f', '1234.000000')
479 test(1234., '011f', '1234.000000')
480 test(1234., '012f', '01234.000000')
481 test(-1234., '011f', '-1234.000000')
482 test(-1234., '012f', '-1234.000000')
483 test(-1234., '013f', '-01234.000000')
484 test(-1234.12341234, '013f', '-01234.123412')
485 test(-123456.12341234, '011.2f', '-0123456.12')
486
Eric Smith937491d2009-04-22 17:04:27 +0000487 # issue 5782, commas with no specifier type
488 test(1.2, '010,.2', '0,000,001.2')
489
Eric Smith0923d1d2009-04-16 20:16:10 +0000490 # 0 padding with commas
491 test(1234., '011,f', '1,234.000000')
492 test(1234., '012,f', '1,234.000000')
493 test(1234., '013,f', '01,234.000000')
494 test(-1234., '012,f', '-1,234.000000')
495 test(-1234., '013,f', '-1,234.000000')
496 test(-1234., '014,f', '-01,234.000000')
497 test(-12345., '015,f', '-012,345.000000')
498 test(-123456., '016,f', '-0,123,456.000000')
499 test(-123456., '017,f', '-0,123,456.000000')
500 test(-123456.12341234, '017,f', '-0,123,456.123412')
501 test(-123456.12341234, '013,.2f', '-0,123,456.12')
502
Christian Heimes7131fd92008-02-19 14:21:46 +0000503 # % formatting
504 test(-1.0, '%', '-100.000000%')
505
506 # format spec must be string
507 self.assertRaises(TypeError, 3.0.__format__, None)
508 self.assertRaises(TypeError, 3.0.__format__, 0)
509
510 # other format specifiers shouldn't work on floats,
511 # in particular int specifiers
512 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
513 [chr(x) for x in range(ord('A'), ord('Z')+1)]):
514 if not format_spec in 'eEfFgGn%':
515 self.assertRaises(ValueError, format, 0.0, format_spec)
516 self.assertRaises(ValueError, format, 1.0, format_spec)
517 self.assertRaises(ValueError, format, -1.0, format_spec)
518 self.assertRaises(ValueError, format, 1e100, format_spec)
519 self.assertRaises(ValueError, format, -1e100, format_spec)
520 self.assertRaises(ValueError, format, 1e-100, format_spec)
521 self.assertRaises(ValueError, format, -1e-100, format_spec)
522
Eric Smith984bb582010-11-25 16:08:06 +0000523 # Alternate float formatting
524 test(1.0, '.0e', '1e+00')
525 test(1.0, '#.0e', '1.e+00')
526 test(1.0, '.0f', '1')
527 test(1.0, '#.0f', '1.')
528 test(1.1, 'g', '1.1')
529 test(1.1, '#g', '1.10000')
530 test(1.0, '.0%', '100%')
531 test(1.0, '#.0%', '100.%')
532
533 # Issue 7094: Alternate formatting (specified by #)
534 test(1.0, '0e', '1.000000e+00')
535 test(1.0, '#0e', '1.000000e+00')
536 test(1.0, '0f', '1.000000' )
537 test(1.0, '#0f', '1.000000')
538 test(1.0, '.1e', '1.0e+00')
539 test(1.0, '#.1e', '1.0e+00')
540 test(1.0, '.1f', '1.0')
541 test(1.0, '#.1f', '1.0')
542 test(1.0, '.1%', '100.0%')
543 test(1.0, '#.1%', '100.0%')
Eric Smithb1ebcc62008-07-15 13:02:41 +0000544
Eric Smithabb28c62010-02-23 00:22:24 +0000545 # Issue 6902
546 test(12345.6, "0<20", '12345.60000000000000')
547 test(12345.6, "1<20", '12345.61111111111111')
548 test(12345.6, "*<20", '12345.6*************')
549 test(12345.6, "0>20", '000000000000012345.6')
550 test(12345.6, "1>20", '111111111111112345.6')
551 test(12345.6, "*>20", '*************12345.6')
552 test(12345.6, "0=20", '000000000000012345.6')
553 test(12345.6, "1=20", '111111111111112345.6')
554 test(12345.6, "*=20", '*************12345.6')
555
Eric Smith0923d1d2009-04-16 20:16:10 +0000556 def test_format_spec_errors(self):
557 # int, float, and string all share the same format spec
558 # mini-language parser.
559
560 # Check that we can't ask for too many digits. This is
561 # probably a CPython specific test. It tries to put the width
562 # into a C long.
563 self.assertRaises(ValueError, format, 0, '1'*10000 + 'd')
564
565 # Similar with the precision.
566 self.assertRaises(ValueError, format, 0, '.' + '1'*10000 + 'd')
567
568 # And may as well test both.
569 self.assertRaises(ValueError, format, 0, '1'*1000 + '.' + '1'*10000 + 'd')
570
571 # Make sure commas aren't allowed with various type codes
572 for code in 'xXobns':
573 self.assertRaises(ValueError, format, 0, ',' + code)
Christian Heimes7131fd92008-02-19 14:21:46 +0000574
Benjamin Peterson0e102062010-08-25 23:13:17 +0000575 def test_internal_sizes(self):
576 self.assertGreater(object.__basicsize__, 0)
577 self.assertGreater(tuple.__itemsize__, 0)
578
579
Victor Stinner0db176f2012-04-16 00:16:30 +0200580class MappingProxyTests(unittest.TestCase):
581 mappingproxy = types.MappingProxyType
582
583 def test_constructor(self):
584 class userdict(dict):
585 pass
586
587 mapping = {'x': 1, 'y': 2}
588 self.assertEqual(self.mappingproxy(mapping), mapping)
589 mapping = userdict(x=1, y=2)
590 self.assertEqual(self.mappingproxy(mapping), mapping)
591 mapping = collections.ChainMap({'x': 1}, {'y': 2})
592 self.assertEqual(self.mappingproxy(mapping), mapping)
593
594 self.assertRaises(TypeError, self.mappingproxy, 10)
595 self.assertRaises(TypeError, self.mappingproxy, ("a", "tuple"))
596 self.assertRaises(TypeError, self.mappingproxy, ["a", "list"])
597
598 def test_methods(self):
599 attrs = set(dir(self.mappingproxy({}))) - set(dir(object()))
600 self.assertEqual(attrs, {
601 '__contains__',
602 '__getitem__',
603 '__iter__',
604 '__len__',
605 'copy',
606 'get',
607 'items',
608 'keys',
609 'values',
610 })
611
612 def test_get(self):
613 view = self.mappingproxy({'a': 'A', 'b': 'B'})
614 self.assertEqual(view['a'], 'A')
615 self.assertEqual(view['b'], 'B')
616 self.assertRaises(KeyError, view.__getitem__, 'xxx')
617 self.assertEqual(view.get('a'), 'A')
618 self.assertIsNone(view.get('xxx'))
619 self.assertEqual(view.get('xxx', 42), 42)
620
621 def test_missing(self):
622 class dictmissing(dict):
623 def __missing__(self, key):
624 return "missing=%s" % key
625
626 view = self.mappingproxy(dictmissing(x=1))
627 self.assertEqual(view['x'], 1)
628 self.assertEqual(view['y'], 'missing=y')
629 self.assertEqual(view.get('x'), 1)
630 self.assertEqual(view.get('y'), None)
631 self.assertEqual(view.get('y', 42), 42)
632 self.assertTrue('x' in view)
633 self.assertFalse('y' in view)
634
635 def test_customdict(self):
636 class customdict(dict):
637 def __contains__(self, key):
638 if key == 'magic':
639 return True
640 else:
641 return dict.__contains__(self, key)
642
643 def __iter__(self):
644 return iter(('iter',))
645
646 def __len__(self):
647 return 500
648
649 def copy(self):
650 return 'copy'
651
652 def keys(self):
653 return 'keys'
654
655 def items(self):
656 return 'items'
657
658 def values(self):
659 return 'values'
660
661 def __getitem__(self, key):
662 return "getitem=%s" % dict.__getitem__(self, key)
663
664 def get(self, key, default=None):
665 return "get=%s" % dict.get(self, key, 'default=%r' % default)
666
667 custom = customdict({'key': 'value'})
668 view = self.mappingproxy(custom)
669 self.assertTrue('key' in view)
670 self.assertTrue('magic' in view)
671 self.assertFalse('xxx' in view)
672 self.assertEqual(view['key'], 'getitem=value')
673 self.assertRaises(KeyError, view.__getitem__, 'xxx')
674 self.assertEqual(tuple(view), ('iter',))
675 self.assertEqual(len(view), 500)
676 self.assertEqual(view.copy(), 'copy')
677 self.assertEqual(view.get('key'), 'get=value')
678 self.assertEqual(view.get('xxx'), 'get=default=None')
679 self.assertEqual(view.items(), 'items')
680 self.assertEqual(view.keys(), 'keys')
681 self.assertEqual(view.values(), 'values')
682
683 def test_chainmap(self):
684 d1 = {'x': 1}
685 d2 = {'y': 2}
686 mapping = collections.ChainMap(d1, d2)
687 view = self.mappingproxy(mapping)
688 self.assertTrue('x' in view)
689 self.assertTrue('y' in view)
690 self.assertFalse('z' in view)
691 self.assertEqual(view['x'], 1)
692 self.assertEqual(view['y'], 2)
693 self.assertRaises(KeyError, view.__getitem__, 'z')
694 self.assertEqual(tuple(sorted(view)), ('x', 'y'))
695 self.assertEqual(len(view), 2)
696 copy = view.copy()
697 self.assertIsNot(copy, mapping)
698 self.assertIsInstance(copy, collections.ChainMap)
699 self.assertEqual(copy, mapping)
700 self.assertEqual(view.get('x'), 1)
701 self.assertEqual(view.get('y'), 2)
702 self.assertIsNone(view.get('z'))
703 self.assertEqual(tuple(sorted(view.items())), (('x', 1), ('y', 2)))
704 self.assertEqual(tuple(sorted(view.keys())), ('x', 'y'))
705 self.assertEqual(tuple(sorted(view.values())), (1, 2))
706
707 def test_contains(self):
708 view = self.mappingproxy(dict.fromkeys('abc'))
709 self.assertTrue('a' in view)
710 self.assertTrue('b' in view)
711 self.assertTrue('c' in view)
712 self.assertFalse('xxx' in view)
713
714 def test_views(self):
715 mapping = {}
716 view = self.mappingproxy(mapping)
717 keys = view.keys()
718 values = view.values()
719 items = view.items()
720 self.assertEqual(list(keys), [])
721 self.assertEqual(list(values), [])
722 self.assertEqual(list(items), [])
723 mapping['key'] = 'value'
724 self.assertEqual(list(keys), ['key'])
725 self.assertEqual(list(values), ['value'])
726 self.assertEqual(list(items), [('key', 'value')])
727
728 def test_len(self):
729 for expected in range(6):
730 data = dict.fromkeys('abcde'[:expected])
731 self.assertEqual(len(data), expected)
732 view = self.mappingproxy(data)
733 self.assertEqual(len(view), expected)
734
735 def test_iterators(self):
736 keys = ('x', 'y')
737 values = (1, 2)
738 items = tuple(zip(keys, values))
739 view = self.mappingproxy(dict(items))
740 self.assertEqual(set(view), set(keys))
741 self.assertEqual(set(view.keys()), set(keys))
742 self.assertEqual(set(view.values()), set(values))
743 self.assertEqual(set(view.items()), set(items))
744
745 def test_copy(self):
746 original = {'key1': 27, 'key2': 51, 'key3': 93}
747 view = self.mappingproxy(original)
748 copy = view.copy()
749 self.assertEqual(type(copy), dict)
750 self.assertEqual(copy, original)
751 original['key1'] = 70
752 self.assertEqual(view['key1'], 70)
753 self.assertEqual(copy['key1'], 27)
754
755
Nick Coghlan7fc570a2012-05-20 02:34:13 +1000756class ClassCreationTests(unittest.TestCase):
757
758 class Meta(type):
759 def __init__(cls, name, bases, ns, **kw):
760 super().__init__(name, bases, ns)
761 @staticmethod
762 def __new__(mcls, name, bases, ns, **kw):
763 return super().__new__(mcls, name, bases, ns)
764 @classmethod
765 def __prepare__(mcls, name, bases, **kw):
766 ns = super().__prepare__(name, bases)
767 ns["y"] = 1
768 ns.update(kw)
769 return ns
770
771 def test_new_class_basics(self):
772 C = types.new_class("C")
773 self.assertEqual(C.__name__, "C")
774 self.assertEqual(C.__bases__, (object,))
775
776 def test_new_class_subclass(self):
777 C = types.new_class("C", (int,))
778 self.assertTrue(issubclass(C, int))
779
780 def test_new_class_meta(self):
781 Meta = self.Meta
782 settings = {"metaclass": Meta, "z": 2}
783 # We do this twice to make sure the passed in dict isn't mutated
784 for i in range(2):
785 C = types.new_class("C" + str(i), (), settings)
786 self.assertIsInstance(C, Meta)
787 self.assertEqual(C.y, 1)
788 self.assertEqual(C.z, 2)
789
790 def test_new_class_exec_body(self):
791 Meta = self.Meta
792 def func(ns):
793 ns["x"] = 0
794 C = types.new_class("C", (), {"metaclass": Meta, "z": 2}, func)
795 self.assertIsInstance(C, Meta)
796 self.assertEqual(C.x, 0)
797 self.assertEqual(C.y, 1)
798 self.assertEqual(C.z, 2)
799
Benjamin Peterson43f8f4c2012-09-27 18:10:17 -0400800 def test_new_class_metaclass_keywords(self):
Nick Coghlan7fc570a2012-05-20 02:34:13 +1000801 #Test that keywords are passed to the metaclass:
802 def meta_func(name, bases, ns, **kw):
803 return name, bases, ns, kw
804 res = types.new_class("X",
805 (int, object),
806 dict(metaclass=meta_func, x=0))
807 self.assertEqual(res, ("X", (int, object), {}, {"x": 0}))
808
809 def test_new_class_defaults(self):
810 # Test defaults/keywords:
811 C = types.new_class("C", (), {}, None)
812 self.assertEqual(C.__name__, "C")
813 self.assertEqual(C.__bases__, (object,))
814
815 def test_new_class_meta_with_base(self):
816 Meta = self.Meta
817 def func(ns):
818 ns["x"] = 0
819 C = types.new_class(name="C",
820 bases=(int,),
821 kwds=dict(metaclass=Meta, z=2),
822 exec_body=func)
823 self.assertTrue(issubclass(C, int))
824 self.assertIsInstance(C, Meta)
825 self.assertEqual(C.x, 0)
826 self.assertEqual(C.y, 1)
827 self.assertEqual(C.z, 2)
828
829 # Many of the following tests are derived from test_descr.py
830 def test_prepare_class(self):
831 # Basic test of metaclass derivation
832 expected_ns = {}
833 class A(type):
834 def __new__(*args, **kwargs):
835 return type.__new__(*args, **kwargs)
836
837 def __prepare__(*args):
838 return expected_ns
839
840 B = types.new_class("B", (object,))
841 C = types.new_class("C", (object,), {"metaclass": A})
842
843 # The most derived metaclass of D is A rather than type.
844 meta, ns, kwds = types.prepare_class("D", (B, C), {"metaclass": type})
845 self.assertIs(meta, A)
846 self.assertIs(ns, expected_ns)
847 self.assertEqual(len(kwds), 0)
848
849 def test_metaclass_derivation(self):
850 # issue1294232: correct metaclass calculation
851 new_calls = [] # to check the order of __new__ calls
852 class AMeta(type):
853 def __new__(mcls, name, bases, ns):
854 new_calls.append('AMeta')
855 return super().__new__(mcls, name, bases, ns)
856 @classmethod
857 def __prepare__(mcls, name, bases):
858 return {}
859
860 class BMeta(AMeta):
861 def __new__(mcls, name, bases, ns):
862 new_calls.append('BMeta')
863 return super().__new__(mcls, name, bases, ns)
864 @classmethod
865 def __prepare__(mcls, name, bases):
866 ns = super().__prepare__(name, bases)
867 ns['BMeta_was_here'] = True
868 return ns
869
870 A = types.new_class("A", (), {"metaclass": AMeta})
871 self.assertEqual(new_calls, ['AMeta'])
872 new_calls.clear()
873
874 B = types.new_class("B", (), {"metaclass": BMeta})
875 # BMeta.__new__ calls AMeta.__new__ with super:
876 self.assertEqual(new_calls, ['BMeta', 'AMeta'])
877 new_calls.clear()
878
879 C = types.new_class("C", (A, B))
880 # The most derived metaclass is BMeta:
881 self.assertEqual(new_calls, ['BMeta', 'AMeta'])
882 new_calls.clear()
883 # BMeta.__prepare__ should've been called:
884 self.assertIn('BMeta_was_here', C.__dict__)
885
886 # The order of the bases shouldn't matter:
887 C2 = types.new_class("C2", (B, A))
888 self.assertEqual(new_calls, ['BMeta', 'AMeta'])
889 new_calls.clear()
890 self.assertIn('BMeta_was_here', C2.__dict__)
891
892 # Check correct metaclass calculation when a metaclass is declared:
893 D = types.new_class("D", (C,), {"metaclass": type})
894 self.assertEqual(new_calls, ['BMeta', 'AMeta'])
895 new_calls.clear()
896 self.assertIn('BMeta_was_here', D.__dict__)
897
898 E = types.new_class("E", (C,), {"metaclass": AMeta})
899 self.assertEqual(new_calls, ['BMeta', 'AMeta'])
900 new_calls.clear()
901 self.assertIn('BMeta_was_here', E.__dict__)
902
903 def test_metaclass_override_function(self):
904 # Special case: the given metaclass isn't a class,
905 # so there is no metaclass calculation.
906 class A(metaclass=self.Meta):
907 pass
908
909 marker = object()
910 def func(*args, **kwargs):
911 return marker
912
913 X = types.new_class("X", (), {"metaclass": func})
914 Y = types.new_class("Y", (object,), {"metaclass": func})
915 Z = types.new_class("Z", (A,), {"metaclass": func})
916 self.assertIs(marker, X)
917 self.assertIs(marker, Y)
918 self.assertIs(marker, Z)
919
920 def test_metaclass_override_callable(self):
921 # The given metaclass is a class,
922 # but not a descendant of type.
923 new_calls = [] # to check the order of __new__ calls
924 prepare_calls = [] # to track __prepare__ calls
925 class ANotMeta:
926 def __new__(mcls, *args, **kwargs):
927 new_calls.append('ANotMeta')
928 return super().__new__(mcls)
929 @classmethod
930 def __prepare__(mcls, name, bases):
931 prepare_calls.append('ANotMeta')
932 return {}
933
934 class BNotMeta(ANotMeta):
935 def __new__(mcls, *args, **kwargs):
936 new_calls.append('BNotMeta')
937 return super().__new__(mcls)
938 @classmethod
939 def __prepare__(mcls, name, bases):
940 prepare_calls.append('BNotMeta')
941 return super().__prepare__(name, bases)
942
943 A = types.new_class("A", (), {"metaclass": ANotMeta})
944 self.assertIs(ANotMeta, type(A))
945 self.assertEqual(prepare_calls, ['ANotMeta'])
946 prepare_calls.clear()
947 self.assertEqual(new_calls, ['ANotMeta'])
948 new_calls.clear()
949
950 B = types.new_class("B", (), {"metaclass": BNotMeta})
951 self.assertIs(BNotMeta, type(B))
952 self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
953 prepare_calls.clear()
954 self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
955 new_calls.clear()
956
957 C = types.new_class("C", (A, B))
958 self.assertIs(BNotMeta, type(C))
959 self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
960 prepare_calls.clear()
961 self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
962 new_calls.clear()
963
964 C2 = types.new_class("C2", (B, A))
965 self.assertIs(BNotMeta, type(C2))
966 self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
967 prepare_calls.clear()
968 self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
969 new_calls.clear()
970
971 # This is a TypeError, because of a metaclass conflict:
972 # BNotMeta is neither a subclass, nor a superclass of type
973 with self.assertRaises(TypeError):
974 D = types.new_class("D", (C,), {"metaclass": type})
975
976 E = types.new_class("E", (C,), {"metaclass": ANotMeta})
977 self.assertIs(BNotMeta, type(E))
978 self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
979 prepare_calls.clear()
980 self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
981 new_calls.clear()
982
983 F = types.new_class("F", (object(), C))
984 self.assertIs(BNotMeta, type(F))
985 self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
986 prepare_calls.clear()
987 self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
988 new_calls.clear()
989
990 F2 = types.new_class("F2", (C, object()))
991 self.assertIs(BNotMeta, type(F2))
992 self.assertEqual(prepare_calls, ['BNotMeta', 'ANotMeta'])
993 prepare_calls.clear()
994 self.assertEqual(new_calls, ['BNotMeta', 'ANotMeta'])
995 new_calls.clear()
996
997 # TypeError: BNotMeta is neither a
998 # subclass, nor a superclass of int
999 with self.assertRaises(TypeError):
1000 X = types.new_class("X", (C, int()))
1001 with self.assertRaises(TypeError):
1002 X = types.new_class("X", (int(), C))
1003
Berker Peksag3f015a62016-08-19 11:04:07 +03001004 def test_one_argument_type(self):
1005 expected_message = 'type.__new__() takes exactly 3 arguments (1 given)'
1006
1007 # Only type itself can use the one-argument form (#27157)
1008 self.assertIs(type(5), int)
1009
1010 class M(type):
1011 pass
1012 with self.assertRaises(TypeError) as cm:
1013 M(5)
1014 self.assertEqual(str(cm.exception), expected_message)
1015
1016 class N(type, metaclass=M):
1017 pass
1018 with self.assertRaises(TypeError) as cm:
1019 N(5)
1020 self.assertEqual(str(cm.exception), expected_message)
1021
Nick Coghlan7fc570a2012-05-20 02:34:13 +10001022
Barry Warsaw409da152012-06-03 16:18:47 -04001023class SimpleNamespaceTests(unittest.TestCase):
1024
1025 def test_constructor(self):
1026 ns1 = types.SimpleNamespace()
1027 ns2 = types.SimpleNamespace(x=1, y=2)
1028 ns3 = types.SimpleNamespace(**dict(x=1, y=2))
1029
1030 with self.assertRaises(TypeError):
1031 types.SimpleNamespace(1, 2, 3)
1032
1033 self.assertEqual(len(ns1.__dict__), 0)
1034 self.assertEqual(vars(ns1), {})
1035 self.assertEqual(len(ns2.__dict__), 2)
1036 self.assertEqual(vars(ns2), {'y': 2, 'x': 1})
1037 self.assertEqual(len(ns3.__dict__), 2)
1038 self.assertEqual(vars(ns3), {'y': 2, 'x': 1})
1039
1040 def test_unbound(self):
1041 ns1 = vars(types.SimpleNamespace())
1042 ns2 = vars(types.SimpleNamespace(x=1, y=2))
1043
1044 self.assertEqual(ns1, {})
1045 self.assertEqual(ns2, {'y': 2, 'x': 1})
1046
1047 def test_underlying_dict(self):
1048 ns1 = types.SimpleNamespace()
1049 ns2 = types.SimpleNamespace(x=1, y=2)
1050 ns3 = types.SimpleNamespace(a=True, b=False)
1051 mapping = ns3.__dict__
1052 del ns3
1053
1054 self.assertEqual(ns1.__dict__, {})
1055 self.assertEqual(ns2.__dict__, {'y': 2, 'x': 1})
1056 self.assertEqual(mapping, dict(a=True, b=False))
1057
1058 def test_attrget(self):
1059 ns = types.SimpleNamespace(x=1, y=2, w=3)
1060
1061 self.assertEqual(ns.x, 1)
1062 self.assertEqual(ns.y, 2)
1063 self.assertEqual(ns.w, 3)
1064 with self.assertRaises(AttributeError):
1065 ns.z
1066
1067 def test_attrset(self):
1068 ns1 = types.SimpleNamespace()
1069 ns2 = types.SimpleNamespace(x=1, y=2, w=3)
1070 ns1.a = 'spam'
1071 ns1.b = 'ham'
1072 ns2.z = 4
1073 ns2.theta = None
1074
1075 self.assertEqual(ns1.__dict__, dict(a='spam', b='ham'))
1076 self.assertEqual(ns2.__dict__, dict(x=1, y=2, w=3, z=4, theta=None))
1077
1078 def test_attrdel(self):
1079 ns1 = types.SimpleNamespace()
1080 ns2 = types.SimpleNamespace(x=1, y=2, w=3)
1081
1082 with self.assertRaises(AttributeError):
1083 del ns1.spam
1084 with self.assertRaises(AttributeError):
1085 del ns2.spam
1086
1087 del ns2.y
1088 self.assertEqual(vars(ns2), dict(w=3, x=1))
1089 ns2.y = 'spam'
1090 self.assertEqual(vars(ns2), dict(w=3, x=1, y='spam'))
1091 del ns2.y
1092 self.assertEqual(vars(ns2), dict(w=3, x=1))
1093
1094 ns1.spam = 5
1095 self.assertEqual(vars(ns1), dict(spam=5))
1096 del ns1.spam
1097 self.assertEqual(vars(ns1), {})
1098
1099 def test_repr(self):
1100 ns1 = types.SimpleNamespace(x=1, y=2, w=3)
1101 ns2 = types.SimpleNamespace()
1102 ns2.x = "spam"
1103 ns2._y = 5
Eric Snowb5c8f922013-02-16 16:32:39 -07001104 name = "namespace"
Barry Warsaw409da152012-06-03 16:18:47 -04001105
Eric Snowb5c8f922013-02-16 16:32:39 -07001106 self.assertEqual(repr(ns1), "{name}(w=3, x=1, y=2)".format(name=name))
1107 self.assertEqual(repr(ns2), "{name}(_y=5, x='spam')".format(name=name))
1108
1109 def test_equal(self):
1110 ns1 = types.SimpleNamespace(x=1)
1111 ns2 = types.SimpleNamespace()
1112 ns2.x = 1
1113
1114 self.assertEqual(types.SimpleNamespace(), types.SimpleNamespace())
1115 self.assertEqual(ns1, ns2)
1116 self.assertNotEqual(ns2, types.SimpleNamespace())
Barry Warsaw409da152012-06-03 16:18:47 -04001117
1118 def test_nested(self):
1119 ns1 = types.SimpleNamespace(a=1, b=2)
1120 ns2 = types.SimpleNamespace()
1121 ns3 = types.SimpleNamespace(x=ns1)
1122 ns2.spam = ns1
1123 ns2.ham = '?'
1124 ns2.spam = ns3
1125
1126 self.assertEqual(vars(ns1), dict(a=1, b=2))
1127 self.assertEqual(vars(ns2), dict(spam=ns3, ham='?'))
1128 self.assertEqual(ns2.spam, ns3)
1129 self.assertEqual(vars(ns3), dict(x=ns1))
1130 self.assertEqual(ns3.x.a, 1)
1131
1132 def test_recursive(self):
1133 ns1 = types.SimpleNamespace(c='cookie')
1134 ns2 = types.SimpleNamespace()
1135 ns3 = types.SimpleNamespace(x=1)
1136 ns1.spam = ns1
1137 ns2.spam = ns3
1138 ns3.spam = ns2
1139
1140 self.assertEqual(ns1.spam, ns1)
1141 self.assertEqual(ns1.spam.spam, ns1)
1142 self.assertEqual(ns1.spam.spam, ns1.spam)
1143 self.assertEqual(ns2.spam, ns3)
1144 self.assertEqual(ns3.spam, ns2)
1145 self.assertEqual(ns2.spam.spam, ns2)
1146
1147 def test_recursive_repr(self):
1148 ns1 = types.SimpleNamespace(c='cookie')
1149 ns2 = types.SimpleNamespace()
1150 ns3 = types.SimpleNamespace(x=1)
1151 ns1.spam = ns1
1152 ns2.spam = ns3
1153 ns3.spam = ns2
Eric Snowb5c8f922013-02-16 16:32:39 -07001154 name = "namespace"
1155 repr1 = "{name}(c='cookie', spam={name}(...))".format(name=name)
1156 repr2 = "{name}(spam={name}(spam={name}(...), x=1))".format(name=name)
Barry Warsaw409da152012-06-03 16:18:47 -04001157
Eric Snowb5c8f922013-02-16 16:32:39 -07001158 self.assertEqual(repr(ns1), repr1)
1159 self.assertEqual(repr(ns2), repr2)
Barry Warsaw409da152012-06-03 16:18:47 -04001160
1161 def test_as_dict(self):
1162 ns = types.SimpleNamespace(spam='spamspamspam')
1163
1164 with self.assertRaises(TypeError):
1165 len(ns)
1166 with self.assertRaises(TypeError):
1167 iter(ns)
1168 with self.assertRaises(TypeError):
1169 'spam' in ns
1170 with self.assertRaises(TypeError):
1171 ns['spam']
1172
Eric Snow547298c2012-10-16 22:35:38 -07001173 def test_subclass(self):
1174 class Spam(types.SimpleNamespace):
1175 pass
1176
1177 spam = Spam(ham=8, eggs=9)
1178
1179 self.assertIs(type(spam), Spam)
1180 self.assertEqual(vars(spam), {'ham': 8, 'eggs': 9})
1181
Eric Snowb5c8f922013-02-16 16:32:39 -07001182 def test_pickle(self):
1183 ns = types.SimpleNamespace(breakfast="spam", lunch="spam")
1184
Eric Snow9d05c8c2013-02-16 18:20:32 -07001185 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1186 pname = "protocol {}".format(protocol)
1187 try:
1188 ns_pickled = pickle.dumps(ns, protocol)
1189 except TypeError as e:
1190 raise TypeError(pname) from e
1191 ns_roundtrip = pickle.loads(ns_pickled)
Eric Snowb5c8f922013-02-16 16:32:39 -07001192
Eric Snow9d05c8c2013-02-16 18:20:32 -07001193 self.assertEqual(ns, ns_roundtrip, pname)
Eric Snowb5c8f922013-02-16 16:32:39 -07001194
Serhiy Storchaka08d230a2015-05-22 11:02:49 +03001195 def test_fake_namespace_compare(self):
1196 # Issue #24257: Incorrect use of PyObject_IsInstance() caused
1197 # SystemError.
1198 class FakeSimpleNamespace(str):
1199 __class__ = types.SimpleNamespace
1200 self.assertFalse(types.SimpleNamespace() == FakeSimpleNamespace())
1201 self.assertTrue(types.SimpleNamespace() != FakeSimpleNamespace())
1202 with self.assertRaises(TypeError):
1203 types.SimpleNamespace() < FakeSimpleNamespace()
1204 with self.assertRaises(TypeError):
1205 types.SimpleNamespace() <= FakeSimpleNamespace()
1206 with self.assertRaises(TypeError):
1207 types.SimpleNamespace() > FakeSimpleNamespace()
1208 with self.assertRaises(TypeError):
1209 types.SimpleNamespace() >= FakeSimpleNamespace()
1210
Barry Warsaw409da152012-06-03 16:18:47 -04001211
Yury Selivanov75445082015-05-11 22:57:16 -04001212class CoroutineTests(unittest.TestCase):
1213 def test_wrong_args(self):
Yury Selivanovc565cd52015-05-29 09:06:05 -04001214 samples = [None, 1, object()]
Yury Selivanov75445082015-05-11 22:57:16 -04001215 for sample in samples:
Yury Selivanovc565cd52015-05-29 09:06:05 -04001216 with self.assertRaisesRegex(TypeError,
1217 'types.coroutine.*expects a callable'):
Yury Selivanov75445082015-05-11 22:57:16 -04001218 types.coroutine(sample)
1219
Yury Selivanov00e33722015-06-24 11:44:51 -04001220 def test_non_gen_values(self):
Yury Selivanovc565cd52015-05-29 09:06:05 -04001221 @types.coroutine
1222 def foo():
Yury Selivanov5376ba92015-06-22 12:19:30 -04001223 return 'spam'
1224 self.assertEqual(foo(), 'spam')
1225
Yury Selivanov00e33722015-06-24 11:44:51 -04001226 class Awaitable:
1227 def __await__(self):
1228 return ()
1229 aw = Awaitable()
1230 @types.coroutine
1231 def foo():
1232 return aw
1233 self.assertIs(aw, foo())
1234
Yury Selivanov4887523c2015-07-23 15:58:37 +03001235 # decorate foo second time
1236 foo = types.coroutine(foo)
1237 self.assertIs(aw, foo())
1238
Yury Selivanov5376ba92015-06-22 12:19:30 -04001239 def test_async_def(self):
1240 # Test that types.coroutine passes 'async def' coroutines
1241 # without modification
1242
1243 async def foo(): pass
1244 foo_code = foo.__code__
1245 foo_flags = foo.__code__.co_flags
1246 decorated_foo = types.coroutine(foo)
1247 self.assertIs(foo, decorated_foo)
1248 self.assertEqual(foo.__code__.co_flags, foo_flags)
1249 self.assertIs(decorated_foo.__code__, foo_code)
1250
1251 foo_coro = foo()
Yury Selivanov5376ba92015-06-22 12:19:30 -04001252 def bar(): return foo_coro
Yury Selivanov4887523c2015-07-23 15:58:37 +03001253 for _ in range(2):
1254 bar = types.coroutine(bar)
1255 coro = bar()
1256 self.assertIs(foo_coro, coro)
1257 self.assertEqual(coro.cr_code.co_flags, foo_flags)
1258 coro.close()
Yury Selivanovc565cd52015-05-29 09:06:05 -04001259
1260 def test_duck_coro(self):
1261 class CoroLike:
1262 def send(self): pass
1263 def throw(self): pass
1264 def close(self): pass
Yury Selivanov13f77232015-05-29 16:19:18 -04001265 def __await__(self): return self
Yury Selivanovc565cd52015-05-29 09:06:05 -04001266
1267 coro = CoroLike()
1268 @types.coroutine
1269 def foo():
1270 return coro
Yury Selivanov5376ba92015-06-22 12:19:30 -04001271 self.assertIs(foo(), coro)
1272 self.assertIs(foo().__await__(), coro)
1273
1274 def test_duck_corogen(self):
1275 class CoroGenLike:
1276 def send(self): pass
1277 def throw(self): pass
1278 def close(self): pass
1279 def __await__(self): return self
1280 def __iter__(self): return self
1281 def __next__(self): pass
1282
1283 coro = CoroGenLike()
1284 @types.coroutine
1285 def foo():
1286 return coro
1287 self.assertIs(foo(), coro)
Yury Selivanov13f77232015-05-29 16:19:18 -04001288 self.assertIs(foo().__await__(), coro)
1289
1290 def test_duck_gen(self):
1291 class GenLike:
1292 def send(self): pass
1293 def throw(self): pass
1294 def close(self): pass
Yury Selivanov00e33722015-06-24 11:44:51 -04001295 def __iter__(self): pass
Yury Selivanov13f77232015-05-29 16:19:18 -04001296 def __next__(self): pass
1297
Yury Selivanov00e33722015-06-24 11:44:51 -04001298 # Setup generator mock object
1299 gen = unittest.mock.MagicMock(GenLike)
1300 gen.__iter__ = lambda gen: gen
1301 gen.__name__ = 'gen'
1302 gen.__qualname__ = 'test.gen'
1303 self.assertIsInstance(gen, collections.abc.Generator)
1304 self.assertIs(gen, iter(gen))
1305
Yury Selivanov13f77232015-05-29 16:19:18 -04001306 @types.coroutine
Yury Selivanov00e33722015-06-24 11:44:51 -04001307 def foo(): return gen
1308
1309 wrapper = foo()
1310 self.assertIsInstance(wrapper, types._GeneratorWrapper)
1311 self.assertIs(wrapper.__await__(), wrapper)
1312 # Wrapper proxies duck generators completely:
1313 self.assertIs(iter(wrapper), wrapper)
1314
1315 self.assertIsInstance(wrapper, collections.abc.Coroutine)
1316 self.assertIsInstance(wrapper, collections.abc.Awaitable)
1317
1318 self.assertIs(wrapper.__qualname__, gen.__qualname__)
1319 self.assertIs(wrapper.__name__, gen.__name__)
1320
1321 # Test AttributeErrors
Yury Selivanov53e62302015-07-03 00:35:02 -04001322 for name in {'gi_running', 'gi_frame', 'gi_code', 'gi_yieldfrom',
1323 'cr_running', 'cr_frame', 'cr_code', 'cr_await'}:
Yury Selivanov00e33722015-06-24 11:44:51 -04001324 with self.assertRaises(AttributeError):
1325 getattr(wrapper, name)
1326
1327 # Test attributes pass-through
1328 gen.gi_running = object()
1329 gen.gi_frame = object()
1330 gen.gi_code = object()
Yury Selivanov53e62302015-07-03 00:35:02 -04001331 gen.gi_yieldfrom = object()
Yury Selivanov00e33722015-06-24 11:44:51 -04001332 self.assertIs(wrapper.gi_running, gen.gi_running)
1333 self.assertIs(wrapper.gi_frame, gen.gi_frame)
1334 self.assertIs(wrapper.gi_code, gen.gi_code)
Yury Selivanov53e62302015-07-03 00:35:02 -04001335 self.assertIs(wrapper.gi_yieldfrom, gen.gi_yieldfrom)
Yury Selivanov00e33722015-06-24 11:44:51 -04001336 self.assertIs(wrapper.cr_running, gen.gi_running)
1337 self.assertIs(wrapper.cr_frame, gen.gi_frame)
1338 self.assertIs(wrapper.cr_code, gen.gi_code)
Yury Selivanov53e62302015-07-03 00:35:02 -04001339 self.assertIs(wrapper.cr_await, gen.gi_yieldfrom)
Yury Selivanov00e33722015-06-24 11:44:51 -04001340
1341 wrapper.close()
1342 gen.close.assert_called_once_with()
1343
1344 wrapper.send(1)
1345 gen.send.assert_called_once_with(1)
Yury Selivanovf847f1f2015-06-24 12:49:28 -04001346 gen.reset_mock()
1347
1348 next(wrapper)
1349 gen.__next__.assert_called_once_with()
1350 gen.reset_mock()
Yury Selivanov00e33722015-06-24 11:44:51 -04001351
1352 wrapper.throw(1, 2, 3)
1353 gen.throw.assert_called_once_with(1, 2, 3)
1354 gen.reset_mock()
1355
1356 wrapper.throw(1, 2)
1357 gen.throw.assert_called_once_with(1, 2)
1358 gen.reset_mock()
1359
1360 wrapper.throw(1)
1361 gen.throw.assert_called_once_with(1)
1362 gen.reset_mock()
1363
1364 # Test exceptions propagation
1365 error = Exception()
1366 gen.throw.side_effect = error
1367 try:
1368 wrapper.throw(1)
1369 except Exception as ex:
1370 self.assertIs(ex, error)
1371 else:
1372 self.fail('wrapper did not propagate an exception')
1373
1374 # Test invalid args
1375 gen.reset_mock()
1376 with self.assertRaises(TypeError):
1377 wrapper.throw()
1378 self.assertFalse(gen.throw.called)
1379 with self.assertRaises(TypeError):
1380 wrapper.close(1)
1381 self.assertFalse(gen.close.called)
1382 with self.assertRaises(TypeError):
1383 wrapper.send()
1384 self.assertFalse(gen.send.called)
1385
1386 # Test that we do not double wrap
1387 @types.coroutine
1388 def bar(): return wrapper
1389 self.assertIs(wrapper, bar())
1390
1391 # Test weakrefs support
1392 ref = weakref.ref(wrapper)
1393 self.assertIs(ref(), wrapper)
1394
1395 def test_duck_functional_gen(self):
1396 class Generator:
1397 """Emulates the following generator (very clumsy):
1398
1399 def gen(fut):
1400 result = yield fut
1401 return result * 2
1402 """
1403 def __init__(self, fut):
1404 self._i = 0
1405 self._fut = fut
1406 def __iter__(self):
1407 return self
1408 def __next__(self):
1409 return self.send(None)
1410 def send(self, v):
1411 try:
1412 if self._i == 0:
1413 assert v is None
1414 return self._fut
1415 if self._i == 1:
1416 raise StopIteration(v * 2)
1417 if self._i > 1:
1418 raise StopIteration
1419 finally:
1420 self._i += 1
1421 def throw(self, tp, *exc):
1422 self._i = 100
1423 if tp is not GeneratorExit:
1424 raise tp
1425 def close(self):
1426 self.throw(GeneratorExit)
1427
1428 @types.coroutine
1429 def foo(): return Generator('spam')
1430
1431 wrapper = foo()
1432 self.assertIsInstance(wrapper, types._GeneratorWrapper)
1433
1434 async def corofunc():
1435 return await foo() + 100
1436 coro = corofunc()
1437
1438 self.assertEqual(coro.send(None), 'spam')
1439 try:
1440 coro.send(20)
1441 except StopIteration as ex:
1442 self.assertEqual(ex.args[0], 140)
1443 else:
1444 self.fail('StopIteration was expected')
Yury Selivanov13f77232015-05-29 16:19:18 -04001445
1446 def test_gen(self):
Yury Selivanovf847f1f2015-06-24 12:49:28 -04001447 def gen_func():
1448 yield 1
1449 return (yield 2)
1450 gen = gen_func()
Yury Selivanov13f77232015-05-29 16:19:18 -04001451 @types.coroutine
1452 def foo(): return gen
Yury Selivanov00e33722015-06-24 11:44:51 -04001453 wrapper = foo()
1454 self.assertIsInstance(wrapper, types._GeneratorWrapper)
1455 self.assertIs(wrapper.__await__(), gen)
Yury Selivanov13f77232015-05-29 16:19:18 -04001456
1457 for name in ('__name__', '__qualname__', 'gi_code',
1458 'gi_running', 'gi_frame'):
1459 self.assertIs(getattr(foo(), name),
1460 getattr(gen, name))
Yury Selivanov5376ba92015-06-22 12:19:30 -04001461 self.assertIs(foo().cr_code, gen.gi_code)
Yury Selivanovc565cd52015-05-29 09:06:05 -04001462
Yury Selivanovf847f1f2015-06-24 12:49:28 -04001463 self.assertEqual(next(wrapper), 1)
1464 self.assertEqual(wrapper.send(None), 2)
1465 with self.assertRaisesRegex(StopIteration, 'spam'):
1466 wrapper.send('spam')
1467
1468 gen = gen_func()
1469 wrapper = foo()
1470 wrapper.send(None)
1471 with self.assertRaisesRegex(Exception, 'ham'):
1472 wrapper.throw(Exception, Exception('ham'))
1473
Yury Selivanov4887523c2015-07-23 15:58:37 +03001474 # decorate foo second time
1475 foo = types.coroutine(foo)
1476 self.assertIs(foo().__await__(), gen)
1477
Yury Selivanovfdbeb2b2015-07-03 13:11:35 -04001478 def test_returning_itercoro(self):
1479 @types.coroutine
1480 def gen():
1481 yield
1482
1483 gencoro = gen()
1484
1485 @types.coroutine
1486 def foo():
1487 return gencoro
1488
1489 self.assertIs(foo(), gencoro)
1490
Yury Selivanov4887523c2015-07-23 15:58:37 +03001491 # decorate foo second time
1492 foo = types.coroutine(foo)
1493 self.assertIs(foo(), gencoro)
1494
Yury Selivanov75445082015-05-11 22:57:16 -04001495 def test_genfunc(self):
Yury Selivanov00e33722015-06-24 11:44:51 -04001496 def gen(): yield
1497 self.assertIs(types.coroutine(gen), gen)
Yury Selivanov4887523c2015-07-23 15:58:37 +03001498 self.assertIs(types.coroutine(types.coroutine(gen)), gen)
Yury Selivanov75445082015-05-11 22:57:16 -04001499
1500 self.assertTrue(gen.__code__.co_flags & inspect.CO_ITERABLE_COROUTINE)
1501 self.assertFalse(gen.__code__.co_flags & inspect.CO_COROUTINE)
1502
1503 g = gen()
1504 self.assertTrue(g.gi_code.co_flags & inspect.CO_ITERABLE_COROUTINE)
1505 self.assertFalse(g.gi_code.co_flags & inspect.CO_COROUTINE)
Yury Selivanov75445082015-05-11 22:57:16 -04001506
Yury Selivanov00e33722015-06-24 11:44:51 -04001507 self.assertIs(types.coroutine(gen), gen)
1508
1509 def test_wrapper_object(self):
1510 def gen():
1511 yield
1512 @types.coroutine
1513 def coro():
1514 return gen()
1515
1516 wrapper = coro()
1517 self.assertIn('GeneratorWrapper', repr(wrapper))
1518 self.assertEqual(repr(wrapper), str(wrapper))
1519 self.assertTrue(set(dir(wrapper)).issuperset({
1520 '__await__', '__iter__', '__next__', 'cr_code', 'cr_running',
1521 'cr_frame', 'gi_code', 'gi_frame', 'gi_running', 'send',
1522 'close', 'throw'}))
1523
Yury Selivanov75445082015-05-11 22:57:16 -04001524
Thomas Wouters89f507f2006-12-13 04:49:30 +00001525if __name__ == '__main__':
Zachary Ware38c707e2015-04-13 15:00:43 -05001526 unittest.main()