1 import unittest
2
3
4 class ESC[4;38;5;81mTestLoadSuperAttrCache(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
5 def test_descriptor_not_double_executed_on_spec_fail(self):
6 calls = []
7 class ESC[4;38;5;81mDescriptor:
8 def __get__(self, instance, owner):
9 calls.append((instance, owner))
10 return lambda: 1
11
12 class ESC[4;38;5;81mC:
13 d = Descriptor()
14
15 class ESC[4;38;5;81mD(ESC[4;38;5;149mC):
16 def f(self):
17 return super().d()
18
19 d = D()
20
21 self.assertEqual(d.f(), 1) # warmup
22 calls.clear()
23 self.assertEqual(d.f(), 1) # try to specialize
24 self.assertEqual(calls, [(d, D)])
25
26
27 class ESC[4;38;5;81mTestLoadAttrCache(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
28 def test_descriptor_added_after_optimization(self):
29 class ESC[4;38;5;81mDescriptor:
30 pass
31
32 class ESC[4;38;5;81mC:
33 def __init__(self):
34 self.x = 1
35 x = Descriptor()
36
37 def f(o):
38 return o.x
39
40 o = C()
41 for i in range(1025):
42 assert f(o) == 1
43
44 Descriptor.__get__ = lambda self, instance, value: 2
45 Descriptor.__set__ = lambda *args: None
46
47 self.assertEqual(f(o), 2)
48
49 def test_metaclass_descriptor_added_after_optimization(self):
50 class ESC[4;38;5;81mDescriptor:
51 pass
52
53 class ESC[4;38;5;81mMetaclass(ESC[4;38;5;149mtype):
54 attribute = Descriptor()
55
56 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mMetaclass):
57 attribute = True
58
59 def __get__(self, instance, owner):
60 return False
61
62 def __set__(self, instance, value):
63 return None
64
65 def f():
66 return Class.attribute
67
68 for _ in range(1025):
69 self.assertTrue(f())
70
71 Descriptor.__get__ = __get__
72 Descriptor.__set__ = __set__
73
74 for _ in range(1025):
75 self.assertFalse(f())
76
77 def test_metaclass_descriptor_shadows_class_attribute(self):
78 class ESC[4;38;5;81mMetaclass(ESC[4;38;5;149mtype):
79 @property
80 def attribute(self):
81 return True
82
83 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mMetaclass):
84 attribute = False
85
86 def f():
87 return Class.attribute
88
89 for _ in range(1025):
90 self.assertTrue(f())
91
92 def test_metaclass_set_descriptor_after_optimization(self):
93 class ESC[4;38;5;81mMetaclass(ESC[4;38;5;149mtype):
94 pass
95
96 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mMetaclass):
97 attribute = True
98
99 @property
100 def attribute(self):
101 return False
102
103 def f():
104 return Class.attribute
105
106 for _ in range(1025):
107 self.assertTrue(f())
108
109 Metaclass.attribute = attribute
110
111 for _ in range(1025):
112 self.assertFalse(f())
113
114 def test_metaclass_del_descriptor_after_optimization(self):
115 class ESC[4;38;5;81mMetaclass(ESC[4;38;5;149mtype):
116 @property
117 def attribute(self):
118 return True
119
120 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mMetaclass):
121 attribute = False
122
123 def f():
124 return Class.attribute
125
126 for _ in range(1025):
127 self.assertTrue(f())
128
129 del Metaclass.attribute
130
131 for _ in range(1025):
132 self.assertFalse(f())
133
134 def test_type_descriptor_shadows_attribute_method(self):
135 class ESC[4;38;5;81mClass:
136 mro = None
137
138 def f():
139 return Class.mro
140
141 for _ in range(1025):
142 self.assertIsNone(f())
143
144 def test_type_descriptor_shadows_attribute_member(self):
145 class ESC[4;38;5;81mClass:
146 __base__ = None
147
148 def f():
149 return Class.__base__
150
151 for _ in range(1025):
152 self.assertIs(f(), object)
153
154 def test_type_descriptor_shadows_attribute_getset(self):
155 class ESC[4;38;5;81mClass:
156 __name__ = "Spam"
157
158 def f():
159 return Class.__name__
160
161 for _ in range(1025):
162 self.assertEqual(f(), "Class")
163
164 def test_metaclass_getattribute(self):
165 class ESC[4;38;5;81mMetaclass(ESC[4;38;5;149mtype):
166 def __getattribute__(self, name):
167 return True
168
169 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mMetaclass):
170 attribute = False
171
172 def f():
173 return Class.attribute
174
175 for _ in range(1025):
176 self.assertTrue(f())
177
178 def test_metaclass_swap(self):
179 class ESC[4;38;5;81mOldMetaclass(ESC[4;38;5;149mtype):
180 @property
181 def attribute(self):
182 return True
183
184 class ESC[4;38;5;81mNewMetaclass(ESC[4;38;5;149mtype):
185 @property
186 def attribute(self):
187 return False
188
189 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mOldMetaclass):
190 pass
191
192 def f():
193 return Class.attribute
194
195 for _ in range(1025):
196 self.assertTrue(f())
197
198 Class.__class__ = NewMetaclass
199
200 for _ in range(1025):
201 self.assertFalse(f())
202
203 def test_load_shadowing_slot_should_raise_type_error(self):
204 class ESC[4;38;5;81mClass:
205 __slots__ = ("slot",)
206
207 class ESC[4;38;5;81mSneaky:
208 __slots__ = ("shadowed",)
209 shadowing = Class.slot
210
211 def f(o):
212 o.shadowing
213
214 o = Sneaky()
215 o.shadowed = 42
216
217 for _ in range(1025):
218 with self.assertRaises(TypeError):
219 f(o)
220
221 def test_store_shadowing_slot_should_raise_type_error(self):
222 class ESC[4;38;5;81mClass:
223 __slots__ = ("slot",)
224
225 class ESC[4;38;5;81mSneaky:
226 __slots__ = ("shadowed",)
227 shadowing = Class.slot
228
229 def f(o):
230 o.shadowing = 42
231
232 o = Sneaky()
233
234 for _ in range(1025):
235 with self.assertRaises(TypeError):
236 f(o)
237
238 def test_load_borrowed_slot_should_not_crash(self):
239 class ESC[4;38;5;81mClass:
240 __slots__ = ("slot",)
241
242 class ESC[4;38;5;81mSneaky:
243 borrowed = Class.slot
244
245 def f(o):
246 o.borrowed
247
248 o = Sneaky()
249
250 for _ in range(1025):
251 with self.assertRaises(TypeError):
252 f(o)
253
254 def test_store_borrowed_slot_should_not_crash(self):
255 class ESC[4;38;5;81mClass:
256 __slots__ = ("slot",)
257
258 class ESC[4;38;5;81mSneaky:
259 borrowed = Class.slot
260
261 def f(o):
262 o.borrowed = 42
263
264 o = Sneaky()
265
266 for _ in range(1025):
267 with self.assertRaises(TypeError):
268 f(o)
269
270
271 class ESC[4;38;5;81mTestLoadMethodCache(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
272 def test_descriptor_added_after_optimization(self):
273 class ESC[4;38;5;81mDescriptor:
274 pass
275
276 class ESC[4;38;5;81mClass:
277 attribute = Descriptor()
278
279 def __get__(self, instance, owner):
280 return lambda: False
281
282 def __set__(self, instance, value):
283 return None
284
285 def attribute():
286 return True
287
288 instance = Class()
289 instance.attribute = attribute
290
291 def f():
292 return instance.attribute()
293
294 for _ in range(1025):
295 self.assertTrue(f())
296
297 Descriptor.__get__ = __get__
298 Descriptor.__set__ = __set__
299
300 for _ in range(1025):
301 self.assertFalse(f())
302
303 def test_metaclass_descriptor_added_after_optimization(self):
304 class ESC[4;38;5;81mDescriptor:
305 pass
306
307 class ESC[4;38;5;81mMetaclass(ESC[4;38;5;149mtype):
308 attribute = Descriptor()
309
310 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mMetaclass):
311 def attribute():
312 return True
313
314 def __get__(self, instance, owner):
315 return lambda: False
316
317 def __set__(self, instance, value):
318 return None
319
320 def f():
321 return Class.attribute()
322
323 for _ in range(1025):
324 self.assertTrue(f())
325
326 Descriptor.__get__ = __get__
327 Descriptor.__set__ = __set__
328
329 for _ in range(1025):
330 self.assertFalse(f())
331
332 def test_metaclass_descriptor_shadows_class_attribute(self):
333 class ESC[4;38;5;81mMetaclass(ESC[4;38;5;149mtype):
334 @property
335 def attribute(self):
336 return lambda: True
337
338 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mMetaclass):
339 def attribute():
340 return False
341
342 def f():
343 return Class.attribute()
344
345 for _ in range(1025):
346 self.assertTrue(f())
347
348 def test_metaclass_set_descriptor_after_optimization(self):
349 class ESC[4;38;5;81mMetaclass(ESC[4;38;5;149mtype):
350 pass
351
352 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mMetaclass):
353 def attribute():
354 return True
355
356 @property
357 def attribute(self):
358 return lambda: False
359
360 def f():
361 return Class.attribute()
362
363 for _ in range(1025):
364 self.assertTrue(f())
365
366 Metaclass.attribute = attribute
367
368 for _ in range(1025):
369 self.assertFalse(f())
370
371 def test_metaclass_del_descriptor_after_optimization(self):
372 class ESC[4;38;5;81mMetaclass(ESC[4;38;5;149mtype):
373 @property
374 def attribute(self):
375 return lambda: True
376
377 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mMetaclass):
378 def attribute():
379 return False
380
381 def f():
382 return Class.attribute()
383
384 for _ in range(1025):
385 self.assertTrue(f())
386
387 del Metaclass.attribute
388
389 for _ in range(1025):
390 self.assertFalse(f())
391
392 def test_type_descriptor_shadows_attribute_method(self):
393 class ESC[4;38;5;81mClass:
394 def mro():
395 return ["Spam", "eggs"]
396
397 def f():
398 return Class.mro()
399
400 for _ in range(1025):
401 self.assertEqual(f(), ["Spam", "eggs"])
402
403 def test_type_descriptor_shadows_attribute_member(self):
404 class ESC[4;38;5;81mClass:
405 def __base__():
406 return "Spam"
407
408 def f():
409 return Class.__base__()
410
411 for _ in range(1025):
412 self.assertNotEqual(f(), "Spam")
413
414 def test_metaclass_getattribute(self):
415 class ESC[4;38;5;81mMetaclass(ESC[4;38;5;149mtype):
416 def __getattribute__(self, name):
417 return lambda: True
418
419 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mMetaclass):
420 def attribute():
421 return False
422
423 def f():
424 return Class.attribute()
425
426 for _ in range(1025):
427 self.assertTrue(f())
428
429 def test_metaclass_swap(self):
430 class ESC[4;38;5;81mOldMetaclass(ESC[4;38;5;149mtype):
431 @property
432 def attribute(self):
433 return lambda: True
434
435 class ESC[4;38;5;81mNewMetaclass(ESC[4;38;5;149mtype):
436 @property
437 def attribute(self):
438 return lambda: False
439
440 class ESC[4;38;5;81mClass(metaclass=ESC[4;38;5;149mOldMetaclass):
441 pass
442
443 def f():
444 return Class.attribute()
445
446 for _ in range(1025):
447 self.assertTrue(f())
448
449 Class.__class__ = NewMetaclass
450
451 for _ in range(1025):
452 self.assertFalse(f())
453
454
455 class ESC[4;38;5;81mTestCallCache(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
456 def test_too_many_defaults_0(self):
457 def f():
458 pass
459
460 f.__defaults__ = (None,)
461 for _ in range(1025):
462 f()
463
464 def test_too_many_defaults_1(self):
465 def f(x):
466 pass
467
468 f.__defaults__ = (None, None)
469 for _ in range(1025):
470 f(None)
471 f()
472
473 def test_too_many_defaults_2(self):
474 def f(x, y):
475 pass
476
477 f.__defaults__ = (None, None, None)
478 for _ in range(1025):
479 f(None, None)
480 f(None)
481 f()
482
483
484 if __name__ == "__main__":
485 import unittest
486 unittest.main()