this repo has no description
at trunk 12786 lines 416 kB view raw
1#!/usr/bin/env python3 2# Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com) 3import ast 4import builtins 5import contextlib 6import copy 7import errno 8import math 9import os 10import pickle 11import sys 12import types 13import typing 14import unittest 15import warnings 16from collections import namedtuple 17from types import SimpleNamespace 18from unittest.mock import Mock 19 20from test_support import cpython_only, pyro_only 21 22 23Py_TPFLAGS_HEAPTYPE = 1 << 9 24 25 26try: 27 from builtins import _number_check, instance_proxy, _non_heaptype 28 29 from _builtins import _async_generator_op_iter_get_state, _gc 30except ImportError: 31 pass 32 33 34class Example: 35 pass 36 37 38class Forward: 39 pass 40 41 42class Super: 43 pass 44 45 46class Child(Super): 47 pass 48 49 50class TupleSubclass(tuple): 51 pass 52 53 54class AbsTests(unittest.TestCase): 55 def test_abs_calls_dunder_abs(self): 56 class C: 57 __abs__ = Mock(name="__abs__", return_value=3) 58 59 abs(C()) 60 C.__abs__.assert_called_once() 61 62 def test_abs_with_non_callable_dunder_abs_raises_type_error(self): 63 class C: 64 __abs__ = None 65 66 instance = C() 67 with self.assertRaisesRegex(TypeError, "'NoneType' object is not callable"): 68 abs(instance) 69 70 def test_abs_with_nan_returns_nan(self): 71 nan = float("nan") 72 result = abs(nan) 73 self.assertIsNot(result, nan) 74 self.assertNotEqual(result, nan) 75 self.assertTrue(math.isnan(result)) 76 77 78class AsciiTests(unittest.TestCase): 79 def test_ascii_calls_dunder_repr(self): 80 class C: 81 def __repr__(self): 82 return "my repr" 83 84 def __str__(self): 85 raise Exception("should not be called") 86 87 self.assertEqual(ascii(C()), "my repr") 88 89 def test_ascii_returns_str(self): 90 self.assertEqual(ascii(42), "42") 91 self.assertEqual(ascii(""), "''") 92 self.assertEqual(ascii("hello"), "'hello'") 93 self.assertEqual(ascii("X\xac\u4213\U0001f40d!"), "'X\\xac\\u4213\\U0001f40d!'") 94 95 96class AsyncGeneratorTests(unittest.TestCase): 97 def test_dunder_aiter_with_non_async_generator_raises_type_error(self): 98 async def async_gen_func(): 99 yield 100 101 with self.assertRaises(TypeError): 102 type(async_gen_func()).__aiter__(None) 103 104 def test_dunder_anext_with_non_async_generator_raises_type_error(self): 105 async def async_gen_func(): 106 yield 107 108 with self.assertRaises(TypeError): 109 type(async_gen_func()).__anext__(None) 110 111 def test_dunder_del_with_non_async_generator_raises_type_error(self): 112 async def async_gen_func(): 113 yield 114 115 with self.assertRaises(TypeError): 116 type(async_gen_func()).__del__(None) 117 118 def test_dunder_repr_with_non_async_generator_raises_type_error(self): 119 async def async_gen_func(): 120 yield 121 122 with self.assertRaises(TypeError): 123 type(async_gen_func()).__repr__(None) 124 125 def test_aclose_with_non_async_generator_raises_type_error(self): 126 async def async_gen_func(): 127 yield 128 129 with self.assertRaises(TypeError): 130 type(async_gen_func()).aclose(None) 131 132 def test_asend_with_non_async_generator_raises_type_error(self): 133 async def async_gen_func(): 134 yield 135 136 with self.assertRaises(TypeError): 137 type(async_gen_func()).asend(None, None) 138 139 def test_athrow_with_non_async_generator_raises_type_error(self): 140 async def async_gen_func(): 141 yield 142 143 with self.assertRaises(TypeError): 144 type(async_gen_func()).athrow(None, None, None, None) 145 146 def test_dunder_aiter_returns_self(self): 147 async def async_gen_func(): 148 yield 149 150 async_gen = async_gen_func() 151 152 self.assertIs(async_gen.__aiter__(), async_gen) 153 154 def test_dunder_anext_returns_iterable_over_states_of_trivial_async_gen_func(self): 155 async def async_gen_func(): 156 yield 1 157 158 with self.assertRaises(StopIteration) as exc: 159 next(iter(async_gen_func().__anext__())) 160 self.assertEqual(exc.exception.value, 1) 161 162 def test_dunder_anext_runs_firstiter_hook_exactly_once(self): 163 firstiter_ran = None 164 165 def firstiter_hook(async_gen_inst): 166 nonlocal firstiter_ran 167 firstiter_ran = async_gen_inst 168 169 sys.set_asyncgen_hooks(firstiter=firstiter_hook) 170 171 async def async_gen_func(): 172 yield 173 174 async_gen = async_gen_func() 175 async_gen.__anext__() 176 self.assertIs(firstiter_ran, async_gen) 177 178 firstiter_ran = None 179 async_gen.__anext__() 180 self.assertIsNone(firstiter_ran) 181 182 def test_dunder_anext_sets_finalizer(self): 183 finalizer_ran = None 184 185 def finalizer_hook(async_gen_inst): 186 nonlocal finalizer_ran 187 finalizer_ran = async_gen_inst 188 189 sys.set_asyncgen_hooks(finalizer=finalizer_hook) 190 191 async def async_gen_func(): 192 yield 193 194 async_gen = async_gen_func() 195 async_gen.__anext__() 196 async_gen.__del__() 197 self.assertIs(finalizer_ran, async_gen) 198 199 def test_dunder_repr(self): 200 async def async_gen_func(): 201 yield 202 203 async_gen_obj = async_gen_func() 204 205 self.assertTrue( 206 async_gen_obj.__repr__().startswith( 207 "<async_generator object AsyncGeneratorTests.test_dunder_repr." 208 "<locals>.async_gen_func at " 209 ) 210 ) 211 212 def test_aclose_runs_firstiter_hook(self): 213 firstiter_ran = None 214 215 def firstiter_hook(async_gen_inst): 216 nonlocal firstiter_ran 217 firstiter_ran = async_gen_inst 218 219 sys.set_asyncgen_hooks(firstiter=firstiter_hook) 220 221 async def async_gen_func(): 222 yield 223 224 async_gen = async_gen_func() 225 async_gen.aclose() 226 self.assertIs(firstiter_ran, async_gen) 227 228 def test_aclose_sets_finalizer(self): 229 finalizer_ran = None 230 231 def finalizer_hook(async_gen_inst): 232 nonlocal finalizer_ran 233 finalizer_ran = async_gen_inst 234 235 sys.set_asyncgen_hooks(finalizer=finalizer_hook) 236 237 async def async_gen_func(): 238 yield 239 240 async_gen = async_gen_func() 241 async_gen.aclose() 242 async_gen.__del__() 243 self.assertIs(finalizer_ran, async_gen) 244 245 def test_aclose_raises_generator_exit_inside_generator(self): 246 saw_generator_exit = False 247 248 async def f(): 249 nonlocal saw_generator_exit 250 try: 251 yield 1 252 except GeneratorExit: 253 saw_generator_exit = True 254 255 # Create async_generator for f() 256 async_gen = f() 257 258 # Advance generator to 'yield 1' to put us inside a try-except 259 # block from which we can catch aclose's GeneratorExit. 260 try: 261 async_gen.asend(None).send(None) 262 except StopIteration: 263 pass 264 265 try: 266 async_gen.aclose().send(None) 267 except StopIteration: 268 pass 269 270 self.assertTrue(saw_generator_exit) 271 272 def test_aclose_prevents_further_iteration(self): 273 async def f(): 274 yield 1 275 276 # Create async_generator for f() 277 async_gen = f() 278 279 # Perform the aclose operation 280 with self.assertRaises(StopIteration) as exc: 281 async_gen.aclose().send(None) 282 # Note '1' is not yielded because we closed before execution begun 283 self.assertIsNone(exc.exception.value) 284 285 # Further attempts to send into the generator result in 'StopAsyncIteration' 286 # which means the iterator has no more results. Again '1' is never yielded. 287 with self.assertRaises(StopAsyncIteration): 288 async_gen.asend(None).send(None) 289 290 def test_asend_runs_firstiter_hook_exactly_once(self): 291 firstiter_ran = None 292 293 def firstiter_hook(async_gen_inst): 294 nonlocal firstiter_ran 295 firstiter_ran = async_gen_inst 296 297 sys.set_asyncgen_hooks(firstiter=firstiter_hook) 298 299 async def async_gen_func(): 300 yield 301 yield 302 303 async_gen = async_gen_func() 304 async_gen.asend(None) 305 self.assertIs(firstiter_ran, async_gen) 306 307 firstiter_ran = None 308 async_gen.asend(None) 309 self.assertIs(firstiter_ran, None) 310 311 def test_asend_sets_finalizer(self): 312 finalizer_ran = None 313 314 def finalizer_hook(async_gen_inst): 315 nonlocal finalizer_ran 316 finalizer_ran = async_gen_inst 317 318 sys.set_asyncgen_hooks(finalizer=finalizer_hook) 319 320 async def async_gen_func(): 321 yield 322 323 async_gen = async_gen_func() 324 async_gen.asend(None) 325 async_gen.__del__() 326 self.assertIs(finalizer_ran, async_gen) 327 328 def test_asend_returns_iterable_over_states_of_no_op_async_gen_func(self): 329 async def async_gen_func(): 330 if False: 331 yield 332 333 async_gen_obj = async_gen_func() 334 335 # Call next() on no-op function advances us to the final state. 336 # StopAsyncIteration indicates there are no further results. 337 with self.assertRaises(StopAsyncIteration): 338 next(iter(async_gen_obj.asend(None))) 339 340 def test_asend_returns_iterables_over_states_of_yielding_async_gen_func(self): 341 async def async_gen_func(): 342 yield 1 343 344 async_gen_obj = async_gen_func() 345 346 # Calling next advances us to the first state: yielding 1. 347 with self.assertRaises(StopIteration) as exc: 348 next(iter(async_gen_obj.asend(None))) 349 self.assertEqual(exc.exception.value, 1) 350 351 # Calling next now advances us to the final state. 352 # StopAsyncIteration indicates there are no further results. 353 with self.assertRaises(StopAsyncIteration): 354 next(iter(async_gen_obj.asend(None))) 355 356 def test_using_asend_to_inject_a_value_into_generator(self): 357 async def async_gen_func(): 358 yield (yield) 359 360 async_gen_obj = async_gen_func() 361 362 # First next() call runs generator until the first yield. 363 with self.assertRaises(StopIteration) as exc: 364 next(async_gen_obj.asend(None)) 365 self.assertIsNone(exc.exception.value) 366 367 # Send value into generator with a value to advance to the next 368 # stopping state which will yield the value we sent in. 369 with self.assertRaises(StopIteration) as exc: 370 next(async_gen_obj.asend(1)) 371 self.assertEqual(exc.exception.value, 1) 372 373 def test_athrow_runs_firstiter_hook(self): 374 firstiter_ran = None 375 376 def firstiter_hook(async_gen_inst): 377 nonlocal firstiter_ran 378 firstiter_ran = async_gen_inst 379 380 sys.set_asyncgen_hooks(firstiter=firstiter_hook) 381 382 async def async_gen_func(): 383 yield 384 385 async_gen = async_gen_func() 386 async_gen.athrow(None) 387 self.assertIs(firstiter_ran, async_gen) 388 389 def test_athrow_sets_finalizer(self): 390 finalizer_ran = None 391 392 def finalizer_hook(async_gen_inst): 393 nonlocal finalizer_ran 394 finalizer_ran = async_gen_inst 395 396 sys.set_asyncgen_hooks(finalizer=finalizer_hook) 397 398 async def async_gen_func(): 399 yield 400 401 async_gen = async_gen_func() 402 async_gen.athrow(None) 403 async_gen.__del__() 404 self.assertIs(finalizer_ran, async_gen) 405 406 def test_athrow_raises_inside_generator(self): 407 async def f(): 408 try: 409 yield 1 410 except ValueError: 411 yield 2 412 413 async_gen = f() 414 415 # Advance generator to 'yield 1' so we can catch the ValueError. 416 try: 417 async_gen.asend(None).send(None) 418 except StopIteration: 419 pass 420 421 with self.assertRaises(StopIteration) as exc: 422 async_gen.athrow(ValueError).send(None) 423 self.assertEqual(exc.exception.value, 2) 424 425 def test_athrow_uncaught_in_generator_propagates_out(self): 426 async def f(): 427 yield 1 428 429 with self.assertRaises(ValueError) as exc: 430 f().athrow(ValueError, 1).send(None) 431 self.assertEqual(exc.exception.args, (1,)) 432 433 def test_async_generator_is_an_asynchronous_iterable(self): 434 # Inline coments from PEP-492 definition of "asynchronous 435 # iterable": 436 # https://www.python.org/dev/peps/pep-0492/#asynchronous-iterators-and-async-for 437 438 async def async_gen_func(): 439 yield 440 441 # 1. [An asynchronous iterable] must implement an __aiter__ method ... 442 async_gen_obj = async_gen_func() 443 self.assertTrue(hasattr(async_gen_obj, "__aiter__")) 444 445 # ... returning an asynchronous iterator object. 446 # 2. An asynchronous iterator object must implement an __anext__ 447 # method ... 448 async_it_obj = async_gen_obj.__aiter__() 449 self.assertTrue(hasattr(async_it_obj, "__anext__")) 450 451 # ... returning an awaitable. 452 awaitable_obj = async_it_obj.__anext__() 453 self.assertTrue(hasattr(awaitable_obj, "__await__")) 454 455 # 3. To stop iteration __anext__ must raise a StopAsyncIteration 456 # exception. 457 iterable_obj = awaitable_obj.__await__() 458 with self.assertRaises(StopIteration) as exc: 459 next(iter(iterable_obj)) 460 self.assertIsNone(exc.exception.value) 461 with self.assertRaises(StopAsyncIteration): 462 next(iter(async_gen_obj.__aiter__().__anext__().__await__())) 463 464 def test_async_generator_explicitly_throws_stop_async_iteration_raise_runtime_error( 465 self, 466 ): 467 async def f(): 468 raise StopIteration 469 yield 470 471 with self.assertRaises(RuntimeError): 472 f().asend(None).send(None) 473 474 475class AsyncGeneratorAcloseTests(unittest.TestCase): 476 _STATE_MAP = {"_STATE_INIT": 0, "_STATE_ITER": 1, "_STATE_CLOSED": 2} 477 478 def _assertOpIterState(self, op_iter, state_str): 479 if sys.implementation.name == "skybison": 480 state = _async_generator_op_iter_get_state(op_iter) 481 self.assertEqual(state, AsyncGeneratorAcloseTests._STATE_MAP[state_str]) 482 483 def test_dunder_await_with_non_async_generator_aclose_raises_type_error(self): 484 async def async_gen_func(): 485 yield 486 487 with self.assertRaises(TypeError): 488 type(async_gen_func().aclose()).__await__(None) 489 490 def test_dunder_iter_with_non_async_generator_aclose_raises_type_error(self): 491 async def async_gen_func(): 492 yield 493 494 with self.assertRaises(TypeError): 495 type(async_gen_func().aclose()).__iter__(None) 496 497 def test_dunder_next_with_non_async_generator_aclose_raises_type_error(self): 498 async def async_gen_func(): 499 yield 500 501 with self.assertRaises(TypeError): 502 type(async_gen_func().aclose()).__next__(None) 503 504 def test_close_with_non_async_generator_aclose_raises_type_error(self): 505 async def async_gen_func(): 506 yield 507 508 with self.assertRaises(TypeError): 509 type(async_gen_func().aclose()).close(None) 510 511 def test_send_with_non_async_generator_aclose_raises_type_error(self): 512 async def async_gen_func(): 513 yield 514 515 with self.assertRaises(TypeError): 516 type(async_gen_func().aclose()).send(None, None) 517 518 def test_throw_with_non_async_generator_aclose_raises_type_error(self): 519 async def async_gen_func(): 520 yield 521 522 with self.assertRaises(TypeError): 523 type(async_gen_func().aclose()).throw(None, None, None, None) 524 525 def test_dunder_await_returns_self(self): 526 async def f(): 527 yield 1 528 529 op_iter = f().aclose() 530 531 self.assertIs(op_iter.__await__(), op_iter) 532 533 def test_dunder_iter_returns_self(self): 534 async def f(): 535 yield 536 537 op_iter = f().aclose() 538 539 self.assertIs(op_iter.__iter__(), op_iter) 540 541 def test_is_awaitable(self): 542 async def f(): 543 yield 1 544 545 op_iter = f().aclose() 546 547 async def awaiter(awaitable): 548 return await awaitable 549 550 try: 551 # This would raise TypeError if op_iter were not awaitable. 552 awaiter(op_iter).send(None) 553 except StopIteration: 554 pass 555 556 def test_is_iterable(self): 557 async def f(): 558 yield 1 559 560 op_iter = f().aclose() 561 562 with self.assertRaises(StopIteration) as exc: 563 next(iter(op_iter)) 564 self.assertIsNone(exc.exception.value) 565 566 @pyro_only 567 def test_new_instance_starts_in_init_state(self): 568 async def f(): 569 yield 1 570 571 op_iter = f().aclose() 572 573 self._assertOpIterState(op_iter, "_STATE_INIT") 574 575 @pyro_only 576 def test_close_moves_into_closed_state(self): 577 async def f(): 578 yield 1 579 580 # Make aclose op_iter 581 op_iter = f().aclose() 582 583 op_iter.close() 584 self._assertOpIterState(op_iter, "_STATE_CLOSED") 585 586 def test_send_state_closed_raises_stop_iteration_state_closed(self): 587 async def f(): 588 yield 1 589 590 # Make aclose op_iter in closed state 591 op_iter = f().aclose() 592 op_iter.close() 593 594 with self.assertRaises( 595 RuntimeError, msg="cannot reuse already awaited aclose()/athrow()" 596 ): 597 op_iter.send(None) 598 599 self._assertOpIterState(op_iter, "_STATE_CLOSED") 600 601 def test_send_state_init_arg_is_not_none_raises_runtime_error_state_init(self): 602 async def f(): 603 yield 1 604 605 # Make aclose op_iter 606 op_iter = f().aclose() 607 608 with self.assertRaises(RuntimeError): 609 op_iter.send(1) 610 611 self._assertOpIterState(op_iter, "_STATE_INIT") 612 613 def test_send_state_init_arg_is_none_generator_raises_stop_async_iteration_raises_stop_iteration_state_closed( # noqa: B950 614 self, 615 ): 616 async def f(): 617 try: 618 yield 1 619 except GeneratorExit: 620 # Returning causes StopAsyncIteration to be raised 621 return 622 623 # Make an async_generator for f 624 async_gen = f() 625 626 # Advance generator into try-except block, pausing after 'yield 1' 627 try: 628 async_gen.asend(None).send(None) 629 except StopIteration: 630 pass 631 632 # Make aclose op_iter which is primted to run inside try-except block 633 op_iter = async_gen.aclose() 634 635 with self.assertRaises(StopIteration) as exc: 636 op_iter.send(None) 637 self.assertIsNone(exc.exception.value) 638 639 self._assertOpIterState(op_iter, "_STATE_CLOSED") 640 641 def test_send_state_init_arg_is_none_generator_raises_generator_exit_raises_stop_iteration_state_closed( # noqa: B950 642 self, 643 ): 644 async def f(): 645 yield 1 646 647 # Make aclose op_iter 648 op_iter = f().aclose() 649 650 with self.assertRaises(StopIteration) as exc: 651 # The aclose operation implicitly raises GeneratorExit in the generator 652 op_iter.send(None) 653 self.assertIsNone(exc.exception.value) 654 655 self._assertOpIterState(op_iter, "_STATE_CLOSED") 656 657 def test_send_state_init_arg_is_none_generator_yields_raises_runtime_error_state_iter( # noqa: B950 658 self, 659 ): 660 async def f(): 661 try: 662 yield 1 663 except GeneratorExit: 664 yield 2 665 666 # Make an async_generator for f 667 async_gen = f() 668 669 # Advance generator into try-except block, pausing after 'yield 1' 670 try: 671 async_gen.asend(None).send(None) 672 except StopIteration: 673 pass 674 675 # Make aclose op_iter which is primted to run inside try-except block 676 op_iter = async_gen.aclose() 677 678 with self.assertRaises(RuntimeError): 679 op_iter.send(None) 680 681 self._assertOpIterState(op_iter, "_STATE_ITER") 682 683 def test_send_state_init_arg_is_none_generator_awaits_returns_awaitable_yielded_value_state_iter( # noqa: B950 684 self, 685 ): 686 async def f(): 687 class Awaitable: 688 def __await__(self): 689 yield 1 690 691 try: 692 yield 2 693 except GeneratorExit: 694 await Awaitable() 695 696 # Make an async_generator for f 697 async_gen = f() 698 699 # Advance generator into try-except block, pausing after 'yield 2' 700 try: 701 async_gen.asend(None).send(None) 702 except StopIteration: 703 pass 704 705 # Make aclose op_iter which is primted to run inside try-except block 706 op_iter = async_gen.aclose() 707 708 self.assertEqual(op_iter.send(None), 1) 709 710 self._assertOpIterState(op_iter, "_STATE_ITER") 711 712 def test_send_state_iter_arg_is_not_none_arg_sent_into_generator(self): 713 sent_value = None 714 715 async def f(): 716 class Awaitable: 717 def __await__(self): 718 nonlocal sent_value 719 sent_value = yield 1 720 721 try: 722 yield 2 723 except GeneratorExit: 724 await Awaitable() 725 726 # Make an async_generator for f 727 async_gen = f() 728 729 # Advance generator into try-except block, pausing after 'yield 2' 730 try: 731 async_gen.asend(None).send(None) 732 except StopIteration: 733 pass 734 735 # Make aclose op_iter which is primted to run inside try-except block 736 op_iter = async_gen.aclose() 737 738 # Executing the aclose operation which should take us to the ITER state 739 # as we run 'await Awaitable()' 740 op_iter.send(None) 741 742 # Send the value 3 in which will appear at the yield in the awaitable 743 # and then finish the generator with a StopIteration. 744 try: 745 op_iter.send(3) 746 except StopIteration: 747 pass 748 self.assertEqual(sent_value, 3) 749 750 def test_send_state_iter_arg_is_none_generator_raises_generator_exit_raises_stop_iteration_state_closed( # noqa: B950 751 self, 752 ): 753 async def f(): 754 class Awaitable: 755 def __await__(self): 756 yield 1 757 raise GeneratorExit 758 759 try: 760 yield 2 761 except GeneratorExit: 762 await Awaitable() 763 764 # Make an async_generator for f 765 async_gen = f() 766 767 # Advance generator into try-except block, pausing after 'yield 2' 768 try: 769 async_gen.asend(None).send(None) 770 except StopIteration: 771 pass 772 773 # Make aclose op_iter which is primted to run inside try-except block 774 op_iter = async_gen.aclose() 775 776 # Executing the aclose operation which should take us to the ITER state 777 # as we run 'await Awaitable()' 778 op_iter.send(None) 779 780 with self.assertRaises(StopIteration) as exc: 781 op_iter.send(None) 782 self.assertIsNone(exc.exception.value) 783 784 self._assertOpIterState(op_iter, "_STATE_CLOSED") 785 786 def test_send_state_iter_arg_is_none_generator_raises_stop_async_iteration_raises_stop_iteration_state_closed( # noqa: B950 787 self, 788 ): 789 async def f(): 790 class Awaitable: 791 def __await__(self): 792 yield 1 793 794 try: 795 yield 2 796 except GeneratorExit: 797 await Awaitable() 798 # Terminating here raises StopAsyncIteration 799 800 # Make an async_generator for f 801 async_gen = f() 802 803 # Advance generator into try-except block, pausing after 'yield 2' 804 try: 805 async_gen.asend(None).send(None) 806 except StopIteration: 807 pass 808 809 # Make aclose op_iter which is primted to run inside try-except block 810 op_iter = async_gen.aclose() 811 812 # Executing the aclose operation which should take us to the ITER state 813 # as we run 'await Awaitable()' 814 op_iter.send(None) 815 816 with self.assertRaises(StopIteration) as exc: 817 op_iter.send(None) 818 self.assertIsNone(exc.exception.value) 819 820 self._assertOpIterState(op_iter, "_STATE_CLOSED") 821 822 def test_send_state_iter_arg_is_none_generator_yields_raises_runtime_error_state_iter( # noqa: B950 823 self, 824 ): 825 async def f(): 826 class Awaitable: 827 def __await__(self): 828 yield 1 829 830 try: 831 yield 2 832 except GeneratorExit: 833 await Awaitable() 834 yield 3 835 836 # Make an async_generator for f 837 async_gen = f() 838 839 # Advance generator into try-except block, pausing after 'yield 2' 840 try: 841 async_gen.asend(None).send(None) 842 except StopIteration: 843 pass 844 845 # Make aclose op_iter which is primted to run inside try-except block 846 op_iter = async_gen.aclose() 847 848 # Executing the aclose operation which should take us to the ITER state 849 # as we run 'await Awaitable()' 850 op_iter.send(None) 851 852 with self.assertRaises(RuntimeError): 853 op_iter.send(None) 854 855 self._assertOpIterState(op_iter, "_STATE_ITER") 856 857 def test_send_state_iter_arg_is_none_generator_awaits_returns_awaitable_yielded_value_state_iter( # noqa: B950 858 self, 859 ): 860 async def f(): 861 class Awaitable: 862 def __init__(self, yield_value): 863 self._yield_value = yield_value 864 865 def __await__(self): 866 yield self._yield_value 867 868 try: 869 yield 1 870 except GeneratorExit: 871 await Awaitable(2) 872 await Awaitable(3) 873 874 # Make an async_generator for f 875 async_gen = f() 876 877 # Advance generator into try-except block, pausing after 'yield 1' 878 try: 879 async_gen.asend(None).send(None) 880 except StopIteration: 881 pass 882 883 # Make aclose op_iter which is primted to run inside try-except block 884 op_iter = async_gen.aclose() 885 886 # Executing the aclose operation which should take us to the ITER state 887 # as we run 'await Awaitable()' 888 op_iter.send(None) 889 890 self.assertEqual(op_iter.send(None), 3) 891 892 self._assertOpIterState(op_iter, "_STATE_ITER") 893 894 def test_throw_state_closed_raises_stop_iteration_state_closed(self): 895 async def f(): 896 yield 1 897 898 # Make aclose op_iter in closed state 899 op_iter = f().aclose() 900 op_iter.close() 901 902 with self.assertRaises( 903 RuntimeError, msg="cannot reuse already awaited aclose()/athrow()" 904 ): 905 op_iter.throw(None, None, None) 906 907 self._assertOpIterState(op_iter, "_STATE_CLOSED") 908 909 def test_throw_state_init_with_non_exception_raises_type_error(self): 910 async def f(): 911 yield 1 912 913 # Make aclose op_iter 914 op_iter = f().aclose() 915 916 with self.assertRaises(TypeError): 917 op_iter.throw(None, None, None) 918 919 def test_throw_state_iter_generator_raise_propagates_state_iter(self): 920 async def f(): 921 class Awaitable: 922 def __await__(self): 923 yield 1 924 925 try: 926 yield 2 927 except GeneratorExit: 928 await Awaitable() 929 930 # Make an async_generator for f 931 async_gen = f() 932 933 # Advance generator into try-except block, pausing after 'yield 2' 934 try: 935 async_gen.asend(None).send(None) 936 except StopIteration: 937 pass 938 939 # Make aclose op_iter which is primted to run inside try-except block 940 op_iter = async_gen.aclose() 941 942 # Executing the aclose operation which should take us to the ITER state 943 # as we run 'await Awaitable()' 944 op_iter.send(None) 945 946 with self.assertRaises(ValueError) as exc: 947 op_iter.throw(ValueError, 3, None) 948 self.assertEqual(exc.exception.args, (3,)) 949 950 self._assertOpIterState(op_iter, "_STATE_ITER") 951 952 def test_throw_state_iter_generator_yields_raises_runtime_error_state_iter(self): 953 async def f(): 954 class Awaitable: 955 def __await__(self): 956 yield 1 957 958 try: 959 yield 2 960 except GeneratorExit: 961 try: 962 await Awaitable() 963 except ValueError: 964 yield 3 965 966 # Make an async_generator for f 967 async_gen = f() 968 969 # Advance generator into try-except block, pausing after 'yield 2' 970 try: 971 async_gen.asend(None).send(None) 972 except StopIteration: 973 pass 974 975 # Make aclose op_iter which is primted to run inside try-except block 976 op_iter = async_gen.aclose() 977 978 # Executing the aclose operation which should take us to the ITER state 979 # as we run 'await Awaitable()' 980 op_iter.send(None) 981 982 with self.assertRaises(RuntimeError): 983 op_iter.throw(ValueError, 4, None) 984 985 self._assertOpIterState(op_iter, "_STATE_ITER") 986 987 def test_throw_state_iter_generator_awaits_returns_awaitable_yielded_value_state_iter( # noqa: B950 988 self, 989 ): 990 async def f(): 991 class Awaitable: 992 def __init__(self, yield_value): 993 self._yield_value = yield_value 994 995 def __await__(self): 996 yield self._yield_value 997 998 try: 999 yield 1 1000 except GeneratorExit: 1001 try: 1002 await Awaitable(2) 1003 except ValueError: 1004 await Awaitable(3) 1005 1006 # Make an async_generator for f 1007 async_gen = f() 1008 1009 # Advance generator into try-except block, pausing after 'yield 2' 1010 try: 1011 async_gen.asend(None).send(None) 1012 except StopIteration: 1013 pass 1014 1015 # Make aclose op_iter which is primted to run inside try-except block 1016 op_iter = async_gen.aclose() 1017 1018 # Executing the aclose operation which should take us to the ITER state 1019 # as we run 'await Awaitable()' 1020 op_iter.send(None) 1021 1022 self.assertEqual(op_iter.throw(ValueError, 4, None), 3) 1023 1024 self._assertOpIterState(op_iter, "_STATE_ITER") 1025 1026 1027class AsyncGeneratorAsendTests(unittest.TestCase): 1028 _STATE_MAP = {"_STATE_INIT": 0, "_STATE_ITER": 1, "_STATE_CLOSED": 2} 1029 1030 def _assertOpIterState(self, op_iter, state_str): 1031 if sys.implementation.name == "skybison": 1032 state = _async_generator_op_iter_get_state(op_iter) 1033 self.assertEqual(state, AsyncGeneratorAsendTests._STATE_MAP[state_str]) 1034 1035 def test_dunder_await_with_non_async_generator_asend_raises_type_error(self): 1036 async def async_gen_func(): 1037 yield 1038 1039 with self.assertRaises(TypeError): 1040 type(async_gen_func().asend(None)).__await__(None) 1041 1042 def test_dunder_iter_with_non_async_generator_asend_raises_type_error(self): 1043 async def async_gen_func(): 1044 yield 1045 1046 with self.assertRaises(TypeError): 1047 type(async_gen_func().asend(None)).__iter__(None) 1048 1049 def test_dunder_next_with_non_async_generator_asend_raises_type_error(self): 1050 async def async_gen_func(): 1051 yield 1052 1053 with self.assertRaises(TypeError): 1054 type(async_gen_func().asend(None)).__next__(None) 1055 1056 def test_close_with_non_async_generator_asend_raises_type_error(self): 1057 async def async_gen_func(): 1058 yield 1059 1060 with self.assertRaises(TypeError): 1061 type(async_gen_func().asend(None)).close(None) 1062 1063 def test_send_with_non_async_generator_asend_raises_type_error(self): 1064 async def async_gen_func(): 1065 yield 1066 1067 with self.assertRaises(TypeError): 1068 type(async_gen_func().asend(None)).send(None, None) 1069 1070 def test_throw_with_non_async_generator_asend_raises_type_error(self): 1071 async def async_gen_func(): 1072 yield 1073 1074 with self.assertRaises(TypeError): 1075 type(async_gen_func().asend(None)).throw(None, None, None, None) 1076 1077 def test_dunder_await_returns_self(self): 1078 async def f(): 1079 yield 1 1080 1081 op_iter = f().asend(None) 1082 1083 self.assertIs(op_iter.__await__(), op_iter) 1084 1085 def test_dunder_iter_returns_self(self): 1086 async def f(): 1087 yield 1 1088 1089 op_iter = f().asend(None) 1090 1091 self.assertIs(op_iter.__iter__(), op_iter) 1092 1093 def test_is_awaitable(self): 1094 async def f(): 1095 yield 1 1096 1097 op_iter = f().asend(None) 1098 1099 async def awaiter(awaitable): 1100 return await awaitable 1101 1102 try: 1103 # This would raise TypeError if op_iter were not awaitable. 1104 awaiter(op_iter).send(None) 1105 except StopIteration: 1106 pass 1107 1108 def test_is_iterable(self): 1109 async def f(): 1110 yield 1 1111 1112 op_iter = f().asend(None) 1113 1114 with self.assertRaises(StopIteration) as exc: 1115 next(iter(op_iter)) 1116 self.assertEqual(exc.exception.value, 1) 1117 1118 @pyro_only 1119 def test_new_instance_starts_in_init_state(self): 1120 async def f(): 1121 yield 1 1122 1123 op_iter = f().asend(None) 1124 1125 self._assertOpIterState(op_iter, "_STATE_INIT") 1126 1127 @pyro_only 1128 def test_close_moves_into_closed_state(self): 1129 async def f(): 1130 yield 1 1131 1132 # Make asend op_iter 1133 op_iter = f().asend(None) 1134 1135 op_iter.close() 1136 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1137 1138 def test_send_state_closed_raises_stop_iteration_state_closed(self): 1139 async def f(): 1140 yield 1 1141 1142 # Make asend op_iter in closed state 1143 op_iter = f().asend(None) 1144 op_iter.close() 1145 1146 with self.assertRaises( 1147 RuntimeError, msg="cannot reuse already awaited __anext__()/asend()" 1148 ): 1149 op_iter.send(None) 1150 1151 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1152 1153 def test_send_state_init_arg_is_none_sends_primed_value_into_generator(self): 1154 sent_value = 1 1155 1156 async def f(): 1157 nonlocal sent_value 1158 sent_value = yield 2 1159 1160 async_gen = f() 1161 1162 # Advance generator through 'yield 2' to waiting to receive a value. 1163 try: 1164 async_gen.asend(None).send(None) 1165 except StopIteration: 1166 pass 1167 1168 try: 1169 # Setup an asend op iter with a "primed" value of 3 1170 async_gen.asend(3).send(None) 1171 except StopAsyncIteration: 1172 pass 1173 self.assertEqual(sent_value, 3) 1174 1175 def test_send_state_init_arg_is_set_sends_arg_into_generator(self): 1176 sent_value = 1 1177 1178 async def f(): 1179 nonlocal sent_value 1180 sent_value = yield 2 1181 1182 async_gen = f() 1183 1184 # Advance generator through 'yield 2' to waiting to receive a value. 1185 try: 1186 async_gen.asend(None).send(None) 1187 except StopIteration: 1188 pass 1189 1190 try: 1191 # Setup an asend op iter with a "primed" value of 3 but override 1192 # it with an initial send value of 4. 1193 async_gen.asend(3).send(4) 1194 except StopAsyncIteration: 1195 pass 1196 self.assertEqual(sent_value, 4) 1197 1198 def test_send_state_init_generator_raises_propagates_state_closed(self): 1199 async def f(): 1200 raise ValueError 1201 yield 1202 1203 op_iter = f().asend(None) 1204 1205 with self.assertRaises(ValueError): 1206 op_iter.send(None) 1207 1208 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1209 1210 def test_send_state_init_generator_yields_raises_stop_iteration_with_value_state_closed( # noqa: B950 1211 self, 1212 ): 1213 async def f(): 1214 yield 1 1215 1216 op_iter = f().asend(None) 1217 1218 with self.assertRaises(StopIteration) as exc: 1219 op_iter.send(None) 1220 self.assertEqual(exc.exception.value, 1) 1221 1222 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1223 1224 def test_send_state_init_generator_awaits_returns_value_yielded_from_awaitable_state_iter( # noqa: B950 1225 self, 1226 ): 1227 async def f(): 1228 class Awaitable: 1229 def __await__(self): 1230 yield 1 1231 1232 await Awaitable() 1233 yield 2 1234 1235 op_iter = f().asend(None) 1236 1237 self.assertEqual(op_iter.send(None), 1) 1238 1239 self._assertOpIterState(op_iter, "_STATE_ITER") 1240 1241 def test_send_state_iter_arg_is_none_sends_none_into_generator(self): 1242 sent_value = 1 1243 1244 async def f(): 1245 class Awaitable: 1246 def __await__(self): 1247 nonlocal sent_value 1248 sent_value = yield 2 1249 1250 await Awaitable() 1251 yield 3 1252 1253 op_iter = f().asend(None) 1254 1255 # Advance generator to the 'yield 2' inside the Awaitable. 1256 # The op_iter is now in the ITER state. 1257 op_iter.send(None) 1258 1259 # Send None into generator to be received by 'sent_value' 1260 try: 1261 op_iter.send(None) 1262 except StopIteration: 1263 pass 1264 1265 self.assertEqual(sent_value, None) 1266 1267 def test_send_state_iter_arg_is_set_sends_arg_into_generator(self): 1268 sent_value = 1 1269 1270 async def f(): 1271 class Awaitable: 1272 def __await__(self): 1273 nonlocal sent_value 1274 sent_value = yield 2 1275 1276 await Awaitable() 1277 yield 3 1278 1279 op_iter = f().asend(None) 1280 1281 # Advance generator to the 'yield 2' inside the Awaitable. 1282 # The op_iter is now in the ITER state. 1283 op_iter.send(None) 1284 1285 # Send 4 into generator to be received by 'sent_value' 1286 try: 1287 op_iter.send(4) 1288 except StopIteration: 1289 pass 1290 1291 self.assertEqual(sent_value, 4) 1292 1293 def test_send_state_init_generator_raises_propagates_state_closed(self): 1294 async def f(): 1295 class Awaitable: 1296 def __await__(self): 1297 yield 1 1298 raise ValueError 1299 1300 await Awaitable() 1301 yield 2 1302 1303 op_iter = f().asend(None) 1304 1305 # Advance generator to the 'yield 1' inside the Awaitable. 1306 # The op_iter is now in the ITER state. 1307 op_iter.send(None) 1308 1309 with self.assertRaises(ValueError): 1310 op_iter.send(None) 1311 1312 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1313 1314 def test_send_state_iter_generator_yields_raises_stop_iteration_with_value_state_closed( # noqa: B950 1315 self, 1316 ): 1317 async def f(): 1318 class Awaitable: 1319 def __await__(self): 1320 yield 1 1321 1322 await Awaitable() 1323 yield 2 1324 1325 # Make asend op_iter 1326 op_iter = f().asend(None) 1327 1328 # Advance generator to the 'yield 1' inside the Awaitable. 1329 # The op_iter is now in the ITER state. 1330 op_iter.send(None) 1331 1332 with self.assertRaises(StopIteration) as exc: 1333 op_iter.send(None) 1334 self.assertEqual(exc.exception.value, 2) 1335 1336 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1337 1338 def test_send_state_init_generator_awaits_returns_value_yielded_from_awaitable_state_iter( # noqa: B950 1339 self, 1340 ): 1341 async def f(): 1342 class Awaitable: 1343 def __init__(self, yield_value): 1344 self._yield_value = yield_value 1345 1346 def __await__(self): 1347 yield self._yield_value 1348 1349 await Awaitable(1) 1350 await Awaitable(2) 1351 yield 3 1352 1353 # Make asend op_iter 1354 op_iter = f().asend(None) 1355 1356 # Advance generator to the point it runs 'yield 1' inside the Awaitable. 1357 # The op_iter is now in the ITER state. 1358 op_iter.send(None) 1359 1360 self.assertEqual(op_iter.send(None), 2) 1361 1362 self._assertOpIterState(op_iter, "_STATE_ITER") 1363 1364 def test_throw_state_closed_raises_stop_iteration_state_closed(self): 1365 async def f(): 1366 yield 1 1367 1368 # Make asend op_iter in closed state 1369 op_iter = f().asend(None) 1370 op_iter.close() 1371 1372 with self.assertRaises( 1373 RuntimeError, msg="cannot reuse already awaited __anext__()/asend()" 1374 ): 1375 op_iter.throw(None, None, None) 1376 1377 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1378 1379 def test_throw_state_init_propagates_exception_through_generator_state_closed(self): 1380 async def f(): 1381 yield 1 1382 1383 # Make asend op_iter 1384 op_iter = f().asend(None) 1385 1386 with self.assertRaises(ValueError) as exc: 1387 op_iter.throw(ValueError, 1) 1388 self.assertEqual(exc.exception.args, (1,)) 1389 1390 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1391 1392 def test_throw_state_init_generator_catches_and_yields_raises_stop_iteration_with_value_state_closed( # noqa: B950 1393 self, 1394 ): 1395 async def f(): 1396 try: 1397 yield 1 1398 except ValueError: 1399 yield 2 1400 1401 # Make async generator for f 1402 async_gen = f() 1403 1404 # Advanced generator inside try-except block so throw can be caught 1405 # and further action taken. 1406 try: 1407 async_gen.asend(None).send(None) 1408 except StopIteration: 1409 pass 1410 1411 op_iter = async_gen.asend(None) 1412 1413 with self.assertRaises(StopIteration) as exc: 1414 op_iter.throw(ValueError, 3) 1415 self.assertEqual(exc.exception.value, 2) 1416 1417 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1418 1419 def test_throw_state_init_generator_catches_and_awaits_returns_value_yielded_from_awaitable_state_iter( # noqa: B950 1420 self, 1421 ): 1422 async def f(): 1423 class Awaitable: 1424 def __await__(self): 1425 yield 1 1426 1427 try: 1428 yield 2 1429 except ValueError: 1430 await Awaitable() 1431 1432 # Make async generator for f 1433 async_gen = f() 1434 1435 # Advanced generator inside try-except block so throw can be caught 1436 # and further action taken. 1437 try: 1438 async_gen.asend(None).send(None) 1439 except StopIteration: 1440 pass 1441 1442 op_iter = async_gen.asend(None) 1443 1444 self.assertEqual(op_iter.throw(ValueError, 3), 1) 1445 1446 self._assertOpIterState(op_iter, "_STATE_ITER") 1447 1448 1449class AsyncGeneratorAthrowTests(unittest.TestCase): 1450 _STATE_MAP = {"_STATE_INIT": 0, "_STATE_ITER": 1, "_STATE_CLOSED": 2} 1451 1452 def _assertOpIterState(self, op_iter, state_str): 1453 if sys.implementation.name == "skybison": 1454 state = _async_generator_op_iter_get_state(op_iter) 1455 self.assertEqual(state, AsyncGeneratorAthrowTests._STATE_MAP[state_str]) 1456 1457 def test_dunder_await_with_non_async_generator_athrow_raises_type_error(self): 1458 async def async_gen_func(): 1459 yield 1460 1461 with self.assertRaises(TypeError): 1462 type(async_gen_func().athrow(None)).__await__(None) 1463 1464 def test_dunder_iter_with_non_async_generator_athrow_raises_type_error(self): 1465 async def async_gen_func(): 1466 yield 1467 1468 with self.assertRaises(TypeError): 1469 type(async_gen_func().athrow(None)).__iter__(None) 1470 1471 def test_dunder_next_with_non_async_generator_athrow_raises_type_error(self): 1472 async def async_gen_func(): 1473 yield 1474 1475 with self.assertRaises(TypeError): 1476 type(async_gen_func().athrow(None)).__next__(None) 1477 1478 def test_close_with_non_async_generator_athrow_raises_type_error(self): 1479 async def async_gen_func(): 1480 yield 1481 1482 with self.assertRaises(TypeError): 1483 type(async_gen_func().athrow(None)).close(None) 1484 1485 def test_send_with_non_async_generator_athrow_raises_type_error(self): 1486 async def async_gen_func(): 1487 yield 1488 1489 with self.assertRaises(TypeError): 1490 type(async_gen_func().athrow(None)).send(None, None) 1491 1492 def test_throw_with_non_async_generator_athrow_raises_type_error(self): 1493 async def async_gen_func(): 1494 yield 1495 1496 with self.assertRaises(TypeError): 1497 type(async_gen_func().athrow(None)).throw(None, None, None, None) 1498 1499 def test_dunder_await_returns_self(self): 1500 async def f(): 1501 yield 1 1502 1503 # Make athrow op_iter 1504 op_iter = f().athrow(ValueError, 1) 1505 1506 self.assertIs(op_iter.__await__(), op_iter) 1507 1508 def test_dunder_iter_returns_self(self): 1509 async def f(): 1510 yield 1 1511 1512 # Make athrow op_iter 1513 op_iter = f().athrow(ValueError, 1) 1514 1515 self.assertIs(op_iter.__iter__(), op_iter) 1516 1517 def test_is_awaitable(self): 1518 async def f(): 1519 yield 1 1520 1521 # Make athrow op_iter 1522 op_iter = f().athrow(ValueError, 1) 1523 1524 async def awaiter(awaitable): 1525 return await awaitable 1526 1527 try: 1528 # This would raise TypeError if op_iter were not awaitable. 1529 awaiter(op_iter).send(None) 1530 except ValueError: 1531 pass 1532 1533 def test_is_iterable(self): 1534 async def f(): 1535 yield 1 1536 1537 # Make athrow op_iter 1538 op_iter = f().athrow(ValueError, 1) 1539 1540 with self.assertRaises(ValueError) as exc: 1541 next(iter(op_iter)) 1542 self.assertEqual(exc.exception.args, (1,)) 1543 1544 @pyro_only 1545 def test_new_instance_starts_in_init_state(self): 1546 async def f(): 1547 yield 1 1548 1549 # Make athrow op_iter 1550 op_iter = f().athrow(ValueError, 1) 1551 1552 self._assertOpIterState(op_iter, "_STATE_INIT") 1553 1554 @pyro_only 1555 def test_close_moves_into_closed_state(self): 1556 async def f(): 1557 yield 1 1558 1559 # Make athrow op_iter 1560 op_iter = f().athrow(ValueError, 1) 1561 1562 op_iter.close() 1563 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1564 1565 def test_send_state_closed_raises_stop_iteration_state_closed(self): 1566 async def f(): 1567 yield 1 1568 1569 # Make athrow op_iter in closed state 1570 op_iter = f().athrow(ValueError, 1) 1571 op_iter.close() 1572 1573 with self.assertRaises( 1574 RuntimeError, msg="cannot reuse already awaited aclose()/athrow()" 1575 ): 1576 op_iter.send(None) 1577 1578 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1579 1580 def test_send_state_init_arg_is_not_none_raises_runtime_error_state_init(self): 1581 async def f(): 1582 yield 1 1583 1584 # Make athrow op_iter 1585 op_iter = f().athrow(ValueError, 1) 1586 1587 with self.assertRaises(RuntimeError): 1588 op_iter.send(1) 1589 1590 self._assertOpIterState(op_iter, "_STATE_INIT") 1591 1592 def test_send_state_init_arg_is_none_generator_raises_stop_async_iteration_propagates_state_closed( # noqa: B950 1593 self, 1594 ): 1595 async def f(): 1596 try: 1597 yield 1 1598 except ValueError: 1599 # Returning causes StopAsyncIteration to be raised 1600 return 1601 1602 # Make an async_generator for f 1603 async_gen = f() 1604 1605 # Advance generator into try-except block, pausing after 'yield 1' 1606 try: 1607 async_gen.asend(None).send(None) 1608 except StopIteration: 1609 pass 1610 1611 # Make athrow op_iter which is primted to run inside try-except block 1612 op_iter = async_gen.athrow(ValueError, 2) 1613 1614 with self.assertRaises(StopAsyncIteration): 1615 op_iter.send(None) 1616 1617 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1618 1619 def test_send_state_init_arg_is_none_generator_propagates_generator_exit( 1620 self, 1621 ): 1622 async def f(): 1623 yield 1 1624 1625 # Make athrow op_iter 1626 op_iter = f().athrow(GeneratorExit) 1627 1628 with self.assertRaises(GeneratorExit): 1629 op_iter.send(None) 1630 1631 def test_send_state_init_arg_is_none_generator_yields_raises_stop_iteration_with_value_state_iter( # noqa: B950 1632 self, 1633 ): 1634 async def f(): 1635 try: 1636 yield 1 1637 except ValueError: 1638 yield 2 1639 1640 # Make an async_generator for f 1641 async_gen = f() 1642 1643 # Advance generator into try-except block, pausing after 'yield 1' 1644 try: 1645 async_gen.asend(None).send(None) 1646 except StopIteration: 1647 pass 1648 1649 # Make athrow op_iter which is primted to run inside try-except block 1650 op_iter = async_gen.athrow(ValueError) 1651 1652 with self.assertRaises(StopIteration) as exc: 1653 op_iter.send(None) 1654 self.assertEqual(exc.exception.value, 2) 1655 1656 self._assertOpIterState(op_iter, "_STATE_ITER") 1657 1658 def test_send_state_init_arg_is_none_generator_awaits_returns_awaitable_yielded_value_state_iter( # noqa: B950 1659 self, 1660 ): 1661 async def f(): 1662 class Awaitable: 1663 def __await__(self): 1664 yield 1 1665 1666 try: 1667 yield 2 1668 except ValueError: 1669 await Awaitable() 1670 1671 # Make an async_generator for f 1672 async_gen = f() 1673 1674 # Advance generator into try-except block, pausing after 'yield 2' 1675 try: 1676 async_gen.asend(None).send(None) 1677 except StopIteration: 1678 pass 1679 1680 # Make athrow op_iter which is primted to run inside try-except block 1681 op_iter = async_gen.athrow(ValueError) 1682 1683 self.assertEqual(op_iter.send(None), 1) 1684 1685 self._assertOpIterState(op_iter, "_STATE_ITER") 1686 1687 def test_send_state_iter_arg_is_not_none_arg_sent_into_generator(self): 1688 sent_value = None 1689 1690 async def f(): 1691 class Awaitable: 1692 def __await__(self): 1693 nonlocal sent_value 1694 sent_value = yield 1 1695 1696 try: 1697 yield 2 1698 except ValueError: 1699 await Awaitable() 1700 1701 # Make an async_generator for f 1702 async_gen = f() 1703 1704 # Advance generator into try-except block, pausing after 'yield 2' 1705 try: 1706 async_gen.asend(None).send(None) 1707 except StopIteration: 1708 pass 1709 1710 # Make athrow op_iter which is primted to run inside try-except block 1711 op_iter = async_gen.athrow(ValueError, 3) 1712 1713 # Executing the athrow operation which should take us to the ITER state 1714 # as we run 'await Awaitable()' 1715 op_iter.send(None) 1716 1717 # Send the value 4 in which will appear at the yield in the awaitable 1718 # and then finish the generator with a StopAsyncIteration. 1719 try: 1720 op_iter.send(4) 1721 except StopAsyncIteration: 1722 pass 1723 self.assertEqual(sent_value, 4) 1724 1725 def test_send_state_iter_arg_is_none_generator_raise_propagates_state_iter( # noqa: B950 1726 self, 1727 ): 1728 async def f(): 1729 class Awaitable: 1730 def __await__(self): 1731 yield 1 1732 1733 try: 1734 yield 2 1735 except ValueError: 1736 await Awaitable() 1737 raise ValueError(3) 1738 1739 # Make an async_generator for f 1740 async_gen = f() 1741 1742 # Advance generator into try-except block, pausing after 'yield 2' 1743 try: 1744 async_gen.asend(None).send(None) 1745 except StopIteration: 1746 pass 1747 1748 # Make athrow op_iter which is primted to run inside try-except block 1749 op_iter = async_gen.athrow(ValueError, 4) 1750 1751 # Execute the athrow operation which should take us to the ITER state 1752 # as we run 'await Awaitable()' 1753 op_iter.send(None) 1754 1755 with self.assertRaises(ValueError) as exc: 1756 op_iter.send(None) 1757 self.assertEqual(exc.exception.args, (3,)) 1758 1759 self._assertOpIterState(op_iter, "_STATE_ITER") 1760 1761 def test_send_state_iter_arg_is_none_generator_yields_raises_stop_iteration_with_value_state_iter( # noqa: B950 1762 self, 1763 ): 1764 async def f(): 1765 class Awaitable: 1766 def __await__(self): 1767 yield 1 1768 1769 try: 1770 yield 2 1771 except ValueError: 1772 await Awaitable() 1773 yield 3 1774 1775 # Make an async_generator for f 1776 async_gen = f() 1777 1778 # Advance generator into try-except block, pausing after 'yield 2' 1779 try: 1780 async_gen.asend(None).send(None) 1781 except StopIteration: 1782 pass 1783 1784 # Make athrow op_iter which is primted to run inside try-except block 1785 op_iter = async_gen.athrow(ValueError, 4) 1786 1787 # Execute the athrow operation which should take us to the ITER state 1788 # as we run 'await Awaitable()' 1789 op_iter.send(None) 1790 1791 with self.assertRaises(StopIteration) as exc: 1792 op_iter.send(None) 1793 self.assertEqual(exc.exception.value, 3) 1794 1795 self._assertOpIterState(op_iter, "_STATE_ITER") 1796 1797 def test_send_state_iter_arg_is_none_generator_awaits_returns_awaitable_yielded_value_state_iter( # noqa: B950 1798 self, 1799 ): 1800 async def f(): 1801 class Awaitable: 1802 def __init__(self, yield_value): 1803 self._yield_value = yield_value 1804 1805 def __await__(self): 1806 yield self._yield_value 1807 1808 try: 1809 yield 1 1810 except ValueError: 1811 await Awaitable(2) 1812 await Awaitable(3) 1813 1814 # Make an async_generator for f 1815 async_gen = f() 1816 1817 # Advance generator into try-except block, pausing after 'yield 1' 1818 try: 1819 async_gen.asend(None).send(None) 1820 except StopIteration: 1821 pass 1822 1823 # Make athrow op_iter which is primted to run inside try-except block 1824 op_iter = async_gen.athrow(ValueError, 4) 1825 1826 # Execute the athrow operation which should take us to the ITER state 1827 # as we run 'await Awaitable()' 1828 op_iter.send(None) 1829 1830 self.assertEqual(op_iter.send(None), 3) 1831 1832 self._assertOpIterState(op_iter, "_STATE_ITER") 1833 1834 def test_throw_state_closed_raises_stop_iteration_state_closed(self): 1835 async def f(): 1836 yield 1 1837 1838 # Make athrow op_iter in closed state 1839 op_iter = f().athrow(ValueError, 1) 1840 op_iter.close() 1841 1842 with self.assertRaises( 1843 RuntimeError, msg="cannot reuse already awaited aclose()/athrow()" 1844 ): 1845 op_iter.throw(None, None, None) 1846 1847 self._assertOpIterState(op_iter, "_STATE_CLOSED") 1848 1849 def test_throw_state_init_with_non_exception_raises_type_error(self): 1850 async def f(): 1851 yield 1 1852 1853 # Make athrow op_iter 1854 op_iter = f().athrow(ValueError, 1) 1855 1856 with self.assertRaises(TypeError): 1857 op_iter.throw(None, None, None) 1858 1859 def test_throw_state_iter_generator_raise_propagates_state_iter(self): 1860 async def f(): 1861 class Awaitable: 1862 def __await__(self): 1863 yield 1 1864 1865 try: 1866 yield 2 1867 except ValueError: 1868 await Awaitable() 1869 1870 # Make an async_generator for f 1871 async_gen = f() 1872 1873 # Advance generator into try-except block, pausing after 'yield 2' 1874 try: 1875 async_gen.asend(None).send(None) 1876 except StopIteration: 1877 pass 1878 1879 # Make athrow op_iter which is primted to run inside try-except block 1880 op_iter = async_gen.athrow(ValueError, 3) 1881 1882 # Execute the athrow operation which should take us to the ITER state 1883 # as we run 'await Awaitable()' 1884 op_iter.send(None) 1885 1886 with self.assertRaises(ValueError) as exc: 1887 op_iter.throw(ValueError, 4, None) 1888 self.assertEqual(exc.exception.args, (4,)) 1889 1890 self._assertOpIterState(op_iter, "_STATE_ITER") 1891 1892 def test_throw_state_iter_generator_yields_raises_stop_iteration_error_with_value_state_iter( # noqa: B950 1893 self, 1894 ): 1895 async def f(): 1896 class Awaitable: 1897 def __await__(self): 1898 yield 1 1899 1900 try: 1901 yield 2 1902 except ValueError: 1903 try: 1904 await Awaitable() 1905 except ValueError: 1906 yield 3 1907 1908 # Make an async_generator for f 1909 async_gen = f() 1910 1911 # Advance generator into try-except block, pausing after 'yield 2' 1912 try: 1913 async_gen.asend(None).send(None) 1914 except StopIteration: 1915 pass 1916 1917 # Make athrow op_iter which is primted to run inside try-except block 1918 op_iter = async_gen.athrow(ValueError, 4) 1919 1920 # Execute the athrow operation which should take us to the ITER state 1921 # as we run 'await Awaitable()' 1922 op_iter.send(None) 1923 1924 with self.assertRaises(StopIteration) as exc: 1925 op_iter.throw(ValueError, 5, None) 1926 self.assertEqual(exc.exception.value, 3) 1927 1928 self._assertOpIterState(op_iter, "_STATE_ITER") 1929 1930 def test_throw_state_iter_generator_awaits_returns_awaitable_yielded_value_state_iter( # noqa: B950 1931 self, 1932 ): 1933 async def f(): 1934 class Awaitable: 1935 def __init__(self, yield_value): 1936 self._yield_value = yield_value 1937 1938 def __await__(self): 1939 yield self._yield_value 1940 1941 try: 1942 yield 1 1943 except ValueError: 1944 try: 1945 await Awaitable(2) 1946 except ValueError: 1947 await Awaitable(3) 1948 1949 # Make an async_generator for f 1950 async_gen = f() 1951 1952 # Advance generator into try-except block, pausing after 'yield 2' 1953 try: 1954 async_gen.asend(None).send(None) 1955 except StopIteration: 1956 pass 1957 1958 # Make athrow op_iter which is primted to run inside try-except block 1959 op_iter = async_gen.athrow(ValueError, 4) 1960 1961 # Execute the athrow operation which should take us to the ITER state 1962 # as we run 'await Awaitable()' 1963 op_iter.send(None) 1964 1965 self.assertEqual(op_iter.throw(ValueError, 5, None), 3) 1966 1967 self._assertOpIterState(op_iter, "_STATE_ITER") 1968 1969 1970class AwaitablesTest(unittest.TestCase): 1971 def test_await_on_awaitable_raising_an_exception_propagates(self): 1972 class Awaitable: 1973 def __await__(self): 1974 raise ValueError 1975 1976 async def f(): 1977 return await Awaitable() 1978 1979 with self.assertRaises(ValueError): 1980 f().send(None) 1981 1982 def test_await_on_awaitable_returning_non_iterator_is_type_error(self): 1983 class Awaitable: 1984 def __await__(self): 1985 return 1 1986 1987 async def f(): 1988 return await Awaitable() 1989 1990 with self.assertRaisesRegex( 1991 TypeError, "__await__.* returned non-iterator of type 'int'" 1992 ): 1993 f().send(None) 1994 1995 def test_await_on_awaitable_returning_coroutine_raises_type_error(self): 1996 async def f(): 1997 pass 1998 1999 with contextlib.closing(f()) as coro: 2000 2001 class Awaitable: 2002 def __await__(self): 2003 return coro 2004 2005 async def g(): 2006 return await Awaitable() 2007 2008 with self.assertRaisesRegex(TypeError, "__await__.* returned a coroutine"): 2009 g().send(None) 2010 2011 def test_await_on_awaitable_returning_iterable_coroutine_raises_type_error(self): 2012 class Awaitable: 2013 def __await__(self): 2014 @types.coroutine 2015 def f(): 2016 yield 2017 2018 return f() 2019 2020 async def g(): 2021 return await Awaitable() 2022 2023 with self.assertRaisesRegex(TypeError, "__await__.* returned a coroutine"): 2024 g().send(None) 2025 2026 def test_async_for_over_awaitable_raising_on_await_raises_type_error_with_cause_and_context( 2027 self, 2028 ): 2029 class AsyncIterator: 2030 def __aiter__(self): 2031 return self 2032 2033 def __anext__(self): 2034 return self 2035 2036 def __await__(self): 2037 raise ValueError 2038 2039 async def f(): 2040 async for _ in AsyncIterator(): 2041 pass 2042 2043 with self.assertRaisesRegex( 2044 TypeError, "an invalid object from __anext__" 2045 ) as exc: 2046 f().send(None) 2047 2048 self.assertIsInstance(exc.exception.__cause__, ValueError) 2049 self.assertIsInstance(exc.exception.__context__, ValueError) 2050 2051 def test_async_for_over_awaitable_raising_exact_exception_on_await_raises_type_error_with_ause_and_context( 2052 self, 2053 ): 2054 class AsyncIterator: 2055 value_error = ValueError() 2056 2057 def __aiter__(self): 2058 return self 2059 2060 def __anext__(self): 2061 return self 2062 2063 def __await__(self): 2064 raise AsyncIterator.value_error 2065 2066 async def f(): 2067 async for _ in AsyncIterator(): 2068 pass 2069 2070 with self.assertRaisesRegex( 2071 TypeError, "an invalid object from __anext__" 2072 ) as exc: 2073 f().send(None) 2074 2075 self.assertIs(exc.exception.__cause__, AsyncIterator.value_error) 2076 self.assertIs(exc.exception.__context__, AsyncIterator.value_error) 2077 2078 2079class BinTests(unittest.TestCase): 2080 def test_returns_string(self): 2081 self.assertEqual(bin(0), "0b0") 2082 self.assertEqual(bin(-1), "-0b1") 2083 self.assertEqual(bin(1), "0b1") 2084 self.assertEqual(bin(54321), "0b1101010000110001") 2085 self.assertEqual(bin(494991), "0b1111000110110001111") 2086 2087 def test_with_large_int_returns_string(self): 2088 self.assertEqual( 2089 bin(1 << 63), 2090 "0b1000000000000000000000000000000000000000000000000000000000000000", 2091 ) 2092 self.assertEqual( 2093 bin(1 << 64), 2094 "0b10000000000000000000000000000000000000000000000000000000000000000", 2095 ) 2096 self.assertEqual( 2097 bin(0xDEE182DE2EC55F61B22A509ED1DC3EB), 2098 "0b1101111011100001100000101101111000101110110001010101111101" 2099 "1000011011001000101010010100001001111011010001110111000011111" 2100 "01011", 2101 ) 2102 self.assertEqual( 2103 bin(-0x53ADC651E593B1323158BFA776E8173F60C76519277B2BD6), 2104 "-0b1010011101011011100011001010001111001011001001110110001001" 2105 "1001000110001010110001011111110100111011101101110100000010111" 2106 "0011111101100000110001110110010100011001001001110111101100101" 2107 "01111010110", 2108 ) 2109 2110 def test_calls_dunder_index(self): 2111 class C: 2112 def __int__(self): 2113 return 42 2114 2115 def __index__(self): 2116 return -9 2117 2118 self.assertEqual(bin(C()), "-0b1001") 2119 2120 def test_with_int_subclass(self): 2121 class C(int): 2122 pass 2123 2124 self.assertEqual(bin(C(51)), "0b110011") 2125 2126 def test_with_non_int_raises_type_error(self): 2127 with self.assertRaises(TypeError) as context: 2128 bin("not an int") 2129 self.assertEqual( 2130 str(context.exception), "'str' object cannot be interpreted as an integer" 2131 ) 2132 2133 2134class BoolTests(unittest.TestCase): 2135 def test_dunder_hash(self): 2136 self.assertEqual(bool.__hash__(False), 0) 2137 self.assertEqual(bool.__hash__(True), 1) 2138 2139 def test_dunder_hash_matches_int_dunder_hash(self): 2140 self.assertEqual(bool.__hash__(False), int.__hash__(0)) 2141 self.assertEqual(bool.__hash__(True), int.__hash__(1)) 2142 2143 def test_dunder_and_success(self): 2144 self.assertEqual(bool.__and__(True, True), True) 2145 self.assertEqual(bool.__and__(True, False), False) 2146 self.assertEqual(bool.__and__(True, 1024 - 1), 1) 2147 self.assertEqual(bool.__and__(True, 1024), 0) 2148 self.assertEqual(bool.__and__(False, True), False) 2149 self.assertEqual(bool.__and__(False, False), False) 2150 self.assertEqual(bool.__and__(False, 1), 0) 2151 self.assertEqual(bool.__and__(False, 0), 0) 2152 2153 def test_dunder_and_not_implemented(self): 2154 self.assertIs(bool.__and__(True, "string"), NotImplemented) 2155 self.assertIs(bool.__and__(True, 1.8), NotImplemented) 2156 2157 def test_dunder_rand_success(self): 2158 self.assertEqual(bool.__rand__(True, True), True) 2159 self.assertEqual(bool.__rand__(False, True), False) 2160 self.assertEqual(bool.__rand__(True, 1024 - 1), 1) 2161 self.assertEqual(bool.__rand__(True, 1024), 0) 2162 self.assertEqual(bool.__rand__(True, False), False) 2163 self.assertEqual(bool.__rand__(False, False), False) 2164 self.assertEqual(bool.__rand__(False, 1), 0) 2165 self.assertEqual(bool.__rand__(False, 0), 0) 2166 2167 def test_dunder_rand_not_implemented(self): 2168 self.assertIs(bool.__rand__(True, "string"), NotImplemented) 2169 self.assertIs(bool.__rand__(True, 1.8), NotImplemented) 2170 2171 def test_dunder_or_with_non_bool_raises_type_error(self): 2172 self.assertRaisesRegex( 2173 TypeError, 2174 "'__or__' .* 'bool' object.* a 'int'", 2175 bool.__or__, 2176 1, 2177 1, 2178 ) 2179 2180 def test_dunder_or_success(self): 2181 self.assertEqual(bool.__or__(True, True), True) 2182 self.assertEqual(bool.__or__(True, False), True) 2183 self.assertEqual(bool.__or__(True, 1024 - 1), 1023) 2184 self.assertEqual(bool.__or__(True, 1024), 1025) 2185 self.assertEqual(bool.__or__(False, True), True) 2186 self.assertEqual(bool.__or__(False, False), False) 2187 self.assertEqual(bool.__or__(False, 1), 1) 2188 self.assertEqual(bool.__or__(False, 0), 0) 2189 2190 def test_dunder_or_not_implemented(self): 2191 self.assertIs(bool.__or__(True, "string"), NotImplemented) 2192 self.assertIs(bool.__or__(True, 1.8), NotImplemented) 2193 2194 def test_dunder_ror_with_non_bool_raises_type_error(self): 2195 self.assertRaisesRegex( 2196 TypeError, 2197 "'__ror__' .* 'bool' object.* a 'int'", 2198 bool.__ror__, 2199 1, 2200 1, 2201 ) 2202 2203 def test_dunder_ror_success(self): 2204 self.assertEqual(bool.__ror__(True, True), True) 2205 self.assertEqual(bool.__ror__(False, True), True) 2206 self.assertEqual(bool.__ror__(True, 1024 - 1), 1023) 2207 self.assertEqual(bool.__ror__(True, 1024), 1025) 2208 self.assertEqual(bool.__ror__(True, False), True) 2209 self.assertEqual(bool.__ror__(False, False), False) 2210 self.assertEqual(bool.__ror__(False, 1), 1) 2211 self.assertEqual(bool.__ror__(False, 0), 0) 2212 2213 def test_dunder_ror_not_implemented(self): 2214 self.assertIs(bool.__ror__(True, "string"), NotImplemented) 2215 self.assertIs(bool.__ror__(True, 1.8), NotImplemented) 2216 2217 def test_dunder_xor_with_non_bool_raises_type_error(self): 2218 with self.assertRaises(TypeError) as ctx: 2219 bool.__xor__(1, 1) 2220 self.assertIn( 2221 "'__xor__' .* 'bool' object.* a 'int'", 2222 str(ctx.exception), 2223 ) 2224 2225 def test_dunder_xor_success(self): 2226 self.assertEqual(bool.__xor__(True, True), False) 2227 self.assertEqual(bool.__xor__(True, False), True) 2228 self.assertEqual(bool.__xor__(True, 1024 - 1), 1022) 2229 self.assertEqual(bool.__xor__(True, 1024), 1025) 2230 self.assertEqual(bool.__xor__(False, True), True) 2231 self.assertEqual(bool.__xor__(False, False), False) 2232 self.assertEqual(bool.__xor__(False, 1), 1) 2233 self.assertEqual(bool.__xor__(False, 0), 0) 2234 2235 def test_dunder_xor_with_non_int_returns_notimplemented(self): 2236 self.assertIs(bool.__xor__(True, "string"), NotImplemented) 2237 self.assertIs(bool.__xor__(True, 1.8), NotImplemented) 2238 2239 def test_dunder_xor_with_non_bool_raises_type_error(self): 2240 self.assertRaisesRegex( 2241 TypeError, 2242 "'__rxor__' .* 'bool' object.* a 'int'", 2243 bool.__rxor__, 2244 1, 2245 1, 2246 ) 2247 2248 def test_dunder_rxor_success(self): 2249 self.assertEqual(bool.__rxor__(True, True), False) 2250 self.assertEqual(bool.__rxor__(False, True), True) 2251 self.assertEqual(bool.__rxor__(True, 1024 - 1), 1022) 2252 self.assertEqual(bool.__rxor__(True, 1024), 1025) 2253 self.assertEqual(bool.__rxor__(True, False), True) 2254 self.assertEqual(bool.__rxor__(False, False), False) 2255 self.assertEqual(bool.__rxor__(False, 1), 1) 2256 self.assertEqual(bool.__rxor__(False, 0), 0) 2257 2258 def test_dunder_rxor_with_non_int_returns_notimplemented(self): 2259 self.assertIs(bool.__rxor__(True, "string"), NotImplemented) 2260 self.assertIs(bool.__rxor__(True, 1.8), NotImplemented) 2261 2262 2263class BoundMethodTests(unittest.TestCase): 2264 def test_dunder_func_returns_function(self): 2265 class Foo: 2266 def foo(self): 2267 pass 2268 2269 self.assertIs(Foo.foo, Foo().foo.__func__) 2270 2271 def test_dunder_self_returns_self_member(self): 2272 class Foo: 2273 def foo(self): 2274 pass 2275 2276 f = Foo() 2277 self.assertIs(f, f.foo.__self__) 2278 2279 def test_dunder_doc_returns_function_dunder_doc(self): 2280 class Foo: 2281 def foo(self): 2282 "This is the docstring of foo" 2283 pass 2284 2285 self.assertEqual(Foo().foo.__doc__, "This is the docstring of foo") 2286 self.assertIs(Foo.foo.__doc__, Foo().foo.__doc__) 2287 2288 def test_write_readonly_attributes_raises_attribute_error(self): 2289 class Foo: 2290 def foo(self): 2291 "This is the docstring of foo" 2292 pass 2293 2294 f = Foo().foo 2295 with self.assertRaises(AttributeError): 2296 f.__func__ = abs 2297 2298 with self.assertRaises(AttributeError): 2299 f.__self__ = int 2300 2301 with self.assertRaises(AttributeError): 2302 f.__doc__ = "hey!" 2303 2304 def test_getattribute_returns_function_attribute(self): 2305 class C: 2306 def meth(self): 2307 pass 2308 2309 meth.attr = 42 2310 2311 c = C() 2312 bound = c.meth 2313 self.assertEqual(bound.attr, 42) 2314 2315 def test_dunder_eq_with_invalid_self_raises_type_error(self): 2316 class C: 2317 def meth(self): 2318 pass 2319 2320 with self.assertRaises(TypeError): 2321 type(C().meth).__eq__(None, None) 2322 2323 def test_is_not_same_with_same_method_on_same_instance(self): 2324 class C: 2325 def meth(self): 2326 pass 2327 2328 c = C() 2329 bound_meth1 = c.meth 2330 bound_meth2 = c.meth 2331 self.assertFalse(bound_meth1 is bound_meth2) 2332 2333 def test_equal_with_same_method_on_same_instance(self): 2334 class C: 2335 def meth(self): 2336 pass 2337 2338 c = C() 2339 bound_meth1 = c.meth 2340 bound_meth2 = c.meth 2341 self.assertTrue(bound_meth1.__eq__(bound_meth2)) 2342 2343 def test_not_equal_with_same_method_on_different_instances(self): 2344 class C: 2345 def meth(self): 2346 pass 2347 2348 bound_meth1 = C().meth 2349 bound_meth2 = C().meth 2350 self.assertFalse(bound_meth1.__eq__(bound_meth2)) 2351 2352 def test_not_equal_with_different_method_on_same_instances(self): 2353 class C: 2354 def meth1(self): 2355 pass 2356 2357 def meth2(self): 2358 pass 2359 2360 c = C() 2361 bound_meth1 = c.meth1 2362 bound_meth2 = c.meth2 2363 self.assertFalse(bound_meth1.__eq__(bound_meth2)) 2364 2365 def test_compared_to_non_bound_method_returns_not_implemented(self): 2366 class C: 2367 def meth(self): 2368 pass 2369 2370 self.assertEqual(C().meth.__eq__(None), NotImplemented) 2371 2372 def test_dunder_eq_ignores_overriden_self_equality(self): 2373 class C: 2374 def meth(self): 2375 pass 2376 2377 def __eq__(self, other): 2378 return True 2379 2380 m0 = C().meth 2381 m1 = C().meth 2382 self.assertFalse(m0.__eq__(m1)) 2383 2384 def test_dunder_hash_calls_function_hash_but_not_self_hash(self): 2385 class C: 2386 __hash__ = Mock(name="__hash__", return_value=42) 2387 2388 class D: 2389 def __call__(self): 2390 pass 2391 2392 __hash__ = Mock(name="__hash__", return_value=1) 2393 2394 from types import MethodType 2395 2396 self_obj = C() 2397 callable = D() 2398 m = MethodType(callable, self_obj) 2399 self.assertIs(type(hash(m)), int) 2400 C.__hash__.assert_not_called() 2401 D.__hash__.assert_called_once() 2402 2403 def test_dunder_hash_with_equal_objects_returns_equal_values(self): 2404 class C: 2405 def meth(self): 2406 pass 2407 2408 from types import MethodType 2409 2410 self_obj = C() 2411 m0 = MethodType(C.meth, self_obj) 2412 m1 = MethodType(C.meth, self_obj) 2413 m2 = self_obj.meth 2414 self.assertEqual(hash(m0), hash(m0)) 2415 self.assertIsNot(m0, m1) 2416 self.assertEqual(hash(m0), hash(m1)) 2417 self.assertIsNot(m0, m2) 2418 self.assertEqual(hash(m0), hash(m2)) 2419 2420 2421class CallableIteratorTest(unittest.TestCase): 2422 def test_callable_iterator_iterates_till_sentinel(self): 2423 class C: 2424 def __init__(self): 2425 self.x = 0 2426 2427 def __call__(self): 2428 self.x += 1 2429 return self.x 2430 2431 i = C() 2432 it = iter(i, 5) 2433 self.assertFalse(hasattr(it, "__len__")) 2434 self.assertEqual(list(it), [1, 2, 3, 4]) 2435 2436 @pyro_only 2437 def test_callable_iterator_dunder_init_initializes(self): 2438 class C: 2439 def __init__(self): 2440 self.x = -5 2441 2442 def __call__(self): 2443 self.x += 3 2444 return self.x 2445 2446 i = C() 2447 it = builtins.callable_iterator(i, 7) 2448 self.assertEqual(list(it), [-2, 1, 4]) 2449 2450 2451class ChrTests(unittest.TestCase): 2452 def test_returns_string(self): 2453 self.assertEqual(chr(101), "e") 2454 self.assertEqual(chr(42), "*") 2455 self.assertEqual(chr(0x1F40D), "\U0001f40d") 2456 2457 def test_with_int_subclass_returns_string(self): 2458 class C(int): 2459 pass 2460 2461 self.assertEqual(chr(C(122)), "z") 2462 2463 def test_with_unicode_max_returns_string(self): 2464 import sys 2465 2466 self.assertEqual(ord(chr(sys.maxunicode)), sys.maxunicode) 2467 2468 def test_with_unicode_max_plus_one_raises_value_error(self): 2469 import sys 2470 2471 with self.assertRaises(ValueError) as context: 2472 chr(sys.maxunicode + 1) 2473 self.assertIn("chr() arg not in range", str(context.exception)) 2474 2475 def test_with_negative_raises_value_error(self): 2476 with self.assertRaises(ValueError) as context: 2477 chr(-1) 2478 self.assertIn("chr() arg not in range", str(context.exception)) 2479 2480 def test_non_int_raises_type_error(self): 2481 with self.assertRaises(TypeError) as context: 2482 chr(None) 2483 self.assertEqual( 2484 str(context.exception), "an integer is required (got type NoneType)" 2485 ) 2486 2487 def test_with_large_int_raises_overflow_error(self): 2488 with self.assertRaisesRegex( 2489 OverflowError, r"Python int too large to convert to C \w*" 2490 ): 2491 chr(123456789012345678901234567890) 2492 2493 2494class ClassMethodTests(unittest.TestCase): 2495 def test_dunder_abstractmethod_with_missing_attr_returns_false(self): 2496 def foo(): 2497 pass 2498 2499 method = classmethod(foo) 2500 self.assertIs(method.__isabstractmethod__, False) 2501 2502 def test_dunder_abstractmethod_with_false_attr_returns_false(self): 2503 def foo(): 2504 pass 2505 2506 foo.__isabstractmethod__ = False 2507 with self.assertRaises(AttributeError): 2508 type(foo).__isabstractmethod__ 2509 prop = property(foo) 2510 self.assertIs(prop.__isabstractmethod__, False) 2511 2512 def test_dunder_abstractmethod_with_abstract_returns_true(self): 2513 def foo(): 2514 pass 2515 2516 foo.__isabstractmethod__ = ["random", "values"] 2517 with self.assertRaises(AttributeError): 2518 type(foo).__isabstractmethod__ 2519 method = classmethod(foo) 2520 self.assertIs(method.__isabstractmethod__, True) 2521 2522 def test_dunder_abstractmethod_with_non_classmethod_raises_type_error(self): 2523 with self.assertRaises(TypeError): 2524 classmethod.__dict__["__isabstractmethod__"].__get__(42) 2525 2526 def test_dunder_class_setter_with_non_type_raises_type_error(self): 2527 class C: 2528 pass 2529 2530 class D: 2531 pass 2532 2533 obj = C() 2534 with self.assertRaisesRegex(TypeError, "__class__ must be"): 2535 obj.__class__ = 123 2536 2537 def test_dunder_class_setter_on_builtin_types_raises_type_error(self): 2538 class C: 2539 pass 2540 2541 class D: 2542 pass 2543 2544 obj = "foo" 2545 with self.assertRaisesRegex(TypeError, "only supported for"): 2546 obj.__class__ = C 2547 with self.assertRaisesRegex(TypeError, "only supported for"): 2548 C.__class__ = D 2549 2550 def test_dunder_class_setter_on_different_layout_raises_type_error(self): 2551 class C(float): 2552 pass 2553 2554 class D(list): 2555 pass 2556 2557 obj = C(12.3) 2558 with self.assertRaisesRegex(TypeError, "layout differs"): 2559 obj.__class__ = D 2560 2561 def test_dunder_class_setter_changes_instance_type(self): 2562 class C: 2563 def foo(self): 2564 return 123 2565 2566 class D: 2567 def foo(self): 2568 return 321 2569 2570 obj = C() 2571 obj.__class__ = D 2572 self.assertIsInstance(obj, D) 2573 self.assertEqual(obj.foo(), 321) 2574 2575 def test_dunder_class_setter_retains_original_attributes(self): 2576 class C: 2577 def __init__(self): 2578 self.a = 123 2579 self.b = 321 2580 2581 pass 2582 2583 class D: 2584 def __init__(self): 2585 self.a = 789 2586 self.b = 987 2587 2588 obj = C() 2589 obj.__class__ = D 2590 self.assertIsInstance(obj, D) 2591 self.assertEqual(obj.a, 123) 2592 self.assertEqual(obj.b, 321) 2593 2594 def test_dunder_func_returns_wrapped_function(self): 2595 class C: 2596 def foo(self): 2597 return 1 2598 2599 bar = classmethod(foo) 2600 2601 self.assertIs(C.bar.__func__, C.foo) 2602 2603 def test_dunder_func_assignment_raises_attribute_error(self): 2604 class C: 2605 def foo(self): 2606 return 1 2607 2608 bar = classmethod(foo) 2609 2610 with self.assertRaises(AttributeError): 2611 C.bar.__func__ = C.foo 2612 2613 def test_has_dunder_call(self): 2614 class C: 2615 @classmethod 2616 def bar(cls): 2617 pass 2618 2619 C.bar.__getattribute__("__call__") 2620 2621 def test_dunder_get_returns_value(self): 2622 class C: 2623 @classmethod 2624 def bar(cls): 2625 return 5 2626 2627 self.assertEqual(C.bar(), 5) 2628 2629 def test_dunder_get_with_subclassed_classmethod_returns_value(self): 2630 class foo(classmethod): 2631 pass 2632 2633 class C: 2634 @foo 2635 def bar(self): 2636 return 5 2637 2638 self.assertEqual(C.bar(), 5) 2639 2640 def test_dunder_get_called_with_non_classmethod_raises_type_error(self): 2641 self.assertRaisesRegex( 2642 TypeError, 2643 "'__get__' .* 'classmethod' object.* a 'float'", 2644 classmethod.__get__, 2645 42.3, 2646 None, 2647 None, 2648 ) 2649 2650 def test_dunder_new_called_with_non_type_object_raises_type_error(self): 2651 with self.assertRaises(TypeError) as context: 2652 2653 def bar(): 2654 pass 2655 2656 classmethod.__new__(42.3, bar) 2657 self.assertIn("not a type object", str(context.exception)) 2658 2659 def test_dunder_new_called_with_non_subtype_raises_type_error(self): 2660 with self.assertRaises(TypeError) as context: 2661 2662 def bar(): 2663 pass 2664 2665 classmethod.__new__(float, bar) 2666 self.assertIn("not a subtype of classmethod", str(context.exception)) 2667 2668 def test_dunder_new_with_subclassed_classmethod_returns_instance_of_superclass( 2669 self, 2670 ): 2671 class foo(classmethod): 2672 pass 2673 2674 def bar(): 2675 pass 2676 2677 self.assertIsInstance(classmethod.__new__(foo, bar), foo) 2678 2679 2680class CodeTests(unittest.TestCase): 2681 def foo(self): 2682 pass 2683 2684 CodeType = type(foo.__code__) 2685 2686 if sys.implementation.name == "skybison" or sys.version_info >= (3, 8): 2687 SAMPLE = CodeType( 2688 1, 2689 1, 2690 1, 2691 4, 2692 1, 2693 1, 2694 b"", 2695 (), 2696 (), 2697 ("a", "b", "c"), 2698 "filename", 2699 "name", 2700 1, 2701 b"", 2702 (), 2703 (), 2704 ) 2705 2706 def test_dunder_hash_with_non_code_object_raises_type_error(self): 2707 self.assertRaisesRegex( 2708 TypeError, 2709 "'__hash__' .* 'code' object.* a 'NoneType'", 2710 self.CodeType.__hash__, 2711 None, 2712 ) 2713 2714 def test_dunder_hash_returns_stable_value_on_different_code_objects(self): 2715 def foo(): 2716 return 4 2717 2718 first_foo_code = foo.__code__ 2719 2720 def foo(): 2721 return 4 2722 2723 second_foo_code = foo.__code__ 2724 2725 self.assertIsNot(first_foo_code, second_foo_code) 2726 self.assertEqual(hash(first_foo_code), hash(second_foo_code)) 2727 2728 def test_dunder_new_with_non_int_argcount_raises_type_error(self): 2729 with self.assertRaises(TypeError) as context: 2730 self.CodeType( 2731 "non_int", 2732 1, 2733 1, 2734 4, 2735 1, 2736 1, 2737 b"", 2738 (), 2739 (), 2740 ("a", "b"), 2741 "filename", 2742 "name", 2743 1, 2744 b"", 2745 (), 2746 (), 2747 ) 2748 self.assertIn("an integer is required (got type str)", str(context.exception)) 2749 2750 def test_dunder_new_with_negative_argcount_raises_value_error(self): 2751 with self.assertRaises(ValueError) as context: 2752 self.CodeType( 2753 -1, 2754 1, 2755 1, 2756 4, 2757 1, 2758 1, 2759 b"", 2760 (), 2761 (), 2762 ("a", "b"), 2763 "filename", 2764 "name", 2765 1, 2766 b"", 2767 (), 2768 (), 2769 ) 2770 self.assertIn("argcount must not be negative", str(context.exception)) 2771 2772 def test_dunder_new_with_non_int_posonlyargcount_raises_type_error(self): 2773 with self.assertRaises(TypeError) as context: 2774 self.CodeType( 2775 1, 2776 "non_int", 2777 1, 2778 4, 2779 1, 2780 1, 2781 b"", 2782 (), 2783 (), 2784 ("a", "b"), 2785 "filename", 2786 "name", 2787 1, 2788 b"", 2789 (), 2790 (), 2791 ) 2792 self.assertIn("an integer is required (got type str)", str(context.exception)) 2793 2794 def test_dunder_new_with_non_int_kwonlyargcount_raises_type_error(self): 2795 with self.assertRaises(TypeError) as context: 2796 self.CodeType( 2797 1, 2798 1, 2799 "non_int", 2800 4, 2801 1, 2802 1, 2803 b"", 2804 (), 2805 (), 2806 ("a", "b"), 2807 "filename", 2808 "name", 2809 1, 2810 b"", 2811 (), 2812 (), 2813 ) 2814 self.assertIn("an integer is required (got type str)", str(context.exception)) 2815 2816 def test_dunder_new_with_negative_kwonlyargcount_raises_value_error(self): 2817 with self.assertRaises(ValueError) as context: 2818 self.CodeType( 2819 1, 2820 0, 2821 -1, 2822 4, 2823 1, 2824 1, 2825 b"", 2826 (), 2827 (), 2828 ("a", "b"), 2829 "filename", 2830 "name", 2831 1, 2832 b"", 2833 (), 2834 (), 2835 ) 2836 self.assertIn("kwonlyargcount must not be negative", str(context.exception)) 2837 2838 def test_dunder_new_with_non_int_nlocals_raises_type_error(self): 2839 with self.assertRaises(TypeError) as context: 2840 self.CodeType( 2841 1, 2842 0, 2843 1, 2844 "non_int", 2845 1, 2846 1, 2847 b"", 2848 (), 2849 (), 2850 ("a", "b"), 2851 "filename", 2852 "name", 2853 1, 2854 b"", 2855 (), 2856 (), 2857 ) 2858 self.assertIn("an integer is required (got type str)", str(context.exception)) 2859 2860 def test_dunder_new_with_negative_nlocals_raises_value_error(self): 2861 with self.assertRaises(ValueError) as context: 2862 self.CodeType( 2863 1, 2864 0, 2865 1, 2866 -4, 2867 1, 2868 1, 2869 b"", 2870 (), 2871 (), 2872 ("a", "b"), 2873 "filename", 2874 "name", 2875 1, 2876 b"", 2877 (), 2878 (), 2879 ) 2880 self.assertIn("nlocals must not be negative", str(context.exception)) 2881 2882 def test_dunder_new_with_non_int_stacksize_raises_type_error(self): 2883 with self.assertRaises(TypeError) as context: 2884 self.CodeType( 2885 1, 2886 0, 2887 1, 2888 1, 2889 "non_int", 2890 1, 2891 b"", 2892 (), 2893 (), 2894 ("a", "b"), 2895 "filename", 2896 "name", 2897 1, 2898 b"", 2899 (), 2900 (), 2901 ) 2902 self.assertIn("an integer is required (got type str)", str(context.exception)) 2903 2904 def test_dunder_new_with_negative_stacksize_raises_system_error(self): 2905 with self.assertRaises(SystemError): 2906 self.CodeType( 2907 1, 2908 0, 2909 1, 2910 4, 2911 -1, 2912 1, 2913 b"", 2914 (), 2915 (), 2916 ("a", "b"), 2917 "filename", 2918 "name", 2919 1, 2920 b"", 2921 (), 2922 (), 2923 ) 2924 2925 def test_dunder_new_with_non_int_flags_raises_type_error(self): 2926 with self.assertRaises(TypeError) as context: 2927 self.CodeType( 2928 1, 2929 0, 2930 1, 2931 1, 2932 1, 2933 "non_int", 2934 b"", 2935 (), 2936 (), 2937 ("a", "b"), 2938 "filename", 2939 "name", 2940 1, 2941 b"", 2942 (), 2943 (), 2944 ) 2945 self.assertIn("an integer is required (got type str)", str(context.exception)) 2946 2947 def test_dunder_new_with_negative_flags_raises_system_error(self): 2948 with self.assertRaises(SystemError): 2949 self.CodeType( 2950 1, 2951 0, 2952 1, 2953 4, 2954 1, 2955 -1, 2956 b"", 2957 (), 2958 (), 2959 ("a", "b"), 2960 "filename", 2961 "name", 2962 1, 2963 b"", 2964 (), 2965 (), 2966 ) 2967 2968 def test_dunder_new_with_non_bytes_code_raises_type_error(self): 2969 with self.assertRaises(TypeError) as context: 2970 self.CodeType(1, 0, 1, 1, 1, 1, "not_bytes", 1, 1, 1, 1, 1, 1, 1) 2971 self.assertIn("bytes", str(context.exception)) 2972 self.assertIn("str", str(context.exception)) 2973 2974 def test_dunder_new_with_non_tuple_consts_raises_type_error(self): 2975 with self.assertRaises(TypeError) as context: 2976 self.CodeType(1, 0, 1, 1, 1, 1, b"", "not_tuple", 1, 1, 1, 1, 1, 1) 2977 self.assertIn("tuple", str(context.exception)) 2978 self.assertIn("str", str(context.exception)) 2979 2980 def test_dunder_new_with_non_tuple_names_raises_type_error(self): 2981 with self.assertRaises(TypeError) as context: 2982 self.CodeType(1, 0, 1, 1, 1, 1, b"", (), "not_tuple", 1, 1, 1, 1, 1) 2983 self.assertIn("tuple", str(context.exception)) 2984 self.assertIn("str", str(context.exception)) 2985 2986 def test_dunder_new_with_non_tuple_varnames_raises_type_error(self): 2987 with self.assertRaises(TypeError) as context: 2988 self.CodeType(1, 0, 1, 1, 1, 1, b"", (), (), "not_tuple", 1, 1, 1, 1) 2989 self.assertIn("tuple", str(context.exception)) 2990 self.assertIn("str", str(context.exception)) 2991 2992 def test_dunder_new_with_non_str_filename_raises_type_error(self): 2993 with self.assertRaises(TypeError) as context: 2994 self.CodeType(1, 0, 1, 1, 1, 1, b"", (), (), (), b"not_str", 1, 1, 1) 2995 self.assertIn("str", str(context.exception)) 2996 self.assertIn("bytes", str(context.exception)) 2997 2998 def test_dunder_new_with_non_str_name_raises_type_error(self): 2999 with self.assertRaises(TypeError) as context: 3000 self.CodeType( 3001 1, 0, 1, 1, 1, 1, b"", (), (), (), "filename", b"not_str", 1, 1 3002 ) 3003 self.assertIn("str", str(context.exception)) 3004 self.assertIn("bytes", str(context.exception)) 3005 3006 def test_dunder_new_with_non_int_firstlineno_raises_type_error(self): 3007 with self.assertRaises(TypeError) as context: 3008 self.CodeType( 3009 1, 3010 0, 3011 1, 3012 4, 3013 1, 3014 1, 3015 b"", 3016 (), 3017 (), 3018 ("a", "b"), 3019 "filename", 3020 "name", 3021 "non_int", 3022 b"", 3023 (), 3024 (), 3025 ) 3026 self.assertIn("an integer is required (got type str)", str(context.exception)) 3027 3028 def test_dunder_new_with_negative_firstlineno_returns_code_object(self): 3029 result = self.CodeType( 3030 1, 3031 0, 3032 1, 3033 4, 3034 1, 3035 1, 3036 b"", 3037 (), 3038 (), 3039 ("a", "b"), 3040 "filename", 3041 "name", 3042 -1, 3043 b"", 3044 (), 3045 (), 3046 ) 3047 self.assertIsInstance(result, self.CodeType) 3048 3049 def test_dunder_new_with_non_bytes_lnotab_raises_type_error(self): 3050 with self.assertRaises(TypeError) as context: 3051 self.CodeType( 3052 1, 0, 1, 1, 1, 1, b"", (), (), (), "filename", "name", 1, "not_bytes" 3053 ) 3054 self.assertIn("bytes", str(context.exception)) 3055 self.assertIn("str", str(context.exception)) 3056 3057 def test_dunder_new_with_non_tuple_freevars_raises_type_error(self): 3058 with self.assertRaises(TypeError) as context: 3059 self.CodeType( 3060 1, 3061 0, 3062 1, 3063 1, 3064 1, 3065 1, 3066 b"", 3067 (), 3068 (), 3069 (), 3070 "filename", 3071 "name", 3072 1, 3073 b"", 3074 "not_tuple", 3075 ) 3076 self.assertIn("tuple", str(context.exception)) 3077 self.assertIn("str", str(context.exception)) 3078 3079 def test_dunder_new_with_non_tuple_cellvars_raises_type_error(self): 3080 with self.assertRaises(TypeError) as context: 3081 self.CodeType( 3082 1, 3083 0, 3084 1, 3085 1, 3086 1, 3087 1, 3088 b"", 3089 (), 3090 (), 3091 (), 3092 "filename", 3093 "name", 3094 1, 3095 b"", 3096 (), 3097 "not_tuple", 3098 ) 3099 self.assertIn("tuple", str(context.exception)) 3100 self.assertIn("str", str(context.exception)) 3101 3102 def test_dunder_new_returns_code(self): 3103 result = self.CodeType( 3104 1, 3105 0, 3106 1, 3107 4, 3108 1, 3109 1, 3110 b"", 3111 (), 3112 (), 3113 ("a", "b"), 3114 "filename", 3115 "name", 3116 1, 3117 b"", 3118 (), 3119 (), 3120 ) 3121 self.assertIsInstance(result, self.CodeType) 3122 3123 def test_replace_with_non_int_argcount_raises_type_error(self): 3124 with self.assertRaises(TypeError): 3125 self.SAMPLE.replace(co_argcount="non_int") 3126 3127 def test_replace_with_negative_argcount_raises_value_error(self): 3128 with self.assertRaises(ValueError): 3129 self.SAMPLE.replace(co_argcount=-7) 3130 3131 def test_replace_with_argcount_replaces_argcount(self): 3132 self.assertNotEqual(self.SAMPLE.co_argcount, 2) 3133 self.assertLessEqual(self.SAMPLE.co_posonlyargcount, 2) 3134 result = self.SAMPLE.replace(co_argcount=2) 3135 self.assertEqual(result.co_argcount, 2) 3136 3137 def test_replace_with_argcount_less_than_posonlyargcount_raises_system_error(self): 3138 self.assertGreater(self.SAMPLE.co_posonlyargcount, 0) 3139 with self.assertRaises(SystemError): 3140 self.SAMPLE.replace(co_argcount=0) 3141 3142 def test_replace_with_non_int_posonlyargcount_raises_type_error(self): 3143 with self.assertRaises(TypeError): 3144 self.SAMPLE.replace(co_posonlyargcount="non_int") 3145 3146 def test_replace_with_negative_posonlyargcount_raises_value_error(self): 3147 with self.assertRaises(ValueError): 3148 self.SAMPLE.replace(co_posonlyargcount=-7) 3149 3150 def test_replace_with_posonlyargcount_replaces_posonlyargcount(self): 3151 self.assertNotEqual(self.SAMPLE.co_posonlyargcount, 0) 3152 result = self.SAMPLE.replace(co_posonlyargcount=0) 3153 self.assertEqual(result.co_posonlyargcount, 0) 3154 3155 def test_replace_with_non_int_kwonlyargcount_raises_type_error(self): 3156 with self.assertRaises(TypeError): 3157 self.SAMPLE.replace(co_kwonlyargcount="non_int") 3158 3159 def test_replace_with_negative_kwonlyargcount_raises_value_error(self): 3160 with self.assertRaises(ValueError): 3161 self.SAMPLE.replace(co_kwonlyargcount=-7) 3162 3163 def test_replace_with_kwonlyargcount_replaces_kwonlyargcount(self): 3164 self.assertNotEqual(self.SAMPLE.co_kwonlyargcount, 0) 3165 result = self.SAMPLE.replace(co_kwonlyargcount=0) 3166 self.assertEqual(result.co_kwonlyargcount, 0) 3167 3168 def test_replace_with_non_int_nlocals_raises_type_error(self): 3169 with self.assertRaises(TypeError): 3170 self.SAMPLE.replace(co_nlocals="non_int") 3171 3172 def test_replace_with_negative_nlocals_raises_value_error(self): 3173 with self.assertRaises(ValueError): 3174 self.SAMPLE.replace(co_nlocals=-7) 3175 3176 def test_replace_with_nlocals_replaces_nlocals(self): 3177 self.assertNotEqual(self.SAMPLE.co_nlocals, 5) 3178 result = self.SAMPLE.replace(co_nlocals=5) 3179 self.assertEqual(result.co_nlocals, 5) 3180 3181 def test_replace_with_non_int_stacksize_raises_type_error(self): 3182 with self.assertRaises(TypeError): 3183 self.SAMPLE.replace(co_stacksize="non_int") 3184 3185 def test_replace_with_negative_stacksize_raises_value_error(self): 3186 with self.assertRaises(ValueError): 3187 self.SAMPLE.replace(co_stacksize=-7) 3188 3189 def test_replace_with_stacksize_replaces_stacksize(self): 3190 self.assertNotEqual(self.SAMPLE.co_stacksize, 0) 3191 result = self.SAMPLE.replace(co_stacksize=0) 3192 self.assertEqual(result.co_stacksize, 0) 3193 3194 def test_replace_with_non_int_flags_raises_type_error(self): 3195 with self.assertRaises(TypeError): 3196 self.SAMPLE.replace(co_flags="non_int") 3197 3198 def test_replace_with_negative_flags_raises_value_error(self): 3199 with self.assertRaises(ValueError): 3200 self.SAMPLE.replace(co_flags=-7) 3201 3202 def test_replace_with_flags_replaces_flags(self): 3203 self.assertNotEqual(self.SAMPLE.co_flags, 64) 3204 result = self.SAMPLE.replace(co_flags=64) 3205 self.assertEqual(result.co_flags, 64) 3206 3207 def test_replace_with_non_bytes_code_raises_type_error(self): 3208 with self.assertRaises(TypeError): 3209 self.SAMPLE.replace(co_code="non_bytes") 3210 3211 def test_replace_with_code_replaces_code(self): 3212 self.assertNotEqual(self.SAMPLE.co_code, b"123") 3213 result = self.SAMPLE.replace(co_code=b"123") 3214 self.assertEqual(result.co_code, b"123") 3215 3216 def test_replace_with_non_tuple_consts_raises_type_error(self): 3217 with self.assertRaises(TypeError): 3218 self.SAMPLE.replace(co_consts="non_tuple") 3219 3220 def test_replace_with_consts_replaces_consts(self): 3221 self.assertNotEqual(self.SAMPLE.co_consts, (1, 2, 3)) 3222 result = self.SAMPLE.replace(co_consts=(1, 2, 3)) 3223 self.assertEqual(result.co_consts, (1, 2, 3)) 3224 3225 def test_replace_with_non_tuple_names_raises_type_error(self): 3226 with self.assertRaises(TypeError): 3227 self.SAMPLE.replace(co_names="non_tuple") 3228 3229 def test_replace_with_names_replaces_names(self): 3230 self.assertNotEqual(self.SAMPLE.co_names, ("foo", "bar")) 3231 result = self.SAMPLE.replace(co_names=("foo", "bar")) 3232 self.assertEqual(result.co_names, ("foo", "bar")) 3233 3234 def test_replace_with_non_tuple_varnames_raises_type_error(self): 3235 with self.assertRaises(TypeError): 3236 self.SAMPLE.replace(co_varnames="non_tuple") 3237 3238 def test_replace_with_varnames_replaces_varnames(self): 3239 self.assertNotEqual(self.SAMPLE.co_varnames, ("foo", "bar")) 3240 result = self.SAMPLE.replace(co_varnames=("foo", "bar")) 3241 self.assertEqual(result.co_varnames, ("foo", "bar")) 3242 3243 def test_replace_with_non_str_filename_raises_type_error(self): 3244 with self.assertRaises(TypeError): 3245 self.SAMPLE.replace(co_filename=b"non_str") 3246 3247 def test_replace_with_filename_replaces_filename(self): 3248 self.assertNotEqual(self.SAMPLE.co_filename, "newfilename") 3249 result = self.SAMPLE.replace(co_filename="newfilename") 3250 self.assertEqual(result.co_filename, "newfilename") 3251 3252 def test_replace_with_non_str_name_raises_type_error(self): 3253 with self.assertRaises(TypeError): 3254 self.SAMPLE.replace(co_name=b"non_str") 3255 3256 def test_replace_with_name_replaces_name(self): 3257 self.assertNotEqual(self.SAMPLE.co_name, "newname") 3258 result = self.SAMPLE.replace(co_name="newname") 3259 self.assertEqual(result.co_name, "newname") 3260 3261 def test_replace_with_non_int_firstlineno_raises_type_error(self): 3262 with self.assertRaises(TypeError): 3263 self.SAMPLE.replace(co_firstlineno="non_int") 3264 3265 def test_replace_with_negative_firstlineno_raises_value_error(self): 3266 with self.assertRaises(ValueError): 3267 self.SAMPLE.replace(co_firstlineno=-7) 3268 3269 def test_dunder_new_with_existing_negative_firstlineno_raises_value_error(self): 3270 code = self.CodeType( 3271 1, 3272 0, 3273 1, 3274 4, 3275 1, 3276 1, 3277 b"", 3278 (), 3279 (), 3280 ("a", "b"), 3281 "filename", 3282 "name", 3283 -1, 3284 b"", 3285 (), 3286 (), 3287 ) 3288 self.assertLess(code.co_firstlineno, 0) 3289 with self.assertRaises(ValueError): 3290 code.replace() 3291 3292 def test_replace_with_firstlineno_replaces_firstlineno(self): 3293 self.assertNotEqual(self.SAMPLE.co_firstlineno, 0) 3294 result = self.SAMPLE.replace(co_firstlineno=0) 3295 self.assertEqual(result.co_firstlineno, 0) 3296 3297 def test_replace_with_non_bytes_lnotab_raises_type_error(self): 3298 with self.assertRaises(TypeError): 3299 self.SAMPLE.replace(co_lnotab="non_bytes") 3300 3301 def test_replace_with_lnotab_replaces_lnotab(self): 3302 self.assertNotEqual(self.SAMPLE.co_lnotab, b"123") 3303 result = self.SAMPLE.replace(co_lnotab=b"123") 3304 self.assertEqual(result.co_lnotab, b"123") 3305 3306 def test_replace_with_non_tuple_freevars_raises_type_error(self): 3307 with self.assertRaises(TypeError): 3308 self.SAMPLE.replace(co_freevars="non_tuple") 3309 3310 def test_replace_with_freevars_replaces_freevars(self): 3311 self.assertNotEqual(self.SAMPLE.co_freevars, ("foo", "bar")) 3312 result = self.SAMPLE.replace(co_freevars=("foo", "bar")) 3313 self.assertEqual(result.co_freevars, ("foo", "bar")) 3314 3315 def test_replace_with_non_tuple_cellvars_raises_type_error(self): 3316 with self.assertRaises(TypeError): 3317 self.SAMPLE.replace(co_cellvars="non_tuple") 3318 3319 def test_replace_with_cellvars_replaces_cellvars(self): 3320 self.assertNotEqual(self.SAMPLE.co_cellvars, ("foo", "bar")) 3321 result = self.SAMPLE.replace(co_cellvars=("foo", "bar")) 3322 self.assertEqual(result.co_cellvars, ("foo", "bar")) 3323 3324 3325class ContextManagerTests(unittest.TestCase): 3326 def test_dunder_exit_return(self): 3327 class Manager: 3328 def __init__(self, test_case): 3329 self._test_case = test_case 3330 3331 def __enter__(self): 3332 pass 3333 3334 def __exit__(self, ty, val, tb): 3335 self._test_case.assertIs(ty, None) 3336 self._test_case.assertIs(val, None) 3337 self._test_case.assertIs(tb, None) 3338 3339 def f(): 3340 with Manager(self): 3341 return 10 3342 3343 self.assertEqual(f(), 10) 3344 3345 3346class CompileTests(unittest.TestCase): 3347 def test_compile_with_iterable_coroutine_flag_raises_value_error(self): 3348 self.assertRaises(ValueError, compile, "result = 42", "", "exec", 0x100) 3349 3350 def test_compile_with_only_ast_flag_returns_ast(self): 3351 result = compile("result = 42", "", "exec", ast.PyCF_ONLY_AST) 3352 self.assertIsInstance(result, ast.AST) 3353 3354 def test_compile_with_dont_inherit_and_only_ast_flag_returns_ast(self): 3355 result = compile("result = 42", "", "exec", ast.PyCF_ONLY_AST, True) 3356 self.assertIsInstance(result, ast.AST) 3357 3358 def test_compile_with_negative_optimize_raises_value_error(self): 3359 with self.assertRaisesRegex(ValueError, r"compile\(\): invalid optimize value"): 3360 compile("True", "", "exec", 0, True, -2) 3361 3362 def test_compile_with_too_high_optimize_raises_value_error(self): 3363 with self.assertRaisesRegex(ValueError, r"compile\(\): invalid optimize value"): 3364 compile("True", "", "exec", 0, True, 3) 3365 3366 def test_compile_with_optimize_disables_asserts(self): 3367 code = compile("assert False", "", "exec", 0, True, 1) 3368 exec(code) # should not raise 3369 3370 def test_exec_mode_returns_code(self): 3371 from types import CodeType 3372 from types import ModuleType 3373 3374 code = compile("result = 42", "", "exec", 0, True, -1) 3375 self.assertIsInstance(code, CodeType) 3376 module = ModuleType("") 3377 exec(code, module.__dict__) 3378 self.assertEqual(module.result, 42) 3379 3380 def test_single_returns_code(self): 3381 from types import CodeType 3382 from types import ModuleType 3383 3384 code = compile("result = 8", "", "exec", 0, True, -1) 3385 self.assertIsInstance(code, CodeType) 3386 module = ModuleType("") 3387 exec(code, module.__dict__) 3388 self.assertEqual(module.result, 8) 3389 3390 def test_eval_mode_returns_code(self): 3391 from types import CodeType 3392 3393 code = compile("7 * 9", "", "eval", 0, True, -1) 3394 self.assertIsInstance(code, CodeType) 3395 self.assertEqual(eval(code), 63) # noqa: P204 3396 3397 def test_with_flags_returns_code(self): 3398 import __future__ 3399 3400 from types import CodeType 3401 3402 code = compile( 3403 "7 <> 9", "", "eval", __future__.CO_FUTURE_BARRY_AS_BDFL, True, -1 3404 ) 3405 self.assertIsInstance(code, CodeType) 3406 3407 def test_inherits_compile_flags(self): 3408 import __future__ 3409 3410 from types import CodeType 3411 3412 code = compile( 3413 "compile('7 <> 9', '', 'eval')", 3414 "", 3415 "eval", 3416 __future__.CO_FUTURE_BARRY_AS_BDFL, 3417 True, 3418 -1, 3419 ) 3420 self.assertIsInstance(code, CodeType) 3421 3422 def test_with_bytes_source_returns_code(self): 3423 from types import CodeType 3424 3425 code = compile(b"42", "", "eval") 3426 self.assertIsInstance(code, CodeType) 3427 3428 def test_with_bytearray_source_returns_code(self): 3429 from types import CodeType 3430 3431 code = compile(bytearray(b"42"), "", "eval") 3432 self.assertIsInstance(code, CodeType) 3433 3434 def test_raises_syntax_error(self): 3435 with self.assertRaises(SyntaxError) as context: 3436 compile("$*@", "bar", "exec") 3437 self.assertEqual(context.exception.filename, "bar") 3438 self.assertEqual(context.exception.lineno, 1) 3439 with self.assertRaises(SyntaxError): 3440 compile("7 <> 9", "", "eval", 0, True, -1) 3441 3442 def test_statement_with_eval_mode_raises_syntax_error(self): 3443 with self.assertRaises(SyntaxError): 3444 compile("pass", "", "eval") 3445 3446 def test_statements_with_single_mode_raises_syntax_error(self): 3447 with self.assertRaises(SyntaxError) as context: 3448 compile("pass\npass", "", "single") 3449 self.assertIn( 3450 "multiple statements found while compiling a single statement", 3451 str(context.exception), 3452 ) 3453 3454 def test_with_invalid_source_raises_type_error(self): 3455 with self.assertRaises(TypeError): 3456 compile(42, "", "eval") 3457 3458 def test_with_invalid_mode_raises_value_error(self): 3459 with self.assertRaises(ValueError): 3460 compile("", "", "not a valid mode") 3461 3462 3463class ComplexTests(unittest.TestCase): 3464 def test_dunder_abs_with_non_complex_self_raises_type_error(self): 3465 with self.assertRaises(TypeError): 3466 complex.__abs__(1) 3467 3468 def test_dunder_abs_calculates_magnitude_returns_float(self): 3469 nums = [complex(x / 3.0, y / 7.0) for x in range(-9, 9) for y in range(-9, 9)] 3470 for num in nums: 3471 self.assertAlmostEqual((num.real ** 2 + num.imag ** 2) ** 0.5, abs(num), 5) 3472 3473 def test_dunder_add_with_non_complex_self_raises_type_error(self): 3474 with self.assertRaises(TypeError): 3475 complex.__add__(1, 2) 3476 3477 def test_dunder_add_with_non_number_type_returns_not_implemented(self): 3478 self.assertIs(complex(3.2, 0).__add__("not-num"), NotImplemented) 3479 3480 def test_dunder_add_adds_numbers_together(self): 3481 self.assertEqual(complex(1.0, 1.0).__add__(0), complex(1, 1)) 3482 self.assertEqual(complex(1.0, 1.0).__add__(1.0), complex(2, 1)) 3483 self.assertEqual(complex(1.0, 1.0).__add__(complex(2, 2)), complex(3, 3)) 3484 3485 def test_dunder_add_with_int_subclass_returns_complex(self): 3486 class A(int): 3487 pass 3488 3489 self.assertEqual(complex(1.0, 1.0).__add__(A(3)), complex(4, 1)) 3490 3491 def test_dunder_bool_returns_correct_boolean(self): 3492 self.assertTrue(complex.__bool__(complex(0.0, 1.0))) 3493 self.assertTrue(complex.__bool__(complex(1.0, 0.0))) 3494 self.assertTrue(complex.__bool__(complex(-1.0, 1.0))) 3495 3496 self.assertFalse(complex.__bool__(complex(0.0, 0.0))) 3497 3498 def test_dunder_hash_with_0_image_returns_float_hash(self): 3499 self.assertEqual(complex.__hash__(complex(0.0)), float.__hash__(0.0)) 3500 self.assertEqual(complex.__hash__(complex(-0.0)), float.__hash__(-0.0)) 3501 self.assertEqual(complex.__hash__(complex(1.0)), float.__hash__(1.0)) 3502 self.assertEqual(complex.__hash__(complex(-1.0)), float.__hash__(-1.0)) 3503 self.assertEqual(complex.__hash__(complex(42.0)), float.__hash__(42.0)) 3504 self.assertEqual(complex.__hash__(complex(1e23)), float.__hash__(1e23)) 3505 inf = float("inf") 3506 self.assertEqual(complex.__hash__(complex(inf)), float.__hash__(inf)) 3507 nan = float("nan") 3508 self.assertEqual(complex.__hash__(complex(nan)), float.__hash__(nan)) 3509 3510 def test_dunder_hash_with_1_imag_returns_hash_info_imag(self): 3511 import sys 3512 3513 imag_hash = sys.hash_info.imag 3514 self.assertEqual(complex.__hash__(1j), imag_hash) 3515 self.assertEqual( 3516 complex.__hash__(1.000000001j), float.__hash__(1.000000001) * imag_hash 3517 ) 3518 self.assertEqual( 3519 complex.__hash__(complex(2.0, -3.0)), 3520 float.__hash__(2.0) + float.__hash__(-3.0) * imag_hash, 3521 ) 3522 3523 def test_dunder_eq_with_num_and_non_zero_imaginary_returns_false(self): 3524 self.assertFalse(complex(1, 1).__eq__(1)) 3525 self.assertFalse(complex(1.0, 1).__eq__(1)) 3526 3527 def test_dunder_eq_with_num_compares_real_field(self): 3528 self.assertTrue(complex(2, 0).__eq__(2)) 3529 self.assertTrue(complex(3.2, 0).__eq__(3.2)) 3530 3531 def test_dunder_eq_with_complex_compares_both_fields(self): 3532 self.assertTrue(complex(1.2, 3.4), complex(1.2, 3.4)) 3533 self.assertFalse(complex(3.2, 0).__eq__(complex(3.2, 1))) 3534 self.assertFalse(complex(1, 1).__eq__(complex(3.2, 1))) 3535 3536 def test_dunder_eq_with_non_num_or_complex_returns_false(self): 3537 self.assertIs(complex(3.2, 0).__eq__([3.2, 0]), NotImplemented) 3538 self.assertIs(complex(1, 1).__eq__("(1+1j)"), NotImplemented) 3539 3540 def test_dunder_new_with_no_args_returns_complex_zero(self): 3541 c = complex() 3542 self.assertIsInstance(c, complex) 3543 self.assertEqual(c, 0) 3544 3545 def test_dunder_new_with_int_returns_complex(self): 3546 c = complex(1) 3547 self.assertIsInstance(c, complex) 3548 self.assertEqual(c, 1) 3549 3550 def test_dunder_new_with_float_returns_complex(self): 3551 c = complex(1.0) 3552 self.assertIsInstance(c, complex) 3553 self.assertEqual(c, 1.0) 3554 3555 def test_dunder_new_with_complex_returns_same_complex(self): 3556 c1 = 1 + 2j 3557 c2 = complex(c1) 3558 self.assertIs(c1, c2) 3559 3560 def test_dunder_new_with_str_returns_complex(self): 3561 c = complex("1") 3562 self.assertIsInstance(c, complex) 3563 self.assertEqual(c, 1) 3564 3565 def test_dunder_new_with_str_subclass_returns_complex(self): 3566 class C(str): 3567 pass 3568 3569 c = complex(C("1")) 3570 self.assertIsInstance(c, complex) 3571 self.assertEqual(c, 1) 3572 3573 def test_dunder_new_with_str_subclass_does_not_call_dunder_float(self): 3574 class C(str): 3575 def __float__(self): 3576 return 2.0 3577 3578 c = complex(C("1")) 3579 self.assertIsInstance(c, complex) 3580 self.assertEqual(c, 1) 3581 3582 def test_dunder_new_with_empty_str_raises_value_error(self): 3583 with self.assertRaises(ValueError): 3584 complex("") 3585 3586 def test_dunder_new_with_str_only_whitespace_raises_value_error(self): 3587 with self.assertRaises(ValueError): 3588 complex(" ") 3589 3590 def test_dunder_new_with_str_and_leading_whitespace_returns_complex(self): 3591 c = complex(" 1") 3592 self.assertIsInstance(c, complex) 3593 self.assertEqual(c, 1) 3594 3595 def test_dunder_new_with_str_and_mismatched_parens_raises_value_error(self): 3596 with self.assertRaises(ValueError): 3597 complex("(1") 3598 3599 with self.assertRaises(ValueError): 3600 complex(")1") 3601 3602 with self.assertRaises(ValueError): 3603 complex("()1") 3604 3605 with self.assertRaises(ValueError): 3606 complex("1()") 3607 3608 with self.assertRaises(ValueError): 3609 complex("1(") 3610 3611 with self.assertRaises(ValueError): 3612 complex("1)") 3613 3614 def test_dunder_new_with_str_and_whitespace_inside_parens_returns_complex(self): 3615 c = complex("( 1)") 3616 self.assertIsInstance(c, complex) 3617 self.assertEqual(c, 1) 3618 3619 def test_dunder_new_with_str_and_parens_inside_whitespace_returns_complex(self): 3620 c = complex(" (1)") 3621 self.assertIsInstance(c, complex) 3622 self.assertEqual(c, 1) 3623 3624 def test_dunder_new_with_str_and_trailing_whitespace_returns_complex(self): 3625 c = complex("1 ") 3626 self.assertIsInstance(c, complex) 3627 self.assertEqual(c, 1) 3628 3629 def test_dunder_new_with_str_and_leading_plus_returns_complex(self): 3630 c = complex("+1") 3631 self.assertIsInstance(c, complex) 3632 self.assertEqual(c, 1) 3633 3634 def test_dunder_new_with_str_and_leading_minus_returns_complex(self): 3635 c = complex("-1") 3636 self.assertIsInstance(c, complex) 3637 self.assertEqual(c, -1) 3638 3639 def test_dunder_new_with_str_and_e_returns_complex(self): 3640 c = complex("2e3") 3641 self.assertIsInstance(c, complex) 3642 self.assertEqual(c.real, 2000) 3643 self.assertEqual(c.imag, 0) 3644 3645 c = complex("2E3") 3646 self.assertIsInstance(c, complex) 3647 self.assertEqual(c.real, 2000) 3648 self.assertEqual(c.imag, 0) 3649 3650 def test_dunder_new_with_str_and_only_j_returns_complex(self): 3651 c = complex("j") 3652 self.assertIsInstance(c, complex) 3653 self.assertEqual(c.real, 0) 3654 self.assertEqual(c.imag, 1) 3655 3656 c = complex("J") 3657 self.assertIsInstance(c, complex) 3658 self.assertEqual(c.real, 0) 3659 self.assertEqual(c.imag, 1) 3660 3661 def test_dunder_new_with_str_and_only_imag_returns_complex(self): 3662 c = complex("2j") 3663 self.assertIsInstance(c, complex) 3664 self.assertEqual(c.real, 0) 3665 self.assertEqual(c.imag, 2) 3666 3667 def test_dunder_new_with_str_and_real_and_imag_returns_complex(self): 3668 c = complex("1+2j") 3669 self.assertIsInstance(c, complex) 3670 self.assertEqual(c.real, 1) 3671 self.assertEqual(c.imag, 2) 3672 3673 c = complex("1-2j") 3674 self.assertIsInstance(c, complex) 3675 self.assertEqual(c.real, 1) 3676 self.assertEqual(c.imag, -2) 3677 3678 def test_dunder_new_with_str_and_exponent_imag_returns_complex(self): 3679 c = complex("1-2e3j") 3680 self.assertIsInstance(c, complex) 3681 self.assertEqual(c.real, 1) 3682 self.assertEqual(c.imag, -2000) 3683 3684 c = complex("1-2E3j") 3685 self.assertIsInstance(c, complex) 3686 self.assertEqual(c.real, 1) 3687 self.assertEqual(c.imag, -2000) 3688 3689 def test_dunder_new_with_str_and_fractional_real_and_imag_returns_complex(self): 3690 c = complex("1.234+5.678j") 3691 self.assertIsInstance(c, complex) 3692 self.assertEqual(c.real, 1.234) 3693 self.assertEqual(c.imag, 5.678) 3694 3695 def test_dunder_new_with_str_and_imag_first_raises_value_error(self): 3696 with self.assertRaises(ValueError): 3697 complex("j+1") 3698 3699 def test_dunder_new_with_str_and_imag_no_j_raises_value_error(self): 3700 with self.assertRaises(ValueError): 3701 complex("1-2") 3702 3703 def test_dunder_new_with_str_and_sign_but_no_imag_raises_value_error(self): 3704 with self.assertRaises(ValueError): 3705 complex("1+") 3706 3707 with self.assertRaises(ValueError): 3708 complex("1-") 3709 3710 def test_dunder_new_with_subtype_returns_instance(self): 3711 class C(complex): 3712 pass 3713 3714 c = C() 3715 self.assertIsInstance(c, complex) 3716 self.assertIs(type(c), C) 3717 3718 def test_dunder_new_with_real_numbers_returns_complex(self): 3719 c = complex(1, 2.0) 3720 self.assertIsInstance(c, complex) 3721 self.assertEqual(c, 1 + 2j) 3722 3723 def test_dunder_new_with_complex_numbers_returns_complex(self): 3724 c = complex(4 + 4j, 1 + 2j) 3725 self.assertIsInstance(c, complex) 3726 self.assertEqual(c, 2 + 5j) 3727 3728 def test_dunder_new_with_string_real_and_imag_raises_type_error(self): 3729 with self.assertRaises(TypeError) as context: 3730 complex("foo", 1) 3731 self.assertEqual( 3732 str(context.exception), 3733 "complex() can't take second arg if first is a string", 3734 ) 3735 3736 def test_dunder_new_with_string_imag_raises_type_error(self): 3737 with self.assertRaises(TypeError) as context: 3738 complex(1, "foo") 3739 self.assertEqual( 3740 str(context.exception), "complex() second arg can't be a string" 3741 ) 3742 3743 def test_dunder_new_calls_dunder_complex(self): 3744 class C(int): 3745 def __complex__(self): 3746 return 1 + 0j 3747 3748 c = complex(C()) 3749 self.assertEqual(c, 1 + 0j) 3750 3751 def test_dunder_new_with_dunder_index(self): 3752 class C: 3753 def __index__(self): 3754 return 21 3755 3756 result = complex.__new__(complex, C()) 3757 self.assertEqual(result, 21 + 0j) 3758 3759 def test_dunder_new_with_dunder_index_for_imaginary_bit(self): 3760 class C: 3761 def __index__(self): 3762 return 21 3763 3764 result = complex.__new__(complex, 1.0, C()) 3765 self.assertEqual(result, 1.0 + 21.0j) 3766 3767 def test_dunder_new_with_non_complex_dunder_complex(self): 3768 class C: 3769 def __complex__(self): 3770 return 1 3771 3772 with self.assertRaises(TypeError) as context: 3773 complex(C()) 3774 self.assertEqual( 3775 str(context.exception), "__complex__ returned non-complex (type int)" 3776 ) 3777 3778 def test_dunder_new_with_bytes_real_raises_type_error(self): 3779 with self.assertRaises(TypeError) as context: 3780 complex(b"") 3781 self.assertEqual( 3782 str(context.exception), 3783 "complex() first argument must be a string or a number, not 'bytes'", 3784 ) 3785 3786 def test_dunder_new_with_bytes_imag_raises_type_error(self): 3787 with self.assertRaises(TypeError) as context: 3788 complex(1, b"") 3789 self.assertEqual( 3790 str(context.exception), 3791 "complex() second argument must be a number, not 'bytes'", 3792 ) 3793 3794 def test_dunder_neg_with_non_complex_raises_type_error(self): 3795 with self.assertRaises(TypeError): 3796 complex.__neg__(1.0) 3797 3798 def test_dunder_neg_negates_both_fields_in_complex(self): 3799 self.assertEqual(complex(0, 0).__neg__(), complex(0, 0)) 3800 self.assertEqual(complex(1, 2.2).__neg__(), complex(-1, -2.2)) 3801 self.assertEqual(complex(-3.4, -5.6).__neg__(), complex(3.4, 5.6)) 3802 3803 def test_dunder_neg_with_complex_subclass_returns_complex(self): 3804 class A(complex): 3805 pass 3806 3807 neg_complex_subclass = A(1.2, -2.1).__neg__() 3808 self.assertEqual(type(neg_complex_subclass), complex) 3809 self.assertEqual(neg_complex_subclass, complex(-1.2, 2.1)) 3810 3811 def test_dunder_pos_with_non_complex_raises_type_error(self): 3812 with self.assertRaises(TypeError): 3813 complex.__pos__(1.0) 3814 3815 def test_dunder_pos_returns_unmodified_complex(self): 3816 self.assertEqual(complex(0, 0).__pos__(), complex(0, 0)) 3817 self.assertEqual(complex(1, 2.2).__pos__(), complex(1, 2.2)) 3818 self.assertEqual(complex(-3.4, -5.6).__pos__(), complex(-3.4, -5.6)) 3819 3820 def test_dunder_pos_with_complex_subclass_returns_complex(self): 3821 class A(complex): 3822 pass 3823 3824 pos_complex_subclass = A(1, -2).__pos__() 3825 self.assertEqual(type(pos_complex_subclass), complex) 3826 self.assertEqual(pos_complex_subclass, complex(1, -2)) 3827 3828 def test_dunder_rsub_with_non_complex_self_raises_type_error(self): 3829 with self.assertRaises(TypeError): 3830 complex.__rsub__(1, 2) 3831 3832 def test_dunder_rsub_with_non_number_type_returns_not_implemented(self): 3833 self.assertIs(complex(3.2, 0).__rsub__("not-num"), NotImplemented) 3834 3835 def test_dunder_rsub_subtracts_first_number_from_second_number(self): 3836 self.assertEqual(complex(1.0, 1.0).__rsub__(0), complex(-1, -1)) 3837 self.assertEqual(complex(1.0, 1.0).__rsub__(1.0), complex(0, -1)) 3838 self.assertEqual(complex(1.0, 1.0).__rsub__(complex(2, 2)), complex(1, 1)) 3839 3840 def test_dunder_rsub_with_int_subclass_returns_complex(self): 3841 class A(int): 3842 pass 3843 3844 self.assertEqual(complex(1.0, 1.0).__rsub__(A(3)), complex(2, -1)) 3845 3846 def test_dunder_sub_with_non_complex_self_raises_type_error(self): 3847 with self.assertRaises(TypeError): 3848 complex.__sub__(1, 2) 3849 3850 def test_dunder_sub_with_non_number_type_returns_not_implemented(self): 3851 self.assertIs(complex(3.2, 0).__sub__("not-num"), NotImplemented) 3852 3853 def test_dunder_sub_subtracts_first_number_from_second_number(self): 3854 self.assertEqual(complex(1.0, 1.0).__sub__(0), complex(1, 1)) 3855 self.assertEqual(complex(1.0, 1.0).__sub__(1.0), complex(0, 1)) 3856 self.assertEqual(complex(1.0, 1.0).__sub__(complex(2, 2)), complex(-1, -1)) 3857 3858 def test_dunder_sub_with_int_subclass_returns_complex(self): 3859 class A(int): 3860 pass 3861 3862 self.assertEqual(complex(1.0, 1.0).__sub__(A(3)), complex(-2, 1)) 3863 3864 def test_imag_with_subclass_returns_float(self): 3865 class C(complex): 3866 pass 3867 3868 c = C(1 + 2j) 3869 i = c.imag 3870 self.assertIsInstance(i, float) 3871 self.assertEqual(i, 2.0) 3872 3873 def test_real_with_subclass_returns_float(self): 3874 class C(complex): 3875 pass 3876 3877 c = C(1 + 2j) 3878 r = c.real 3879 self.assertIsInstance(r, float) 3880 self.assertEqual(r, 1.0) 3881 3882 def test_dunder_mul_complex_returns_complex(self): 3883 self.assertEqual(complex(1, 2).__mul__(complex(-2, 3)), complex(-8, -1)) 3884 self.assertEqual(complex(1, 2).__mul__(complex(2.5, -1)), complex(4.5, 4)) 3885 self.assertEqual(complex(1, 2).__mul__(complex(0, 3)), complex(-6, 3)) 3886 self.assertEqual(complex(1, 2).__mul__(complex(2, 0)), complex(2, 4)) 3887 3888 def test_dunder_mul_complex_with_nan_returns_nan_complex(self): 3889 import math 3890 3891 res = complex(1, 2).__mul__(complex(2, float("nan"))) 3892 self.assertTrue(math.isnan(res.real)) 3893 self.assertTrue(math.isnan(res.imag)) 3894 3895 def test_dunder_rmul_complex_with_nan_returns_nan_complex(self): 3896 import math 3897 3898 res = complex(1, 2).__rmul__(complex(2, float("nan"))) 3899 self.assertTrue(math.isnan(res.real)) 3900 self.assertTrue(math.isnan(res.imag)) 3901 3902 def test_dunder_rmul_complex_with_int_returns_complex(self): 3903 self.assertEqual(complex(1, 2).__rmul__(4), complex(4, 8)) 3904 3905 def test_dunder_rmul_complex_with_float_returns_complex(self): 3906 self.assertEqual(complex(1, 2).__rmul__(4.9), complex(4.9, 9.8)) 3907 3908 def test_dunder_rmul_complex_with_str_returns_notimplemented(self): 3909 self.assertIs(complex(1, 2).__rmul__("ciao"), NotImplemented) 3910 3911 def test_dunder_rmul_complex_with_list_returns_notimplemented(self): 3912 self.assertIs(complex(1, 2).__rmul__([4]), NotImplemented) 3913 3914 def test_dunder_div_complex_returns_complex(self): 3915 self.assertEqual(complex(1, 2).__truediv__(complex(1, 1)), complex(1.5, 0.5)) 3916 self.assertEqual( 3917 complex(1, 2).__truediv__(complex(-2, 2)), complex(0.25, -0.75) 3918 ) 3919 self.assertEqual(complex(2, 1).__truediv__(complex(0, 2)), complex(0.5, -1)) 3920 self.assertEqual(complex(3, 2).__truediv__(complex(-0.5, 0)), complex(-6, -4)) 3921 3922 def test_dunder_div_complex_with_nan_returns_nan_complex(self): 3923 import math 3924 3925 res = complex(1, 2).__truediv__(complex(2, float("nan"))) 3926 self.assertTrue(math.isnan(res.real)) 3927 self.assertTrue(math.isnan(res.imag)) 3928 3929 def test_dunder_div_zero_raises_error(self): 3930 with self.assertRaises(ZeroDivisionError): 3931 complex(1, 2).__truediv__(complex(0, 0)) 3932 3933 def test_dunder_repr_with_int_real_and_imag_returns_string(self): 3934 self.assertEqual(complex.__repr__(complex(1, 2)), "(1+2j)") 3935 self.assertEqual(complex.__repr__(complex(1, -2)), "(1-2j)") 3936 self.assertEqual(complex.__repr__(complex(-1, 2)), "(-1+2j)") 3937 self.assertEqual(complex.__repr__(complex(-1, -2)), "(-1-2j)") 3938 3939 def test_dunder_repr_with_float_real_and_imag_returns_string(self): 3940 self.assertEqual(complex.__repr__(complex(1.1, 2.3)), "(1.1+2.3j)") 3941 self.assertEqual(complex.__repr__(complex(1.1, -2.3)), "(1.1-2.3j)") 3942 self.assertEqual(complex.__repr__(complex(-1.1, 2.3)), "(-1.1+2.3j)") 3943 self.assertEqual(complex.__repr__(complex(-1.1, -2.3)), "(-1.1-2.3j)") 3944 3945 def test_dunder_repr_with_int_real_and_float_imag_returns_string(self): 3946 self.assertEqual(complex.__repr__(complex(1, 2.3)), "(1+2.3j)") 3947 self.assertEqual(complex.__repr__(complex(1, -2.3)), "(1-2.3j)") 3948 self.assertEqual(complex.__repr__(complex(-1, 2.3)), "(-1+2.3j)") 3949 self.assertEqual(complex.__repr__(complex(-1, -2.3)), "(-1-2.3j)") 3950 3951 def test_dunder_repr_with_float_real_and_int_imag_returns_string(self): 3952 self.assertEqual(complex.__repr__(complex(1.1, 2)), "(1.1+2j)") 3953 self.assertEqual(complex.__repr__(complex(1.1, -2)), "(1.1-2j)") 3954 self.assertEqual(complex.__repr__(complex(-1.1, 2)), "(-1.1+2j)") 3955 self.assertEqual(complex.__repr__(complex(-1.1, -2)), "(-1.1-2j)") 3956 3957 def test_dunder_repr_with_positive_zero_real_returns_string(self): 3958 self.assertEqual(complex.__repr__(complex(0, 2.3)), "2.3j") 3959 self.assertEqual(complex.__repr__(complex(0, -2.3)), "-2.3j") 3960 self.assertEqual(complex.__repr__(complex(0, 2)), "2j") 3961 self.assertEqual(complex.__repr__(complex(0, -2)), "-2j") 3962 3963 def test_dunder_repr_with_negative_zero_real_returns_string(self): 3964 self.assertEqual(complex.__repr__(complex(-0.0, 2.3)), "(-0+2.3j)") 3965 self.assertEqual(complex.__repr__(complex(-0.0, -2.3)), "(-0-2.3j)") 3966 self.assertEqual(complex.__repr__(complex(-0.0, 2)), "(-0+2j)") 3967 self.assertEqual(complex.__repr__(complex(-0.0, -2)), "(-0-2j)") 3968 3969 def test_dunder_repr_with_non_complex_self_raises_type_error(self): 3970 with self.assertRaises(TypeError): 3971 complex.__repr__(1.0) 3972 with self.assertRaises(TypeError): 3973 complex.__repr__("a") 3974 with self.assertRaises(TypeError): 3975 complex.__repr__(None) 3976 3977 def test_dunder_lt_with_complex_returns_not_implemented(self): 3978 self.assertIs(complex(1, 1).__lt__(complex(1, 1)), NotImplemented) 3979 self.assertIs(complex(1, 1).__lt__(float(1)), NotImplemented) 3980 3981 def test_dunder_le_with_complex_returns_not_implemented(self): 3982 self.assertIs(complex(1, 1).__le__(complex(1, 1)), NotImplemented) 3983 self.assertIs(complex(1, 1).__le__(float(1)), NotImplemented) 3984 3985 def test_dunder_gt_with_complex_returns_not_implemented(self): 3986 self.assertIs(complex(1, 1).__gt__(complex(1, 1)), NotImplemented) 3987 self.assertIs(complex(1, 1).__gt__(float(1)), NotImplemented) 3988 3989 def test_dunder_ge_with_complex_returns_not_implemented(self): 3990 self.assertIs(complex(1, 1).__ge__(complex(1, 1)), NotImplemented) 3991 self.assertIs(complex(1, 1).__ge__(float(1)), NotImplemented) 3992 3993 3994class CoroutineTests(unittest.TestCase): 3995 class MyError(Exception): 3996 pass 3997 3998 class Awaitable: 3999 def __init__(self, yield_value): 4000 self._yield_value = yield_value 4001 4002 def __await__(self): 4003 yield self._yield_value 4004 4005 @staticmethod 4006 async def simple_coro(): 4007 await CoroutineTests.Awaitable(1) 4008 await CoroutineTests.Awaitable(2) 4009 4010 @staticmethod 4011 async def catching_coro(): 4012 try: 4013 await CoroutineTests.Awaitable(1) 4014 except CoroutineTests.MyError: 4015 await CoroutineTests.Awaitable("caught") 4016 4017 @staticmethod 4018 async def catching_returning_coro(): 4019 try: 4020 await CoroutineTests.Awaitable(1) 4021 except CoroutineTests.MyError: 4022 return "all done!" # noqa 4023 4024 def test_calling_iter_raises_type_error(self): 4025 with contextlib.closing(self.simple_coro()) as g: 4026 with self.assertRaises(TypeError): 4027 iter(g) 4028 4029 def test_calling_next_raises_type_error(self): 4030 with contextlib.closing(self.simple_coro()) as g: 4031 with self.assertRaises(TypeError): 4032 next(g) 4033 4034 def test_dunder_await_with_invalid_self_raises_type_error(self): 4035 with contextlib.closing(self.simple_coro()) as g: 4036 with self.assertRaises(TypeError): 4037 type(g).__await__(None) 4038 4039 def test_dunder_await_returns_iterable(self): 4040 it = self.simple_coro().__await__() 4041 self.assertEqual(next(it), 1) 4042 self.assertEqual(next(it), 2) 4043 4044 def test_close_with_invalid_self_raises_type_error(self): 4045 with contextlib.closing(self.simple_coro()) as g: 4046 with self.assertRaises(TypeError): 4047 type(g).close(None) 4048 4049 def test_close_when_exhausted_returns_none(self): 4050 g = self.simple_coro() 4051 self.assertEqual(g.send(None), 1) 4052 self.assertEqual(g.send(None), 2) 4053 self.assertRaises(StopIteration, g.send, None) 4054 self.assertIsNone(g.close()) 4055 4056 def test_close_when_generator_exit_propagates_returns_none(self): 4057 saw_generator_exit = False 4058 4059 async def f(): 4060 nonlocal saw_generator_exit 4061 try: 4062 await CoroutineTests.Awaitable(1) 4063 except GeneratorExit: 4064 saw_generator_exit = True 4065 raise 4066 4067 g = f() 4068 self.assertEqual(g.send(None), 1) 4069 self.assertIsNone(g.close()) 4070 self.assertTrue(saw_generator_exit) 4071 4072 def test_close_when_generator_exit_derived_exception_raised_returns_none(self): 4073 class GeneratorExitDerived(GeneratorExit): 4074 pass 4075 4076 async def f(): 4077 try: 4078 await CoroutineTests.Awaitable(1) 4079 except GeneratorExit: 4080 raise GeneratorExitDerived 4081 4082 g = f() 4083 self.assertEqual(g.send(None), 1) 4084 self.assertIsNone(g.close()) 4085 4086 def test_close_when_stop_iteration_raised_returns_none(self): 4087 saw_generator_exit = False 4088 4089 async def f(): 4090 nonlocal saw_generator_exit 4091 try: 4092 await CoroutineTests.Awaitable(1) 4093 except GeneratorExit: 4094 saw_generator_exit = True 4095 # Implicitly raises StopIteration(2) 4096 return 2 4097 4098 g = f() 4099 self.assertEqual(g.send(None), 1) 4100 self.assertIsNone(g.close()) 4101 self.assertTrue(saw_generator_exit) 4102 4103 def test_close_generator_raises_exception_propagates(self): 4104 async def f(): 4105 try: 4106 await CoroutineTests.Awaitable(1) 4107 except GeneratorExit: 4108 raise ValueError 4109 4110 g = f() 4111 self.assertEqual(g.send(None), 1) 4112 self.assertRaises(ValueError, g.close) 4113 4114 def test_close_generator_awaits_raises_runtime_error(self): 4115 async def f(): 4116 try: 4117 await CoroutineTests.Awaitable(1) 4118 except GeneratorExit: 4119 await CoroutineTests.Awaitable(2) 4120 4121 g = f() 4122 self.assertEqual(g.send(None), 1) 4123 self.assertRaises(RuntimeError, g.close) 4124 4125 def test_throw(self): 4126 g = self.simple_coro() 4127 self.assertRaises(CoroutineTests.MyError, g.throw, CoroutineTests.MyError()) 4128 4129 def test_throw_caught(self): 4130 g = self.catching_coro() 4131 self.assertEqual(g.send(None), 1) 4132 self.assertEqual(g.throw(CoroutineTests.MyError()), "caught") 4133 4134 def test_throw_type(self): 4135 g = self.catching_coro() 4136 self.assertEqual(g.send(None), 1) 4137 self.assertEqual(g.throw(CoroutineTests.MyError), "caught") 4138 4139 def test_throw_type_and_value(self): 4140 g = self.catching_coro() 4141 self.assertEqual(g.send(None), 1) 4142 self.assertEqual( 4143 g.throw(CoroutineTests.MyError, CoroutineTests.MyError()), "caught" 4144 ) 4145 4146 def test_throw_uncaught_type(self): 4147 g = self.catching_coro() 4148 self.assertEqual(g.send(None), 1) 4149 self.assertRaises(RuntimeError, g.throw, RuntimeError) 4150 4151 def test_throw_finished(self): 4152 g = self.catching_returning_coro() 4153 self.assertEqual(g.send(None), 1) 4154 self.assertRaises(StopIteration, g.throw, CoroutineTests.MyError) 4155 4156 def test_throw_two_values(self): 4157 g = self.catching_coro() 4158 self.assertEqual(g.send(None), 1) 4159 self.assertRaises( 4160 TypeError, g.throw, CoroutineTests.MyError(), CoroutineTests.MyError() 4161 ) 4162 4163 def test_throw_bad_traceback(self): 4164 g = self.catching_coro() 4165 self.assertEqual(g.send(None), 1) 4166 self.assertRaises( 4167 TypeError, g.throw, CoroutineTests.MyError, CoroutineTests.MyError(), 5 4168 ) 4169 4170 def test_throw_bad_type(self): 4171 g = self.catching_coro() 4172 self.assertEqual(g.send(None), 1) 4173 self.assertRaises(TypeError, g.throw, 1234) 4174 4175 def test_coroutine_awaiting_on_further_coroutine_with_no_arguments(self): 4176 async def f(): 4177 pass 4178 4179 async def g(): 4180 return await f() 4181 4182 # Send in None to trigger initial execution of coroutine 4183 with self.assertRaises(StopIteration) as exc: 4184 g().send(None) 4185 4186 self.assertIs(exc.exception.value, None) 4187 4188 def test_coroutine_awaiting_on_further_coroutine_with_an_argument(self): 4189 v = "foo" 4190 4191 async def f(v): 4192 return v 4193 4194 async def g(): 4195 return await f(v) 4196 4197 # Send in None to trigger initial execution of coroutine 4198 with self.assertRaises(StopIteration) as exc: 4199 g().send(None) 4200 4201 self.assertIs(exc.exception.value, v) 4202 4203 def test_stop_iteration_raised_from_coroutine_turns_into_runtime_error(self): 4204 async def f(): 4205 raise StopIteration 4206 4207 # Send in None to trigger initial execution of coroutine 4208 with self.assertRaises(RuntimeError): 4209 f().send(None) 4210 4211 def test_stop_iteration_raised_from_coroutine_but_caught_can_return_a_value(self): 4212 async def f(): 4213 try: 4214 raise StopIteration 4215 except StopIteration: 4216 return 1 4217 4218 # Send in None to trigger initial execution of coroutine 4219 with self.assertRaises(StopIteration) as exc: 4220 f().send(None) 4221 4222 self.assertEqual(exc.exception.value, 1) 4223 4224 def test_stop_iteration_raised_from_inner_coroutine_turns_into_runtime_error(self): 4225 async def f(): 4226 raise StopIteration 4227 4228 async def g(): 4229 return await f() 4230 4231 # Send in None to trigger initial execution of coroutine 4232 with self.assertRaises(RuntimeError): 4233 g().send(None) 4234 4235 def test_sub_classed_stop_iteration_raised_from_coroutine_turns_into_runtime_error( 4236 self, 4237 ): 4238 class SubClassedStopIteration(AttributeError, StopIteration): 4239 pass 4240 4241 async def f(): 4242 raise SubClassedStopIteration 4243 4244 # Send in None to trigger initial execution of coroutine 4245 with self.assertRaises(RuntimeError): 4246 f().send(None) 4247 4248 def test_yield_from_coroutine_in_non_coroutine_iter_raises_exception(self): 4249 async def coro(): 4250 pass 4251 4252 def f(coro_inst): 4253 yield from coro_inst 4254 4255 with contextlib.closing(coro()) as coro_inst: 4256 with self.assertRaises(TypeError): 4257 f(coro_inst).send(None) 4258 4259 def test_awaiting_already_awaited_coroutine_raises_runtime_error(self): 4260 class Awaitable: 4261 def __await__(self): 4262 return self 4263 4264 def __next__(self): 4265 return None 4266 4267 async def f(): 4268 await Awaitable() 4269 4270 coro = f() 4271 4272 async def g(): 4273 nonlocal coro 4274 await coro 4275 4276 coro.send(None) 4277 4278 with self.assertRaisesRegex(RuntimeError, "coroutine is being awaited already"): 4279 g().send(None) 4280 4281 def test_send_into_finished_coro_raises_runtime_error(self): 4282 g = self.simple_coro() 4283 self.assertEqual(g.send(None), 1) 4284 self.assertEqual(g.send(None), 2) 4285 with self.assertRaises(StopIteration): 4286 g.send(None) 4287 with self.assertRaises(RuntimeError): 4288 g.send(None) 4289 4290 def test_throw_into_finshed_coro_raises_runtime_error(self): 4291 g = self.simple_coro() 4292 self.assertEqual(g.send(None), 1) 4293 self.assertEqual(g.send(None), 2) 4294 with self.assertRaises(StopIteration): 4295 g.send(None) 4296 with self.assertRaises(RuntimeError): 4297 g.throw(CoroutineTests.MyError()) 4298 4299 def test_close_finshed_coro_raises_is_no_op(self): 4300 g = self.simple_coro() 4301 self.assertEqual(g.send(None), 1) 4302 self.assertEqual(g.send(None), 2) 4303 with self.assertRaises(StopIteration): 4304 g.send(None) 4305 self.assertIsNone(g.close()) 4306 4307 def test_exception_context_captured_across_further_awaits(self): 4308 async def raises(): 4309 raise ValueError 4310 4311 async def double_raises(): 4312 try: 4313 raise RuntimeError 4314 except RuntimeError: 4315 await raises() 4316 4317 with self.assertRaises(ValueError) as exc: 4318 double_raises().send(None) 4319 4320 self.assertIsInstance(exc.exception.__context__, RuntimeError) 4321 4322 def test_coroutine_returning_explicit_stop_iteration_value_passes_through_unchanged( 4323 self, 4324 ): 4325 v = StopIteration(10) 4326 4327 async def f(): 4328 return v 4329 4330 # Send in None to trigger initial execution of coroutine 4331 with self.assertRaises(StopIteration) as exc: 4332 f().send(None) 4333 4334 self.assertIs(exc.exception.value, v) 4335 self.assertEqual(exc.exception.args, (v,)) 4336 4337 def test_coroutine_returning_stop_iteration_sub_class_passes_through_unchanged( 4338 self, 4339 ): 4340 class SubClassedStopIteration(StopIteration): 4341 pass 4342 4343 v = SubClassedStopIteration(1) 4344 4345 async def f(): 4346 return v 4347 4348 # Send in None to trigger initial execution of coroutine 4349 with self.assertRaises(StopIteration) as exc: 4350 f().send(None) 4351 4352 self.assertIs(exc.exception.value, v) 4353 self.assertEqual(exc.exception.args, (v,)) 4354 4355 def test_coroutine_returning_tuple_passes_through_as_tuple(self): 4356 v = (1,) 4357 4358 async def f(): 4359 return v 4360 4361 # Send in None to trigger initial execution of coroutine 4362 with self.assertRaises(StopIteration) as exc: 4363 f().send(None) 4364 4365 self.assertIs(exc.exception.value, v) 4366 self.assertEqual(exc.exception.args, (v,)) 4367 4368 def test_coroutine_returning_tuple_sub_class_passes_through_unchanged(self): 4369 class NewTuple(tuple): 4370 pass 4371 4372 v = NewTuple() 4373 4374 async def f(): 4375 return v 4376 4377 # Send in None to trigger initial execution of coroutine 4378 with self.assertRaises(StopIteration) as exc: 4379 f().send(None) 4380 4381 self.assertIs(exc.exception.value, v) 4382 self.assertEqual(exc.exception.args, (v,)) 4383 4384 def test_coroutine_returning_arbitrary_exception_does_not_get_context_updated(self): 4385 value_error = ValueError() 4386 4387 async def f(): 4388 nonlocal value_error 4389 return value_error 4390 4391 async def g(): 4392 try: 4393 raise KeyError 4394 except KeyError: 4395 return await f() 4396 4397 self.assertIsNone(value_error.__context__) 4398 with self.assertRaises(StopIteration) as exc: 4399 g().send(None) 4400 self.assertIs(exc.exception.value, value_error) 4401 self.assertIsNone(exc.exception.value.__context__) 4402 4403 4404class CoroutineWrapperTests(unittest.TestCase): 4405 def test_dunder_iter_with_invalid_self_raises_type_error(self): 4406 async def f(): 4407 pass 4408 4409 with contextlib.closing(f()) as g: 4410 with self.assertRaises(TypeError): 4411 type(g.__await__()).__iter__(None) 4412 4413 def test_dunder_next_with_invalid_self_raises_type_error(self): 4414 async def f(): 4415 pass 4416 4417 with contextlib.closing(f()) as g: 4418 with self.assertRaises(TypeError): 4419 type(g.__await__()).__next__(None) 4420 4421 def test_close_with_invalid_self_raises_type_error(self): 4422 async def f(): 4423 pass 4424 4425 with contextlib.closing(f()) as g: 4426 with self.assertRaises(TypeError): 4427 type(g.__await__()).close(None) 4428 4429 def test_send_with_invalid_self_raises_type_error(self): 4430 async def f(): 4431 pass 4432 4433 with contextlib.closing(f()) as g: 4434 with self.assertRaises(TypeError): 4435 type(g.__await__()).send(None, None) 4436 4437 def test_throw_with_invalid_self_raises_type_error(self): 4438 async def f(): 4439 pass 4440 4441 with contextlib.closing(f()) as g: 4442 with self.assertRaises(TypeError): 4443 type(g.__await__()).throw(None, None, None, None) 4444 4445 def test_dunder_iter_returns_self(self): 4446 async def f(): 4447 pass 4448 4449 with contextlib.closing(f()) as g: 4450 wrapper = g.__await__() 4451 self.assertIs(wrapper.__iter__(), wrapper) 4452 4453 def test_dunder_next_raises_stop_iteration_with_yielded_value(self): 4454 async def f(): 4455 return 1 4456 4457 with contextlib.closing(f()) as g: 4458 with self.assertRaises(StopIteration) as exc: 4459 g.__await__().__next__() 4460 self.assertEqual(exc.exception.value, 1) 4461 4462 def test_dunder_repr(self): 4463 async def f(): 4464 return 1 4465 4466 with contextlib.closing(f()) as g: 4467 self.assertTrue( 4468 g.__await__().__repr__().startswith("<coroutine_wrapper object at ") 4469 ) 4470 4471 def test_close_throws_in_generator_exit(self): 4472 saw_generator_exit = False 4473 4474 async def f(): 4475 nonlocal saw_generator_exit 4476 4477 class Awaitable: 4478 def __await__(self): 4479 yield 1 4480 4481 try: 4482 await Awaitable() 4483 except GeneratorExit: 4484 saw_generator_exit = True 4485 4486 g = f() 4487 self.assertEqual(g.send(None), 1) 4488 g.__await__().close() 4489 self.assertTrue(saw_generator_exit) 4490 4491 def test_send_raises_stop_iteration_with_yielded_value(self): 4492 async def f(): 4493 return 1 4494 4495 with contextlib.closing(f()) as g: 4496 with self.assertRaises(StopIteration) as exc: 4497 g.__await__().send(None) 4498 self.assertEqual(exc.exception.value, 1) 4499 4500 def test_throw_raises_in_generator(self): 4501 saw_value_error = False 4502 4503 async def f(): 4504 nonlocal saw_value_error 4505 4506 class Awaitable: 4507 def __await__(self): 4508 yield 1 4509 4510 try: 4511 await Awaitable() 4512 except ValueError: 4513 saw_value_error = True 4514 4515 with contextlib.closing(f()) as g: 4516 self.assertEqual(g.send(None), 1) 4517 with self.assertRaises(StopIteration): 4518 g.__await__().throw(ValueError, None) 4519 self.assertTrue(saw_value_error) 4520 4521 4522class DelattrTests(unittest.TestCase): 4523 def test_non_str_as_name_raises_type_error(self): 4524 with self.assertRaises(TypeError) as context: 4525 delattr("str instance", None) 4526 self.assertIn( 4527 "attribute name must be string, not 'NoneType'", str(context.exception) 4528 ) 4529 4530 def test_delete_non_existing_instance_attribute_raises_attribute_error(self): 4531 class C: 4532 fld = 4 4533 4534 c = C() 4535 with self.assertRaises(AttributeError): 4536 delattr(c, "fld") 4537 4538 def test_calls_dunder_delattr_and_returns_none_if_successful(self): 4539 class C: 4540 def __init__(self): 4541 self.fld = "" 4542 4543 def __delattr__(self, name): 4544 self.fld = name 4545 return "unused value" 4546 4547 c = C() 4548 self.assertIs(delattr(c, "passed to __delattr__"), None) 4549 self.assertEqual(c.fld, "passed to __delattr__") 4550 4551 def test_passes_exception_raised_by_dunder_delattr(self): 4552 class C: 4553 def __delattr__(self, name): 4554 raise UserWarning("delattr failed") 4555 4556 c = C() 4557 with self.assertRaises(UserWarning) as context: 4558 delattr(c, "foo") 4559 self.assertIn("delattr failed", str(context.exception)) 4560 4561 def test_deletes_existing_instance_attribute(self): 4562 class C: 4563 def __init__(self): 4564 self.fld = 0 4565 4566 c = C() 4567 self.assertTrue(hasattr(c, "fld")) 4568 delattr(c, "fld") 4569 self.assertFalse(hasattr(c, "fld")) 4570 4571 def test_accepts_str_subclass_as_name(self): 4572 class C: 4573 def __init__(self): 4574 self.fld = 0 4575 4576 class S(str): 4577 pass 4578 4579 c = C() 4580 self.assertTrue(hasattr(c, "fld")) 4581 delattr(c, S("fld")) 4582 self.assertFalse(hasattr(c, "fld")) 4583 4584 4585class DirTests(unittest.TestCase): 4586 def test_without_args_returns_locals_keys(self): 4587 def foo(): 4588 a = 4 4589 a = a # noqa: F841 4590 b = 5 4591 b = b # noqa: F841 4592 return dir() 4593 4594 result = foo() 4595 self.assertIsInstance(result, list) 4596 self.assertEqual(len(result), 2) 4597 self.assertEqual(result[0], "a") 4598 self.assertEqual(result[1], "b") 4599 4600 def test_with_arg_returns_dunder_dir_result(self): 4601 class C: 4602 def __dir__(self): 4603 return ["1", "2"] 4604 4605 c = C() 4606 self.assertEqual(dir(c), ["1", "2"]) 4607 4608 4609class DunderBuildClassTests(unittest.TestCase): 4610 def test_bases_updated_with_dunder_mro_entries(self): 4611 observed_bases = [] 4612 4613 class GenericAlias: 4614 def __init__(self, origin, item): 4615 self.origin = origin 4616 self.item = item 4617 4618 def __mro_entries__(self, bases): 4619 nonlocal observed_bases 4620 observed_bases.append(bases) 4621 return (self.origin,) 4622 4623 def __eq__(self, other): 4624 return self.origin == other.origin and self.item == other.item 4625 4626 class NewList: 4627 def __class_getitem__(cls, item): 4628 return GenericAlias(cls, item) 4629 4630 class NewTuple: 4631 def __class_getitem__(cls, item): 4632 return GenericAlias(cls, item) 4633 4634 class Tokens(NewList[int], NewTuple[float]): 4635 pass 4636 4637 self.assertIs(type(Tokens.__orig_bases__), tuple) 4638 self.assertEqual(Tokens.__orig_bases__, (NewList[int], NewTuple[float])) 4639 self.assertIs(type(Tokens.__bases__), tuple) 4640 self.assertEqual(Tokens.__bases__, (NewList, NewTuple)) 4641 self.assertEqual(Tokens.__mro__, (Tokens, NewList, NewTuple, object)) 4642 4643 self.assertEqual(observed_bases, [Tokens.__orig_bases__, Tokens.__orig_bases__]) 4644 4645 def test_bases_with_non_class_invokes_metaclass(self): 4646 class Meta: # noqa: B903 4647 def __init__(self, *args, **kwargs): 4648 self.init_args = args 4649 self.init_kwargs = kwargs 4650 4651 pseudo_type = Meta() 4652 4653 class C(pseudo_type): 4654 pass 4655 4656 self.assertIsInstance(C, Meta) 4657 self.assertIsNot(C, pseudo_type) 4658 self.assertEqual(len(C.init_args), 3) 4659 self.assertEqual(C.init_args[0], "C") 4660 self.assertEqual(C.init_args[1], (pseudo_type,)) 4661 self.assertIsInstance(C.init_args[2], dict) 4662 self.assertEqual(C.init_kwargs, {}) 4663 4664 def test_exceptions_propagated_from_dunder_mro_entries(self): 4665 class GenericAlias: 4666 def __init__(self, origin, item): 4667 pass 4668 4669 def __mro_entries__(self, bases): 4670 raise UserWarning("GenericAlias.__mro__entries__") 4671 4672 class NewList: 4673 def __class_getitem__(cls, item): 4674 return GenericAlias(cls, item) 4675 4676 class NewTuple: 4677 def __class_getitem__(cls, item): 4678 return GenericAlias(cls, item) 4679 4680 with self.assertRaises(UserWarning) as context: 4681 4682 class Tokens(NewList[int]): 4683 pass 4684 4685 self.assertIn("GenericAlias.__mro__entries__", str(context.exception)) 4686 4687 4688class EllipsisTypeTests(unittest.TestCase): 4689 def test_repr_returns_not_implemented(self): 4690 self.assertEqual(Ellipsis.__repr__(), "Ellipsis") 4691 4692 4693class ExceptionTests(unittest.TestCase): 4694 def test_oserror_with_errno_enoent_returns_file_not_found_error(self): 4695 result = OSError(errno.ENOENT, "foo", "bar.py") 4696 self.assertIsInstance(result, FileNotFoundError) 4697 self.assertEqual(result.errno, errno.ENOENT) 4698 self.assertEqual(result.strerror, "foo") 4699 self.assertEqual(result.filename, "bar.py") 4700 4701 def test_oserror_with_not_whitelisted_errno_returns_os_error(self): 4702 result = OSError(999, "foo", "bar.py") 4703 self.assertIsInstance(result, OSError) 4704 self.assertEqual(result.errno, 999) 4705 self.assertEqual(result.strerror, "foo") 4706 self.assertEqual(result.filename, "bar.py") 4707 4708 def test_oserror_with_errno_eacces_returns_permission_error(self): 4709 result = OSError(errno.EACCES, "foo", "bar.py") 4710 self.assertIsInstance(result, PermissionError) 4711 4712 def test_oserror_with_errno_eagain_returns_blocking_io_error(self): 4713 result = OSError(errno.EAGAIN, "foo", "bar.py") 4714 self.assertIsInstance(result, BlockingIOError) 4715 4716 def test_oserror_with_errno_ealready_returns_blocking_io_error(self): 4717 result = OSError(errno.EALREADY, "foo", "bar.py") 4718 self.assertIsInstance(result, BlockingIOError) 4719 4720 def test_oserror_with_errno_einprogress_returns_blocking_io_error(self): 4721 result = OSError(errno.EINPROGRESS, "foo", "bar.py") 4722 self.assertIsInstance(result, BlockingIOError) 4723 4724 def test_oserror_with_errno_echild_returns_child_process_error(self): 4725 result = OSError(errno.ECHILD, "foo", "bar.py") 4726 self.assertIsInstance(result, ChildProcessError) 4727 4728 def test_oserror_with_errno_econnaborted_returns_connection_aborted_error(self): 4729 result = OSError(errno.ECONNABORTED, "foo", "bar.py") 4730 self.assertIsInstance(result, ConnectionAbortedError) 4731 4732 def test_oserror_with_errno_econnrefused_returns_connection_refused_error(self): 4733 result = OSError(errno.ECONNREFUSED, "foo", "bar.py") 4734 self.assertIsInstance(result, ConnectionRefusedError) 4735 4736 def test_oserror_with_errno_econnreset_returns_connection_reset_error(self): 4737 result = OSError(errno.ECONNRESET, "foo", "bar.py") 4738 self.assertIsInstance(result, ConnectionResetError) 4739 4740 def test_oserror_with_errno_eexist_returns_file_exists_error(self): 4741 result = OSError(errno.EEXIST, "foo", "bar.py") 4742 self.assertIsInstance(result, FileExistsError) 4743 4744 def test_oserror_with_errno_eintr_returns_interrupted_error(self): 4745 result = OSError(errno.EINTR, "foo", "bar.py") 4746 self.assertIsInstance(result, InterruptedError) 4747 4748 def test_oserror_with_errno_eisdir_returns_is_a_directory_error(self): 4749 result = OSError(errno.EISDIR, "foo", "bar.py") 4750 self.assertIsInstance(result, IsADirectoryError) 4751 4752 def test_oserror_with_errno_enotdir_returns_not_a_directory_error(self): 4753 result = OSError(errno.ENOTDIR, "foo", "bar.py") 4754 self.assertIsInstance(result, NotADirectoryError) 4755 4756 def test_oserror_with_errno_eperm_returns_permission_error(self): 4757 result = OSError(errno.EPERM, "foo", "bar.py") 4758 self.assertIsInstance(result, PermissionError) 4759 4760 def test_oserror_with_errno_epipe_returns_broken_pipe_error(self): 4761 result = OSError(errno.EPIPE, "foo", "bar.py") 4762 self.assertIsInstance(result, BrokenPipeError) 4763 4764 def test_oserror_with_esrch_returns_process_lookup_error(self): 4765 result = OSError(errno.ESRCH, "foo", "bar.py") 4766 self.assertIsInstance(result, ProcessLookupError) 4767 4768 def test_oserror_with_errno_etimedout_returns_timeout_error(self): 4769 result = OSError(errno.ETIMEDOUT, "foo", "bar.py") 4770 self.assertIsInstance(result, TimeoutError) 4771 4772 def test_oserror_with_errno_ewouldblock_returns_blocking_io_error(self): 4773 result = OSError(errno.EWOULDBLOCK, "foo", "bar.py") 4774 self.assertIsInstance(result, BlockingIOError) 4775 4776 def test_oserror_dunder_new_with_subclass_return_subclass_instance(self): 4777 result = OSError.__new__(FileNotFoundError) 4778 self.assertIsInstance(result, FileNotFoundError) 4779 4780 def test_oserror_dunder_init_with_no_args_does_not_set_attrs(self): 4781 exc = OSError() 4782 self.assertIs(exc.errno, None) 4783 self.assertIs(exc.strerror, None) 4784 self.assertIs(exc.filename, None) 4785 self.assertIs(exc.filename2, None) 4786 4787 def test_oserror_dunder_init_with_args_sets_attrs(self): 4788 exc = OSError(1, "some error", "file", 0, "file2") 4789 self.assertIs(exc.errno, 1) 4790 self.assertIs(exc.strerror, "some error") 4791 self.assertIs(exc.filename, "file") 4792 self.assertIs(exc.filename2, "file2") 4793 4794 def test_oserror_dunder_str_without_errno_or_strerror(self): 4795 exc = OSError() 4796 self.assertEqual(OSError.__str__(exc), "") 4797 4798 exc = OSError(999) 4799 self.assertEqual(OSError.__str__(exc), "999") 4800 4801 def test_oserror_dunder_str_without_filename(self): 4802 exc = OSError(999, "some error") 4803 self.assertEqual(OSError.__str__(exc), "[Errno 999] some error") 4804 4805 def test_oserror_dunder_str_with_filename(self): 4806 exc = OSError(999, "some error", "file") 4807 self.assertEqual(OSError.__str__(exc), "[Errno 999] some error: 'file'") 4808 4809 def test_oserror_dunder_str_with_filename_and_filename2(self): 4810 exc = OSError(999, "some error", "file", 0, "file2") 4811 self.assertEqual( 4812 OSError.__str__(exc), "[Errno 999] some error: 'file' -> 'file2'" 4813 ) 4814 4815 def test_maybe_unbound_attributes(self): 4816 exc = BaseException() 4817 exc2 = BaseException() 4818 self.assertIs(exc.__cause__, None) 4819 self.assertIs(exc.__context__, None) 4820 self.assertIs(exc.__traceback__, None) 4821 4822 # Test setter for __cause__. 4823 self.assertRaises(TypeError, setattr, exc, "__cause__", 123) 4824 exc.__cause__ = exc2 4825 self.assertIs(exc.__cause__, exc2) 4826 exc.__cause__ = None 4827 self.assertIs(exc.__cause__, None) 4828 4829 # Test setter for __context__. 4830 self.assertRaises(TypeError, setattr, exc, "__context__", 456) 4831 exc.__context__ = exc2 4832 self.assertIs(exc.__context__, exc2) 4833 exc.__context__ = None 4834 self.assertIs(exc.__context__, None) 4835 4836 # Test setter for __traceback__. 4837 self.assertRaises(TypeError, setattr, "__traceback__", "some string") 4838 # TODO(bsimmers): Set a real traceback once we support them. 4839 exc.__traceback__ = None 4840 self.assertIs(exc.__traceback__, None) 4841 4842 def test_context_chaining(self): 4843 inner_exc = None 4844 outer_exc = None 4845 try: 4846 try: 4847 raise RuntimeError("whoops") 4848 except RuntimeError as exc: 4849 inner_exc = exc 4850 raise TypeError("darn") 4851 except TypeError as exc: 4852 outer_exc = exc 4853 4854 self.assertIsInstance(inner_exc, RuntimeError) 4855 self.assertIsInstance(outer_exc, TypeError) 4856 self.assertIs(outer_exc.__context__, inner_exc) 4857 self.assertIsNone(inner_exc.__context__) 4858 4859 def test_context_chaining_cycle_avoidance(self): 4860 exc0 = None 4861 exc1 = None 4862 exc2 = None 4863 exc3 = None 4864 try: 4865 try: 4866 try: 4867 try: 4868 raise RuntimeError("inner") 4869 except RuntimeError as exc: 4870 exc0 = exc 4871 raise RuntimeError("middle") 4872 except RuntimeError as exc: 4873 exc1 = exc 4874 raise RuntimeError("outer") 4875 except RuntimeError as exc: 4876 exc2 = exc 4877 # The __context__ link between exc1 and exc0 should be broken 4878 # by this raise. 4879 raise exc0 4880 except RuntimeError as exc: 4881 exc3 = exc 4882 4883 self.assertIs(exc3, exc0) 4884 self.assertIs(exc3.__context__, exc2) 4885 self.assertIs(exc2.__context__, exc1) 4886 self.assertIs(exc1.__context__, None) 4887 4888 def test_dunder_dict_doesnt_expose_dunder_attrs(self): 4889 instance_dict = Exception().__dict__ 4890 self.assertFalse(hasattr(instance_dict, "__cause__")) 4891 self.assertFalse(hasattr(instance_dict, "__context__")) 4892 self.assertFalse(hasattr(instance_dict, "__traceback__")) 4893 4894 def test_reraise_exception_appends_traceback(self): 4895 def raise_exc(): 4896 raise ValueError("Hello") 4897 4898 def reraise(): 4899 try: 4900 raise_exc() 4901 except ValueError as e: 4902 raise e 4903 4904 def catch(): 4905 try: 4906 reraise() 4907 except Exception as e: 4908 tb = e.__traceback__ 4909 frames = [] 4910 while tb is not None: 4911 frames.append(tb.tb_frame) 4912 tb = tb.tb_next 4913 return frames 4914 4915 frames = catch() 4916 names = [frame.f_code.co_name for frame in frames] 4917 self.assertIn("catch", names) 4918 self.assertIn("reraise", names) 4919 self.assertIn("raise_exc", names) 4920 4921 def test_with_traceback_sets_none_as_dunder_traceback(self): 4922 e = BaseException() 4923 self.assertIs(e, e.with_traceback(None)) 4924 self.assertIs(e.__traceback__, None) 4925 4926 def test_with_traceback_sets_traceback_as_dunder_traceback(self): 4927 traceback_obj = None 4928 try: 4929 raise Exception("test") 4930 except Exception as e: 4931 traceback_obj = e.__traceback__ 4932 self.assertIsNot(traceback_obj, None) 4933 4934 e = BaseException() 4935 self.assertIs(e, e.with_traceback(traceback_obj)) 4936 self.assertIs(e.__traceback__, traceback_obj) 4937 4938 def test_with_traceback_with_non_traceback_raises_type_error(self): 4939 e = BaseException() 4940 with self.assertRaises(TypeError): 4941 e.with_traceback("not_a_traceback_obj") 4942 4943 def test_system_exit_with_value_sets_code(self): 4944 exc = SystemExit(1111) 4945 self.assertEqual(exc.code, 1111) 4946 4947 def test_set_name_attr_on_import_error_subclass_with_property_sets_attr(self): 4948 class C(ModuleNotFoundError): 4949 # Modeled after PackageNotFoundError in 4950 # importlib_metadata/__init__.py 4951 @property 4952 def name(self): 4953 (name,) = self.args 4954 return name 4955 4956 c = C("a name") 4957 self.assertEqual(c.name, "a name") 4958 self.assertEqual(c.path, None) 4959 4960 def test_set_path_attr_on_import_error_subclass_with_property_sets_attr(self): 4961 class C(ModuleNotFoundError): 4962 # Modeled after PackageNotFoundError in 4963 # importlib_metadata/__init__.py 4964 @property 4965 def path(self): 4966 (path,) = self.args 4967 return path 4968 4969 c = C("a path") 4970 self.assertEqual(c.name, None) 4971 self.assertEqual(c.path, "a path") 4972 4973 4974class EvalTests(unittest.TestCase): 4975 def test_globals_none_accesses_function_globals(self): 4976 from types import ModuleType 4977 4978 module = ModuleType("") 4979 exec("def foo(): return eval('globals(), locals()', None, {})", module.__dict__) 4980 eval_globals, eval_locals = module.foo() 4981 self.assertIs(eval_globals, module.__dict__) 4982 self.assertEqual(eval_locals, {}) 4983 4984 def test_globals_and_locals_none_accesses_function_locals(self): 4985 from types import ModuleType 4986 4987 module = ModuleType("") 4988 exec( 4989 "def foo(): bar = 42; return eval('globals(), locals(), bar', None, None)", 4990 module.__dict__, 4991 ) 4992 eval_globals, eval_locals, bar = module.foo() 4993 self.assertIs(eval_globals, module.__dict__) 4994 self.assertEqual(eval_locals, {"bar": 42}) 4995 self.assertEqual(bar, 42) 4996 4997 def test_globals_and_locals_none_accesses_implicit_globals(self): 4998 class C: 4999 foo = 42 5000 globals, locals = eval("globals(), locals()", None, None) 5001 5002 self.assertIs(C.globals, globals()) 5003 self.assertIn("foo", C.locals) 5004 self.assertEqual(C.locals["foo"], 42) 5005 5006 def test_locals_none_accesses_globals(self): 5007 from types import ModuleType 5008 5009 module = ModuleType("") 5010 module.foo = 42 5011 eval_globals, eval_locals = eval("globals(), locals()", module.__dict__, None) 5012 self.assertIs(eval_globals, module.__dict__) 5013 self.assertIs(eval_locals, module.__dict__) 5014 5015 def test_builtins_is_added(self): 5016 import builtins 5017 5018 globals = {} 5019 exec("", globals, globals) 5020 self.assertIn("__builtins__", globals) 5021 self.assertIs(globals["__builtins__"], builtins.__dict__) 5022 5023 def test_bytes_source(self): 5024 self.assertEqual(eval(b"4 * 5"), 20) # noqa: P204 5025 5026 def test_bytearray_source(self): 5027 self.assertEqual(eval(bytearray(b"20 / 5")), 4) # noqa: P204 5028 5029 def test_str_with_left_whitespace_returns(self): 5030 res = eval(" 1 + 1") 5031 self.assertEqual(res, 2) 5032 5033 def test_bytes_with_left_whitespace_returns(self): 5034 res = eval(b" 1 + 1") # noqa: P204 5035 self.assertEqual(res, 2) 5036 5037 def test_bytearray_with_left_whitespace_returns(self): 5038 res = eval(bytearray(b" 1 + 1")) # noqa: P204 5039 self.assertEqual(res, 2) 5040 5041 def test_str_with_right_whitespace_returns(self): 5042 res = eval("1 + 1 ") 5043 self.assertEqual(res, 2) 5044 5045 def test_bytes_with_right_whitespace_returns(self): 5046 res = eval(b"1 + 1 ") # noqa: P204 5047 self.assertEqual(res, 2) 5048 5049 def test_bytearray_with_left_whitespace_returns(self): 5050 res = eval(bytearray(b"1 + 1 ")) # noqa: P204 5051 self.assertEqual(res, 2) 5052 5053 def test_code_source(self): 5054 from types import CodeType 5055 5056 code = compile("20 - 4", "", "eval", 0, True, -1) 5057 self.assertIsInstance(code, CodeType) 5058 self.assertEqual(eval(code), 16) # noqa: P204 5059 5060 # TODO(T78726269): Investigate why this test fails 5061 @cpython_only 5062 def test_inherits_compile_flags(self): 5063 import __future__ 5064 5065 from types import CodeType 5066 5067 code = compile( 5068 "eval('8 <> 9')", "", "eval", __future__.CO_FUTURE_BARRY_AS_BDFL, True, -1 5069 ) 5070 self.assertIsInstance(code, CodeType) 5071 self.assertTrue(code.co_flags & __future__.CO_FUTURE_BARRY_AS_BDFL != 0) 5072 self.assertTrue(eval(code)) # noqa: P204 5073 5074 def test_int_source_raises_type_error(self): 5075 with self.assertRaises(TypeError): 5076 eval(123) 5077 5078 def test_non_dict_globals_raise_type_error(self): 5079 with self.assertRaises(TypeError): 5080 eval("0", "not a dict") 5081 5082 class Mapping: 5083 def __setitem__(self, key, name): 5084 pass 5085 5086 def __getitem__(self, key): 5087 pass 5088 5089 with self.assertRaises(TypeError): 5090 eval("0", Mapping()) 5091 5092 def test_non_mapping_locals_raises_type_error(self): 5093 with self.assertRaises(TypeError): 5094 not_a_mapping = 42.4 5095 eval("0", None, not_a_mapping) 5096 5097 def test_code_with_freevars_raises_type_error(self): 5098 def func(x): 5099 return lambda: x 5100 5101 code = func(42).__code__ 5102 with self.assertRaisesRegex(TypeError, "may not contain free variables"): 5103 eval(code) # noqa: P204 5104 5105 def test_globals_dict_reads_dict(self): 5106 d = {"a": 1} 5107 res = eval("a + 1", d) 5108 self.assertEqual(res, 2) 5109 5110 def test_globals_dict_updates_dict(self): 5111 d = {"a": 1} 5112 code = compile("a = 2", "<string>", "exec") 5113 eval(code, d) # noqa: P204 5114 self.assertEqual(d["a"], 2) 5115 5116 def test_instance_has_dunder_dict(self): 5117 instance = Exception() 5118 self.assertTrue(hasattr(instance, "__dict__")) 5119 instance.foo = "bar" 5120 self.assertEqual(instance.__dict__["foo"], "bar") 5121 5122 def test_subclass_instance_has_dunder_dict(self): 5123 class ExceptionSub(Exception): 5124 def __init__(self): 5125 self.foo = "bar" 5126 5127 instance = ExceptionSub() 5128 self.assertEqual(instance.__dict__["foo"], "bar") 5129 5130 5131class ExecTests(unittest.TestCase): 5132 def test_globals_none_accesses_function_globals(self): 5133 from types import ModuleType 5134 5135 module = ModuleType("") 5136 module.foo = 42 5137 module.locals = {} 5138 exec("exec('result = foo', None, locals)", module.__dict__) 5139 self.assertIn("result", module.locals) 5140 self.assertEqual(module.locals["result"], 42) 5141 5142 def test_globals_and_locals_none_accesses_function_locals(self): 5143 def f(): 5144 foo = 42 # noqa: F841 5145 result = [] 5146 exec("result.append(foo)", None, None) 5147 return result 5148 5149 self.assertEqual(f(), [42]) 5150 5151 def test_globals_and_locals_none_accesses_implicit_globals(self): 5152 class C: 5153 foo = 42 5154 exec("result = foo", None, None) 5155 5156 self.assertTrue(hasattr(C, "result")) 5157 self.assertEqual(C.result, 42) 5158 5159 def test_locals_none_accesses_globals(self): 5160 from types import ModuleType 5161 5162 module = ModuleType("") 5163 module.foo = 42 5164 exec("result = foo", module.__dict__, None) 5165 self.assertTrue(hasattr(module, "result")) 5166 self.assertEqual(module.result, 42) 5167 5168 def test_bytes_source(self): 5169 from types import ModuleType 5170 5171 module = ModuleType("") 5172 module.foo = 13 5173 exec(b"result = foo", module.__dict__, None) 5174 self.assertTrue(hasattr(module, "result")) 5175 self.assertEqual(module.result, 13) 5176 5177 def test_bytearray_source(self): 5178 from types import ModuleType 5179 5180 module = ModuleType("") 5181 module.foo = 7 5182 exec(bytearray(b"result = foo"), module.__dict__, None) 5183 self.assertTrue(hasattr(module, "result")) 5184 self.assertEqual(module.result, 7) 5185 5186 def test_code_source(self): 5187 from types import CodeType 5188 from types import ModuleType 5189 5190 code = compile("result = foo", "", "exec", 0, True, -1) 5191 self.assertIsInstance(code, CodeType) 5192 module = ModuleType("") 5193 module.foo = 99 5194 self.assertIs(exec(code, module.__dict__), None) 5195 self.assertEqual(module.result, 99) 5196 5197 def test_inherits_compile_flags(self): 5198 import __future__ 5199 5200 from types import CodeType 5201 from types import ModuleType 5202 5203 code = compile( 5204 "result0 = 4 <> 4\nexec('result1 = 8 <> 9')", 5205 "", 5206 "exec", 5207 __future__.CO_FUTURE_BARRY_AS_BDFL, 5208 True, 5209 -1, 5210 ) 5211 self.assertIsInstance(code, CodeType) 5212 self.assertTrue(code.co_flags & __future__.CO_FUTURE_BARRY_AS_BDFL != 0) 5213 module = ModuleType("") 5214 self.assertIs(exec(code, module.__dict__), None) 5215 self.assertFalse(module.result0) 5216 self.assertTrue(module.result1) 5217 5218 def test_int_source_raises_type_error(self): 5219 with self.assertRaises(TypeError): 5220 exec(123) 5221 5222 def test_non_dict_globals_raise_type_error(self): 5223 with self.assertRaises(TypeError): 5224 exec("pass", "not a dict") 5225 5226 class Mapping: 5227 def __setitem__(self, key, name): 5228 pass 5229 5230 def __getitem__(self, key): 5231 pass 5232 5233 with self.assertRaises(TypeError): 5234 exec("pass", Mapping()) 5235 5236 def test_non_mapping_locals_raises_type_error(self): 5237 with self.assertRaises(TypeError): 5238 not_a_mapping = 42.4 5239 exec("pass", None, not_a_mapping) 5240 5241 def test_code_with_freevars_raises_type_error(self): 5242 def func(x): 5243 return lambda: x 5244 5245 code = func(42).__code__ 5246 with self.assertRaisesRegex(TypeError, "may not contain free variables"): 5247 exec(code) 5248 5249 def test_globals_dict_reads_dict(self): 5250 d = {"a": 1} 5251 exec("b = a + 1", d) 5252 self.assertEqual(d["b"], 2) 5253 5254 def test_globals_dict_updates_dict(self): 5255 d = {"a": 1} 5256 exec("a = 2", d) 5257 self.assertEqual(d["a"], 2) 5258 5259 def test_coroutine_returning_arbitrary_exception_passes_through_unchanged(self): 5260 v = RuntimeError("banana") 5261 5262 async def f(): 5263 return v 5264 5265 # Send in None to trigger initial execution of coroutine 5266 with self.assertRaises(StopIteration) as exc: 5267 f().send(None) 5268 5269 self.assertIs(exc.exception.value, v) 5270 self.assertEqual(exc.exception.args, (v,)) 5271 5272 5273class FormatTests(unittest.TestCase): 5274 def test_format_calls_types_dunder_format(self): 5275 class Format: 5276 def __format__(self, str): 5277 return "Class" 5278 5279 template = "{}" 5280 self.assertEqual(template.format(1), "1") 5281 self.assertEqual(template.format(int), "<class 'int'>") 5282 instance = Format() 5283 instance.__format__ = lambda *args: "instance" 5284 self.assertEqual(template.format(Format()), "Class") 5285 self.assertEqual(template.format(instance), "Class") 5286 5287 5288class FrozensetTests(unittest.TestCase): 5289 def test_deepcopy_with_frozenset_returns_frozenset(self): 5290 s = frozenset([1, 2, 3]) 5291 self.assertEqual(s, copy.deepcopy(s)) 5292 5293 def test_deepcopy_with_frozenset_subclass_returns_subclass(self): 5294 class C(frozenset): 5295 pass 5296 5297 s = C([1, 2, 3]) 5298 self.assertEqual(s, copy.deepcopy(s)) 5299 5300 def test_dunder_and_with_non_frozenset_raises_type_error(self): 5301 with self.assertRaises(TypeError): 5302 frozenset.__and__(set(), frozenset()) 5303 5304 def test_dunder_hash_returns_int(self): 5305 self.assertEqual(frozenset.__hash__(frozenset()), 133146708735736) 5306 self.assertEqual(frozenset.__hash__(frozenset((1, 2, 3))), -272375401224217160) 5307 5308 def test_dunder_new_with_failing_iterable_propagates_error(self): 5309 class C: 5310 def __iter__(self): 5311 return self 5312 5313 def __next__(self): 5314 raise RuntimeError("foo") 5315 5316 with self.assertRaises(RuntimeError) as context: 5317 frozenset(C()) 5318 self.assertEqual(str(context.exception), "foo") 5319 5320 def test_dunder_new_with_subclass_and_iterable_creates_instance_of_subclass(self): 5321 class Bad: 5322 def __iter__(self): 5323 return self 5324 5325 def __next__(self): 5326 raise RuntimeError("foo") 5327 5328 class C(frozenset): 5329 pass 5330 5331 with self.assertRaises(RuntimeError) as context: 5332 frozenset.__new__(frozenset, Bad()) 5333 self.assertEqual(str(context.exception), "foo") 5334 5335 result = frozenset.__new__(C, [1, 2, 3]) 5336 self.assertIsInstance(result, C) 5337 5338 def test_dunder_or_with_non_frozenset_self_raises_type_error(self): 5339 with self.assertRaises(TypeError): 5340 frozenset.__or__(set(), frozenset()) 5341 5342 def test_dunder_or_with_missing_other_raises_type_error(self): 5343 with self.assertRaises(TypeError): 5344 frozenset.__or__(frozenset()) 5345 5346 def test_dunder_or_with_non_anyset_other_returns_notimplemented(self): 5347 self.assertIs(frozenset.__or__(frozenset(), []), NotImplemented) 5348 5349 def test_dunder_or_with_id_equal_self_and_other_returns_self_copy(self): 5350 left = frozenset((1, 2, 3)) 5351 result = left.__or__(left) 5352 self.assertIsInstance(result, frozenset) 5353 self.assertIsNot(result, left) 5354 self.assertEqual(result, left) 5355 5356 def test_dunder_or_returns_union(self): 5357 left = frozenset((1, 2, 3)) 5358 result = left.__or__({2, 3, 4}) 5359 self.assertIsInstance(result, frozenset) 5360 self.assertEqual(result, frozenset((1, 2, 3, 4))) 5361 5362 def test_dunder_or_with_empty_left_returns_elements_from_right(self): 5363 result = frozenset().__or__({2, 3, 4}) 5364 self.assertIsInstance(result, frozenset) 5365 self.assertEqual(result, frozenset((2, 3, 4))) 5366 5367 def test_dunder_or_with_empty_right_returns_elements_from_left(self): 5368 result = frozenset((1, 2, 3)).__or__(set()) 5369 self.assertIsInstance(result, frozenset) 5370 self.assertEqual(result, frozenset((1, 2, 3))) 5371 5372 def test_dunder_or_with_empty_left_and_right_returns_empty_frozenset(self): 5373 empty = frozenset() 5374 result = empty.__or__(set()) 5375 self.assertIsInstance(result, frozenset) 5376 self.assertIsNot(result, empty) 5377 self.assertEqual(result, frozenset()) 5378 5379 def test_dunder_or_with_subclass_returns_exact_frozenset(self): 5380 class C(frozenset): 5381 pass 5382 5383 left = C() 5384 right = C() 5385 self.assertIs(type(left | right), frozenset) 5386 self.assertIs(type(left | left), frozenset) 5387 5388 def test_dunder_reduce_with_frozenset_returns_tuple(self): 5389 a_frozenset = frozenset({1, 2, 3}) 5390 result = a_frozenset.__reduce__() 5391 cls, value, state = result 5392 self.assertEqual(type(result), tuple) 5393 self.assertEqual(type(cls), type) 5394 self.assertEqual(cls, frozenset) 5395 self.assertEqual(type(value), tuple) 5396 self.assertEqual(len(value), 1) 5397 self.assertEqual(value[0], [1, 2, 3]) 5398 self.assertEqual(state, None) 5399 5400 def test_dunder_reduce_with_frozenset_subclass_returns_tuple(self): 5401 class C(frozenset): 5402 pass 5403 5404 c = C({1, 2, 3}) 5405 c.test_value = "test_value" 5406 result = c.__reduce__() 5407 cls, value, state = result 5408 self.assertEqual(type(result), tuple) 5409 self.assertEqual(type(cls), type) 5410 self.assertEqual(cls, C) 5411 self.assertEqual(type(value), tuple) 5412 self.assertEqual(len(value), 1) 5413 self.assertEqual(type(value[0]), list) 5414 self.assertEqual(value[0], [1, 2, 3]) 5415 self.assertEqual(len(state), 1) 5416 self.assertEqual(state["test_value"], "test_value") 5417 5418 def test_dunder_repr_with_non_frozenset_self_raises_type_error(self): 5419 with self.assertRaises(TypeError): 5420 frozenset.difference(set()) 5421 5422 def test_dunder_repr_with_empty_frozenset(self): 5423 self.assertEqual(frozenset().__repr__(), "frozenset()") 5424 5425 def test_dunder_repr_with_non_empty_frozenset(self): 5426 self.assertEqual(frozenset({1, 2, 3}).__repr__(), "frozenset({1, 2, 3})") 5427 5428 def test_dunder_repr_with_subclass_prints_subclass_name(self): 5429 class C(frozenset): 5430 pass 5431 5432 self.assertEqual(C().__repr__(), "C()") 5433 self.assertEqual(C({1, 2, 3}).__repr__(), "C({1, 2, 3})") 5434 5435 def test_dunder_repr_with_recursive_frozenset_prints_ellipsis(self): 5436 class C: 5437 def __init__(self): 5438 self.value = frozenset((self,)) 5439 5440 def __hash__(self): 5441 return 1 5442 5443 def __repr__(self): 5444 return self.value.__repr__() 5445 5446 self.assertEqual(C().__repr__(), "frozenset({frozenset(...)})") 5447 5448 def test_dunder_sub_with_non_frozenset_self_raises_type_error(self): 5449 with self.assertRaises(TypeError): 5450 frozenset.__sub__(set(), frozenset()) 5451 5452 def test_dunder_sub_same_frozensets_returns_empty_frozenset(self): 5453 a_frozenset = frozenset({1, 2, 3}) 5454 self.assertFalse(frozenset.__sub__(a_frozenset, a_frozenset)) 5455 5456 def test_dunder_sub_two_frozensets_returns_difference(self): 5457 frozenset1 = frozenset({1, 2, 3, 4, 5, 6, 7}) 5458 frozenset2 = frozenset({1, 3, 5, 7}) 5459 self.assertEqual(frozenset.__sub__(frozenset1, frozenset2), {2, 4, 6}) 5460 5461 def test_dunder_sub_set_from_frozenset_returns_difference(self): 5462 frozenset1 = frozenset({1, 2, 3, 4, 5, 6, 7}) 5463 set2 = set({1, 3, 5, 7}) 5464 self.assertEqual(frozenset.__sub__(frozenset1, set2), {2, 4, 6}) 5465 5466 def test_copy_with_non_frozenset_self_raises_type_error(self): 5467 self.assertRaisesRegex( 5468 TypeError, 5469 "'copy' .* 'frozenset' object.* a 'set'", 5470 frozenset.copy, 5471 set(), 5472 ) 5473 5474 def test_difference_with_non_frozenset_self_raises_type_error(self): 5475 with self.assertRaises(TypeError): 5476 frozenset.difference(set(), frozenset()) 5477 5478 def test_difference_no_others_copies_self(self): 5479 a_frozenset = frozenset({1, 2, 3}) 5480 self.assertIsNot(frozenset.difference(a_frozenset), a_frozenset) 5481 5482 def test_difference_same_frozensets_returns_empty_frozenset(self): 5483 a_frozenset = frozenset({1, 2, 3}) 5484 self.assertFalse(frozenset.difference(a_frozenset, a_frozenset)) 5485 5486 def test_difference_two_frozensets_returns_difference(self): 5487 frozenset1 = frozenset({1, 2, 3, 4, 5, 6, 7}) 5488 frozenset2 = frozenset({1, 3, 5, 7}) 5489 self.assertEqual(frozenset.difference(frozenset1, frozenset2), {2, 4, 6}) 5490 5491 def test_difference_many_frozensets_returns_difference(self): 5492 a_frozenset = frozenset({1, 10, 100, 1000}) 5493 self.assertEqual(frozenset.difference(a_frozenset, {10}, {100}, {1000}), {1}) 5494 5495 def test_issuperset_with_non_frozenset_raises_type_error(self): 5496 with self.assertRaises(TypeError): 5497 frozenset.issuperset(None, frozenset()) 5498 5499 def test_issuperset_with_set_raises_type_error(self): 5500 with self.assertRaises(TypeError): 5501 frozenset.issuperset(set(), frozenset()) 5502 5503 def test_issuperset_with_empty_sets_returns_true(self): 5504 self.assertTrue(frozenset.issuperset(frozenset(), frozenset())) 5505 self.assertTrue(frozenset.issuperset(frozenset(), set())) 5506 5507 def test_issuperset_with_anyset_subset_returns_true(self): 5508 self.assertTrue(frozenset({1}).issuperset(set())) 5509 self.assertTrue(frozenset({1}).issuperset(frozenset())) 5510 5511 self.assertTrue(frozenset({1}).issuperset({1})) 5512 self.assertTrue(frozenset({1}).issuperset(frozenset({1}))) 5513 5514 self.assertTrue(frozenset({1, 2}).issuperset({1})) 5515 self.assertTrue(frozenset({1, 2}).issuperset(frozenset({1}))) 5516 5517 self.assertTrue(frozenset({1, 2}).issuperset({1, 2})) 5518 self.assertTrue(frozenset({1, 2}).issuperset(frozenset({1, 2}))) 5519 5520 self.assertTrue(frozenset({1, 2, 3}).issuperset({1, 2})) 5521 self.assertTrue(frozenset({1, 2, 3}).issuperset(frozenset({1, 2}))) 5522 5523 def test_issuperset_with_iterable_subset_returns_true(self): 5524 self.assertTrue(frozenset({1}).issuperset([])) 5525 self.assertTrue(frozenset({1}).issuperset(range(1, 1))) 5526 5527 self.assertTrue(frozenset({1}).issuperset([1])) 5528 self.assertTrue(frozenset({1}).issuperset(range(1, 2))) 5529 5530 self.assertTrue(frozenset({1, 2}).issuperset([1])) 5531 self.assertTrue(frozenset({1, 2}).issuperset(range(1, 2))) 5532 5533 self.assertTrue(frozenset({1, 2}).issuperset([1, 2])) 5534 self.assertTrue(frozenset({1, 2}).issuperset(range(1, 3))) 5535 5536 self.assertTrue(frozenset({1, 2, 3}).issuperset([1, 2])) 5537 self.assertTrue(frozenset({1, 2, 3}).issuperset(range(1, 3))) 5538 5539 def test_issuperset_with_superset_returns_false(self): 5540 self.assertFalse(frozenset({}).issuperset({1})) 5541 self.assertFalse(frozenset({}).issuperset(frozenset({1}))) 5542 self.assertFalse(frozenset({}).issuperset([1])) 5543 self.assertFalse(frozenset({}).issuperset(range(1, 2))) 5544 5545 self.assertFalse(frozenset({1}).issuperset({1, 2})) 5546 self.assertFalse(frozenset({1}).issuperset(frozenset({1, 2}))) 5547 self.assertFalse(frozenset({1}).issuperset([1, 2])) 5548 self.assertFalse(frozenset({1}).issuperset(range(1, 3))) 5549 5550 self.assertFalse(frozenset({1, 2}).issuperset({1, 2, 3})) 5551 self.assertFalse(frozenset({1, 2}).issuperset(frozenset({1, 2, 3}))) 5552 self.assertFalse(frozenset({1, 2}).issuperset([1, 2, 3])) 5553 self.assertFalse(frozenset({1, 2}).issuperset(range(1, 4))) 5554 5555 def test_union_with_non_frozenset_as_self_raises_type_error(self): 5556 with self.assertRaises(TypeError): 5557 frozenset.union(set(), set()) 5558 5559 def test_union_with_frozenset_returns_union(self): 5560 set1 = frozenset({1, 2}) 5561 set2 = frozenset({2, 3}) 5562 set3 = frozenset({4, 5}) 5563 self.assertEqual(frozenset.union(set1, set2, set3), frozenset({1, 2, 3, 4, 5})) 5564 5565 def test_union_with_self_returns_copy(self): 5566 a_set = frozenset({1, 2, 3}) 5567 self.assertIs(type(frozenset.union(a_set)), frozenset) 5568 self.assertIsNot(frozenset.union(a_set), a_set) 5569 self.assertIsNot(frozenset.union(a_set, a_set), a_set) 5570 self.assertEqual(frozenset.union(a_set, a_set), a_set) 5571 5572 def test_union_with_iterable_contains_iterable_items(self): 5573 a_set = frozenset({1, 2}) 5574 a_dict = {2: True, 3: True} 5575 self.assertEqual(frozenset.union(a_set, a_dict), frozenset({1, 2, 3})) 5576 5577 def test_union_with_custom_iterable(self): 5578 class C: 5579 def __init__(self, start, end): 5580 self.pos = start 5581 self.end = end 5582 5583 def __iter__(self): 5584 return self 5585 5586 def __next__(self): 5587 if self.pos == self.end: 5588 raise StopIteration 5589 result = self.pos 5590 self.pos += 1 5591 return result 5592 5593 self.assertEqual( 5594 frozenset.union(frozenset(), C(1, 3), C(6, 9)), frozenset({1, 2, 6, 7, 8}) 5595 ) 5596 5597 def test_union_with_non_iterable_raises_typeerror(self): 5598 with self.assertRaises(TypeError): 5599 frozenset.union(frozenset({1, 2, 3}), 1.5) 5600 5601 5602class FunctionTests(unittest.TestCase): 5603 def test_dunder_closure_returns_none_if_function_is_not_a_closure(self): 5604 def foo(): 5605 pass 5606 5607 self.assertIsNone(foo.__closure__) 5608 5609 def test_dunder_closure_returns_tuple_with_cell_if_function_is_closure(self): 5610 def foo(x): 5611 def bar(n): 5612 return x + n 5613 5614 return bar 5615 5616 add_three = foo(3) 5617 self.assertIsInstance(add_three.__closure__, tuple) 5618 self.assertEqual(len(add_three.__closure__), 1) 5619 self.assertEqual(type(add_three.__closure__[0]).__name__, "cell") 5620 self.assertEqual(add_three.__closure__[0].cell_contents, 3) 5621 5622 def test_dunder_closure_is_read_only_attribute(self): 5623 def foo(): 5624 pass 5625 5626 with self.assertRaises(AttributeError): 5627 foo.__closure__ = 8 5628 5629 def test_dunder_dict_matches_attributes(self): 5630 def foo(): 5631 pass 5632 5633 d = foo.__dict__ 5634 self.assertEqual(len(d), 0) 5635 foo.bar = 42 5636 self.assertEqual(d["bar"], 42) 5637 d["baz"] = -8 5638 self.assertEqual(foo.baz, -8) 5639 5640 def test_dunder_dict_setter_update_matches_attributes(self): 5641 def foo(): 5642 pass 5643 5644 foo.__dict__ = {"baz": 500} 5645 self.assertEqual(len(foo.__dict__), 1) 5646 self.assertEqual(foo.baz, 500) 5647 5648 def test_dunder_dict_setters_with_non_dict_raises_type_error(self): 5649 def foo(): 5650 pass 5651 5652 with self.assertRaises(TypeError): 5653 foo.__dict__ = 100 5654 5655 def test_dunder_dict_after_dunder_class_succeeds(self): 5656 class C: 5657 pass 5658 5659 class D: 5660 def __init__(self): 5661 self.x = 10 5662 self.y = 20 5663 5664 c = C() 5665 c.__class__ = D 5666 c.__dict__ = {"baz": 100} 5667 self.assertIs(c.baz, 100) 5668 5669 def test_dunder_dict_with_in_object_attributes_after_dunder_class_succeeds(self): 5670 class C: 5671 def __init__(self): 5672 self.fish = -100 5673 5674 class D: 5675 def __init__(self): 5676 self.x = 10 5677 self.y = 20 5678 5679 c = C() 5680 c.__class__ = D 5681 c.__dict__ = {"baz": 100} 5682 self.assertIs(c.baz, 100) 5683 5684 def test_dunder_dict_after_dunder_class_multiple_times_succeeds(self): 5685 class C: 5686 def __init__(self): 5687 self.fish = -100 5688 5689 class D: 5690 def __init__(self): 5691 self.x = 10 5692 self.y = 20 5693 5694 class E: 5695 def __init__(self): 5696 self.z = 5000 5697 5698 c = C() 5699 c.__class__ = D 5700 c.__dict__ = {"baz": 100} 5701 self.assertIs(c.baz, 100) 5702 5703 c.__class__ = E 5704 c.__dict__ = {"baf": 200} 5705 self.assertIs(c.baf, 200) 5706 5707 def test_dunder_get_with_single_none_argument_raises_type_error(self): 5708 def foo(): 5709 pass 5710 5711 with self.assertRaises(TypeError) as context: 5712 foo.__get__(None) 5713 self.assertIn("__get__(None, None) is invalid", str(context.exception)) 5714 5715 def test_dunder_get_with_none_instance_and_none_owner_raises_type_error(self): 5716 def foo(): 5717 pass 5718 5719 with self.assertRaises(TypeError) as context: 5720 foo.__get__(None, None) 5721 self.assertIn("__get__(None, None) is invalid", str(context.exception)) 5722 5723 def test_dunder_get_with_none_instance_and_any_owner_returns_self(self): 5724 def foo(): 5725 pass 5726 5727 self.assertEqual(foo.__get__(None, foo), foo) 5728 self.assertEqual(foo.__get__(None, type(foo)), foo) 5729 self.assertEqual(foo.__get__(None, "anything"), foo) 5730 5731 def test_dunder_get_with_instance_binds_instance_to_method(self): 5732 def foo(): 5733 pass 5734 5735 self.assertEqual(foo.__get__(foo).__self__, foo) 5736 self.assertEqual(foo.__get__(foo, foo).__self__, foo) 5737 self.assertEqual(foo.__get__(foo, "anything").__self__, foo) 5738 self.assertEqual(foo.__get__("anything").__self__, "anything") 5739 self.assertEqual(foo.__get__("anything", foo).__self__, "anything") 5740 self.assertEqual(foo.__get__("anything", "anything").__self__, "anything") 5741 5742 def test_dunder_globals_returns_identical_object(self): 5743 def foo(): 5744 pass 5745 5746 self.assertIs(foo.__globals__, foo.__globals__) 5747 5748 def test_dunder_globals_returns_dict_of_defining_module_dict(self): 5749 from types import ModuleType 5750 5751 module = ModuleType("test_module") 5752 module_code = """ 5753def foo(): 5754 pass 5755 """ 5756 exec(module_code, module.__dict__) 5757 self.assertIs(module.__dict__["foo"].__globals__, module.__dict__) 5758 5759 @pyro_only 5760 def test_dunder_globals_with_extension_function_returns_empty_dict(self): 5761 import atexit 5762 5763 self.assertIn("BuiltinImporter", str(atexit.__loader__)) 5764 dunder_globals = atexit.register.__globals__ 5765 self.assertEqual(dunder_globals, {}) 5766 self.assertIsInstance(dunder_globals, dict) 5767 5768 def test_dunder_defaults_returns_defaults(self): 5769 def foo(arg=42): 5770 return arg 5771 5772 self.assertEqual(foo.__defaults__, (42,)) 5773 5774 def test_dunder_set_defaults(self): 5775 def foo(arg="bar"): 5776 return arg 5777 5778 self.assertEqual(foo(), "bar") 5779 foo.__defaults__ = ("baz",) 5780 self.assertEqual(foo(), "baz") 5781 5782 def test_dunder_set_defaults_with_tuple_subclass(self): 5783 class T(tuple): 5784 pass 5785 5786 def whereami(office=770): 5787 return office 5788 5789 self.assertEqual(whereami(), 770) 5790 whereami.__defaults__ = T((225,)) 5791 self.assertEqual(whereami(), 225) 5792 5793 def test_dunder_set_defaults_with_non_tuple_raises_typeerror(self): 5794 def foo(): 5795 pass 5796 5797 with self.assertRaises(TypeError): 5798 foo.__defaults__ = {} 5799 5800 def test_dunder_set_defaults_with_none_makes_function_require_arg(self): 5801 def foo(arg="bar"): 5802 return arg 5803 5804 foo.__defaults__ = None 5805 self.assertEqual(foo.__defaults__, None) 5806 self.assertEqual(foo(arg="abc"), "abc") 5807 with self.assertRaises(TypeError): 5808 foo() 5809 5810 def test_dunder_dir_returns_list(self): 5811 def foo(): 5812 pass 5813 5814 self.assertIsInstance(foo.__dir__(), list) 5815 5816 def test_dunder_kwdefaults_returns_kwdefaults(self): 5817 def foo(*args, kwarg=42): 5818 return kwarg 5819 5820 self.assertEqual(foo.__kwdefaults__, {"kwarg": 42}) 5821 5822 def test_dunder_set_kwdefaults(self): 5823 def foo(*args, kwarg="bar"): 5824 return kwarg 5825 5826 self.assertEqual(foo(), "bar") 5827 foo.__kwdefaults__ = {"kwarg": "baz"} 5828 self.assertEqual(foo(), "baz") 5829 5830 def test_dunder_set_kwdefaults_with_dict_subclass(self): 5831 class D(dict): 5832 pass 5833 5834 def whereami(*args, office=770): 5835 return office 5836 5837 self.assertEqual(whereami(), 770) 5838 whereami.__kwdefaults__ = D((("office", 225),)) 5839 self.assertEqual(whereami(), 225) 5840 5841 def test_dunder_set_kwdefaults_with_none_makes_function_require_kwarg(self): 5842 def foo(*args, kwarg="bar"): 5843 return kwarg 5844 5845 foo.__kwdefaults__ = None 5846 self.assertEqual(foo.__kwdefaults__, None) 5847 self.assertEqual(foo(kwarg="abc"), "abc") 5848 with self.assertRaises(TypeError): 5849 foo() 5850 5851 def test_dunder_set_kwdefaults_with_non_dict_raises_typeerror(self): 5852 def foo(): 5853 pass 5854 5855 with self.assertRaises(TypeError): 5856 foo.__kwdefaults__ = "not a dict" 5857 5858 def test_dunder_annotations_returns_annotations(self): 5859 def foo(arg: str): 5860 pass 5861 5862 self.assertEqual(foo.__annotations__, {"arg": str}) 5863 5864 def test_dunder_set_annotations(self): 5865 def foo(arg: str): 5866 pass 5867 5868 foo.__annotations__ = {"arg": int} 5869 self.assertEqual(foo.__annotations__, {"arg": int}) 5870 foo.__annotations__ = None 5871 self.assertEqual(foo.__annotations__, {}) 5872 5873 def test_dunder_set_annotations_with_dict_subclass(self): 5874 class D(dict): 5875 pass 5876 5877 def foo(arg: str): 5878 pass 5879 5880 foo.__annotations__ = D((("arg", int),)) 5881 self.assertEqual(foo.__annotations__, {"arg": int}) 5882 5883 def test_dunder_set_annotations_with_non_dict_raises_typeerror(self): 5884 def foo(): 5885 pass 5886 5887 with self.assertRaises(TypeError): 5888 foo.__annotations__ = (1, 2, 3) 5889 5890 def test_dunder_new_returns_function_object(self): 5891 import types 5892 5893 def _f(): 5894 pass 5895 5896 new_func = types.FunctionType(_f.__code__, _f.__globals__) 5897 self.assertIsInstance(new_func, types.FunctionType) 5898 self.assertEqual(new_func.__name__, "_f") 5899 5900 def test_dunder_new_with_all_args_returns_function_object(self): 5901 import types 5902 5903 def _f(): 5904 pass 5905 5906 new_func = types.FunctionType( 5907 _f.__code__, _f.__globals__, "hi", _f.__defaults__, _f.__closure__ 5908 ) 5909 self.assertIsInstance(new_func, types.FunctionType) 5910 self.assertEqual(new_func.__name__, "hi") 5911 self.assertEqual(new_func.__defaults__, _f.__defaults__) 5912 self.assertEqual(new_func.__closure__, _f.__closure__) 5913 5914 def test_dunder_new_with_name_override_as_subclassed_str_returns_function_object( 5915 self, 5916 ): 5917 import types 5918 5919 def _f(): 5920 pass 5921 5922 class _s(str): 5923 pass 5924 5925 str_subclass = _s("reb00t") 5926 new_func = types.FunctionType(_f.__code__, _f.__globals__, name=str_subclass) 5927 self.assertIsInstance(new_func, types.FunctionType) 5928 self.assertEqual(new_func.__name__, "reb00t") 5929 5930 def test_dunder_new_with_closure_as_subclassed_tuple_returns_function_object(self): 5931 import types 5932 5933 def _f(): 5934 pass 5935 5936 class _t(tuple): 5937 pass 5938 5939 tuple_subclass = _t() 5940 new_func = types.FunctionType( 5941 _f.__code__, _f.__globals__, closure=tuple_subclass 5942 ) 5943 self.assertIsInstance(new_func, types.FunctionType) 5944 self.assertEqual(new_func.__closure__, ()) 5945 5946 def test_dunder_new_with_non_code_type_value_raises_type_error(self): 5947 import types 5948 5949 def _f(): 5950 pass 5951 5952 with self.assertRaises(TypeError): 5953 types.FunctionType("", _f.__globals__, name="hi") 5954 5955 def test_dunder_new_with_non_dict_globals_value_raises_type_error(self): 5956 import types 5957 5958 def _f(): 5959 pass 5960 5961 with self.assertRaises(TypeError): 5962 types.FunctionType(_f.__code__, "", name="hi") 5963 5964 def test_dunder_new_with_dict_globals_returns_function(self): 5965 import types 5966 5967 def _f(): 5968 global foo 5969 return foo 5970 5971 result = types.FunctionType(_f.__code__, {"foo": "bar"}, name="hi") 5972 self.assertIsInstance(result, types.FunctionType) 5973 self.assertEqual(result(), "bar") 5974 5975 def test_dunder_new_with_non_str_names_value_raises_type_error(self): 5976 import types 5977 5978 def _f(): 5979 pass 5980 5981 with self.assertRaises(TypeError): 5982 types.FunctionType(_f.__code__, _f.__globals__, name=[]) 5983 5984 def test_dunder_new_with_non_tuple_argdefs_value_raises_type_error(self): 5985 import types 5986 5987 def _f(): 5988 pass 5989 5990 with self.assertRaises(TypeError): 5991 types.FunctionType(_f.__code__, _f.__globals__, argdefs="not a tuple") 5992 5993 def test_dunder_new_with_non_tuple_closure_value_raises_type_error(self): 5994 import types 5995 5996 def _f(): 5997 pass 5998 5999 with self.assertRaises(TypeError): 6000 types.FunctionType(_f.__code__, _f.__globals__, closure="not a tuple") 6001 6002 6003class GeneratorTests(unittest.TestCase): 6004 def test_managed_yield_from_stop_iteration_turns_into_runtime_error(self): 6005 def inner_gen(): 6006 raise StopIteration 6007 6008 def outer_gen(): 6009 val = yield from inner_gen() 6010 yield val 6011 6012 g = outer_gen() 6013 with self.assertRaises(RuntimeError): 6014 next(g) 6015 6016 def test_managed_stop_iteration_turns_into_runtime_error(self): 6017 def gen(): 6018 raise StopIteration 6019 yield 6020 6021 with self.assertRaises(RuntimeError): 6022 next(gen()) 6023 6024 def test_gi_running(self): 6025 def gen(): 6026 self.assertTrue(g.gi_running) 6027 yield 1 6028 self.assertTrue(g.gi_running) 6029 yield 2 6030 6031 g = gen() 6032 self.assertFalse(g.gi_running) 6033 next(g) 6034 self.assertFalse(g.gi_running) 6035 next(g) 6036 self.assertFalse(g.gi_running) 6037 6038 def test_gi_running_readonly(self): 6039 def gen(): 6040 yield None 6041 6042 g = gen() 6043 self.assertRaises(AttributeError, setattr, g, "gi_running", 1234) 6044 6045 def test_running_gen_raises(self): 6046 def gen(): 6047 self.assertRaises(ValueError, next, g) 6048 yield "done" 6049 6050 g = gen() 6051 self.assertEqual(next(g), "done") 6052 6053 class MyError(Exception): 6054 pass 6055 6056 @staticmethod 6057 def simple_gen(): 6058 yield 1 6059 yield 2 6060 6061 @staticmethod 6062 def catching_gen(): 6063 try: 6064 yield 1 6065 except GeneratorTests.MyError: 6066 yield "caught" 6067 6068 @staticmethod 6069 def catching_returning_gen(): 6070 try: 6071 yield 1 6072 except GeneratorTests.MyError: 6073 return "all done!" # noqa 6074 6075 @staticmethod 6076 def delegate_gen(g): 6077 r = yield from g 6078 yield r 6079 6080 def test_close_with_invalid_self_raises_type_error(self): 6081 g = self.simple_gen() 6082 with self.assertRaises(TypeError): 6083 type(g).close(None) 6084 6085 def test_close_when_exhausted_returns_none(self): 6086 g = self.simple_gen() 6087 self.assertEqual(next(g), 1) 6088 self.assertEqual(next(g), 2) 6089 self.assertIsNone(g.close()) 6090 6091 def test_close_when_generator_exit_propagates_returns_none(self): 6092 saw_generator_exit = False 6093 6094 def f(): 6095 nonlocal saw_generator_exit 6096 try: 6097 yield 1 6098 except GeneratorExit: 6099 saw_generator_exit = True 6100 raise 6101 6102 g = f() 6103 self.assertEqual(next(g), 1) 6104 self.assertIsNone(g.close()) 6105 self.assertTrue(saw_generator_exit) 6106 6107 def test_close_when_generator_exit_derived_exception_raised_returns_none(self): 6108 class GeneratorExitDerived(GeneratorExit): 6109 pass 6110 6111 def f(): 6112 try: 6113 yield 1 6114 except GeneratorExit: 6115 raise GeneratorExitDerived 6116 6117 g = f() 6118 self.assertEqual(next(g), 1) 6119 self.assertIsNone(g.close()) 6120 6121 def test_close_when_stop_iteration_raised_returns_none(self): 6122 saw_generator_exit = False 6123 6124 def f(): 6125 nonlocal saw_generator_exit 6126 try: 6127 yield 1 6128 except GeneratorExit: 6129 saw_generator_exit = True 6130 # Implicitly raises StopIteration(2) 6131 return 2 # noqa 6132 6133 g = f() 6134 self.assertEqual(next(g), 1) 6135 self.assertIsNone(g.close()) 6136 self.assertTrue(saw_generator_exit) 6137 6138 def test_close_generator_raises_exception_propagates(self): 6139 def f(): 6140 try: 6141 yield 1 6142 except GeneratorExit: 6143 raise ValueError 6144 6145 g = f() 6146 self.assertEqual(next(g), 1) 6147 self.assertRaises(ValueError, g.close) 6148 6149 def test_close_generator_yields_raises_runtime_error(self): 6150 def f(): 6151 try: 6152 yield 1 6153 except GeneratorExit: 6154 yield 2 6155 6156 g = f() 6157 self.assertEqual(g.send(None), 1) 6158 self.assertRaises(RuntimeError, g.close) 6159 6160 def test_throw(self): 6161 g = self.simple_gen() 6162 self.assertRaises(GeneratorTests.MyError, g.throw, GeneratorTests.MyError()) 6163 6164 def test_throw_caught(self): 6165 g = self.catching_gen() 6166 self.assertEqual(next(g), 1) 6167 self.assertEqual(g.throw(GeneratorTests.MyError()), "caught") 6168 6169 def test_throw_type(self): 6170 g = self.catching_gen() 6171 self.assertEqual(next(g), 1) 6172 self.assertEqual(g.throw(GeneratorTests.MyError), "caught") 6173 6174 def test_throw_type_and_value(self): 6175 g = self.catching_gen() 6176 self.assertEqual(next(g), 1) 6177 self.assertEqual( 6178 g.throw(GeneratorTests.MyError, GeneratorTests.MyError()), "caught" 6179 ) 6180 6181 def test_throw_uncaught_type(self): 6182 g = self.catching_gen() 6183 self.assertEqual(next(g), 1) 6184 self.assertRaises(RuntimeError, g.throw, RuntimeError) 6185 6186 def test_throw_finished(self): 6187 g = self.catching_returning_gen() 6188 self.assertEqual(next(g), 1) 6189 self.assertRaises(StopIteration, g.throw, GeneratorTests.MyError) 6190 6191 def test_throw_two_values(self): 6192 g = self.catching_gen() 6193 self.assertEqual(next(g), 1) 6194 self.assertRaises( 6195 TypeError, g.throw, GeneratorTests.MyError(), GeneratorTests.MyError() 6196 ) 6197 6198 def test_throw_bad_traceback(self): 6199 g = self.catching_gen() 6200 self.assertEqual(next(g), 1) 6201 self.assertRaises( 6202 TypeError, g.throw, GeneratorTests.MyError, GeneratorTests.MyError(), 5 6203 ) 6204 6205 def test_throw_bad_type(self): 6206 g = self.catching_gen() 6207 self.assertEqual(next(g), 1) 6208 self.assertRaises(TypeError, g.throw, 1234) 6209 6210 def test_throw_not_started(self): 6211 g = self.simple_gen() 6212 self.assertRaises(GeneratorTests.MyError, g.throw, GeneratorTests.MyError()) 6213 self.assertRaises(StopIteration, next, g) 6214 6215 def test_throw_stopped(self): 6216 g = self.simple_gen() 6217 self.assertEqual(next(g), 1) 6218 self.assertEqual(next(g), 2) 6219 self.assertRaises(StopIteration, next, g) 6220 self.assertRaises(GeneratorTests.MyError, g.throw, GeneratorTests.MyError()) 6221 6222 def test_throw_yield_from(self): 6223 g = self.delegate_gen(self.simple_gen()) 6224 self.assertEqual(next(g), 1) 6225 self.assertRaises(GeneratorTests.MyError, g.throw, GeneratorTests.MyError) 6226 6227 def test_throw_yield_from_caught(self): 6228 g = self.delegate_gen(self.catching_gen()) 6229 self.assertEqual(next(g), 1) 6230 self.assertEqual(g.throw(GeneratorTests.MyError), "caught") 6231 6232 def test_throw_yield_from_finishes(self): 6233 g = self.delegate_gen(self.catching_returning_gen()) 6234 self.assertEqual(next(g), 1) 6235 self.assertEqual(g.throw(GeneratorTests.MyError), "all done!") 6236 6237 def test_throw_yield_from_non_gen(self): 6238 g = self.delegate_gen([1, 2, 3, 4]) 6239 self.assertEqual(next(g), 1) 6240 self.assertRaises(RuntimeError, g.throw, RuntimeError) 6241 6242 def test_dunder_repr(self): 6243 def foo(): 6244 yield 5 6245 6246 self.assertTrue( 6247 foo() 6248 .__repr__() 6249 .startswith( 6250 "<generator object GeneratorTests.test_dunder_repr.<locals>.foo at " 6251 ) 6252 ) 6253 6254 def test_exception_context_captured_across_further_yield_from(self): 6255 def raises(): 6256 raise ValueError 6257 yield None 6258 6259 def double_raises(): 6260 try: 6261 raise RuntimeError 6262 except RuntimeError: 6263 yield from raises() 6264 6265 with self.assertRaises(ValueError) as exc: 6266 double_raises().send(None) 6267 6268 self.assertIsInstance(exc.exception.__context__, RuntimeError) 6269 6270 6271class GlobalsTests(unittest.TestCase): 6272 def test_returns_module_dunder_dict(self): 6273 import sys 6274 6275 self.assertIs(globals(), sys.modules[__name__].__dict__) 6276 6277 def test_with_module_subclass_returns_module_proxy(self): 6278 from types import ModuleType 6279 6280 class C(ModuleType): 6281 pass 6282 6283 m_name = "testing.test_with_module_subclass_returns_module_proxy" 6284 m = C(m_name) 6285 import sys 6286 6287 try: 6288 # We currently only support `globals()` for modules registered in 6289 # `sys.modules`. 6290 sys.modules[m_name] = m 6291 exec("def foo(): return globals()", m.__dict__, m.__dict__) 6292 self.assertIs(m.foo(), m.__dict__) 6293 finally: 6294 del sys.modules[m_name] 6295 6296 6297class HasattrTests(unittest.TestCase): 6298 def test_hasattr_calls_dunder_getattribute(self): 6299 class C: 6300 def __getattribute__(self, name): 6301 if name == "foo": 6302 return 42 6303 raise AttributeError(name) 6304 6305 i = C() 6306 self.assertTrue(hasattr(i, "foo")) 6307 self.assertFalse(hasattr(i, "bar")) 6308 6309 def test_hasattr_propagates_error_from_dunder_getattribute(self): 6310 class C: 6311 def __getattribute__(self, name): 6312 raise UserWarning() 6313 6314 i = C() 6315 with self.assertRaises(UserWarning): 6316 hasattr(i, "foo") 6317 6318 def test_hasattr_calls_dunder_getattr(self): 6319 class C: 6320 def __getattribute__(self, name): 6321 nonlocal getattribute_called 6322 getattribute_called = True 6323 raise AttributeError(name) 6324 6325 def __getattr__(self, name): 6326 if name == "foo": 6327 return 42 6328 raise AttributeError(name) 6329 6330 i = C() 6331 getattribute_called = False 6332 self.assertTrue(hasattr(i, "foo")) 6333 self.assertTrue(getattribute_called) 6334 6335 getattribute_called = False 6336 self.assertFalse(hasattr(i, "bar")) 6337 self.assertTrue(getattribute_called) 6338 6339 def test_hasattr_propagates_error_from_dunder_getattr(self): 6340 class C: 6341 def __getattribute__(self, name): 6342 raise AttributeError(name) 6343 6344 def __getattr__(self, name): 6345 raise UserWarning() 6346 6347 i = C() 6348 with self.assertRaises(UserWarning): 6349 hasattr(i, "foo") 6350 6351 def test_hasattr_with_non_string_attr_raises_type_error(self): 6352 with self.assertRaises(TypeError) as context: 6353 hasattr(None, 42) 6354 self.assertIn("attribute name must be string", str(context.exception)) 6355 6356 6357class HashTests(unittest.TestCase): 6358 def test_hash_with_raising_dunder_hash_descriptor_raises_type_error(self): 6359 class Desc: 6360 def __get__(self, obj, type): 6361 raise AttributeError("failed") 6362 6363 class Foo: 6364 __hash__ = Desc() 6365 6366 foo = Foo() 6367 with self.assertRaises(TypeError) as context: 6368 hash(foo) 6369 self.assertEqual(str(context.exception), "unhashable type: 'Foo'") 6370 6371 def test_hash_with_raising_dunder_hash_propagates_exceptions(self): 6372 class C: 6373 def __hash__(self): 6374 raise UserWarning() 6375 6376 i = C() 6377 with self.assertRaises(UserWarning): 6378 hash(i) 6379 6380 def test_hash_with_none_dunder_hash_raises_type_error(self): 6381 class Foo: 6382 __hash__ = None 6383 6384 foo = Foo() 6385 with self.assertRaises(TypeError) as context: 6386 hash(foo) 6387 self.assertEqual(str(context.exception), "unhashable type: 'Foo'") 6388 6389 def test_hash_with_non_int_dunder_hash_raises_type_error(self): 6390 class Foo: 6391 def __hash__(self): 6392 return "not an int" 6393 6394 foo = Foo() 6395 with self.assertRaises(TypeError) as context: 6396 hash(foo) 6397 self.assertEqual( 6398 str(context.exception), "__hash__ method should return an integer" 6399 ) 6400 6401 def test_hash_with_int_subclass_dunder_hash_returns_int(self): 6402 class SubInt(int): 6403 pass 6404 6405 class Foo: 6406 def __hash__(self): 6407 return SubInt(42) 6408 6409 foo = Foo() 6410 result = hash(foo) 6411 self.assertEqual(42, result) 6412 self.assertEqual(type(42), int) 6413 6414 def test_hash_with_false_returns_zero(self): 6415 class C: 6416 def __hash__(self): 6417 return False 6418 6419 self.assertIs(type(hash(C())), int) 6420 self.assertEqual(hash(C()), 0) 6421 6422 def test_hash_with_true_returns_one(self): 6423 class C: 6424 def __hash__(self): 6425 return True 6426 6427 self.assertIs(type(hash(C())), int) 6428 self.assertEqual(hash(C()), 1) 6429 6430 def test_hash_replaces_minus_one_with_minus_two(self): 6431 class C: 6432 def __hash__(self): 6433 return -1 6434 6435 self.assertEqual(hash(C()), -2) 6436 6437 def test_hash_with_large_int_value_hashes_result(self): 6438 class C: 6439 def __hash__(self): 6440 return 0xB228AA4BB7326F5D697F47B0CC9230D4 6441 6442 self.assertEqual(hash(C()), int.__hash__(0xB228AA4BB7326F5D697F47B0CC9230D4)) 6443 6444 def test_hash_returns_hash_value(self): 6445 class C(int): 6446 def __hash__(self): 6447 return self 6448 6449 self.assertEqual(hash(C(0)), 0) 6450 self.assertEqual(hash(C(1)), 1) 6451 self.assertEqual(hash(C(42)), 42) 6452 self.assertEqual(hash(C(-5)), -5) 6453 6454 def test_hash_with_max_hash_returns_max_hash(self): 6455 import sys 6456 6457 max_hash = (1 << (sys.hash_info.width - 1)) - 1 6458 6459 class C: 6460 def __hash__(self): 6461 nonlocal max_hash 6462 return max_hash 6463 6464 self.assertEqual(hash(C()), max_hash) 6465 6466 6467class HexTests(unittest.TestCase): 6468 def test_returns_string(self): 6469 self.assertEqual(hex(0), "0x0") 6470 self.assertEqual(hex(-1), "-0x1") 6471 self.assertEqual(hex(1), "0x1") 6472 self.assertEqual(hex(54321), "0xd431") 6473 self.assertEqual(hex(81985529216486895), "0x123456789abcdef") 6474 self.assertEqual(hex(18364758544493064720), "0xfedcba9876543210") 6475 6476 def test_with_large_int_returns_string(self): 6477 self.assertEqual(hex(1 << 63), "0x8000000000000000") 6478 self.assertEqual(hex(1 << 64), "0x10000000000000000") 6479 self.assertEqual( 6480 hex(0xDEE182DE2EC55F61B22A509ED1DC3EB), "0xdee182de2ec55f61b22a509ed1dc3eb" 6481 ) 6482 self.assertEqual( 6483 hex(-0x53ADC651E593B1323158BFA776E8173F60C76519277B2BD6), 6484 "-0x53adc651e593b1323158bfa776e8173f60c76519277b2bd6", 6485 ) 6486 6487 def test_calls_dunder_index(self): 6488 class C: 6489 def __int__(self): 6490 return 42 6491 6492 def __index__(self): 6493 return -99 6494 6495 self.assertEqual(hex(C()), "-0x63") 6496 6497 def test_with_int_subclass(self): 6498 class C(int): 6499 pass 6500 6501 self.assertEqual(hex(C(51)), "0x33") 6502 6503 def test_with_non_int_raises_type_error(self): 6504 with self.assertRaises(TypeError) as context: 6505 hex("not an int") 6506 self.assertEqual( 6507 str(context.exception), "'str' object cannot be interpreted as an integer" 6508 ) 6509 6510 6511class DeleteStream(contextlib.AbstractContextManager): 6512 _stream = None 6513 6514 def __init__(self): 6515 self._old_targets = [] 6516 6517 def __enter__(self): 6518 self._old_targets.append(getattr(sys, self._stream)) 6519 delattr(sys, self._stream) 6520 6521 def __exit__(self, exctype, excinst, exctb): 6522 setattr(sys, self._stream, self._old_targets.pop()) 6523 6524 6525class delete_stderr(DeleteStream): 6526 _stream = "stderr" 6527 6528 6529class delete_stdin(DeleteStream): 6530 _stream = "stdin" 6531 6532 6533class delete_stdout(DeleteStream): 6534 _stream = "stdout" 6535 6536 6537class redirect_stdin(contextlib._RedirectStream): 6538 _stream = "stdin" 6539 6540 6541class InputTests(unittest.TestCase): 6542 def test_input_with_deleted_stderr_raises_runtime_error(self): 6543 6544 with delete_stderr(): 6545 with self.assertRaises(RuntimeError): 6546 input() 6547 6548 def test_input_with_deleted_stdin_raises_runtime_error(self): 6549 6550 with delete_stdin(): 6551 with self.assertRaises(RuntimeError): 6552 input() 6553 6554 def test_input_with_deleted_stdout_raises_runtime_error(self): 6555 6556 with delete_stdout(): 6557 with self.assertRaises(RuntimeError): 6558 input() 6559 6560 def test_input_with_none_stderr_raises_runtime_error(self): 6561 6562 with contextlib.redirect_stderr(None): 6563 with self.assertRaises(RuntimeError): 6564 input() 6565 6566 def test_input_with_none_stdin_raises_runtime_error(self): 6567 6568 with redirect_stdin(None): 6569 with self.assertRaises(RuntimeError): 6570 input() 6571 6572 def test_input_with_none_stdout_raises_runtime_error(self): 6573 6574 with contextlib.redirect_stdout(None): 6575 with self.assertRaises(RuntimeError): 6576 input() 6577 6578 def test_input_strips_trailing_newline(self): 6579 class MyInStream: 6580 def readline(self): 6581 return "foobar\n" 6582 6583 with redirect_stdin(MyInStream()): 6584 self.assertEqual(input(), "foobar") 6585 6586 def test_input_keeps_trailing_non_newline_char(self): 6587 class MyInStream: 6588 def readline(self): 6589 return "foobarX" 6590 6591 with redirect_stdin(MyInStream()): 6592 self.assertEqual(input(), "foobarX") 6593 6594 def test_input_does_not_strip_trailing_cr_nl(self): 6595 class MyInStream: 6596 def readline(self): 6597 return "foobar\r\n" 6598 6599 with redirect_stdin(MyInStream()): 6600 self.assertEqual(input(), "foobar\r") 6601 6602 def test_input_with_empty_input_raises_eof_error(self): 6603 class MyInStream: 6604 def readline(self): 6605 return "" 6606 6607 with redirect_stdin(MyInStream()): 6608 self.assertRaises(EOFError, input) 6609 6610 def test_input_with_prompt_writes_prompt(self): 6611 class MyInStream: 6612 def readline(self): 6613 return "foobar\n" 6614 6615 class MyOutStream: 6616 def write(self, value): 6617 self.value = value 6618 6619 with redirect_stdin(MyInStream()): 6620 with contextlib.redirect_stdout(MyOutStream()): 6621 self.assertEqual(input("> "), "foobar") 6622 self.assertEqual(sys.stdout.value, "> ") 6623 6624 def test_input_calls_stdout_flush(self): 6625 class MyInStream: 6626 def readline(self): 6627 return "foobar\n" 6628 6629 class MyOutStream: 6630 flush = Mock(name="flush") 6631 6632 with redirect_stdin(MyInStream()): 6633 with contextlib.redirect_stdout(MyOutStream()): 6634 self.assertEqual(input(), "foobar") 6635 MyOutStream.flush.assert_called_once() 6636 6637 def test_input_calls_stderr_flush(self): 6638 class MyInStream: 6639 def readline(self): 6640 return "foobar\n" 6641 6642 class MyOutStream: 6643 flush = Mock(name="flush") 6644 6645 with redirect_stdin(MyInStream()): 6646 with contextlib.redirect_stderr(MyOutStream()): 6647 self.assertEqual(input(), "foobar") 6648 MyOutStream.flush.assert_called_once() 6649 6650 6651@pyro_only 6652class InstanceProxyTests(unittest.TestCase): 6653 def test_dunder_eq_with_id_equal_proxy_returns_true(self): 6654 class C: 6655 pass 6656 6657 instance = C() 6658 proxy = instance.__dict__ 6659 self.assertIs(instance_proxy.__eq__(proxy, proxy), True) 6660 6661 def test_dunder_eq_with_non_dict_other_returns_not_implemented(self): 6662 class C: 6663 pass 6664 6665 instance = C() 6666 proxy = instance.__dict__ 6667 self.assertIs(instance_proxy.__eq__(proxy, 5), NotImplemented) 6668 6669 def test_dunder_eq_with_unequal_length_proxy_returns_false(self): 6670 class C: 6671 pass 6672 6673 left = C() 6674 right = C() 6675 right.a = 1 6676 self.assertIs(instance_proxy.__eq__(left.__dict__, right.__dict__), False) 6677 6678 def test_dunder_eq_with_unequal_length_dict_returns_false(self): 6679 class C: 6680 pass 6681 6682 left = C() 6683 self.assertIs(instance_proxy.__eq__(left.__dict__, {"a": 1}), False) 6684 6685 def test_dunder_eq_with_empty_proxies_returns_true(self): 6686 class C: 6687 pass 6688 6689 left = C() 6690 right = C() 6691 self.assertIs(instance_proxy.__eq__(left.__dict__, right.__dict__), True) 6692 6693 def test_dunder_eq_with_empty_proxy_and_empty_dict_returns_true(self): 6694 class C: 6695 pass 6696 6697 left = C() 6698 self.assertIs(instance_proxy.__eq__(left.__dict__, {}), True) 6699 6700 def test_dunder_eq_with_key_not_in_other_returns_false(self): 6701 class C: 6702 pass 6703 6704 left = C() 6705 left.a = 1 6706 right = C() 6707 right.b = 2 6708 self.assertIs(instance_proxy.__eq__(left.__dict__, right.__dict__), False) 6709 6710 def test_dunder_eq_with_key_not_in_other_dict_returns_false(self): 6711 class C: 6712 pass 6713 6714 left = C() 6715 left.a = 1 6716 self.assertIs(instance_proxy.__eq__(left.__dict__, {"b": 2}), False) 6717 6718 def test_dunder_eq_with_value_not_equal_in_other_returns_false(self): 6719 class C: 6720 pass 6721 6722 left = C() 6723 left.a = 1 6724 right = C() 6725 right.a = 2 6726 self.assertIs(instance_proxy.__eq__(left.__dict__, right.__dict__), False) 6727 6728 def test_dunder_eq_with_value_not_equal_in_other_dict_returns_false(self): 6729 class C: 6730 pass 6731 6732 left = C() 6733 left.a = 1 6734 self.assertIs(instance_proxy.__eq__(left.__dict__, {"a": 2}), False) 6735 6736 def test_dunder_eq_with_key_and_value_equal_in_other_returns_true(self): 6737 class C: 6738 pass 6739 6740 left = C() 6741 left.a = 1 6742 right = C() 6743 right.a = 1 6744 self.assertIs(instance_proxy.__eq__(left.__dict__, right.__dict__), True) 6745 6746 def test_dunder_eq_with_key_and_value_equal_in_other_dict_returns_true(self): 6747 class C: 6748 pass 6749 6750 left = C() 6751 left.a = 1 6752 self.assertIs(instance_proxy.__eq__(left.__dict__, {"a": 1}), True) 6753 6754 def test_dunder_eq_with_id_equal_values_returns_true(self): 6755 # There's no test for id equal keys but overridden __eq__ because we 6756 # don't support str subclasses with overridden __eq__ for attributes 6757 class C: 6758 pass 6759 6760 class D: 6761 def __eq__(self, other): 6762 raise RuntimeError("foo") 6763 6764 left = C() 6765 value = D() 6766 left.a = value 6767 self.assertIs(instance_proxy.__eq__(left.__dict__, {"a": value}), True) 6768 6769 def test_dunder_init_with_non_instance_raises_type_error(self): 6770 self.assertRaisesRegex( 6771 TypeError, 6772 "'__init__' .* 'instance' object.* a 'int'", 6773 instance_proxy, 6774 42, 6775 ) 6776 6777 def test_copy_with_empty_instance_returns_empty_dict(self): 6778 class C: 6779 pass 6780 6781 result = C().__dict__.copy() 6782 self.assertIsInstance(result, dict) 6783 self.assertEqual(result, {}) 6784 6785 def test_copy_returns_dict_with_attributes(self): 6786 class C: 6787 pass 6788 6789 instance = C() 6790 instance.a = 1 6791 instance.b = 2 6792 result = instance.__dict__.copy() 6793 self.assertIsInstance(result, dict) 6794 self.assertIsNot(result, instance.__dict__) 6795 self.assertEqual(result, {"a": 1, "b": 2}) 6796 6797 def test_get_with_extant_key_returns_value(self): 6798 class C: 6799 pass 6800 6801 left = C() 6802 value = object() 6803 left.a = value 6804 self.assertIs(instance_proxy.get(left.__dict__, "a"), value) 6805 6806 def test_get_with_nonexistent_key_returns_none(self): 6807 class C: 6808 pass 6809 6810 left = C() 6811 self.assertIs(instance_proxy.get(left.__dict__, "a"), None) 6812 6813 def test_get_with_nonexistent_key_returns_default(self): 6814 class C: 6815 pass 6816 6817 left = C() 6818 value = object() 6819 self.assertIs(instance_proxy.get(left.__dict__, "a", value), value) 6820 6821 def test_dunder_repr_with_recursive_instance_prints_ellipsis(self): 6822 class C: 6823 pass 6824 6825 instance = C() 6826 instance.a = 1 6827 instance.b = instance.__dict__ 6828 self.assertEqual( 6829 instance_proxy.__repr__(instance.__dict__), 6830 "instance_proxy({'a': 1, 'b': instance_proxy({'a': 1, 'b': instance_proxy({...})})})", # noqa 6831 ) 6832 6833 6834class InstanceTests(unittest.TestCase): 6835 def test_dunder_dict_updates_instance_attributes(self): 6836 class C: 6837 def __init__(self): 6838 self.foo = 10 6839 self.bar = 20 6840 6841 c = C() 6842 d = {"bar": -10, "baz": -20} 6843 c.__dict__ = d 6844 6845 self.assertFalse(hasattr(c, "foo")) 6846 # Existing "bar" was overwritten. 6847 self.assertTrue(hasattr(c, "bar")) 6848 self.assertTrue(hasattr(c, "baz")) 6849 6850 self.assertEqual(c.bar, -10) 6851 self.assertEqual(c.baz, -20) 6852 6853 d["foo"] = "1" 6854 d["bar"] = "2" 6855 d["baz"] = "3" 6856 6857 self.assertEqual(c.foo, "1") 6858 self.assertEqual(c.bar, "2") 6859 self.assertEqual(c.baz, "3") 6860 6861 def test_dunder_dict_updates_instances_during_init(self): 6862 class C: 6863 shared_defaults = {"a": 42, "b": 13} 6864 6865 def __init__(self): 6866 self.__dict__ = C.shared_defaults 6867 6868 c0 = C() 6869 self.assertEqual(c0.a, 42) 6870 self.assertEqual(c0.b, 13) 6871 6872 c1 = C() 6873 c0.new_attribute = 99 6874 6875 self.assertEqual(c1.new_attribute, 99) 6876 6877 def test_dunder_dict_updates_with_non_dict_raises_type_error(self): 6878 class C: 6879 pass 6880 6881 c = C() 6882 with self.assertRaises(TypeError) as context: 6883 c.__dict__ = None 6884 self.assertEqual( 6885 str(context.exception), 6886 "__dict__ must be set to a dictionary, not a 'NoneType'", 6887 ) 6888 6889 def test_dunder_dict_keys_with_instance_with_dict_overflow_returns_keys(self): 6890 class C: 6891 def __init__(self): 6892 self.a = 1 6893 self.b = 2 6894 6895 instance = C() 6896 # This is the current idiomatic way to force an instance's layout into 6897 # the dict overflow state. 6898 instance.__dict__ = {"hello": "world"} 6899 self.assertEqual(list(instance.__dict__.keys()), ["hello"]) 6900 6901 def test_vars_update_with_no_args_does_not_raise(self): 6902 class C: 6903 pass 6904 6905 instance = C() 6906 vars(instance).update() 6907 6908 def test_vars_update_with_only_kwargs_sets_attribute(self): 6909 class C: 6910 pass 6911 6912 instance = C() 6913 vars(instance).update(hello=1) 6914 self.assertEqual(instance.hello, 1) 6915 6916 def test_vars_update_with_args_and_kwargs_sets_attributes(self): 6917 class C: 6918 pass 6919 6920 instance = C() 6921 vars(instance).update({"hello": 1}, world=2) 6922 self.assertEqual(instance.hello, 1) 6923 self.assertEqual(instance.world, 2) 6924 6925 6926class IsInstanceTests(unittest.TestCase): 6927 def test_isinstance_with_same_types_returns_true(self): 6928 self.assertIs(isinstance(1, int), True) 6929 6930 def test_isinstance_with_subclass_returns_true(self): 6931 self.assertIs(isinstance(False, int), True) 6932 6933 def test_isinstance_with_superclass_returns_false(self): 6934 self.assertIs(isinstance(2, bool), False) 6935 6936 def test_isinstance_with_type_and_metaclass_returns_true(self): 6937 self.assertIs(isinstance(list, type), True) 6938 6939 def test_isinstance_with_type_returns_true(self): 6940 self.assertIs(isinstance(type, type), True) 6941 6942 def test_isinstance_with_object_type_returns_true(self): 6943 self.assertIs(isinstance(object, object), True) 6944 6945 def test_isinstance_with_int_type_returns_false(self): 6946 self.assertIs(isinstance(int, int), False) 6947 6948 def test_isinstance_with_unrelated_types_returns_false(self): 6949 self.assertIs(isinstance(int, (dict, bytes, str)), False) 6950 6951 def test_isinstance_with_superclass_tuple_returns_true(self): 6952 self.assertIs(isinstance(True, (int, "bad - not a type")), True) 6953 6954 def test_isinstance_with_non_type_superclass_raises_type_error(self): 6955 self.assertRaisesRegex( 6956 TypeError, 6957 r"isinstance\(\) arg 2 must be a type.* tuple of types", 6958 isinstance, 6959 4, 6960 "bad - not a type", 6961 ) 6962 6963 def test_isinstance_with_non_type_in_tuple_raises_type_error(self): 6964 self.assertRaisesRegex( 6965 TypeError, 6966 r"isinstance\(\) arg 2 must be a type.* tuple of types", 6967 isinstance, 6968 5, 6969 ("bad - not a type", int), 6970 ) 6971 6972 def test_isinstance_with_multiple_inheritance_returns_true(self): 6973 class A: 6974 pass 6975 6976 class B(A): 6977 pass 6978 6979 class C(A): 6980 pass 6981 6982 class D(B, C): 6983 pass 6984 6985 d = D() 6986 6987 # D() is an instance of all specified superclasses 6988 self.assertIs(isinstance(d, A), True) 6989 self.assertIs(isinstance(d, B), True) 6990 self.assertIs(isinstance(d, C), True) 6991 self.assertIs(isinstance(d, D), True) 6992 6993 # D() is not an instance of builtin types except object 6994 self.assertIs(isinstance(d, object), True) 6995 self.assertIs(isinstance(d, list), False) 6996 6997 # D is an instance type, but D() is not 6998 self.assertIs(isinstance(D, type), True) 6999 self.assertIs(isinstance(d, type), False) 7000 7001 def test_isinstance_with_type_checks_instance_type_and_dunder_class(self): 7002 class A(int): 7003 __class__ = list 7004 7005 a = A() 7006 self.assertIs(isinstance(a, int), True) 7007 self.assertIs(isinstance(a, list), True) 7008 7009 def test_isinstance_with_nontype_checks_dunder_bases_and_dunder_class(self): 7010 class A: 7011 __bases__ = () 7012 7013 a = A() 7014 7015 class B: 7016 __bases__ = (a,) 7017 7018 b = B() 7019 7020 class C(int): 7021 __class__ = b 7022 __bases__ = (int,) 7023 7024 c = C() 7025 self.assertIs(isinstance(c, a), True) 7026 self.assertIs(isinstance(c, b), True) 7027 self.assertIs(isinstance(c, c), False) 7028 7029 def test_isinstance_with_non_tuple_dunder_bases_raises_type_error(self): 7030 class A: 7031 __bases__ = 5 7032 7033 self.assertRaisesRegex( 7034 TypeError, 7035 r"isinstance\(\) arg 2 must be a type.* tuple of types", 7036 isinstance, 7037 5, 7038 A(), 7039 ) 7040 7041 def test_isinstance_calls_custom_instancecheck_true(self): 7042 class Meta(type): 7043 def __instancecheck__(cls, obj): 7044 return [1] 7045 7046 class A(metaclass=Meta): 7047 pass 7048 7049 self.assertIs(isinstance(0, A), True) 7050 7051 def test_isinstance_calls_custom_instancecheck_false(self): 7052 class Meta(type): 7053 def __instancecheck__(cls, obj): 7054 return None 7055 7056 class A(metaclass=Meta): 7057 pass 7058 7059 class B(A): 7060 pass 7061 7062 self.assertIs(isinstance(A(), A), True) 7063 self.assertIs(isinstance(B(), A), False) 7064 7065 def test_isinstance_with_raising_instancecheck_propagates_error(self): 7066 class Desc: 7067 def __get__(self, obj, type): 7068 raise AttributeError("failed") 7069 7070 class Meta(type): 7071 __instancecheck__ = Desc() 7072 7073 class A(metaclass=Meta): 7074 pass 7075 7076 with self.assertRaises(AttributeError) as context: 7077 isinstance(2, A) 7078 self.assertEqual(str(context.exception), "failed") 7079 7080 def test_dunder_dict_copy_with_empty_instance_returns_empty_dict(self): 7081 class C: 7082 pass 7083 7084 result = C().__dict__.copy() 7085 self.assertIsInstance(result, dict) 7086 self.assertEqual(result, {}) 7087 7088 def test_dunder_dict_copy_returns_dict_with_attributes(self): 7089 class C: 7090 pass 7091 7092 instance = C() 7093 instance.a = 1 7094 instance.b = 2 7095 result = instance.__dict__.copy() 7096 self.assertIsInstance(result, dict) 7097 self.assertEqual(result, {"a": 1, "b": 2}) 7098 7099 7100class IsSubclassTests(unittest.TestCase): 7101 def test_issubclass_with_same_types_returns_true(self): 7102 self.assertIs(issubclass(int, int), True) 7103 7104 def test_issubclass_with_subclass_returns_true(self): 7105 self.assertIs(issubclass(bool, int), True) 7106 7107 def test_issubclass_with_superclass_returns_false(self): 7108 self.assertIs(issubclass(int, bool), False) 7109 7110 def test_issubclass_with_unrelated_types_returns_false(self): 7111 self.assertIs(issubclass(int, (dict, bytes, str)), False) 7112 7113 def test_issubclass_with_superclass_tuple_returns_true(self): 7114 self.assertIs(issubclass(bool, (int, "bad - not a type")), True) 7115 7116 def test_issubclass_with_non_type_subclass_raises_type_error(self): 7117 with self.assertRaises(TypeError) as context: 7118 issubclass("bad - not a type", str) 7119 self.assertEqual(str(context.exception), "issubclass() arg 1 must be a class") 7120 7121 def test_issubclass_with_non_type_superclass_raises_type_error(self): 7122 with self.assertRaises(TypeError) as context: 7123 issubclass(int, "bad - not a type") 7124 self.assertEqual( 7125 str(context.exception), 7126 "issubclass() arg 2 must be a class or tuple of classes", 7127 ) 7128 7129 def test_issubclass_with_non_type_in_tuple_raises_type_error(self): 7130 with self.assertRaises(TypeError) as context: 7131 issubclass(bool, ("bad - not a type", int)) 7132 self.assertEqual( 7133 str(context.exception), 7134 "issubclass() arg 2 must be a class or tuple of classes", 7135 ) 7136 7137 def test_issubclass_with_non_type_subclass_uses_bases(self): 7138 class A: 7139 __bases__ = (list,) 7140 7141 self.assertIs(issubclass(A(), list), True) 7142 7143 def test_issubclass_calls_custom_subclasscheck_true(self): 7144 class Meta(type): 7145 def __subclasscheck__(cls, subclass): 7146 return 1 7147 7148 class A(metaclass=Meta): 7149 pass 7150 7151 self.assertIs(issubclass(list, A), True) 7152 7153 def test_issubclass_calls_custom_subclasscheck_false(self): 7154 class Meta(type): 7155 def __subclasscheck__(cls, subclass): 7156 return [] 7157 7158 class A(metaclass=Meta): 7159 pass 7160 7161 class B(A): 7162 pass 7163 7164 self.assertIs(issubclass(B, A), False) 7165 7166 def test_issubclass_with_raising_subclasscheck_propagates_error(self): 7167 class Desc: 7168 def __get__(self, obj, type): 7169 raise AttributeError("failed") 7170 7171 class Meta(type): 7172 __subclasscheck__ = Desc() 7173 7174 class A(metaclass=Meta): 7175 pass 7176 7177 with self.assertRaises(AttributeError) as context: 7178 issubclass(bool, A) 7179 self.assertEqual(str(context.exception), "failed") 7180 7181 7182class IterTests(unittest.TestCase): 7183 def test_iter_with_no_dunder_iter_raises_type_error(self): 7184 class C: 7185 pass 7186 7187 c = C() 7188 7189 with self.assertRaises(TypeError) as context: 7190 iter(c) 7191 7192 self.assertEqual(str(context.exception), "'C' object is not iterable") 7193 7194 def test_iter_with_dunder_iter_calls_dunder_iter(self): 7195 class C: 7196 def __iter__(self): 7197 raise UserWarning("foo") 7198 7199 c = C() 7200 7201 with self.assertRaises(UserWarning) as context: 7202 iter(c) 7203 7204 self.assertEqual(str(context.exception), "foo") 7205 7206 def test_iter_with_raising_descriptor_dunder_iter_raises_type_error(self): 7207 dunder_get_called = False 7208 7209 class Desc: 7210 def __get__(self, obj, type): 7211 nonlocal dunder_get_called 7212 dunder_get_called = True 7213 raise UserWarning("foo") 7214 7215 class C: 7216 __iter__ = Desc() 7217 7218 c = C() 7219 7220 with self.assertRaises(TypeError) as context: 7221 iter(c) 7222 7223 self.assertEqual(str(context.exception), "'C' object is not iterable") 7224 self.assertTrue(dunder_get_called) 7225 7226 def test_iter_with_non_iterator_raises_type_error(self): 7227 class NonIter: 7228 pass 7229 7230 class Foo: 7231 def __iter__(self): 7232 return NonIter() 7233 7234 foo = Foo() 7235 with self.assertRaises(TypeError) as context: 7236 iter(foo) 7237 self.assertEqual( 7238 str(context.exception), "iter() returned non-iterator of type 'NonIter'" 7239 ) 7240 7241 def test_iter_with_none_dunder_iter_raises_type_error(self): 7242 class Foo: 7243 __iter__ = None 7244 7245 foo = Foo() 7246 with self.assertRaises(TypeError) as context: 7247 iter(foo) 7248 self.assertEqual(str(context.exception), "'Foo' object is not iterable") 7249 7250 7251class LenTests(unittest.TestCase): 7252 def test_len_without_class_dunder_len_raises_type_error(self): 7253 class Foo: 7254 pass 7255 7256 foo = Foo() 7257 foo.__len__ = lambda: 0 7258 with self.assertRaises(TypeError) as context: 7259 len(foo) 7260 self.assertEqual(str(context.exception), "object of type 'Foo' has no len()") 7261 7262 def test_len_without_non_int_dunder_len_raises_type_error(self): 7263 class Foo: 7264 def __len__(self): 7265 return "not an int" 7266 7267 foo = Foo() 7268 with self.assertRaises(TypeError) as context: 7269 len(foo) 7270 self.assertEqual( 7271 str(context.exception), "'str' object cannot be interpreted as an integer" 7272 ) 7273 7274 def test_len_with_dunder_len_returns_int(self): 7275 class Foo: 7276 def __len__(self): 7277 return 5 7278 7279 self.assertEqual(len(Foo()), 5) 7280 7281 def test_len_with_list_returns_list_length(self): 7282 self.assertEqual(len([1, 2, 3]), 3) 7283 7284 def test_len_with_non_container_raises_type_error(self): 7285 self.assertRaises(TypeError, len, 1) 7286 7287 7288class ListTests(unittest.TestCase): 7289 def test_list_with_empty_iterable(self): 7290 actual = list() # noqa: C408 7291 self.assertEqual(actual, []) 7292 7293 def test_list_with_iterable_as_list(self): 7294 actual = list([1, 2, 3]) # noqa: C410 7295 self.assertEqual(actual, [1, 2, 3]) 7296 7297 def test_list_with_iterable_as_tuple(self): 7298 actual = list((1, 2, 3)) # noqa: C410 7299 self.assertEqual(actual, [1, 2, 3]) 7300 7301 def test_list_with_general_iterable(self): 7302 actual = list({1: -1, 2: -1, 3: -1}) # noqa: C410 7303 self.assertEqual(actual, [1, 2, 3]) 7304 7305 7306class LocalsTests(unittest.TestCase): 7307 def test_returns_local_vars(self): 7308 def foo(): 7309 a = 4 7310 b = 5 7311 return locals() 7312 7313 result = foo() 7314 self.assertIsInstance(result, dict) 7315 self.assertEqual(len(result), 2) 7316 self.assertEqual(result["a"], 4) 7317 self.assertEqual(result["b"], 5) 7318 7319 def test_returns_free_vars(self): 7320 def foo(): 7321 a = 4 7322 7323 def bar(): 7324 nonlocal a 7325 a = 5 7326 return locals() 7327 7328 return bar() 7329 7330 result = foo() 7331 self.assertIsInstance(result, dict) 7332 self.assertEqual(len(result), 1) 7333 self.assertEqual(result["a"], 5) 7334 7335 def test_returns_cell_vars(self): 7336 def foo(): 7337 a = 4 7338 7339 def bar(b): 7340 return a + b 7341 7342 return locals() 7343 7344 result = foo() 7345 self.assertIsInstance(result, dict) 7346 self.assertEqual(len(result), 2) 7347 self.assertEqual(result["a"], 4) 7348 from types import FunctionType 7349 7350 self.assertIsInstance(result["bar"], FunctionType) 7351 7352 def test_caller_locals_in_class_body_returns_dict_with_class_variables(self): 7353 class C: 7354 foo = 4 7355 bar = 5 7356 baz = locals() 7357 7358 result = C.baz 7359 self.assertIsInstance(result, dict) 7360 self.assertEqual(result["foo"], 4) 7361 self.assertEqual(result["bar"], 5) 7362 7363 def test_caller_locals_in_exec_scope_returns_given_locals_instance(self): 7364 result_key = None 7365 result_value = None 7366 7367 class C: 7368 def __getitem__(self, key): 7369 if key == "locals": 7370 return locals 7371 raise Exception 7372 7373 def __setitem__(self, key, value): 7374 nonlocal result_key 7375 nonlocal result_value 7376 result_key = key 7377 result_value = value 7378 7379 c = C() 7380 7381 exec("result = locals()", {}, c) 7382 self.assertEqual(result_key, "result") 7383 self.assertIs(result_value, c) 7384 7385 7386class LongRangeIteratorTests(unittest.TestCase): 7387 def test_dunder_iter_returns_self(self): 7388 large_int = 2 ** 123 7389 it = iter(range(large_int)) 7390 self.assertEqual(iter(it), it) 7391 7392 def test_dunder_length_hint_returns_pending_length(self): 7393 large_int = 2 ** 123 7394 it = iter(range(large_int)) 7395 self.assertEqual(it.__length_hint__(), large_int) 7396 it.__next__() 7397 self.assertEqual(it.__length_hint__(), large_int - 1) 7398 7399 def test_dunder_next_returns_ints(self): 7400 large_int = 2 ** 123 7401 it = iter(range(large_int)) 7402 for i in [0, 1, 2, 3]: 7403 self.assertEqual(it.__next__(), i) 7404 7405 7406class MappingProxyTests(unittest.TestCase): 7407 def setUp(self): 7408 self.mappingproxy_type = type(type.__dict__) 7409 self.proxy = self.mappingproxy_type({"a": 4}) 7410 7411 def test_dunder_contains_with_non_mappingproxy_raises_type_error(self): 7412 with self.assertRaises(TypeError): 7413 self.mappingproxy_type.__contains__(None, None) 7414 7415 def test_dunder_contains_returns_result_from_mapping(self): 7416 self.assertTrue("a" in self.proxy) 7417 self.assertFalse("b" in self.proxy) 7418 7419 def test_dunder_delitem_doesn_not_exist(self): 7420 self.assertFalse(hasattr(self.mappingproxy_type, "__delitem__")) 7421 7422 def test_dunder_getitem_with_non_mappingproxy_type_error(self): 7423 with self.assertRaises(TypeError): 7424 self.mappingproxy_type.__getitem__(None, None) 7425 7426 def test_dunder_getitem_from_mapping(self): 7427 self.assertEqual(self.proxy["a"], 4) 7428 7429 def test_dunder_init_with_non_mapping_type_error(self): 7430 with self.assertRaises(TypeError) as context: 7431 self.mappingproxy_type(1) 7432 self.assertIn( 7433 "mappingproxy() argument must be a mapping, not int", str(context.exception) 7434 ) 7435 7436 def test_dunder_init_with_mapping_returns_mappingproxy(self): 7437 m = self.mappingproxy_type({"age": 999, "dexterity": -34}) 7438 self.assertIsInstance(m, self.mappingproxy_type) 7439 7440 def test_dunder_iter_with_non_mappingproxy_type_error(self): 7441 with self.assertRaises(TypeError): 7442 self.mappingproxy_type.__iter__(None) 7443 7444 def test_dunder_iter_returns_result_from_mapping(self): 7445 it = iter(self.proxy) 7446 self.assertEqual(next(it), "a") 7447 with self.assertRaises(StopIteration): 7448 next(it) 7449 7450 def test_dunder_len_with_non_mappingproxy_type_error(self): 7451 with self.assertRaises(TypeError): 7452 self.mappingproxy_type.__len__(None) 7453 7454 def test_dunder_len_returns_result_from_mapping(self): 7455 self.assertEqual(len(self.proxy), 1) 7456 7457 def test_dunder_repr_with_non_mappingproxy_type_error(self): 7458 with self.assertRaises(TypeError): 7459 self.mappingproxy_type.__repr__(None) 7460 7461 def test_dunder_repr_returns_result_from_mapping_with_mappingproxy_prefix(self): 7462 self.assertEqual(repr(self.proxy), "mappingproxy({'a': 4})") 7463 7464 def test_dunder_setitem_doesn_not_exist(self): 7465 self.assertFalse(hasattr(self.mappingproxy_type, "__setitem__")) 7466 7467 def test_clear_doesn_not_exist(self): 7468 self.assertFalse(hasattr(self.mappingproxy_type, "clear")) 7469 7470 def test_copy_with_non_mappingproxy_type_error(self): 7471 with self.assertRaises(TypeError): 7472 self.mappingproxy_type.copy(None) 7473 7474 def test_items_returns_result_from_mapping(self): 7475 it = iter(self.proxy.items()) 7476 self.assertEqual(next(it), ("a", 4)) 7477 with self.assertRaises(StopIteration): 7478 next(it) 7479 7480 def test_keys_with_non_mappingproxy_type_error(self): 7481 with self.assertRaises(TypeError): 7482 self.mappingproxy_type.keys(None) 7483 7484 def test_keys_returns_result_from_mapping(self): 7485 it = iter(self.proxy.keys()) 7486 self.assertEqual(next(it), "a") 7487 with self.assertRaises(StopIteration): 7488 next(it) 7489 7490 def test_pop_doesn_not_exist(self): 7491 self.assertFalse(hasattr(self.mappingproxy_type, "pop")) 7492 7493 def test_popitem_doesn_not_exist(self): 7494 self.assertFalse(hasattr(self.mappingproxy_type, "popitem")) 7495 7496 def test_setdefault_doesn_not_exist(self): 7497 self.assertFalse(hasattr(self.mappingproxy_type, "setdefault")) 7498 7499 def test_update_doesn_not_exist(self): 7500 self.assertFalse(hasattr(self.mappingproxy_type, "update")) 7501 7502 def test_values_with_non_mappingproxy_type_error(self): 7503 with self.assertRaises(TypeError): 7504 self.mappingproxy_type.values(None) 7505 7506 def test_values_with_non_mappingproxy_type_error(self): 7507 it = iter(self.proxy.values()) 7508 self.assertEqual(next(it), 4) 7509 with self.assertRaises(StopIteration): 7510 next(it) 7511 7512 7513class MemoryviewTests(unittest.TestCase): 7514 def test_ndim_returns_default_value(self): 7515 view = memoryview(b"foobar") 7516 self.assertEqual(view.ndim, 1) 7517 7518 def test_strides_returns_default_value(self): 7519 view = memoryview(b"foobar") 7520 self.assertEqual(view.strides, (1,)) 7521 7522 def test_shape_returns_default_value(self): 7523 view = memoryview(b"foobar") 7524 self.assertEqual(view.shape, (6,)) 7525 7526 def test_dunder_eq_with_non_memoryview_self_raises_type_error(self): 7527 with self.assertRaises(TypeError): 7528 memoryview.__eq__(1, 2) 7529 7530 def test_dunder_eq_with_non_memoryview_other_returns_not_implemented(self): 7531 view = memoryview(b"foobar") 7532 self.assertIs(view.__eq__(1), NotImplemented) 7533 7534 def test_dunder_eq_with_same_object_returns_true(self): 7535 view = memoryview(b"foobar") 7536 self.assertIs(True, view.__eq__(view)) 7537 7538 def test_dunder_eq_with_same_bytes_object_returns_true(self): 7539 content = b"foobar" 7540 view = memoryview(content) 7541 comp = memoryview(content) 7542 self.assertIs(True, view.__eq__(comp)) 7543 7544 def test_dunder_eq_with_matching_bytes_returns_true(self): 7545 content = b"foobar" 7546 view = memoryview(content) 7547 self.assertIs(True, view.__eq__(content)) 7548 7549 def test_dunder_eq_with_matching_bytearray_returns_true(self): 7550 content = bytearray(b"foobar") 7551 view = memoryview(content) 7552 self.assertIs(True, view.__eq__(content)) 7553 7554 def test_dunder_eq_with_sliced_memoryview_returns_false(self): 7555 view = memoryview(b"123456") 7556 sliced = view[:2] 7557 result = memoryview(b"12") 7558 self.assertIs(True, sliced.__eq__(result)) 7559 7560 def test_dunder_eq_different_memoryview_values_returns_false(self): 7561 view = memoryview(b"123456") 7562 comp = memoryview(b"135") 7563 self.assertIs(False, view.__eq__(comp)) 7564 7565 def test_dunder_enter_and_dunder_exit(self): 7566 view = memoryview(b"foobar") 7567 with view as ctx: 7568 self.assertIs(view, ctx) 7569 7570 def test_format_returns_format_string(self): 7571 view = memoryview(b"asde") 7572 self.assertEqual(view.format, "B") 7573 self.assertEqual(view.cast("h").format, "h") 7574 7575 def test_format_is_read_only(self): 7576 view = memoryview(b"asde") 7577 with self.assertRaises(AttributeError): 7578 view.format = "h" 7579 7580 def test_object_with_bytes_returns_original_object(self): 7581 b = b"foo" 7582 bytes_mem = memoryview(b) 7583 self.assertIs(bytes_mem.obj, b) 7584 7585 ba = bytearray(b"foo") 7586 bytearray_mem = memoryview(ba) 7587 self.assertIs(bytearray_mem.obj, ba) 7588 7589 def test_object_with_bytes_subclass_returns_original_object(self): 7590 class BytesSub(bytes): 7591 pass 7592 7593 bytes_sub = BytesSub(b"foo") 7594 bytes_sub_mem = memoryview(bytes_sub) 7595 self.assertIs(bytes_sub_mem.obj, bytes_sub) 7596 7597 def test_object_with_mmap_returns_original_object(self): 7598 from mmap import mmap 7599 7600 memory = mmap(-1, 4) 7601 memory_mem = memoryview(memory) 7602 self.assertIs(memory_mem.obj, memory) 7603 memory_mem_mem = memoryview(memory_mem)[1:] 7604 self.assertIs(memory_mem_mem.obj, memory) 7605 7606 def test_dunder_getitem_with_non_memoryview_raises_type_error(self): 7607 self.assertRaisesRegex( 7608 TypeError, 7609 "'__getitem__' .* 'memoryview' object.* a 'NoneType'", 7610 memoryview.__getitem__, 7611 None, 7612 1, 7613 ) 7614 7615 def test_dunder_getitem_index_too_large_raises_index_error(self): 7616 view = memoryview(b"12345678").cast("I") 7617 with self.assertRaises(IndexError) as context: 7618 memoryview.__getitem__(view, 2) 7619 self.assertIn("index out of bounds", str(context.exception)) 7620 7621 def test_dunder_getitem_index_too_small_raises_index_error(self): 7622 view = memoryview(bytes()) 7623 with self.assertRaises(IndexError) as context: 7624 memoryview.__getitem__(view, -1) 7625 self.assertIn("index out of bounds", str(context.exception)) 7626 7627 def test_dunder_getitem_with_positive_index_returns_value(self): 7628 view = memoryview(b"hello") 7629 self.assertEqual(view[1], ord("e")) 7630 7631 def test_dunder_getitem_with_positive_index_returns_value_on_sliced_mv(self): 7632 view = memoryview(b"drive") 7633 sliced = view[2:] 7634 self.assertEqual(sliced[1], ord("v")) 7635 7636 def test_dunder_getitem_with_negative_index_returns_value(self): 7637 view = memoryview(b"negative") 7638 self.assertEqual(view[-2], ord("v")) 7639 7640 def test_dunder_getitem_with_negative_index_returns_value_on_sliced_mv(self): 7641 view = memoryview(b"negativo") 7642 sliced = view[:3] 7643 self.assertEqual(sliced[-2], ord("e")) 7644 7645 def test_dunder_getitem_with_negative_index_relative_to_end_value(self): 7646 view = memoryview(b"bam") 7647 self.assertEqual(memoryview.__getitem__(view, -3), ord("b")) 7648 7649 def test_dunder_getitem_with_valid_indices_returns_submemoryview(self): 7650 view = memoryview(b"movie") 7651 self.assertEqual(memoryview.__getitem__(view, slice(2, -1)), b"vi") 7652 7653 def test_dunder_getitem_with_negative_start_returns_trailing(self): 7654 view = memoryview(b"bam") 7655 self.assertEqual(memoryview.__getitem__(view, slice(-2, 5)), b"am") 7656 7657 def test_dunder_getitem_with_positive_stop_returns_leading(self): 7658 view = memoryview(b"bam") 7659 self.assertEqual(memoryview.__getitem__(view, slice(2)), b"ba") 7660 7661 def test_dunder_getitem_with_negative_stop_returns_all_but_trailing(self): 7662 view = memoryview(b"bam") 7663 self.assertEqual(memoryview.__getitem__(view, slice(-2)), b"b") 7664 7665 def test_dunder_getitem_with_large_negative_start_returns_copy(self): 7666 view = memoryview(b"bam") 7667 self.assertEqual(memoryview.__getitem__(view, slice(-10, 10)), view) 7668 7669 def test_dunder_getitem_with_large_positive_start_returns_empty(self): 7670 view = memoryview(b"bam") 7671 self.assertEqual(memoryview.__getitem__(view, slice(10, 10)), b"") 7672 7673 def test_dunder_getitem_with_large_negative_stop_returns_empty(self): 7674 view = memoryview(b"bam") 7675 self.assertEqual(memoryview.__getitem__(view, slice(-10)), b"") 7676 7677 def test_dunder_getitem_with_int_subclass_does_not_call_dunder_index(self): 7678 class C(int): 7679 def __index__(self): 7680 raise ValueError("foo") 7681 7682 view = memoryview(b"asde") 7683 self.assertEqual(memoryview.__getitem__(view, C(0)), ord("a")) 7684 7685 def test_dunder_getitem_with_raising_descriptor_propagates_exception(self): 7686 class Desc: 7687 def __get__(self, obj, type): 7688 raise AttributeError("foo") 7689 7690 class C: 7691 __index__ = Desc() 7692 7693 view = memoryview(b"asde") 7694 with self.assertRaises(AttributeError) as context: 7695 memoryview.__getitem__(view, C()) 7696 self.assertEqual(str(context.exception), "foo") 7697 7698 def test_dunder_getitem_with_non_int_raises_type_error(self): 7699 view = memoryview(b"asde") 7700 with self.assertRaises(TypeError): 7701 memoryview.__getitem__(view, "3") 7702 7703 def test_dunder_getitem_with_dunder_index_calls_dunder_index(self): 7704 class C: 7705 def __index__(self): 7706 return 2 7707 7708 view = memoryview(b"asde") 7709 self.assertEqual(memoryview.__getitem__(view, C()), ord("d")) 7710 7711 def test_dunder_getitem_with_class_with_index(self): 7712 class IndSet: 7713 def __index__(self): 7714 return 0 7715 7716 view = memoryview(b"hello") 7717 self.assertEqual(view[IndSet()], ord("h")) 7718 7719 def test_dunder_new_with_bytes_subclass_returns_memoryview(self): 7720 class C(bytes): 7721 pass 7722 7723 view = memoryview(C(b"hello")) 7724 self.assertIsInstance(view, memoryview) 7725 self.assertEqual(view, b"hello") 7726 7727 def test_itemsize_returns_size_of_item_chars(self): 7728 src = b"abcd" 7729 view = memoryview(src) 7730 self.assertEqual(view.itemsize, 1) 7731 7732 def test_itemsize_returns_size_of_item_ints(self): 7733 src = b"abcdefgh" 7734 view = memoryview(src).cast("i") 7735 self.assertEqual(view.itemsize, 4) 7736 7737 def test_mmap_creates_memoryview_with_correct_permissions(self): 7738 import mmap 7739 7740 writable = mmap.mmap(-1, 6) 7741 writable_view = memoryview(writable) 7742 self.assertEqual(writable_view.readonly, False) 7743 self.assertEqual(writable_view.format, "B") 7744 self.assertEqual(writable_view.nbytes, 6) 7745 del writable_view 7746 writable.close() 7747 7748 readable = mmap.mmap(-1, 6, access=mmap.ACCESS_READ) 7749 readable_view = memoryview(readable) 7750 self.assertEqual(readable_view.readonly, True) 7751 self.assertEqual(readable_view.format, "B") 7752 self.assertEqual(readable_view.nbytes, 6) 7753 del readable_view 7754 readable.close() 7755 7756 def test_nbytes_returns_size_of_memoryview(self): 7757 view = memoryview(b"foobar") 7758 self.assertEqual(view.nbytes, 6) 7759 7760 def test_release_does_nothing(self): 7761 view = memoryview(b"foobar") 7762 view.release() 7763 7764 def test_setitem_with_non_memoryview_raises_type_error(self): 7765 self.assertRaisesRegex( 7766 TypeError, 7767 "'__setitem__' .* 'memoryview' object.* a 'NoneType'", 7768 memoryview.__setitem__, 7769 None, 7770 1, 7771 1, 7772 ) 7773 7774 def test_setitem_with_bytes_memoryview_raises_type_error(self): 7775 view = memoryview(b"foobar") 7776 with self.assertRaises(TypeError) as context: 7777 view[0] = 1 7778 self.assertIn("cannot modify read-only memory", str(context.exception)) 7779 7780 def test_setitem_with_too_big_index_raises_index_error(self): 7781 view = memoryview(bytearray(b"12345678")).cast("I") 7782 with self.assertRaises(IndexError) as context: 7783 view[2] = None 7784 self.assertIn("index out of bounds", str(context.exception)) 7785 7786 def test_setitem_with_negative_index(self): 7787 view = memoryview(bytearray(b"hello")) 7788 m = ord("m") 7789 view[-2] = m 7790 self.assertEqual(view[3], m) 7791 7792 def test_setitem_with_class_with_index(self): 7793 class IndSet: 7794 def __index__(self): 7795 return 0 7796 7797 view = memoryview(bytearray(b"hello")) 7798 m = ord("m") 7799 view[IndSet()] = m 7800 self.assertEqual(view[0], m) 7801 7802 def test_setitem_with_slices_and_non_byteslike_raises_type_error(self): 7803 view = memoryview(bytearray(b"hello")) 7804 with self.assertRaises(TypeError) as context: 7805 view[:1] = 0 7806 self.assertIn( 7807 "a bytes-like object is required, not 'int'", str(context.exception) 7808 ) 7809 7810 def test_setitem_with_bytes_and_different_format_raises_value_error(self): 7811 view = memoryview(bytearray(b"0000")).cast("h") 7812 with self.assertRaises(ValueError) as context: 7813 view[:1] = b"a" 7814 self.assertIn( 7815 "memoryview assignment: lvalue and rvalue have different structures", 7816 str(context.exception), 7817 ) 7818 7819 def test_setitem_with_bytearray_and_different_format_raises_value_error(self): 7820 view = memoryview(bytearray(b"0000")).cast("h") 7821 with self.assertRaises(ValueError) as context: 7822 view[:1] = bytearray(b"a") 7823 self.assertIn( 7824 "memoryview assignment: lvalue and rvalue have different structures", 7825 str(context.exception), 7826 ) 7827 7828 def test_setitem_with_memoryview_and_different_format_raises_value_error(self): 7829 view = memoryview(bytearray(b"0000")).cast("h") 7830 with self.assertRaises(ValueError) as context: 7831 view[:1] = memoryview(b"a") 7832 self.assertIn( 7833 "memoryview assignment: lvalue and rvalue have different structures", 7834 str(context.exception), 7835 ) 7836 7837 def test_setitem_with_byteslike_of_wrong_size_raises_value_error(self): 7838 view = memoryview(bytearray(b"0000")) 7839 with self.assertRaises(ValueError) as context: 7840 view[:2] = memoryview(b"a") 7841 self.assertIn( 7842 "memoryview assignment: lvalue and rvalue have different structures", 7843 str(context.exception), 7844 ) 7845 7846 def test_setitem_with_zero_len_slice_and_empty_bytes_raises_type_error(self): 7847 content = b"foobar" 7848 view = memoryview(content) 7849 with self.assertRaises(TypeError) as context: 7850 view[:0] = b"" 7851 self.assertIn("cannot modify read-only memory", str(context.exception)) 7852 7853 def test_setitem_with_zero_len_slice_and_nonempty_bytes_raises_value_error(self): 7854 content = bytearray(b"foobar") 7855 view = memoryview(content) 7856 with self.assertRaises(ValueError) as context: 7857 view[:0] = b"123" 7858 self.assertIn( 7859 "memoryview assignment: lvalue and rvalue have different structures", 7860 str(context.exception), 7861 ) 7862 7863 def test_setitem_with_zero_len_slice_and_empty_bytes_value_returns_mv_unmodified( 7864 self, 7865 ): 7866 content = bytearray(b"foobar") 7867 view = memoryview(content) 7868 view[:0] = b"" 7869 self.assertEqual(view, b"foobar") 7870 7871 def test_setitem_with_zero_len_slice_and_empty_mv_value_returns_mv_unmodified(self): 7872 content = bytearray(b"foobar") 7873 view = memoryview(content) 7874 view[:0] = memoryview(b"") 7875 self.assertEqual(view, b"foobar") 7876 7877 def test_setitem_with_zero_len_slice_and_negative_stop_returns_mv_unmodified(self): 7878 content = bytearray(b"foobar") 7879 view = memoryview(content) 7880 view[:-6] = b"" 7881 self.assertEqual(view, b"foobar") 7882 7883 def test_setitem_with_slices_and_bytes_and_step_1(self): 7884 view = memoryview(bytearray(b"0000")) 7885 view[:2] = b"zz" 7886 self.assertEqual(view, b"zz00") 7887 7888 def test_setitem_with_slices_and_bytearray_and_step_1(self): 7889 view = memoryview(bytearray(b"0000")) 7890 view[1:3] = bytearray(b"zz") 7891 self.assertEqual(view, b"0zz0") 7892 7893 def test_setitem_with_slices_and_memoryview_byte_format_and_step_1(self): 7894 view = memoryview(bytearray(b"0000")) 7895 view[:2] = memoryview(b"zz") 7896 self.assertEqual(view, b"zz00") 7897 7898 def test_setitem_with_slices_and_memoryview_short_format_and_step_1(self): 7899 view = memoryview(bytearray(b"0000")) 7900 short_view = view.cast("h") 7901 short_view[:1] = memoryview(b"zz").cast("h") 7902 self.assertEqual(view, b"zz00") 7903 7904 def test_setitem_with_slices_and_bytes_and_step_2(self): 7905 view = memoryview(bytearray(b"0000")) 7906 view[::2] = b"zz" 7907 self.assertEqual(view, b"z0z0") 7908 7909 def test_setitem_with_slices_and_bytearray_and_step_2(self): 7910 view = memoryview(bytearray(b"0000")) 7911 view[1::2] = bytearray(b"zz") 7912 self.assertEqual(view, b"0z0z") 7913 7914 def test_setitem_with_slices_and_memoryview_byte_format_and_step_2(self): 7915 view = memoryview(bytearray(b"0000")) 7916 view[::2] = memoryview(b"zz") 7917 self.assertEqual(view, b"z0z0") 7918 7919 def test_setitem_with_slices_and_memoryview_short_format_and_step_2(self): 7920 view = memoryview(bytearray(b"000000")) 7921 short_view = view.cast("h") 7922 short_view[1::2] = memoryview(b"zz").cast("h") 7923 self.assertEqual(view, b"00zz00") 7924 7925 def test_tobytes_with_non_memoryview_raises_type_error(self): 7926 with self.assertRaisesRegex( 7927 TypeError, "'tobytes'.*'memoryview' object.* a 'int'" 7928 ): 7929 memoryview.tobytes(42) 7930 7931 def test_tobytes_with_bytes_returns_bytes(self): 7932 self.assertEqual(memoryview(b"").tobytes(), b"") 7933 self.assertEqual(memoryview(b"short").tobytes(), b"short") 7934 self.assertEqual(memoryview(b"hello world").tobytes(), b"hello world") 7935 v0 = memoryview(b"hello") 7936 self.assertEqual(v0[0:3].tobytes(), b"hel") 7937 self.assertEqual(v0[:4].cast("i").tobytes(), b"hell") 7938 7939 def test_tobytes_with_bytearray_returns_bytes(self): 7940 self.assertEqual(memoryview(bytearray(b"")).tobytes(), b"") 7941 self.assertEqual(memoryview(bytearray(b"short")).tobytes(), b"short") 7942 self.assertEqual(memoryview(bytearray(b"hello world")).tobytes(), b"hello world") 7943 v0 = memoryview(bytearray(b"hello")) 7944 self.assertEqual(v0[0:3].tobytes(), b"hel") 7945 self.assertEqual(v0[:4].cast("i").tobytes(), b"hell") 7946 7947 def test_tolist_with_non_memoryview_raises_type_error(self): 7948 self.assertRaisesRegex( 7949 TypeError, 7950 "'tolist' .* 'memoryview' object.* a 'NoneType'", 7951 memoryview.tolist, 7952 None, 7953 ) 7954 7955 def test_tolist_returns_list_of_elements(self): 7956 src = b"hello" 7957 view = memoryview(src) 7958 self.assertEqual(view.tolist(), [104, 101, 108, 108, 111]) 7959 7960 def test_tolist_withitemsize_greater_than_one(self): 7961 src = b"abcd" 7962 view = memoryview(src).cast("i") 7963 self.assertEqual(view.tolist(), [1684234849]) 7964 7965 def test_tolist_with_empty_memoryview_returns_empty_list(self): 7966 src = b"" 7967 view = memoryview(src) 7968 self.assertEqual(view.tolist(), []) 7969 7970 7971class MethodTests(unittest.TestCase): 7972 def test_dunder_new_with_non_callable_func_raises_type_error(self): 7973 class C: 7974 def method(self): 7975 pass 7976 7977 instance = C() 7978 method_type = type(instance.method) 7979 with self.assertRaises(TypeError) as context: 7980 method_type.__new__(method_type, 1, "foo") 7981 7982 self.assertEqual(str(context.exception), "first argument must be callable") 7983 7984 def test_dunder_new_with_none_self_raises_type_error(self): 7985 class C: 7986 def method(self): 7987 pass 7988 7989 def non_method_function(self): 7990 return self.value 7991 7992 instance = C() 7993 method_type = type(instance.method) 7994 with self.assertRaises(TypeError) as context: 7995 method_type.__new__(method_type, non_method_function, None) 7996 7997 self.assertEqual(str(context.exception), "self must not be None") 7998 7999 def test_dunder_new_returns_bound_method(self): 8000 class C: 8001 def __init__(self, value): 8002 self.value = value 8003 8004 def method(self): 8005 pass 8006 8007 def non_method_function(self): 8008 return self.value 8009 8010 instance = C(10) 8011 method_type = type(instance.method) 8012 result = method_type.__new__(method_type, non_method_function, instance) 8013 self.assertIsInstance(result, method_type) 8014 self.assertEqual(result.__func__, non_method_function) 8015 self.assertEqual(result.__self__, instance) 8016 self.assertEqual(result(), 10) 8017 8018 def test_has_dunder_call(self): 8019 class C: 8020 def bar(self): 8021 pass 8022 8023 C().bar.__getattribute__("__call__") 8024 8025 8026class ModuleTests(unittest.TestCase): 8027 def test_delattr_deletes_module_attribute(self): 8028 from types import ModuleType 8029 8030 m = ModuleType("") 8031 m.fld = 4 8032 self.assertTrue(hasattr(m, "fld")) 8033 self.assertIs(m.__delattr__("fld"), None) 8034 self.assertFalse(hasattr(m, "fld")) 8035 8036 def test_delattr_raises_type_error_with_instance(self): 8037 from types import ModuleType 8038 8039 class C: 8040 fld = 4 8041 8042 c = C() 8043 self.assertRaisesRegex( 8044 TypeError, 8045 "'__delattr__' .* 'module' object.* a 'C'", 8046 ModuleType.__delattr__, 8047 c, 8048 "fld", 8049 ) 8050 8051 def test_del_invalidates_cache(self): 8052 from types import ModuleType 8053 8054 mymodule = ModuleType("mymodule") 8055 mymodule.x = 40 8056 exec("def foo(): return x", mymodule.__dict__) 8057 result = mymodule.foo() 8058 self.assertEqual(result, 40) 8059 8060 del mymodule.x 8061 8062 with self.assertRaises(NameError) as context: 8063 mymodule.foo() 8064 self.assertEqual(str(context.exception), "name 'x' is not defined") 8065 8066 def test_dunder_dict_with_non_module_raises_type_error(self): 8067 from types import ModuleType 8068 8069 with self.assertRaises(TypeError): 8070 ModuleType.__dict__["__dict__"].__get__(42) 8071 8072 def test_dunder_dir_returns_newly_created_list_object(self): 8073 from types import ModuleType 8074 8075 mymodule = ModuleType("mymodule") 8076 self.assertEqual(type(mymodule.__dir__()), list) 8077 self.assertIsNot(mymodule.__dir__(), mymodule.__dir__()) 8078 8079 def test_dunder_dir_returns_list_containing_module_attributes(self): 8080 from types import ModuleType 8081 8082 mymodule = ModuleType("mymodule") 8083 mymodule.x = 40 8084 mymodule.y = 50 8085 result = mymodule.__dir__() 8086 self.assertIn("x", result) 8087 self.assertIn("y", result) 8088 8089 def test_dunder_dir_returns_list_containing_added_module_attributes(self): 8090 from types import ModuleType 8091 8092 mymodule = ModuleType("mymodule") 8093 self.assertNotIn("z", mymodule.__dir__()) 8094 8095 mymodule.z = 60 8096 self.assertIn("z", mymodule.__dir__()) 8097 8098 def test_dunder_dir_returns_list_not_containing_deleted_module_attributes(self): 8099 from types import ModuleType 8100 8101 mymodule = ModuleType("mymodule") 8102 mymodule.x = 40 8103 self.assertIn("x", mymodule.__dir__()) 8104 8105 del mymodule.x 8106 self.assertNotIn("x", mymodule.__dir__()) 8107 8108 def test_dunder_new_with_subclass_returns_object(self): 8109 from types import ModuleType 8110 8111 class C(ModuleType): 8112 pass 8113 8114 m = ModuleType.__new__(C) 8115 self.assertEqual(type(m), C) 8116 self.assertIsInstance(m, ModuleType) 8117 # Do some sanity checking that half-initialized modules do not crash. 8118 self.assertEqual(repr(m), "<module '?'>") 8119 with self.assertRaises(AttributeError) as context: 8120 ModuleType.__getattribute__(m, "foo") 8121 self.assertEqual(str(context.exception), "module has no attribute 'foo'") 8122 8123 def test_dunder_new_accepts_extra_arguments(self): 8124 from types import ModuleType 8125 8126 m = ModuleType.__new__(ModuleType, 42, "foo", bar=None) 8127 self.assertIsInstance(m, ModuleType) 8128 self.assertEqual(repr(m), "<module '?'>") 8129 8130 def test_dunder_init_sets_fields(self): 8131 from types import ModuleType 8132 8133 m = ModuleType.__new__(ModuleType) 8134 ModuleType.__init__(m, "foo") 8135 self.assertEqual( 8136 dir(m), ["__doc__", "__loader__", "__name__", "__package__", "__spec__"] 8137 ) 8138 self.assertIs(m.__doc__, None) 8139 self.assertIs(m.__loader__, None) 8140 self.assertEqual(m.__name__, "foo") 8141 self.assertIs(m.__package__, None) 8142 self.assertIs(m.__spec__, None) 8143 8144 def test_dunder_new_with_non_type_raises_type_error(self): 8145 from types import ModuleType 8146 8147 with self.assertRaises(TypeError) as context: 8148 ModuleType.__new__(42, "") 8149 self.assertEqual( 8150 str(context.exception), "module.__new__(X): X is not a type object (int)" 8151 ) 8152 8153 def test_dunder_new_with_non_module_subtype_raise_type_error(self): 8154 from types import ModuleType 8155 8156 class C: 8157 pass 8158 8159 with self.assertRaises(TypeError) as context: 8160 ModuleType.__new__(C, "") 8161 self.assertEqual( 8162 str(context.exception), "module.__new__(C): C is not a subtype of module" 8163 ) 8164 8165 def test_non_module_with_module_getattribute(self): 8166 from types import ModuleType 8167 8168 class C: 8169 __getattribute__ = ModuleType.__getattribute__ 8170 8171 c = C() 8172 with self.assertRaises(TypeError): 8173 c.foo 8174 8175 def test_module_subclass_getattribute(self): 8176 from types import ModuleType 8177 8178 class M(ModuleType): 8179 pass 8180 8181 mod = M("a_module") 8182 mod.foo = "bar" 8183 # TODO(T58719879): Add a test that reliably uses LOAD_ATTR_MODULE as 8184 # appropriate in Pyro. 8185 for _i in range(2): 8186 self.assertEqual(mod.foo, "bar") 8187 8188 8189class ModuleProxyTests(unittest.TestCase): 8190 def setUp(self): 8191 from types import ModuleType 8192 8193 self.module = ModuleType("test_module") 8194 self.module_proxy = self.module.__dict__ 8195 8196 # Create a placeholder in the module dict for a builtin. 8197 module_code = """ 8198def make_placeholder(): 8199 return placeholder 8200 """ 8201 exec(module_code, self.module_proxy) 8202 8203 builtins = ModuleType("builtins") 8204 builtins.placeholder = "builtin_value" 8205 self.module.__builtins__ = builtins 8206 self.assertEqual(self.module.make_placeholder(), "builtin_value") 8207 8208 def test_dunder_contains_with_non_module_proxy_raises_type_error(self): 8209 with self.assertRaises(TypeError): 8210 type(self.module_proxy).__contains__(None, None) 8211 8212 def test_dunder_contains_returns_true_for_existing_item(self): 8213 self.module.x = 40 8214 self.assertTrue(self.module_proxy.__contains__("x")) 8215 8216 def test_dunder_contains_returns_false_for_not_existing_item(self): 8217 self.assertFalse(self.module_proxy.__contains__("x")) 8218 8219 def test_dunder_contains_returns_false_for_placeholder(self): 8220 self.assertFalse(self.module_proxy.__contains__("placeholder")) 8221 8222 def test_dunder_repr_returns_string(self): 8223 from types import ModuleType 8224 8225 module_proxy = ModuleType("my_module").__dict__ 8226 for key in tuple(module_proxy.keys()): 8227 if key != "__name__": 8228 del module_proxy[key] 8229 8230 self.assertEqual(module_proxy.__repr__(), "{'__name__': 'my_module'}") 8231 8232 def test_dunder_repr_with_recursion_returns_string_with_ellipsis(self): 8233 from types import ModuleType 8234 8235 module_proxy = ModuleType("my_module").__dict__ 8236 for key in tuple(module_proxy.keys()): 8237 del module_proxy[key] 8238 module_proxy["self"] = module_proxy 8239 8240 self.assertEqual(module_proxy.__repr__(), "{'self': {...}}") 8241 8242 def test_copy_with_non_module_proxy_raises_type_error(self): 8243 with self.assertRaises(TypeError): 8244 type(self.module_proxy).copy(None) 8245 8246 def test_copy_returns_dict_copy(self): 8247 self.module.x = 40 8248 result = self.module_proxy.copy() 8249 self.assertEqual(type(result), dict) 8250 self.assertEqual(result["x"], 40) 8251 self.module.y = 50 8252 self.assertNotIn("y", result) 8253 8254 def test_dunder_delitem_with_non_module_proxy_raises_type_error(self): 8255 with self.assertRaises(TypeError): 8256 self.module_proxy.__delitem__(None, None) 8257 8258 def test_dunder_delitem_deletes_module_variable_and_raises_name_error(self): 8259 module_code = """ 8260x = 40 8261def foo(): 8262 return x 8263foo() 8264 """ 8265 exec(module_code, self.module_proxy) 8266 self.assertEqual(self.module.foo(), 40) 8267 8268 self.module_proxy.__delitem__("x") 8269 8270 with self.assertRaises(NameError) as context: 8271 self.module.foo() 8272 self.assertIn("name 'x' is not defined", str(context.exception)) 8273 8274 def test_dunder_delitem_for_non_existing_key_raises_key_error(self): 8275 with self.assertRaises(KeyError) as context: 8276 self.module_proxy.__delitem__("x") 8277 self.assertIn("'x'", str(context.exception)) 8278 8279 def test_clear_with_non_module_proxy_raises_type_error(self): 8280 with self.assertRaises(TypeError): 8281 self.module_proxy.clear(None) 8282 8283 def test_clear_deletes_module_variables_and_raises_attribute_error(self): 8284 module_code = """ 8285x = 40 8286def foo(): 8287 return x 8288foo() 8289 """ 8290 exec(module_code, self.module_proxy) 8291 self.assertEqual(self.module.foo(), 40) 8292 8293 self.module_proxy.clear() 8294 8295 self.assertEqual(len(self.module_proxy), 0) 8296 self.assertNotIn("x", self.module_proxy) 8297 self.assertNotIn("foo", self.module_proxy) 8298 8299 with self.assertRaises(AttributeError) as context: 8300 self.module.foo() 8301 self.assertIn("has no attribute 'foo'", str(context.exception)) 8302 8303 def test_dunder_getitem_with_non_module_proxy_raises_type_error(self): 8304 with self.assertRaises(TypeError): 8305 type(self.module_proxy).__getitem__(None, None) 8306 8307 def test_dunder_getitem_for_existing_key_returns_that_item(self): 8308 self.module.x = 40 8309 self.assertEqual(self.module_proxy.__getitem__("x"), 40) 8310 8311 def test_dunder_getitem_for_not_existing_key_raises_key_error(self): 8312 with self.assertRaises(KeyError) as context: 8313 self.module_proxy.__getitem__("x") 8314 self.assertIn("'x'", str(context.exception)) 8315 8316 def test_dunder_getitem_for_placeholder_raises_key_error(self): 8317 with self.assertRaises(KeyError) as context: 8318 self.module_proxy.__getitem__("placeholder") 8319 self.assertIn("'placeholder'", str(context.exception)) 8320 8321 def test_dunder_iter_with_non_module_proxy_raises_type_error(self): 8322 with self.assertRaises(TypeError): 8323 type(self.module_proxy).__iter__(None) 8324 8325 def test_dunder_iter_returns_key_iterator(self): 8326 self.module.x = 40 8327 self.module.y = 50 8328 result = self.module_proxy.__iter__() 8329 self.assertTrue(hasattr(result, "__next__")) 8330 result_list = list(result) 8331 self.assertIn("x", result_list) 8332 self.assertIn("y", result_list) 8333 8334 def test_dunder_len_with_non_module_proxy_raises_type_error(self): 8335 with self.assertRaises(TypeError): 8336 type(self.module_proxy).__len__(None) 8337 8338 def test_dunder_len_returns_num_items(self): 8339 length = self.module_proxy.__len__() 8340 self.module.x = 40 8341 self.assertEqual(self.module_proxy.__len__(), length + 1) 8342 8343 def test_dunder_len_returns_num_items_excluding_placeholder(self): 8344 length = self.module_proxy.__len__() 8345 # Overwrite the existing placeholder by creating a real one under the same name. 8346 self.module.placeholder = 1 8347 self.assertEqual(self.module_proxy.__len__(), length + 1) 8348 8349 def test_dunder_repr_with_non_module_proxy_raises_type_error(self): 8350 with self.assertRaises(TypeError): 8351 type(self.module_proxy).__repr__(None) 8352 8353 def test_dunder_repr_returns_str_containing_existing_items(self): 8354 self.module.x = 40 8355 self.module.y = 50 8356 result = self.module_proxy.__repr__() 8357 self.assertIsInstance(result, str) 8358 self.assertIn("'x': 40", result) 8359 self.assertIn("'y': 50", result) 8360 8361 def test_dunder_repr_returns_str_not_containing_placeholder(self): 8362 result = self.module_proxy.__repr__() 8363 self.assertNotIn("'placeholder'", result) 8364 8365 def test_dunder_setitem_with_non_module_proxy_raises_type_error(self): 8366 with self.assertRaises(TypeError): 8367 type(self.module_proxy).__setitem__(None, None, None) 8368 8369 def test_dunder_setitem_sets_item_showing_up_in_module(self): 8370 self.module_proxy.__setitem__("a", 1) 8371 self.assertEqual(self.module.a, 1) 8372 8373 def test_dunder_setitem_with_existing_item_updates_module_variable(self): 8374 module_code = """ 8375x = 40 8376def foo(): 8377 return x 8378foo() 8379 """ 8380 exec(module_code, self.module_proxy) 8381 self.assertEqual(self.module.foo(), 40) 8382 8383 self.module_proxy.__setitem__("x", 50) 8384 self.assertEqual(self.module.foo(), 50) 8385 8386 def test_dunder_setitem_with_placeholder_updates_module_variable(self): 8387 module_code = """ 8388def foo(): 8389 return x 8390 """ 8391 exec(module_code, self.module_proxy) 8392 8393 from types import ModuleType 8394 8395 builtins = ModuleType("builtins") 8396 builtins.x = 40 8397 self.module.__builtins__ = builtins 8398 self.assertEqual(self.module.foo(), 40) 8399 8400 self.module_proxy.__setitem__("x", 50) 8401 self.assertEqual(self.module.foo(), 50) 8402 8403 def test_get_with_non_module_proxy_raises_type_error(self): 8404 with self.assertRaises(TypeError): 8405 type(self.module_proxy).get(None, None) 8406 8407 def test_get_returns_existing_item_value(self): 8408 self.module.x = 40 8409 self.assertEqual(self.module_proxy.get("x"), 40) 8410 8411 def test_get_with_default_for_non_existing_item_value_returns_that_default(self): 8412 self.assertEqual(self.module_proxy.get("x", -1), -1) 8413 8414 def test_get_for_non_existing_item_returns_none(self): 8415 self.assertIs(self.module_proxy.get("x"), None) 8416 8417 def test_get_for_placeholder_returns_none(self): 8418 self.assertIs(self.module_proxy.get("placeholder"), None) 8419 8420 def test_items_with_non_module_proxy_raises_type_error(self): 8421 with self.assertRaises(TypeError): 8422 type(self.module_proxy).items(None) 8423 8424 def test_items_returns_container_for_key_value_pairs(self): 8425 self.module.x = 40 8426 self.module.y = 50 8427 result = self.module_proxy.items() 8428 self.assertTrue(hasattr(result, "__iter__")) 8429 result_list = list(iter(result)) 8430 self.assertIn(("x", 40), result_list) 8431 self.assertIn(("y", 50), result_list) 8432 8433 def test_keys_with_non_module_proxy_raises_type_error(self): 8434 with self.assertRaises(TypeError): 8435 type(self.module_proxy).keys(None) 8436 8437 def test_keys_returns_container_for_keys(self): 8438 self.module.x = 40 8439 self.module.y = 50 8440 result = self.module_proxy.keys() 8441 self.assertTrue(hasattr(result, "__iter__")) 8442 result_list = list(iter(result)) 8443 self.assertIn("x", result_list) 8444 self.assertIn("y", result_list) 8445 8446 def test_keys_returns_key_iterator_excluding_placeholder(self): 8447 result = self.module_proxy.keys() 8448 self.assertNotIn("placeholder", result) 8449 8450 def test_pop_with_non_module_proxy_raises_type_error(self): 8451 with self.assertRaises(TypeError): 8452 type(self.module_proxy).pop(None) 8453 8454 def test_pop_for_existing_item_deletes_and_returns_that_item_value(self): 8455 self.module.x = 40 8456 value = self.module_proxy.pop("x") 8457 self.assertEqual(value, 40) 8458 self.assertFalse(self.module_proxy.__contains__("x")) 8459 8460 def test_pop_for_not_existing_item_raises_key_error(self): 8461 with self.assertRaises(KeyError) as context: 8462 self.module_proxy.pop("x") 8463 self.assertIn("'x'", str(context.exception)) 8464 8465 def test_pop_with_default_for_not_existing_item_returns_default(self): 8466 value = self.module_proxy.pop("x", -1) 8467 self.assertEqual(value, -1) 8468 8469 def test_pop_for_placeholder_raises_key_error(self): 8470 with self.assertRaises(KeyError) as context: 8471 self.module_proxy.pop("placeholder") 8472 self.assertIn("'placeholder'", str(context.exception)) 8473 8474 def test_setdefault_with_non_module_proxy_raises_type_error(self): 8475 with self.assertRaises(TypeError): 8476 type(self.module_proxy).setdefault(None, None) 8477 8478 def test_setdefault_for_existing_item_does_nothing(self): 8479 self.module.x = 40 8480 self.module_proxy.setdefault("x", -1) 8481 self.assertEqual(self.module_proxy.get("x"), 40) 8482 8483 def test_setdefault_for_not_existing_item_sets_default_value(self): 8484 self.module_proxy.setdefault("x", -1) 8485 self.assertEqual(self.module_proxy.get("x"), -1) 8486 8487 def test_update_with_non_module_proxy_raises_type_error(self): 8488 with self.assertRaises(TypeError): 8489 type(self.module_proxy).update(None) 8490 8491 def test_update_with_multiple_positional_arguments_raises_type_error(self): 8492 with self.assertRaises(TypeError): 8493 self.module_proxy.update({"x": 40}, {"y": 50}) 8494 8495 def test_update_with_dict_updates_module_proxy_and_module(self): 8496 d = {"x": 40, "y": 50} 8497 self.assertIsNone(self.module_proxy.update(d)) 8498 self.assertEqual(self.module_proxy.get("x"), 40) 8499 self.assertEqual(self.module_proxy.get("y"), 50) 8500 self.assertEqual(self.module.x, 40) 8501 self.assertEqual(self.module.y, 50) 8502 8503 def test_update_with_iterable_updates_module_proxy_and_module(self): 8504 class Iterable: 8505 def __iter__(self): 8506 return iter([("x", 40), ("y", 50)]) 8507 8508 iterable = Iterable() 8509 self.assertIsNone(self.module_proxy.update(iterable)) 8510 self.assertEqual(self.module_proxy.get("x"), 40) 8511 self.assertEqual(self.module_proxy.get("y"), 50) 8512 self.assertEqual(self.module.x, 40) 8513 self.assertEqual(self.module.y, 50) 8514 8515 def test_update_with_iterable_of_non_pair_tuple_raises_value_error(self): 8516 class Iterable: 8517 def __iter__(self): 8518 return iter([("x", 40), ("y", 50, 60)]) 8519 8520 iterable = Iterable() 8521 with self.assertRaises(ValueError) as context: 8522 self.assertIsNone(self.module_proxy.update(iterable)) 8523 self.assertIn( 8524 "dictionary update sequence element #1 has length 3; 2 is required", 8525 str(context.exception), 8526 ) 8527 8528 def test_update_with_kwargs_updates_module_proxy_and_module(self): 8529 self.assertNotIn("x", self.module_proxy) 8530 self.assertNotIn("y", self.module_proxy) 8531 self.assertIsNone(self.module_proxy.update(y=50, x=40)) 8532 self.assertEqual(self.module_proxy.get("x"), 40) 8533 self.assertEqual(self.module_proxy.get("y"), 50) 8534 self.assertEqual(self.module.x, 40) 8535 self.assertEqual(self.module.y, 50) 8536 8537 def test_update_with_dict_and_kwargs_updates_module_proxy_and_module(self): 8538 self.assertNotIn("x", self.module_proxy) 8539 self.assertNotIn("y", self.module_proxy) 8540 self.assertIsNone(self.module_proxy.update({"y": 50}, x=40)) 8541 self.assertEqual(self.module_proxy.get("x"), 40) 8542 self.assertEqual(self.module_proxy.get("y"), 50) 8543 self.assertEqual(self.module.x, 40) 8544 self.assertEqual(self.module.y, 50) 8545 8546 def test_update_with_dict_and_kwargs_gives_kwargs_precedence(self): 8547 self.assertNotIn("y", self.module_proxy) 8548 self.assertIsNone(self.module_proxy.update({"y": 50}, y=60)) 8549 self.assertEqual(self.module_proxy.get("y"), 60) 8550 self.assertEqual(self.module.y, 60) 8551 8552 def test_update_with_self_in_kwargs_puts_self_in_attributes(self): 8553 self.assertNotIn("self", self.module_proxy) 8554 self.assertIsNone(self.module_proxy.update(self=60)) 8555 self.assertEqual(self.module_proxy.get("self"), 60) 8556 self.assertEqual(self.module.self, 60) 8557 8558 def test_values_with_non_module_proxy_raises_type_error(self): 8559 with self.assertRaises(TypeError): 8560 type(self.module_proxy).values(None) 8561 8562 def test_values_returns_container_for_values(self): 8563 self.module.x = 1243314135 8564 self.module.y = -1243314135 8565 result = self.module_proxy.values() 8566 self.assertTrue(hasattr(result, "__iter__")) 8567 result_list = list(iter(result)) 8568 self.assertIn(1243314135, result_list) 8569 self.assertIn(-1243314135, result_list) 8570 8571 def test_values_returns_iterator_excluding_placeholder_value(self): 8572 result = self.module_proxy.values() 8573 self.assertNotIn("builtin_value", result) 8574 8575 8576class NextTests(unittest.TestCase): 8577 def test_next_with_raising_dunder_next_propagates_error(self): 8578 class Desc: 8579 def __get__(self, obj, type): 8580 raise AttributeError("failed") 8581 8582 class Foo: 8583 __next__ = Desc() 8584 8585 foo = Foo() 8586 with self.assertRaises(AttributeError) as context: 8587 next(foo) 8588 self.assertEqual(str(context.exception), "failed") 8589 8590 def test_next_with_dict_keyiterater_returns_next_item(self): 8591 d = {"a": 0} 8592 dict_keyiter = iter(d.keys()) 8593 self.assertEqual(next(dict_keyiter), "a") 8594 8595 def test_next_with_empty_dict_keyiterator_returns_default(self): 8596 d = {} 8597 dict_keyiter = iter(d.keys()) 8598 self.assertEqual(next(dict_keyiter, None), None) 8599 8600 def test_next_with_empty_dict_keyiterator_raises_stop_iteration(self): 8601 d = {} 8602 dict_keyiter = iter(d.keys()) 8603 with self.assertRaises(StopIteration): 8604 next(dict_keyiter) 8605 8606 def test_next_with_list_iterater_returns_next_item(self): 8607 li = [1] 8608 list_iter = iter(li) 8609 self.assertEqual(next(list_iter), 1) 8610 8611 def test_next_with_empty_list_iterator_returns_default(self): 8612 li = [] 8613 list_iter = iter(li) 8614 self.assertEqual(next(list_iter, None), None) 8615 8616 def test_next_with_empty_list_iterator_raises_stop_iteration(self): 8617 li = [] 8618 list_iter = iter(li) 8619 with self.assertRaises(StopIteration): 8620 next(list_iter) 8621 8622 def test_next_with_range_iterater_returns_next_item(self): 8623 ran = range(1) 8624 range_iter = iter(ran) 8625 self.assertEqual(next(range_iter), 0) 8626 8627 def test_next_with_empty_range_iterator_returns_default(self): 8628 ran = range(0) 8629 range_iter = iter(ran) 8630 self.assertEqual(next(range_iter, None), None) 8631 8632 def test_next_with_empty_range_iterator_raises_stop_iteration(self): 8633 ran = range(0) 8634 range_iter = iter(ran) 8635 with self.assertRaises(StopIteration): 8636 next(range_iter) 8637 8638 def test_next_with_set_iterater_returns_next_item(self): 8639 s = {0} 8640 set_iter = iter(s) 8641 self.assertEqual(next(set_iter), 0) 8642 8643 def test_next_with_empty_set_iterator_returns_default(self): 8644 set_iter = iter(set()) 8645 self.assertEqual(next(set_iter, None), None) 8646 8647 def test_next_with_empty_set_iterator_raises_stop_iteration(self): 8648 set_iter = iter(set()) 8649 with self.assertRaises(StopIteration): 8650 next(set_iter) 8651 8652 def test_next_with_set_iterator_raises_stop_iteration(self): 8653 s = {0} 8654 set_iter = iter(s) 8655 self.assertEqual(next(set_iter), 0) 8656 with self.assertRaises(StopIteration): 8657 next(set_iter) 8658 8659 def test_next_with_str_iterater_returns_next_item(self): 8660 str = "a" 8661 str_iter = iter(str) 8662 self.assertEqual(next(str_iter), "a") 8663 8664 def test_next_with_empty_str_iterator_returns_default(self): 8665 str = "" 8666 str_iter = iter(str) 8667 self.assertEqual(next(str_iter, None), None) 8668 8669 def test_next_with_empty_str_iterator_raises_stop_iteration(self): 8670 str = "" 8671 str_iter = iter(str) 8672 with self.assertRaises(StopIteration): 8673 next(str_iter) 8674 8675 def test_next_with_str_iterator_raises_stop_iteration(self): 8676 str = "abc" 8677 str_iter = iter(str) 8678 self.assertEqual(next(str_iter), "a") 8679 self.assertEqual(next(str_iter), "b") 8680 self.assertEqual(next(str_iter), "c") 8681 with self.assertRaises(StopIteration): 8682 next(str_iter) 8683 8684 def test_next_with_tuple_iterater_returns_next_item(self): 8685 t = (1,) 8686 tuple_iter = iter(t) 8687 self.assertEqual(next(tuple_iter), 1) 8688 8689 def test_next_with_empty_tuple_iterator_returns_default(self): 8690 t = () 8691 tuple_iter = iter(t) 8692 self.assertEqual(next(tuple_iter, None), None) 8693 8694 def test_next_with_empty_tuple_iterator_raises_stop_iteration(self): 8695 t = () 8696 tuple_iter = iter(t) 8697 with self.assertRaises(StopIteration): 8698 next(tuple_iter) 8699 8700 8701class NoneTests(unittest.TestCase): 8702 def test_dunder_class_returns_type_of_none(self): 8703 self.assertEqual(None.__class__, type(None)) 8704 8705 def test_dunder_class_assignment_raises_type_error(self): 8706 class C: 8707 pass 8708 8709 with self.assertRaises(TypeError): 8710 type(None).__class__ = C 8711 8712 8713class NotImplementedTypeTests(unittest.TestCase): 8714 def test_repr_returns_not_implemented(self): 8715 self.assertEqual(NotImplemented.__repr__(), "NotImplemented") 8716 8717 8718class ObjectTests(unittest.TestCase): 8719 def test_delattr_deletes_instance_attribute(self): 8720 class C: 8721 def __init__(self): 8722 self.fld = 4 8723 8724 c = C() 8725 self.assertTrue(hasattr(c, "fld")) 8726 self.assertIs(c.__delattr__("fld"), None) 8727 self.assertFalse(hasattr(c, "fld")) 8728 8729 def test_delattr_raises_type_error_with_type(self): 8730 class C: 8731 fld = 4 8732 8733 with self.assertRaises(TypeError) as context: 8734 object.__delattr__(C, "fld") 8735 self.assertIn("can't apply this __delattr__ to type", str(context.exception)) 8736 8737 @pyro_only 8738 def test_delattr_raises_with_module(self): 8739 from types import ModuleType 8740 8741 m = ModuleType("") 8742 m.fld = 4 8743 with self.assertRaises(TypeError) as context: 8744 object.__delattr__(m, "fld") 8745 self.assertIn( 8746 "can't apply this __delattr__ to type 'module'", str(context.exception) 8747 ) 8748 8749 def test_reduce_with_object(self): 8750 result = object().__reduce__() 8751 self.assertEqual(len(result), 2) 8752 self.assertEqual(result[1], (object, object, None)) 8753 8754 def test_reduce_with_custom_type_without_attributes(self): 8755 class Foo: 8756 pass 8757 8758 result = Foo().__reduce__() 8759 self.assertEqual(len(result), 2) 8760 self.assertEqual(result[1], (Foo, object, None)) 8761 8762 def test_reduce_with_custom_type(self): 8763 class Foo: 8764 def __init__(self): 8765 self.a = 1 8766 8767 result = Foo().__reduce__() 8768 self.assertEqual(len(result), 3) 8769 self.assertEqual(result[1:], ((Foo, object, None), {"a": 1})) 8770 8771 def test_reduce_with_custom_base(self): 8772 class Foo: 8773 def __init__(self): 8774 self.a = 1 8775 8776 class Bar(Foo): 8777 def __init__(self): 8778 Foo.__init__(self) 8779 self.b = 2 8780 8781 result = Bar().__reduce__() 8782 self.assertEqual(len(result), 3) 8783 self.assertEqual(result[1:], ((Bar, object, None), {"a": 1, "b": 2})) 8784 8785 def test_reduce_with_getstate(self): 8786 class Foo: 8787 def __init__(self): 8788 self.a = 1 8789 8790 def __getstate__(self): 8791 return {"b": 2} 8792 8793 result = Foo().__reduce__() 8794 self.assertEqual(len(result), 3) 8795 self.assertEqual(result[1], (Foo, object, None), {"b": 2}) 8796 8797 def test_reduce_ex_with_object(self): 8798 result = object().__reduce_ex__(0) 8799 self.assertEqual(len(result), 2) 8800 self.assertEqual(result[1], (object, object, None)) 8801 8802 def test_reduce_ex_with_object_and_proto_three(self): 8803 result = object().__reduce_ex__(3) 8804 self.assertEqual(len(result), 5) 8805 self.assertEqual(result[1:], ((object,), None, None, None)) 8806 8807 def test_reduce_ex_with_custom_type_without_attributes(self): 8808 class Foo: 8809 pass 8810 8811 result = Foo().__reduce_ex__(0) 8812 self.assertEqual(len(result), 2) 8813 self.assertEqual(result[1], (Foo, object, None)) 8814 8815 def test_reduce_ex_with_custom_type_without_attributes_and_proto_three(self): 8816 class Foo: 8817 pass 8818 8819 result = Foo().__reduce_ex__(3) 8820 self.assertEqual(len(result), 5) 8821 self.assertEqual(result[1:], ((Foo,), None, None, None)) 8822 8823 def test_reduce_ex_with_custom_type(self): 8824 class Foo: 8825 def __init__(self): 8826 self.a = 1 8827 8828 result = Foo().__reduce_ex__(0) 8829 self.assertEqual(len(result), 3) 8830 self.assertEqual(result[1], (Foo, object, None), {"a": 1}) 8831 8832 def test_reduce_ex_with_custom_type_and_proto_three(self): 8833 class Foo: 8834 def __init__(self): 8835 self.a = 1 8836 8837 result = Foo().__reduce_ex__(3) 8838 self.assertEqual(len(result), 5) 8839 self.assertEqual(result[1:], ((Foo,), {"a": 1}, None, None)) 8840 8841 def test_reduce_ex_with_custom_base(self): 8842 class Foo: 8843 def __init__(self): 8844 self.a = 1 8845 8846 class Bar(Foo): 8847 def __init__(self): 8848 Foo.__init__(self) 8849 self.b = 2 8850 8851 result = Bar().__reduce_ex__(0) 8852 self.assertEqual(len(result), 3) 8853 self.assertEqual(result[1:], ((Bar, object, None), {"a": 1, "b": 2})) 8854 8855 def test_reduce_ex_with_custom_base_and_proto_three(self): 8856 class Foo: 8857 def __init__(self): 8858 self.a = 1 8859 8860 class Bar(Foo): 8861 def __init__(self): 8862 Foo.__init__(self) 8863 self.b = 2 8864 8865 result = Bar().__reduce_ex__(3) 8866 self.assertEqual(len(result), 5) 8867 self.assertEqual(result[1:], ((Bar,), {"a": 1, "b": 2}, None, None)) 8868 8869 def test_reduce_ex_with_custom_reduce(self): 8870 class Foo: 8871 def __init__(self): 8872 self.a = 1 8873 8874 def __reduce__(self): 8875 return (Foo, (self.a)) 8876 8877 result = Foo().__reduce_ex__(0) 8878 self.assertEqual(len(result), 2) 8879 self.assertEqual(result, (Foo, 1)) 8880 8881 def test_reduce_ex_with_custom_reduce_and_proto_three(self): 8882 class Foo: 8883 def __init__(self): 8884 self.a = 1 8885 8886 def __reduce__(self): 8887 return (Foo, (self.a)) 8888 8889 result = Foo().__reduce_ex__(3) 8890 self.assertEqual(len(result), 2) 8891 self.assertEqual(result, (Foo, 1)) 8892 8893 def test_reduce_ex_with_getstate(self): 8894 class Foo: 8895 def __init__(self): 8896 self.a = 1 8897 8898 def __getstate__(self): 8899 return {"b": 2} 8900 8901 result = Foo().__reduce_ex__(1) 8902 self.assertEqual(len(result), 3) 8903 self.assertEqual(result[1:], ((Foo, object, None), {"b": 2})) 8904 8905 def test_reduce_ex_with_getstate_and_proto_three(self): 8906 class Foo: 8907 def __init__(self): 8908 self.a = 1 8909 8910 def __getstate__(self): 8911 return {"b": 2} 8912 8913 result = Foo().__reduce_ex__(3) 8914 self.assertEqual(len(result), 5) 8915 self.assertEqual(result[1:], ((Foo,), {"b": 2}, None, None)) 8916 8917 def test_reduce_ex_with_empty_slots_and_proto_three(self): 8918 class Foo: 8919 __slots__ = () 8920 8921 result = Foo().__reduce_ex__(3) 8922 self.assertEqual(len(result), 5) 8923 self.assertEqual(result[1:], ((Foo,), None, None, None)) 8924 8925 def test_reduce_ex_with_slots_and_proto_three(self): 8926 class Foo: 8927 __slots__ = "a" 8928 8929 def __init__(self, value): 8930 self.a = value 8931 8932 result = Foo(1).__reduce_ex__(3) 8933 self.assertEqual(len(result), 5) 8934 self.assertEqual(result[1:], ((Foo,), (None, {"a": 1}), None, None)) 8935 8936 def test_reduce_ex_with_dict_and_proto_three(self): 8937 d = {"a": 1} 8938 result = d.__reduce_ex__(3) 8939 self.assertEqual(len(result), 5) 8940 self.assertEqual(result[1:4], ((dict,), None, None)) 8941 it = result[4] 8942 self.assertEqual(it.__next__(), ("a", 1)) 8943 with self.assertRaises(StopIteration): 8944 it.__next__() 8945 8946 def test_reduce_ex_ignores_instance_reduce(self): 8947 class Foo: 8948 def __init__(self): 8949 self.a = 123 8950 8951 def reconstruct_foo(a): 8952 foo = Foo() 8953 foo.a = a 8954 return foo 8955 8956 def reduce_foo(self): 8957 return (reconstruct_foo, (self.a)) 8958 8959 foo = Foo() 8960 foo.__reduce__ = reduce_foo.__get__(foo, Foo) 8961 self.assertEqual(foo.__reduce__()[0], reconstruct_foo) 8962 import copyreg 8963 8964 self.assertEqual(foo.__reduce_ex__(1)[0], copyreg._reconstructor) 8965 8966 def test_reduce_ex_with_getnewargs_ex_equals_none_raises_type_error(self): 8967 class Foo: 8968 __getnewargs_ex__ = None 8969 8970 with self.assertRaises(TypeError) as context: 8971 Foo().__reduce_ex__(3) 8972 self.assertEqual(str(context.exception), "'NoneType' object is not callable") 8973 8974 def test_reduce_ex_with_getnewargs_equals_none_raises_type_error(self): 8975 class Foo: 8976 __getnewargs__ = None 8977 8978 with self.assertRaises(TypeError) as context: 8979 Foo().__reduce_ex__(3) 8980 self.assertEqual(str(context.exception), "'NoneType' object is not callable") 8981 8982 def test_reduce_ex_with_getstate_equals_none_raises_type_error(self): 8983 class Foo: 8984 __getstate__ = None 8985 8986 with self.assertRaises(TypeError) as context: 8987 Foo().__reduce_ex__(3) 8988 self.assertEqual(str(context.exception), "'NoneType' object is not callable") 8989 8990 def test_dunder_repr_returns_string_with_module_and_name(self): 8991 class C: 8992 pass 8993 8994 self.assertTrue( 8995 object.__repr__(C()).startswith( 8996 "<__main__.ObjectTests.test_dunder_repr_returns_string_with_module_and_name.<locals>.C object at" 8997 ) 8998 ) 8999 9000 def test_dunder_repr_returns_string_with_only_name(self): 9001 self.assertTrue(object.__repr__(42).startswith("<int object at ")) 9002 self.assertTrue(object.__repr__("").startswith("<str object at ")) 9003 9004 def test_dir_without_dict_returns_type_attributes(self): 9005 o = dir(object()) 9006 self.assertIn("__class__", o) 9007 self.assertIn("__repr__", o) 9008 self.assertIn("__doc__", o) 9009 9010 def test_dir_with_builtin_returns_attributes(self): 9011 s = dir("foo") 9012 self.assertIn("__class__", s) 9013 self.assertIn("__repr__", s) 9014 self.assertIn("__doc__", s) 9015 self.assertIn("lower", s) 9016 self.assertIn("strip", s) 9017 9018 def test_dir_with_builtin_subclass_returns_attributes(self): 9019 class Foo(str): 9020 def foo(self): 9021 pass 9022 9023 s = dir(Foo("bar")) 9024 self.assertIn("__class__", s) 9025 self.assertIn("__repr__", s) 9026 self.assertIn("__doc__", s) 9027 self.assertIn("lower", s) 9028 self.assertIn("strip", s) 9029 self.assertIn("foo", s) 9030 9031 def test_dir_with_custom_object_returns_attribtues(self): 9032 class Foo: 9033 def foo(self): 9034 pass 9035 9036 f = dir(Foo()) 9037 self.assertIn("__class__", f) 9038 self.assertIn("__repr__", f) 9039 self.assertIn("__doc__", f) 9040 self.assertIn("foo", f) 9041 9042 def test_dir_with_inherited_object_returns_base_attribtues(self): 9043 class Foo: 9044 def foo(self): 9045 pass 9046 9047 class Bar(Foo): 9048 def bar(self): 9049 pass 9050 9051 b = dir(Bar()) 9052 self.assertIn("__class__", b) 9053 self.assertIn("__repr__", b) 9054 self.assertIn("__doc__", b) 9055 self.assertIn("foo", b) 9056 self.assertIn("bar", b) 9057 9058 def test_dir_with_custom_dunder_dict_returns_attribtues(self): 9059 class Foo: 9060 __slots__ = ["__dict__"] 9061 __dict__ = "hey" 9062 9063 def foo(self): 9064 pass 9065 9066 f = dir(Foo()) 9067 self.assertIn("__class__", f) 9068 self.assertIn("__repr__", f) 9069 self.assertIn("__doc__", f) 9070 self.assertIn("foo", f) 9071 9072 def test_dunder_class_getitem_becomes_classmethod(self): 9073 class C: 9074 def __class_getitem__(cls, item): 9075 return None 9076 9077 @classmethod 9078 def foo(cls): 9079 return cls 9080 9081 self.assertIs(type(C.__class_getitem__), type(C.foo)) 9082 9083 def test_dunder_getattribute_with_raising_descr_propagates_exception(self): 9084 class D: 9085 def __get__(self, x, y): 9086 raise UserWarning("foo") 9087 9088 class C: 9089 __getattribute__ = D() 9090 9091 instance = C() 9092 with self.assertRaises(UserWarning): 9093 instance.foo 9094 9095 def test_dunder_new_with_builtin_type_raises_type_error(self): 9096 with self.assertRaisesRegex( 9097 TypeError, r"object\.__new__\(int\) is not safe.*int\.__new__\(\)" 9098 ): 9099 object.__new__(int) 9100 9101 def test_dunder_subclasshook_returns_not_implemented(self): 9102 self.assertIs(object.__subclasshook__(), NotImplemented) 9103 self.assertIs(object.__subclasshook__(int), NotImplemented) 9104 9105 def test_dunder_class_on_instance_returns_type(self): 9106 class Foo: 9107 pass 9108 9109 class Bar(Foo): 9110 pass 9111 9112 class Hello(Bar, list): 9113 pass 9114 9115 self.assertIs([].__class__, list) 9116 self.assertIs(Foo().__class__, Foo) 9117 self.assertIs(Bar().__class__, Bar) 9118 self.assertIs(Hello().__class__, Hello) 9119 self.assertIs(Foo.__class__, type) 9120 self.assertIs(super(Bar, Bar()).__class__, super) 9121 9122 def test_dunder_init_subclass_with_args_raises_type_error(self): 9123 with self.assertRaises(TypeError): 9124 object.__init_subclass__(str) 9125 9126 def test_dunder_init_subclass_with_kwargs_raises_type_error(self): 9127 with self.assertRaises(TypeError): 9128 object.__init_subclass__(name="foo") 9129 9130 def test_dunder_init_subclass_returns_none(self): 9131 self.assertIs(object.__init_subclass__(), None) 9132 9133 def test_dunder_setattr_raises_attribute_error(self): 9134 result = object() 9135 with self.assertRaisesRegex(AttributeError, ".*attribute 'foo'"): 9136 result.foo = "bar" 9137 9138 def test_dunder_setattr_on_exception_does_not_raise(self): 9139 result = Exception() 9140 result.foo = "bar" 9141 self.assertEqual(result.foo, "bar") 9142 9143 def test_dunder_dict_dunder_getitem_with_non_existent_key_raises_key_error(self): 9144 class C: 9145 pass 9146 9147 instance = C() 9148 with self.assertRaises(KeyError): 9149 instance.__dict__["non_key"] 9150 9151 def test_subclass_does_not_override_user_dunder_dict(self): 9152 class C(object): 9153 __dict__ = 5 9154 9155 class D(C): 9156 pass 9157 9158 self.assertEqual(C.__dict__["__dict__"], 5) 9159 self.assertNotIn("__dict__", D.__dict__) 9160 9161 def test_dunder_dict_dunder_setitem_sets_attribute(self): 9162 class C: 9163 pass 9164 9165 instance = C() 9166 with self.assertRaises(AttributeError): 9167 instance.foo 9168 instance.__dict__["foo"] = "bar" 9169 self.assertEqual(instance.foo, "bar") 9170 9171 def test_dunder_dict_items_returns_items_iterable(self): 9172 class C: 9173 pass 9174 9175 instance = C() 9176 d = instance.__dict__ 9177 d["foo"] = "bar" 9178 self.assertEqual(list(d.items()), [("foo", "bar")]) 9179 9180 def test_dunder_dict_keys_returns_keys_iterable(self): 9181 class C: 9182 pass 9183 9184 instance = C() 9185 d = instance.__dict__ 9186 d["foo"] = "bar" 9187 d["baz"] = "quux" 9188 keys = d.keys() 9189 self.assertEqual(len(keys), 2) 9190 self.assertIn("foo", keys) 9191 self.assertIn("baz", keys) 9192 9193 def test_dunder_dict_update_sets_attributes(self): 9194 class C: 9195 pass 9196 9197 instance = C() 9198 d = instance.__dict__ 9199 self.assertEqual(len(d), 0) 9200 d.update({"hello": "world", "foo": "bar"}) 9201 self.assertEqual(len(d), 2) 9202 self.assertEqual(d["hello"], "world") 9203 self.assertEqual(d["foo"], "bar") 9204 9205 def test_int_subclass_has_dunder_dict(self): 9206 class C(int): 9207 pass 9208 9209 sub = C(5) 9210 self.assertTrue(hasattr(sub, "__dict__")) 9211 9212 def test_str_subclass_has_dunder_dict(self): 9213 class C(str): 9214 pass 9215 9216 sub = C("foo") 9217 self.assertTrue(hasattr(sub, "__dict__")) 9218 9219 def test_instance_dict_stays_synced_with_attribute_values(self): 9220 class C: 9221 pass 9222 9223 instance = C() 9224 d = instance.__dict__ 9225 self.assertEqual(len(d), 0) 9226 instance.foo = 42 9227 self.assertEqual(len(d), 1) 9228 self.assertEqual(d["foo"], 42) 9229 d["bar"] = 7 9230 self.assertEqual(instance.bar, 7) 9231 9232 def test_dunder_dict_dunder_contains_returns_true_if_attr_exists(self): 9233 class C: 9234 pass 9235 9236 instance = C() 9237 d = instance.__dict__ 9238 self.assertFalse(d.__contains__("foo")) 9239 instance.foo = "bar" 9240 self.assertTrue(d.__contains__("foo")) 9241 del instance.foo 9242 self.assertFalse(d.__contains__("foo")) 9243 9244 def test_dunder_dict_dunder_delitem_deletes_attribute(self): 9245 class C: 9246 pass 9247 9248 instance = C() 9249 d = instance.__dict__ 9250 self.assertNotIn("foo", d) 9251 with self.assertRaisesRegex(AttributeError, "foo"): 9252 instance.foo 9253 instance.foo = "bar" 9254 self.assertIn("foo", d) 9255 d.__delitem__("foo") 9256 self.assertNotIn("foo", d) 9257 with self.assertRaisesRegex(AttributeError, "foo"): 9258 instance.foo 9259 9260 def test_dunder_dict_dunder_iter_iterates_over_keys(self): 9261 class C: 9262 pass 9263 9264 instance = C() 9265 d = instance.__dict__ 9266 instance.foo = "bar" 9267 instance.bar = "baz" 9268 keys = (*d.__iter__(),) 9269 self.assertEqual(len(keys), 2) 9270 self.assertIn("foo", keys) 9271 self.assertIn("bar", keys) 9272 9273 def test_dunder_dict_pop_removes_and_returns_attribute(self): 9274 class C: 9275 pass 9276 9277 instance = C() 9278 d = instance.__dict__ 9279 instance.foo = "bar" 9280 self.assertEqual(d.pop("foo"), "bar") 9281 self.assertNotIn("foo", d) 9282 with self.assertRaisesRegex(AttributeError, "foo"): 9283 instance.foo 9284 9285 def test_dunder_dict_pop_with_nonexistent_attr_returns_default(self): 9286 class C: 9287 pass 9288 9289 instance = C() 9290 d = instance.__dict__ 9291 value = "bar" 9292 self.assertIs(d.pop("foo", value), value) 9293 self.assertNotIn("foo", d) 9294 with self.assertRaisesRegex(AttributeError, "foo"): 9295 instance.foo 9296 9297 def test_dunder_dict_pop_with_nonexistent_attr_raises_key_error(self): 9298 class C: 9299 pass 9300 9301 instance = C() 9302 d = instance.__dict__ 9303 self.assertRaisesRegex(KeyError, "foo", d.pop, "foo") 9304 self.assertNotIn("foo", d) 9305 with self.assertRaisesRegex(AttributeError, "foo"): 9306 instance.foo 9307 9308 def test_dunder_dict_popitem_with_empty_dict_raises_key_error(self): 9309 class C: 9310 pass 9311 9312 instance = C() 9313 self.assertRaisesRegex(KeyError, "empty", instance.__dict__.popitem) 9314 9315 def test_dunder_dict_popitem_removes_attribute(self): 9316 class C: 9317 pass 9318 9319 instance = C() 9320 orig_value = "bar" 9321 instance.foo = orig_value 9322 d = instance.__dict__ 9323 (key, value) = d.popitem() 9324 self.assertEqual(key, "foo") 9325 self.assertIs(value, orig_value) 9326 self.assertNotIn("foo", d) 9327 9328 def test_dunder_dict_removes_only_one_attribute(self): 9329 class C: 9330 pass 9331 9332 instance = C() 9333 instance.foo = "bar" 9334 instance.bar = "baz" 9335 d = instance.__dict__ 9336 self.assertEqual(len(d), 2) 9337 (key, value) = d.popitem() 9338 self.assertEqual(len(d), 1) 9339 self.assertNotIn(key, d) 9340 self.assertIn((key, value), (("foo", "bar"), ("bar", "baz"))) 9341 9342 def test_dunder_dict_clear_removes_attributes(self): 9343 class C: 9344 pass 9345 9346 instance = C() 9347 d = instance.__dict__ 9348 self.assertEqual(len(d), 0) 9349 instance.foo = "bar" 9350 self.assertIn("foo", d) 9351 instance.bar = "foo" 9352 self.assertIn("bar", d) 9353 self.assertEqual(len(d), 2) 9354 d.clear() 9355 self.assertEqual(len(d), 0) 9356 self.assertNotIn("foo", d) 9357 with self.assertRaisesRegex(AttributeError, "foo"): 9358 instance.foo 9359 self.assertNotIn("bar", d) 9360 with self.assertRaisesRegex(AttributeError, "bar"): 9361 instance.bar 9362 9363 def test_dunder_dict_setdefault_with_nonexistent_attr_sets_none(self): 9364 class C: 9365 pass 9366 9367 instance = C() 9368 d = instance.__dict__ 9369 self.assertIsNone(d.setdefault("foo")) 9370 self.assertIsNone(d["foo"]) 9371 self.assertIsNone(instance.foo) 9372 9373 def test_dunder_dict_setdefault_with_nonexistent_attr_sets_default(self): 9374 class C: 9375 pass 9376 9377 instance = C() 9378 d = instance.__dict__ 9379 value = "bar" 9380 self.assertIs(d.setdefault("foo", value), value) 9381 self.assertIs(d["foo"], value) 9382 self.assertIs(instance.foo, value) 9383 9384 def test_dunder_dict_setdefault_with_extant_attr_returns_value(self): 9385 class C: 9386 pass 9387 9388 instance = C() 9389 value = "bar" 9390 instance.foo = value 9391 d = instance.__dict__ 9392 self.assertIs(d.setdefault("foo"), value) 9393 self.assertIs(d["foo"], value) 9394 self.assertIs(instance.foo, value) 9395 9396 def test_dunder_str_with_none_repr_raises_type_error(self): 9397 class C: 9398 __repr__ = None 9399 9400 c = C() 9401 with self.assertRaises(TypeError) as context: 9402 str(c) 9403 self.assertEqual(str(context.exception), "'NoneType' object is not callable") 9404 9405 def test_ge_returns_not_implemented(self): 9406 self.assertIs(object().__ge__(object()), NotImplemented) 9407 9408 def test_gt_returns_not_implemented(self): 9409 self.assertIs(object().__gt__(object()), NotImplemented) 9410 9411 def test_le_returns_not_implemented(self): 9412 self.assertIs(object().__le__(object()), NotImplemented) 9413 9414 def test_lt_returns_not_implemented(self): 9415 self.assertIs(object().__lt__(object()), NotImplemented) 9416 9417 9418class OctTests(unittest.TestCase): 9419 def test_returns_string(self): 9420 self.assertEqual(oct(0), "0o0") 9421 self.assertEqual(oct(-1), "-0o1") 9422 self.assertEqual(oct(1), "0o1") 9423 self.assertEqual(oct(54321), "0o152061") 9424 self.assertEqual(oct(34466324363639), "0o765432101234567") 9425 9426 def test_with_large_int_returns_string(self): 9427 # Test carry-over behavior at the border between digit 0 and 1: 9428 self.assertEqual(oct(1 << 60), "0o100000000000000000000") 9429 self.assertEqual(oct(1 << 61), "0o200000000000000000000") 9430 self.assertEqual(oct(1 << 62), "0o400000000000000000000") 9431 self.assertEqual(oct(1 << 63), "0o1000000000000000000000") 9432 self.assertEqual(oct(1 << 64), "0o2000000000000000000000") 9433 self.assertEqual(oct(1 << 65), "0o4000000000000000000000") 9434 # Test carry over behavior between later digits (there's 3 different 9435 # carry sizes, between 0-1, 1-2, 2-3). 9436 self.assertEqual( 9437 oct(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF), 9438 "0o77777777777777777777777777777777777777777777777777777777777777" 9439 "7777777777", 9440 ) 9441 self.assertEqual( 9442 oct(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF), 9443 "0o17777777777777777777777777777777777777777777777777777777777777" 9444 "777777777777", 9445 ) 9446 self.assertEqual( 9447 oct(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF), 9448 "0o37777777777777777777777777777777777777777777777777777777777777" 9449 "7777777777777", 9450 ) 9451 # Some random numbers: 9452 self.assertEqual( 9453 oct(0xDEE182DE2EC55F61B22A509ED1DC3EB), 9454 "0o157341405570566125754154425120475507341753", 9455 ) 9456 self.assertEqual( 9457 oct(-0x53ADC651E593B1323158BFA776E8173F60C76519277B2BD6), 9458 "-0o2472670624362623542310612613764735564027176603073121444736625726", 9459 ) 9460 9461 def test_calls_dunder_index(self): 9462 class C: 9463 def __int__(self): 9464 return 42 9465 9466 def __index__(self): 9467 return -9 9468 9469 self.assertEqual(oct(C()), "-0o11") 9470 9471 def test_with_int_subclass(self): 9472 class C(int): 9473 pass 9474 9475 self.assertEqual(oct(C(51)), "0o63") 9476 9477 def test_with_non_int_raises_type_error(self): 9478 with self.assertRaises(TypeError) as context: 9479 oct("not an int") 9480 self.assertEqual( 9481 str(context.exception), "'str' object cannot be interpreted as an integer" 9482 ) 9483 9484 9485class OpenTests(unittest.TestCase): 9486 def test_function_exists(self): 9487 import builtins 9488 9489 self.assertTrue(hasattr(builtins, "open")) 9490 9491 9492class PowTests(unittest.TestCase): 9493 def test_binary_first_arg_pow_returns_result(self): 9494 dunder_pow_args = None 9495 9496 class A: 9497 def __pow__(self, other, mod=None): 9498 nonlocal dunder_pow_args 9499 dunder_pow_args = (self, other, mod) 9500 return -123 9501 9502 a = A() 9503 self.assertEqual(pow(a, "str0"), -123) 9504 self.assertEqual(dunder_pow_args, (a, "str0", None)) 9505 9506 def test_binary_second_arg_rpow_returns_result(self): 9507 dunder_pow_args = None 9508 9509 class A: 9510 def __rpow__(self, other, mod=None): 9511 nonlocal dunder_pow_args 9512 dunder_pow_args = (self, other, mod) 9513 return -123 9514 9515 a = A() 9516 self.assertEqual(pow("str0", a), -123) 9517 self.assertEqual(dunder_pow_args, (a, "str0", None)) 9518 9519 def test_binary_unsupported_dunder_functions_raises_type_error(self): 9520 # TODO(T53066604): Check error message. 9521 with self.assertRaises(TypeError): 9522 pow("", "") 9523 9524 def test_ternary_first_arg_pow_returns_result(self): 9525 dunder_pow_args = None 9526 9527 class A: 9528 def __pow__(self, other, mod=None): 9529 nonlocal dunder_pow_args 9530 dunder_pow_args = (self, other, mod) 9531 return -123 9532 9533 a = A() 9534 self.assertEqual(pow(a, "str0", "str1"), -123) 9535 self.assertEqual(dunder_pow_args, (a, "str0", "str1")) 9536 9537 def test_ternary_first_arg_pow_from_descriptor_returns_result(self): 9538 class Desc: 9539 def __get__(self, obj, type): 9540 return lambda a, b, c=None: -5678 9541 9542 class A: 9543 __pow__ = Desc() 9544 9545 a = A() 9546 self.assertEqual(pow(a, "str0", "str1"), -5678) 9547 9548 def test_ternary_ignore_non_first_args_dunder_functions(self): 9549 class A: 9550 def __pow__(self, other, mod=None): 9551 raise UserWarning("unreachable") 9552 9553 def __rpow__(self, other): 9554 # __rpow__ doesn't accept the third arg. 9555 raise UserWarning("unreachable") 9556 9557 with self.assertRaises(TypeError) as context: 9558 pow("", A(), A()) 9559 self.assertIn( 9560 "unsupported operand type(s) for pow(): 'str', 'A', 'A'", 9561 str(context.exception), 9562 ) 9563 9564 def test_ternary_unsupported_dunder_functions_raises_type_error(self): 9565 class A: 9566 pass 9567 9568 class B: 9569 pass 9570 9571 class C: 9572 pass 9573 9574 with self.assertRaises(TypeError) as context: 9575 pow(A(), B(), C()) 9576 self.assertIn( 9577 "unsupported operand type(s) for pow(): 'A', 'B', 'C'", 9578 str(context.exception), 9579 ) 9580 9581 9582class PrintTests(unittest.TestCase): 9583 class MyStream: 9584 def __init__(self): 9585 self.buf = "" 9586 9587 def write(self, text): 9588 self.buf += text 9589 return len(text) 9590 9591 def flush(self): 9592 raise UserWarning("foo") 9593 9594 def test_print_writes_to_stream(self): 9595 stream = PrintTests.MyStream() 9596 print("hello", file=stream) 9597 self.assertEqual(stream.buf, "hello\n") 9598 9599 def test_print_returns_none(self): 9600 stream = PrintTests.MyStream() 9601 self.assertIs(print("hello", file=stream), None) 9602 9603 def test_print_writes_end(self): 9604 stream = PrintTests.MyStream() 9605 print("hi", end="ho", file=stream) 9606 self.assertEqual(stream.buf, "hiho") 9607 9608 def test_print_with_no_sep_defaults_to_space(self): 9609 stream = PrintTests.MyStream() 9610 print("hello", "world", file=stream) 9611 self.assertEqual(stream.buf, "hello world\n") 9612 9613 def test_print_writes_none(self): 9614 stream = PrintTests.MyStream() 9615 print(None, file=stream) 9616 self.assertEqual(stream.buf, "None\n") 9617 9618 def test_print_with_none_file_prints_to_sys_stdout(self): 9619 stream = PrintTests.MyStream() 9620 import sys 9621 9622 orig_stdout = sys.stdout 9623 sys.stdout = stream 9624 print("hello", file=None) 9625 self.assertEqual(stream.buf, "hello\n") 9626 sys.stdout = orig_stdout 9627 9628 def test_print_with_none_stdout_does_nothing(self): 9629 import sys 9630 9631 orig_stdout = sys.stdout 9632 sys.stdout = None 9633 print("hello", file=None) 9634 sys.stdout = orig_stdout 9635 9636 def test_print_with_deleted_stdout_raises_runtime_error(self): 9637 import sys 9638 9639 orig_stdout = sys.stdout 9640 del sys.stdout 9641 with self.assertRaises(RuntimeError): 9642 print("hello", file=None) 9643 sys.stdout = orig_stdout 9644 9645 def test_print_with_flush_calls_file_flush(self): 9646 stream = PrintTests.MyStream() 9647 with self.assertRaises(UserWarning): 9648 print("hello", file=stream, flush=True) 9649 self.assertEqual(stream.buf, "hello\n") 9650 9651 def test_print_calls_dunder_str(self): 9652 class C: 9653 def __str__(self): 9654 raise UserWarning("foo") 9655 9656 stream = PrintTests.MyStream() 9657 c = C() 9658 with self.assertRaises(UserWarning): 9659 print(c, file=stream) 9660 9661 9662class PropertyTests(unittest.TestCase): 9663 def test_dunder_abstractmethod_with_missing_attr_returns_false(self): 9664 def foo(): 9665 pass 9666 9667 prop = property(foo) 9668 self.assertIs(prop.__isabstractmethod__, False) 9669 9670 def test_dunder_abstractmethod_with_false_attr_returns_false(self): 9671 def foo(): 9672 pass 9673 9674 foo.__isabstractmethod__ = False 9675 with self.assertRaises(AttributeError): 9676 type(foo).__isabstractmethod__ 9677 prop = property(foo) 9678 self.assertIs(prop.__isabstractmethod__, False) 9679 9680 def test_dunder_abstractmethod_with_abstract_getter_returns_true(self): 9681 def foo(): 9682 pass 9683 9684 foo.__isabstractmethod__ = b"random non-empty value" 9685 with self.assertRaises(AttributeError): 9686 type(foo).__isabstractmethod__ 9687 prop = property(foo) 9688 self.assertIs(prop.__isabstractmethod__, True) 9689 9690 def test_dunder_abstractmethod_with_abstract_setter_returns_true(self): 9691 def foo(): 9692 pass 9693 9694 foo.__isabstractmethod__ = True 9695 with self.assertRaises(AttributeError): 9696 type(foo).__isabstractmethod__ 9697 prop = property(fset=foo) 9698 self.assertIs(prop.__isabstractmethod__, True) 9699 9700 def test_dunder_abstractmethod_with_abstract_deleter_returns_true(self): 9701 def foo(): 9702 pass 9703 9704 foo.__isabstractmethod__ = (42, "non-empty tuple") 9705 with self.assertRaises(AttributeError): 9706 type(foo).__isabstractmethod__ 9707 prop = property(fdel=foo) 9708 self.assertIs(prop.__isabstractmethod__, True) 9709 9710 def test_dunder_abstractmethod_with_non_abstractmethod_raise_type_error(self): 9711 with self.assertRaises(TypeError): 9712 property.__dict__["__isabstractmethod__"].__get__(42) 9713 9714 def test_dunder_doc_returns_updated_value(self): 9715 p = property() 9716 self.assertIsNone(p.__doc__) 9717 9718 document_message = "this is for testing" 9719 p.__doc__ = document_message 9720 self.assertIs(p.__doc__, document_message) 9721 9722 def test_dunder_get_returns_value(self): 9723 class C: 9724 @property 9725 def bar(self): 9726 return 5 9727 9728 self.assertEqual(C().bar, 5) 9729 9730 def test_dunder_get_with_subclassed_property_returns_value(self): 9731 class foo(property): 9732 pass 9733 9734 class C: 9735 @foo 9736 def bar(self): 9737 return 5 9738 9739 self.assertEqual(C().bar, 5) 9740 9741 def test_dunder_get_called_with_non_property_raises_type_error(self): 9742 self.assertRaisesRegex( 9743 TypeError, 9744 "'__get__' .* 'property' object.* a 'float'", 9745 property.__get__, 9746 42.3, 9747 None, 9748 None, 9749 ) 9750 9751 def test_dunder_new_called_with_non_type_object_raises_type_error(self): 9752 with self.assertRaises(TypeError) as context: 9753 9754 def bar(): 9755 pass 9756 9757 property.__new__(42.3, bar) 9758 self.assertIn("not a type object", str(context.exception)) 9759 9760 def test_dunder_new_called_with_non_subtype_raises_type_error(self): 9761 with self.assertRaises(TypeError) as context: 9762 9763 def bar(): 9764 pass 9765 9766 property.__new__(float, bar) 9767 self.assertIn("not a subtype of property", str(context.exception)) 9768 9769 def test_dunder_new_with_subclassed_property_returns_instance_of_superclass(self): 9770 class foo(property): 9771 pass 9772 9773 def bar(): 9774 pass 9775 9776 self.assertIsInstance(property.__new__(foo, bar), foo) 9777 9778 def test_getter_and_setter_and_deleter_default_to_none(self): 9779 p = property() 9780 self.assertIsNone(p.fget) 9781 self.assertIsNone(p.fset) 9782 self.assertIsNone(p.fdel) 9783 9784 def test_fget_returns_getter(self): 9785 p = property(fget=len) 9786 self.assertIs(p.fget, len) 9787 with self.assertRaises(AttributeError): 9788 p.fget = len 9789 9790 def test_fset_returns_setter(self): 9791 p = property(fset=len) 9792 self.assertIs(p.fset, len) 9793 with self.assertRaises(AttributeError): 9794 p.fset = len 9795 9796 def test_fdel_returns_deleter(self): 9797 p = property(fdel=len) 9798 self.assertIs(p.fdel, len) 9799 with self.assertRaises(AttributeError): 9800 p.fdel = len 9801 9802 9803class RangeTests(unittest.TestCase): 9804 def test_dunder_bool_with_empty_range_returns_true(self): 9805 self.assertFalse(range(0).__bool__()) 9806 9807 def test_dunder_bool_with_non_empty_range_returns_true(self): 9808 self.assertTrue(range(1).__bool__()) 9809 9810 def test_dunder_contains_with_int_less_than_start_returns_false(self): 9811 self.assertFalse(range(1, 5).__contains__(0)) 9812 9813 def test_dunder_contains_with_int_equals_start_returns_true(self): 9814 self.assertTrue(range(1, 5).__contains__(1)) 9815 9816 def test_dunder_contains_with_int_in_range_returns_true(self): 9817 self.assertTrue(range(1, 5).__contains__(3)) 9818 9819 def test_dunder_contains_with_int_equals_stop_returns_false(self): 9820 self.assertFalse(range(1, 5).__contains__(5)) 9821 9822 def test_dunder_contains_with_int_in_stride_returns_true(self): 9823 self.assertTrue(range(1, 5, 2).__contains__(3)) 9824 9825 def test_dunder_contains_with_int_not_in_stride_returns_false(self): 9826 self.assertFalse(range(1, 5, 2).__contains__(4)) 9827 9828 def test_dunder_contains_with_negative_step_and_int_greater_than_start_returns_false( # noqa: B950 9829 self, 9830 ): 9831 self.assertFalse(range(5, 1, -1).__contains__(6)) 9832 9833 def test_dunder_contains_with_negative_step_and_int_equals_start_returns_true(self): 9834 self.assertTrue(range(5, 1, -1).__contains__(5)) 9835 9836 def test_dunder_contains_with_negative_step_and_int_less_than_start_returns_true( # noqa: B950 9837 self, 9838 ): 9839 self.assertTrue(range(5, 1, -1).__contains__(4)) 9840 9841 def test_dunder_contains_with_negative_step_and_int_equals_stop_returns_false(self): 9842 self.assertFalse(range(5, 1, -1).__contains__(1)) 9843 9844 def test_dunder_contains_with_negative_step_and_int_greater_than_stop_returns_true( # noqa: B950 9845 self, 9846 ): 9847 self.assertTrue(range(5, 1, -1).__contains__(2)) 9848 9849 def test_dunder_contains_with_non_int_falls_back_to_iter_search(self): 9850 class C: 9851 __eq__ = Mock(name="__eq__", return_value=False) 9852 9853 range(1, 10, 3).__contains__(C()) 9854 self.assertEqual(C.__eq__.call_count, 3) 9855 9856 def test_dunder_eq_with_non_range_self_raises_type_error(self): 9857 with self.assertRaises(TypeError): 9858 range.__eq__(1, 2) 9859 9860 def test_dunder_eq_with_non_range_other_returns_not_implemented(self): 9861 r = range(100) 9862 self.assertIs(r.__eq__(1), NotImplemented) 9863 9864 def test_dunder_eq_same_returns_true(self): 9865 r = range(10) 9866 self.assertTrue(r == r) 9867 9868 def test_dunder_eq_both_empty_returns_true(self): 9869 r1 = range(0) 9870 r2 = range(4, 3, 2) 9871 r3 = range(2, 5, -1) 9872 self.assertTrue(r1 == r2) 9873 self.assertTrue(r1 == r3) 9874 self.assertTrue(r2 == r3) 9875 9876 def test_dunder_eq_different_start_returns_false(self): 9877 r1 = range(1, 10, 3) 9878 r2 = range(2, 10, 3) 9879 self.assertFalse(r1 == r2) 9880 9881 def test_dunder_eq_different_stop_returns_true(self): 9882 r1 = range(0, 10, 3) 9883 r2 = range(0, 11, 3) 9884 self.assertTrue(r1 == r2) 9885 9886 def test_dunder_eq_different_step_length_one_returns_true(self): 9887 r1 = range(0, 4, 10) 9888 r2 = range(0, 4, 11) 9889 self.assertTrue(r1 == r2) 9890 9891 def test_dunder_eq_different_step_returns_false(self): 9892 r1 = range(0, 14, 10) 9893 r2 = range(0, 14, 11) 9894 self.assertFalse(r1 == r2) 9895 9896 def test_dunder_ge_with_non_range_self_raises_type_error(self): 9897 with self.assertRaises(TypeError): 9898 range.__ge__(1, 2) 9899 9900 def test_dunder_ge_returns_not_implemented(self): 9901 r = range(100) 9902 self.assertIs(r.__ge__(r), NotImplemented) 9903 9904 def test_dunder_getitem_with_non_range_raises_type_error(self): 9905 with self.assertRaises(TypeError): 9906 range.__getitem__(1, 2) 9907 9908 def test_dunder_getitem_with_int_subclass_does_not_call_dunder_index(self): 9909 class C(int): 9910 def __index__(self): 9911 raise ValueError("foo") 9912 9913 r = range(5) 9914 self.assertEqual(r[C(3)], 3) 9915 9916 def test_dunder_getitem_with_raising_descriptor_propagates_exception(self): 9917 class Desc: 9918 def __get__(self, obj, type): 9919 raise AttributeError("foo") 9920 9921 class C: 9922 __index__ = Desc() 9923 9924 r = range(5) 9925 with self.assertRaises(AttributeError) as context: 9926 r[C()] 9927 self.assertEqual(str(context.exception), "foo") 9928 9929 def test_dunder_getitem_with_string_raises_type_error(self): 9930 r = range(5) 9931 with self.assertRaises(TypeError) as context: 9932 r["3"] 9933 self.assertEqual( 9934 str(context.exception), "range indices must be integers or slices, not str" 9935 ) 9936 9937 def test_dunder_getitem_with_dunder_index_calls_dunder_index(self): 9938 class C: 9939 def __index__(self): 9940 return 2 9941 9942 r = range(5) 9943 self.assertEqual(r[C()], 2) 9944 9945 def test_dunder_getitem_index_too_small_raises_index_error(self): 9946 r = range(5) 9947 with self.assertRaises(IndexError) as context: 9948 r[-6] 9949 self.assertEqual(str(context.exception), "range object index out of range") 9950 9951 def test_dunder_getitem_index_too_large_raises_index_error(self): 9952 r = range(5) 9953 with self.assertRaises(IndexError) as context: 9954 r[5] 9955 self.assertEqual(str(context.exception), "range object index out of range") 9956 9957 def test_dunder_getitem_negative_index_relative_to_end_value_error(self): 9958 r = range(5) 9959 self.assertEqual(r[-4], 1) 9960 9961 def test_dunder_getitem_with_valid_indices_returns_sublist(self): 9962 r = range(5) 9963 self.assertEqual(r[2:-1:1], range(2, 4)) 9964 9965 def test_dunder_getitem_with_negative_start_returns_trailing(self): 9966 r = range(5) 9967 self.assertEqual(r[-2:], range(3, 5)) 9968 9969 def test_dunder_getitem_with_positive_stop_returns_leading(self): 9970 r = range(5) 9971 self.assertEqual(r[:2], range(2)) 9972 9973 def test_dunder_getitem_with_negative_stop_returns_all_but_trailing(self): 9974 r = range(5) 9975 self.assertEqual(r[:-2], range(3)) 9976 9977 def test_dunder_getitem_with_positive_step_returns_forwards_list(self): 9978 r = range(5) 9979 self.assertEqual(r[::2], range(0, 5, 2)) 9980 9981 def test_dunder_getitem_with_negative_step_returns_backwards_list(self): 9982 r = range(5) 9983 self.assertEqual(r[::-2], range(4, -1, -2)) 9984 9985 def test_dunder_getitem_with_large_negative_start_returns_copy(self): 9986 r = range(5) 9987 copy = r[-10:] 9988 self.assertEqual(copy, r) 9989 self.assertIsNot(copy, r) 9990 9991 def test_dunder_getitem_with_large_positive_start_returns_empty(self): 9992 r = range(5) 9993 self.assertEqual(r[10:], range(0)) 9994 9995 def test_dunder_getitem_with_large_negative_start_returns_empty(self): 9996 r = range(5) 9997 self.assertEqual(r[:-10], range(0)) 9998 9999 def test_dunder_getitem_with_large_positive_start_returns_copy(self): 10000 r = range(5) 10001 copy = r[:10] 10002 self.assertEqual(copy, r) 10003 self.assertIsNot(copy, r) 10004 10005 def test_dunder_getitem_with_identity_slice_returns_copy(self): 10006 r = range(5) 10007 copy = r[::] 10008 self.assertEqual(copy, r) 10009 self.assertIsNot(copy, r) 10010 10011 def test_dunder_gt_with_non_range_self_raises_type_error(self): 10012 with self.assertRaises(TypeError): 10013 range.__gt__(1, 2) 10014 10015 def test_dunder_gt_returns_not_implemented(self): 10016 r = range(100) 10017 self.assertIs(r.__gt__(r), NotImplemented) 10018 10019 def test_dunder_iter_returns_range_iterator(self): 10020 it = iter(range(100)) 10021 self.assertEqual(type(it).__name__, "range_iterator") 10022 10023 def test_dunder_iter_returns_longrange_iterator(self): 10024 it = iter(range(2 ** 63)) 10025 self.assertEqual(type(it).__name__, "longrange_iterator") 10026 10027 def test_dunder_le_with_non_range_self_raises_type_error(self): 10028 with self.assertRaises(TypeError): 10029 range.__le__(1, 2) 10030 10031 def test_dunder_le_returns_not_implemented(self): 10032 r = range(100) 10033 self.assertIs(r.__le__(r), NotImplemented) 10034 10035 def test_dunder_lt_with_non_range_self_raises_type_error(self): 10036 with self.assertRaises(TypeError): 10037 range.__lt__(1, 2) 10038 10039 def test_dunder_lt_returns_not_implemented(self): 10040 r = range(100) 10041 self.assertIs(r.__lt__(r), NotImplemented) 10042 10043 def test_dunder_ne_with_non_range_self_raises_type_error(self): 10044 with self.assertRaises(TypeError): 10045 range.__ne__(1, 2) 10046 10047 def test_dunder_ne_with_non_range_other_returns_not_implemented(self): 10048 r = range(100) 10049 self.assertIs(r.__ne__(1), NotImplemented) 10050 10051 def test_dunder_ne_same_returns_false(self): 10052 r = range(10) 10053 self.assertFalse(r != r) 10054 10055 def test_dunder_ne_both_empty_returns_false(self): 10056 r1 = range(0) 10057 r2 = range(4, 3, 2) 10058 r3 = range(2, 5, -1) 10059 self.assertFalse(r1 != r2) 10060 self.assertFalse(r1 != r3) 10061 self.assertFalse(r2 != r3) 10062 10063 def test_dunder_ne_different_start_returns_true(self): 10064 r1 = range(1, 10, 3) 10065 r2 = range(2, 10, 3) 10066 self.assertTrue(r1 != r2) 10067 10068 def test_dunder_ne_different_stop_returns_false(self): 10069 r1 = range(0, 10, 3) 10070 r2 = range(0, 11, 3) 10071 self.assertFalse(r1 != r2) 10072 10073 def test_dunder_ne_different_step_length_one_returns_false(self): 10074 r1 = range(0, 4, 10) 10075 r2 = range(0, 4, 11) 10076 self.assertFalse(r1 != r2) 10077 10078 def test_dunder_ne_different_step_returns_true(self): 10079 r1 = range(0, 14, 10) 10080 r2 = range(0, 14, 11) 10081 self.assertTrue(r1 != r2) 10082 10083 def test_dunder_new_with_non_type_raises_type_error(self): 10084 with self.assertRaises(TypeError) as context: 10085 range.__new__(2, 1) 10086 self.assertEqual( 10087 str(context.exception), "range.__new__(X): X is not a type object (int)" 10088 ) 10089 10090 def test_dunder_new_with_str_type_raises_type_error(self): 10091 with self.assertRaises(TypeError) as context: 10092 range.__new__(str, 5) 10093 self.assertEqual( 10094 str(context.exception), "range.__new__(str): str is not a subtype of range" 10095 ) 10096 10097 def test_dunder_new_with_str_raises_type_error(self): 10098 with self.assertRaises(TypeError) as context: 10099 range("2") 10100 self.assertEqual( 10101 str(context.exception), "'str' object cannot be interpreted as an integer" 10102 ) 10103 10104 def test_dunder_new_with_zero_step_raises_value_error(self): 10105 with self.assertRaises(ValueError) as context: 10106 range(1, 2, 0) 10107 self.assertEqual(str(context.exception), "range() arg 3 must not be zero") 10108 10109 def test_dunder_new_calls_dunder_index(self): 10110 class Foo: 10111 def __index__(self): 10112 return 10 10113 10114 obj = range(10) 10115 self.assertEqual(obj.start, 0) 10116 self.assertEqual(obj.stop, 10) 10117 self.assertEqual(obj.step, 1) 10118 10119 def test_dunder_new_stores_int_subclasses(self): 10120 class Foo(int): 10121 pass 10122 10123 class Bar: 10124 def __index__(self): 10125 return Foo(10) 10126 10127 warnings.filterwarnings( 10128 action="ignore", 10129 category=DeprecationWarning, 10130 message="__index__ returned non-int.*", 10131 module=__name__, 10132 ) 10133 obj = range(Foo(2), Bar()) 10134 self.assertEqual(type(obj.start), Foo) 10135 self.assertEqual(type(obj.stop), Foo) 10136 self.assertEqual(obj.start, 2) 10137 self.assertEqual(obj.stop, 10) 10138 self.assertEqual(obj.step, 1) 10139 10140 def test_dunder_new_with_one_arg_sets_stop(self): 10141 obj = range(10) 10142 self.assertEqual(obj.start, 0) 10143 self.assertEqual(obj.stop, 10) 10144 self.assertEqual(obj.step, 1) 10145 10146 def test_dunder_new_with_two_args_sets_start_and_stop(self): 10147 obj = range(10, 11) 10148 self.assertEqual(obj.start, 10) 10149 self.assertEqual(obj.stop, 11) 10150 self.assertEqual(obj.step, 1) 10151 10152 def test_dunder_new_with_three_args_sets_all(self): 10153 obj = range(10, 11, 12) 10154 self.assertEqual(obj.start, 10) 10155 self.assertEqual(obj.stop, 11) 10156 self.assertEqual(obj.step, 12) 10157 10158 def test_dunder_reduce_returns_tuple(self): 10159 r = range(10) 10160 self.assertTupleEqual(r.__reduce__(), (range, (0, 10, 1))) 10161 r = range(21, 10, 2) 10162 self.assertTupleEqual(r.__reduce__(), (range, (21, 10, 2))) 10163 10164 def test_dunder_repr_with_no_step_calls_repr(self): 10165 class Repr(int): 10166 def __repr__(self): 10167 return "repr" 10168 10169 def __str__(self): 10170 return "1" 10171 10172 r = range(Repr(2), Repr(4)) 10173 self.assertEqual(repr(r), "range(repr, repr)") 10174 10175 def test_dunder_repr_with_step_calls_repr(self): 10176 class Repr(int): 10177 def __repr__(self): 10178 return "repr" 10179 10180 def __str__(self): 10181 return "1" 10182 10183 r = range(Repr(2), Repr(4), Repr(2)) 10184 self.assertEqual(repr(r), "range(repr, repr, repr)") 10185 10186 def test_dunder_reversed_with_returns_reversed_iterator(self): 10187 rev_iter = range(1, 6, 2).__reversed__() 10188 self.assertEqual(rev_iter.__next__(), 5) 10189 self.assertEqual(rev_iter.__next__(), 3) 10190 self.assertEqual(rev_iter.__next__(), 1) 10191 10192 def test_start_is_readonly(self): 10193 with self.assertRaises(AttributeError): 10194 range(0, 1, 2).start = 2 10195 10196 def test_step_is_readonly(self): 10197 with self.assertRaises(AttributeError): 10198 range(0, 1, 2).step = 2 10199 10200 def test_stop_is_readonly(self): 10201 with self.assertRaises(AttributeError): 10202 range(0, 1, 2).stop = 2 10203 10204 def test_count_with_int_in_range_returns_one(self): 10205 self.assertEqual(range(3).count(1), 1) 10206 10207 def test_count_with_int_not_in_range_returns_zero(self): 10208 self.assertEqual(range(3).count(4), 0) 10209 10210 def test_count_with_overloaded_eq_returns_all_counts(self): 10211 class A: 10212 def __eq__(self, other): 10213 return other == 1 or other == 2 10214 10215 self.assertEqual(range(3).count(A()), 2) 10216 10217 def test_index_with_int_in_range_returns_index(self): 10218 self.assertEqual(range(3).index(1), 1) 10219 10220 def test_index_with_int_not_in_range_raises_value_error(self): 10221 with self.assertRaises(ValueError) as context: 10222 range(3).index(4) 10223 self.assertEqual(str(context.exception), "4 is not in range") 10224 10225 def test_index_with_overloaded_eq_returns_all_indexs(self): 10226 class A: 10227 def __eq__(self, other): 10228 return other == 1 or other == 2 10229 10230 self.assertEqual(range(3).index(A()), 1) 10231 10232 def test_hash_equals_equivalent_tuple_hashes(self): 10233 self.assertEqual(hash(range(0)), hash((0, None, None))) 10234 self.assertEqual(hash(range(1)), hash((1, 0, None))) 10235 self.assertEqual(hash(range(1, 4)), hash((3, 1, 1))) 10236 self.assertEqual(hash(range(0, 4, 2)), hash((2, 0, 2))) 10237 10238 10239class RangeIteratorTests(unittest.TestCase): 10240 def test_dunder_iter_returns_self(self): 10241 it = iter(range(100)) 10242 self.assertEqual(iter(it), it) 10243 10244 def test_dunder_length_hint_returns_pending_length(self): 10245 len = 100 10246 it = iter(range(len)) 10247 self.assertEqual(it.__length_hint__(), len) 10248 it.__next__() 10249 self.assertEqual(it.__length_hint__(), len - 1) 10250 10251 def test_dunder_next_returns_ints(self): 10252 it = iter(range(10, 5, -2)) 10253 self.assertEqual(it.__next__(), 10) 10254 self.assertEqual(it.__next__(), 8) 10255 self.assertEqual(it.__next__(), 6) 10256 with self.assertRaises(StopIteration): 10257 it.__next__() 10258 10259 10260class ReversedTests(unittest.TestCase): 10261 def test_dunder_new_with_no_dunder_getitem_raises_type_error(self): 10262 class C: 10263 pass 10264 10265 with self.assertRaises(TypeError) as context: 10266 reversed(C()) 10267 self.assertEqual(str(context.exception), "'C' object is not reversible") 10268 10269 def test_dunder_new_with_kwargs_raises_type_error(self): 10270 class C: 10271 pass 10272 10273 with self.assertRaises(TypeError) as context: 10274 reversed.__new__(reversed, [], foo=123) 10275 # TODO(emacs): Make error message for unexpected keyword arguments more 10276 # descriptive. 10277 self.assertIn("arguments", str(context.exception)) 10278 10279 def test_reversed_iterates_backwards_over_iterable(self): 10280 it = reversed([1, 2, 3]) 10281 self.assertEqual(it.__next__(), 3) 10282 self.assertEqual(it.__next__(), 2) 10283 self.assertEqual(it.__next__(), 1) 10284 with self.assertRaises(StopIteration): 10285 it.__next__() 10286 10287 def test_reversed_calls_dunder_reverse(self): 10288 class C: 10289 def __reversed__(self): 10290 return "foo" 10291 10292 self.assertEqual(reversed(C()), "foo") 10293 10294 def test_reversed_with_none_dunder_reverse_raises_type_error(self): 10295 class C: 10296 __reversed__ = None 10297 10298 with self.assertRaises(TypeError) as context: 10299 reversed(C()) 10300 self.assertEqual(str(context.exception), "'C' object is not reversible") 10301 10302 def test_reversed_with_non_callable_dunder_reverse_raises_type_error(self): 10303 class C: 10304 __reversed__ = 1 10305 10306 with self.assertRaises(TypeError) as context: 10307 reversed(C()) 10308 self.assertEqual(str(context.exception), "'int' object is not callable") 10309 10310 def test_reversed_length_hint(self): 10311 it = reversed([1, 2, 3]) 10312 self.assertEqual(it.__length_hint__(), 3) 10313 it.__next__() 10314 self.assertEqual(it.__length_hint__(), 2) 10315 it.__next__() 10316 self.assertEqual(it.__length_hint__(), 1) 10317 it.__next__() 10318 self.assertEqual(it.__length_hint__(), 0) 10319 10320 10321class RoundTests(unittest.TestCase): 10322 def test_round_calls_dunder_round(self): 10323 class Roundable: 10324 def __init__(self, value): 10325 self.value = value 10326 10327 def __round__(self, ndigits="a default value"): 10328 return (self.value, ndigits) 10329 10330 self.assertEqual(round(Roundable(12), 34), (12, 34)) 10331 self.assertEqual(round(Roundable(56)), (56, "a default value")) 10332 10333 def test_round_raises_type_error(self): 10334 class ClassWithoutDunderRound: 10335 pass 10336 10337 with self.assertRaises(TypeError): 10338 round(ClassWithoutDunderRound()) 10339 10340 10341class SeqTests(unittest.TestCase): 10342 def test_sequence_is_iterable(self): 10343 class A: 10344 def __getitem__(self, index): 10345 return [1, 2, 3][index] 10346 10347 self.assertEqual([x for x in A()], [1, 2, 3]) 10348 10349 def test_sequence_iter_is_itself(self): 10350 class A: 10351 def __getitem__(self, index): 10352 return [1, 2, 3][index] 10353 10354 a = iter(A()) 10355 self.assertEqual(a, a.__iter__()) 10356 10357 def test_non_iter_non_sequence_with_iter_raises_type_error(self): 10358 class NonIter: 10359 pass 10360 10361 with self.assertRaises(TypeError) as context: 10362 iter(NonIter()) 10363 10364 self.assertEqual(str(context.exception), "'NonIter' object is not iterable") 10365 10366 def test_non_iter_non_sequence_with_for_raises_type_error(self): 10367 class NonIter: 10368 pass 10369 10370 with self.assertRaises(TypeError) as context: 10371 [x for x in NonIter()] 10372 10373 self.assertEqual(str(context.exception), "'NonIter' object is not iterable") 10374 10375 def test_sequence_with_error_raising_iter_descriptor_raises_type_error(self): 10376 dunder_get_called = False 10377 10378 class Desc: 10379 def __get__(self, obj, type): 10380 nonlocal dunder_get_called 10381 dunder_get_called = True 10382 raise UserWarning("Nope") 10383 10384 class C: 10385 __iter__ = Desc() 10386 10387 with self.assertRaises(TypeError) as context: 10388 [x for x in C()] 10389 10390 self.assertEqual(str(context.exception), "'C' object is not iterable") 10391 self.assertTrue(dunder_get_called) 10392 10393 def test_sequence_with_error_raising_getitem_descriptor_returns_iter(self): 10394 dunder_get_called = False 10395 10396 class Desc: 10397 def __get__(self, obj, type): 10398 nonlocal dunder_get_called 10399 dunder_get_called = True 10400 raise UserWarning("Nope") 10401 10402 class C: 10403 __getitem__ = Desc() 10404 10405 i = iter(C()) 10406 self.assertTrue(hasattr(i, "__next__")) 10407 self.assertFalse(dunder_get_called) 10408 10409 10410class SetTests(unittest.TestCase): 10411 def test_deepcopy_with_set_returns_set(self): 10412 s = {1, 2, 3} 10413 self.assertEqual(s, copy.deepcopy(s)) 10414 10415 def test_deepcopy_with_set_subclass_returns_subclass(self): 10416 class SubSet(set): 10417 pass 10418 10419 s = SubSet({1, 2, 3}) 10420 self.assertEqual(s, copy.deepcopy(s)) 10421 10422 def test_dunder_eq_with_non_set_self_raises_type_error(self): 10423 self.assertRaisesRegex( 10424 TypeError, 10425 "'__eq__' .* 'set' object.* a 'list'", 10426 set.__eq__, 10427 [], 10428 set(), 10429 ) 10430 10431 def test_dunder_ge_with_non_set_self_raises_type_error(self): 10432 self.assertRaisesRegex( 10433 TypeError, 10434 "'__ge__' .* 'set' object.* a 'list'", 10435 set.__ge__, 10436 [], 10437 set(), 10438 ) 10439 10440 def test_dunder_gt_with_non_set_self_raises_type_error(self): 10441 self.assertRaisesRegex( 10442 TypeError, 10443 "'__gt__' .* 'set' object.* a 'list'", 10444 set.__gt__, 10445 [], 10446 set(), 10447 ) 10448 10449 def test_dunder_init_with_non_set_self_raises_type_error(self): 10450 self.assertRaisesRegex( 10451 TypeError, 10452 "'__init__' .* 'set' object.* a 'list'", 10453 set.__init__, 10454 [], 10455 ) 10456 10457 def test_dunder_le_with_non_set_self_raises_type_error(self): 10458 self.assertRaisesRegex( 10459 TypeError, 10460 "'__le__' .* 'set' object.* a 'list'", 10461 set.__le__, 10462 [], 10463 set(), 10464 ) 10465 10466 def test_dunder_lt_with_non_set_self_raises_type_error(self): 10467 self.assertRaisesRegex( 10468 TypeError, 10469 "'__lt__' .* 'set' object.* a 'list'", 10470 set.__lt__, 10471 [], 10472 set(), 10473 ) 10474 10475 def test_dunder_ne_with_non_set_self_raises_type_error(self): 10476 self.assertRaisesRegex( 10477 TypeError, 10478 "'__ne__' .* 'set' object.* a 'list'", 10479 set.__ne__, 10480 [], 10481 set(), 10482 ) 10483 10484 def test_dunder_reduce_with_set_returns_tuple(self): 10485 s = set({1, 2, 3}) 10486 result = s.__reduce__() 10487 cls, value, state = result 10488 self.assertEqual(type(result), tuple) 10489 self.assertIsInstance(cls, type) 10490 self.assertEqual(cls, set) 10491 self.assertEqual(type(value), tuple) 10492 self.assertEqual(len(value), 1) 10493 self.assertEqual(value[0], [1, 2, 3]) 10494 self.assertEqual(state, None) 10495 10496 def test_dunder_reduce_with_set_subclass_returns_tuple(self): 10497 class SubSet(set): 10498 pass 10499 10500 s = SubSet({1, 2, 3}) 10501 s.test_value = "test_value" 10502 result = s.__reduce__() 10503 cls, value, state = result 10504 self.assertEqual(type(result), tuple) 10505 self.assertIsInstance(cls, type) 10506 self.assertEqual(cls, SubSet) 10507 self.assertEqual(type(value), tuple) 10508 self.assertEqual(len(value), 1) 10509 self.assertEqual(type(value[0]), list) 10510 self.assertEqual(value[0], [1, 2, 3]) 10511 self.assertEqual(len(state), 1) 10512 self.assertEqual(state["test_value"], "test_value") 10513 10514 def test_set_add_then_remove_adds_then_add_adds_elements(self): 10515 s = set() 10516 for x in range(100): 10517 s.add(x) 10518 for x in range(100): 10519 s.remove(x) 10520 for x in range(100): 10521 s.add(x) 10522 self.assertEqual(s, set(range(100))) 10523 10524 def test_copy_with_non_set_self_raises_type_error(self): 10525 self.assertRaisesRegex( 10526 TypeError, 10527 "'copy' .* 'set' object.* a 'frozenset'", 10528 set.copy, 10529 frozenset(), 10530 ) 10531 10532 def test_set_difference_update_with_non_iterable_raises_type_error(self): 10533 a = {1, 2, 3} 10534 with self.assertRaises(TypeError): 10535 a.difference_update(1) 10536 10537 def test_set_difference_update_no_match(self): 10538 a = {1, 2, 3} 10539 b = {4, 5, 6} 10540 a.difference_update(b) 10541 self.assertEqual(len(a), 3) 10542 self.assertIn(1, a) 10543 self.assertIn(2, a) 10544 self.assertIn(3, a) 10545 10546 def test_set_difference_update_removes_elements(self): 10547 a = {1, 2, 3} 10548 b = {2, 3} 10549 a.difference_update(b) 10550 self.assertEqual(len(a), 1) 10551 self.assertIn(1, a) 10552 10553 def test_set_difference_update_with_iterable_removes_elements(self): 10554 a = {1, 2, 3} 10555 b = [2] 10556 a.difference_update(b) 10557 self.assertEqual(len(a), 2) 10558 self.assertIn(1, a) 10559 self.assertIn(3, a) 10560 10561 def test_set_difference_update_with_multiple_args_removes_elements(self): 10562 a = {1, 2, 3} 10563 b = [2] 10564 c = {1, 3} 10565 a.difference_update(b, c) 10566 self.assertEqual(len(a), 0) 10567 10568 def test_dunder_and_with_non_set_raises_type_error(self): 10569 with self.assertRaises(TypeError): 10570 set.__and__(frozenset(), set()) 10571 10572 def test_dunder_ixor_with_non_set_self_raises_type_error(self): 10573 with self.assertRaisesRegex( 10574 TypeError, 10575 "'__ixor__' .* 'set' object.* a 'frozenset'", 10576 ): 10577 set.__ixor__(frozenset(), set()) 10578 10579 def test_dunder_ixor_with_non_anyset_other_returns_not_implemented(self): 10580 result = set.__ixor__(set(), ()) 10581 self.assertIs(result, NotImplemented) 10582 10583 def test_dunder_ixor_does_inplace_symmetric_difference_update(self): 10584 left = {1, 2, 3} 10585 right = {3, 4, 5} 10586 result = set.__ixor__(left, right) 10587 self.assertIs(result, left) 10588 self.assertSetEqual(left, {1, 2, 4, 5}) 10589 self.assertSetEqual(right, {3, 4, 5}) 10590 10591 def test_dunder_ixor_with_frozenset_does_inplace_symmetric_difference_update(self): 10592 left = {1, 2, 3} 10593 right = frozenset({3, 4, 5}) 10594 result = set.__ixor__(left, right) 10595 self.assertIs(result, left) 10596 self.assertSetEqual(left, {1, 2, 4, 5}) 10597 self.assertEqual(right, {3, 4, 5}) 10598 10599 def test_set_subclass_difference_removes_elements(self): 10600 class SubSet(set): 10601 pass 10602 10603 a = SubSet([1, 2, 3]) 10604 b = {2, 3} 10605 a.difference_update(b) 10606 self.assertEqual(len(a), 1) 10607 self.assertIn(1, a) 10608 10609 def test_set_subclass_difference_update_with_custom_discard(self): 10610 class SubSet(set): 10611 def discard(self, item): 10612 pass 10613 10614 a = SubSet([1, 2, 3]) 10615 b = {2, 3} 10616 a.difference_update(b) 10617 self.assertEqual(len(a), 1) 10618 self.assertIn(1, a) 10619 10620 def test_set_subclass_difference_ignores_subclass_difference_update(self): 10621 class SubSet(set): 10622 def difference_update(self, *others): 10623 pass 10624 10625 a = SubSet([1, 2, 3]) 10626 b = {2, 3} 10627 set.difference_update(a, b) 10628 self.assertEqual(len(a), 1) 10629 self.assertIn(1, a) 10630 10631 def test_set_clear_with_non_set_raises_type_error(self): 10632 with self.assertRaises(TypeError): 10633 set.clear(1) 10634 10635 def test_set_clear_removes_elements(self): 10636 a = {1, 2, 3} 10637 a.clear() 10638 self.assertEqual(len(a), 0) 10639 10640 def test_set_subclass_clear_removes_elements(self): 10641 class SubSet(set): 10642 pass 10643 10644 a = SubSet([1, 2, 3]) 10645 a.clear() 10646 self.assertEqual(len(a), 0) 10647 10648 def test_dunder_or_with_non_set_raises_type_error(self): 10649 self.assertRaisesRegex( 10650 TypeError, 10651 "'__or__' .* 'set' object.* a 'frozenset'", 10652 set.__or__, 10653 frozenset(), 10654 set(), 10655 ) 10656 10657 def test_dunder_xor_with_non_set_raises_type_error(self): 10658 self.assertRaisesRegex( 10659 TypeError, 10660 "'__xor__' .* 'set' object.* a 'frozenset'", 10661 set.__xor__, 10662 frozenset(), 10663 set(), 10664 ) 10665 10666 def test_dunder_xor_with_non_anyset_other_returns_notimplemented(self): 10667 result = set.__xor__(set(), ()) 10668 self.assertIs(result, NotImplemented) 10669 10670 def test_dunder_xor_removes_common_elements(self): 10671 left = {1, 2, 3} 10672 right = {3, 4, 5} 10673 result = set.__xor__(left, right) 10674 self.assertIs(type(result), set) 10675 self.assertSetEqual(result, {1, 2, 4, 5}) 10676 10677 def test_dunder_xor_with_frozenset_removes_common_elements(self): 10678 left = {1, 2, 3} 10679 right = frozenset({3, 4, 5}) 10680 result = set.__xor__(left, right) 10681 self.assertIs(type(result), set) 10682 self.assertSetEqual(result, {1, 2, 4, 5}) 10683 10684 def test_dunder_rxor_with_non_set_raises_type_error(self): 10685 with self.assertRaisesRegex( 10686 TypeError, 10687 "'__rxor__' .* 'set' object.* a 'frozenset'", 10688 ): 10689 set.__rxor__(frozenset(), set()) 10690 10691 def test_dunder_rxor_with_non_anyset_other_returns_notimplemented(self): 10692 result = set.__rxor__(set(), ()) 10693 self.assertIs(result, NotImplemented) 10694 10695 def test_dunder_rxor_removes_common_elements(self): 10696 left = {1, 2, 3} 10697 right = {3, 4, 5} 10698 result = set.__rxor__(left, right) 10699 self.assertSetEqual(result, {1, 2, 4, 5}) 10700 10701 def test_dunder_rxor_with_frozenset_removes_common_elements(self): 10702 left = {1, 2, 3} 10703 right = frozenset({3, 4, 5}) 10704 result = set.__rxor__(left, right) 10705 self.assertSetEqual(result, {1, 2, 4, 5}) 10706 10707 def test_difference_no_others_copies_self(self): 10708 a_set = {1, 2, 3} 10709 self.assertIsNot(set.difference(a_set), a_set) 10710 10711 def test_difference_same_sets_returns_empty_set(self): 10712 a_set = {1, 2, 3} 10713 self.assertFalse(set.difference(a_set, a_set)) 10714 10715 def test_difference_two_sets_returns_difference(self): 10716 set1 = {1, 2, 3, 4, 5, 6, 7} 10717 set2 = {1, 3, 5, 7} 10718 self.assertEqual(set.difference(set1, set2), {2, 4, 6}) 10719 10720 def test_difference_many_sets_returns_difference(self): 10721 a_set = {1, 10, 100, 1000} 10722 self.assertEqual(set.difference(a_set, {10}, {100}, {1000}), {1}) 10723 10724 def test_discard_with_non_set_raises_type_error(self): 10725 with self.assertRaises(TypeError): 10726 set.discard(None, 1) 10727 10728 def test_discard_with_non_member_returns_none(self): 10729 self.assertIs(set.discard(set(), 1), None) 10730 10731 def test_discard_with_member_removes_element(self): 10732 s = {1, 2, 3} 10733 self.assertIn(1, s) 10734 self.assertIs(set.discard(s, 1), None) 10735 self.assertNotIn(1, s) 10736 10737 def test_mix_bool_and_int(self): 10738 s = set() 10739 s.add(1) 10740 self.assertIn(1, s) 10741 self.assertNotIn(0, s) 10742 self.assertIn(True, s) 10743 self.assertNotIn(False, s) 10744 self.assertEqual(len(s), 1) 10745 s.add(True) 10746 self.assertEqual(len(s), 1) 10747 10748 s = set() 10749 s.add(False) 10750 self.assertIn(0, s) 10751 self.assertEqual(len(s), 1) 10752 s.add(0) 10753 self.assertEqual(len(s), 1) 10754 10755 def test_repr_returns_str(self): 10756 self.assertEqual(set.__repr__(set()), "set()") 10757 self.assertEqual(set.__repr__({1}), "{1}") 10758 result = set.__repr__({1, "foo"}) 10759 self.assertTrue(result == "{1, 'foo'}" or result == "{'foo', 1}") 10760 10761 class M(type): 10762 def __repr__(cls): 10763 return "<M instance>" 10764 10765 class C(metaclass=M): 10766 def __repr__(self): 10767 return "<C instance>" 10768 10769 self.assertEqual(set.__repr__({C}), "{<M instance>}") 10770 self.assertEqual(set.__repr__({C()}), "{<C instance>}") 10771 10772 def test_repr_with_subclass_returns_str(self): 10773 class C(set): 10774 pass 10775 10776 self.assertEqual(set.__repr__(C()), "C()") 10777 10778 def test_remove_with_non_set_raises_type_error(self): 10779 with self.assertRaises(TypeError): 10780 set.remove(None, 1) 10781 10782 def test_remove_with_non_member_raises_key_error(self): 10783 with self.assertRaises(KeyError): 10784 set.remove(set(), 1) 10785 10786 def test_remove_with_member_removes_element(self): 10787 s = {1, 2, 3} 10788 self.assertIn(1, s) 10789 set.remove(s, 1) 10790 self.assertNotIn(1, s) 10791 10792 def test_inplace_with_non_set_raises_type_error(self): 10793 a = frozenset() 10794 self.assertRaises(TypeError, set.__ior__, a, set()) 10795 10796 def test_inplace_with_non_set_as_other_returns_unimplemented(self): 10797 a = set() 10798 result = set.__ior__(a, 1) 10799 self.assertEqual(len(a), 0) 10800 self.assertIs(result, NotImplemented) 10801 10802 def test_inplace_or_modifies_self(self): 10803 a = set() 10804 b = {"foo"} 10805 result = set.__ior__(a, b) 10806 self.assertIs(result, a) 10807 self.assertEqual(len(a), 1) 10808 self.assertIn("foo", a) 10809 10810 def test_intersection_update_with_non_set_self_raises_type_error(self): 10811 self.assertRaisesRegex( 10812 TypeError, 10813 "'intersection_update' .* 'set' object.* a 'frozenset'", 10814 set.intersection_update, 10815 frozenset(), 10816 set(), 10817 ) 10818 10819 def test_intersection_update_with_non_iterable_other_raises_type_error(self): 10820 with self.assertRaises(TypeError) as context: 10821 set.intersection_update(set(), 5) 10822 self.assertEqual(str(context.exception), "'int' object is not iterable") 10823 10824 def test_intersection_update_updates_self_to_be_intersection(self): 10825 a = {1, 2, 3} 10826 a.intersection_update((2, 3, 4)) 10827 self.assertEqual(a, {2, 3}) 10828 10829 def test_intersection_update_updates_self_to_be_intersection_with_multiple(self): 10830 a = {1, 2, 3} 10831 a.intersection_update((2, 3, 4), (3, 4, 5)) 10832 self.assertEqual(a, {3}) 10833 10834 def test_intersection_update_with_empty_lhs_and_no_rhs_stays_empty(self): 10835 a = set() 10836 a.intersection_update() 10837 self.assertEqual(a, set()) 10838 10839 def test_intersection_update_with_empty_lhs_and_empty_rhs(self): 10840 a = set() 10841 a.intersection_update(()) 10842 self.assertEqual(a, set()) 10843 10844 def test_intersection_update_with_non_empty_lhs_and_empty_rhs(self): 10845 a = {1, 2, 3} 10846 a.intersection_update(()) 10847 self.assertEqual(a, set()) 10848 10849 def test_intersection_update_with_empty_lhs_and_non_empty_rhs(self): 10850 a = set() 10851 a.intersection_update({1, 2, 3}) 10852 self.assertEqual(a, set()) 10853 10854 def test_sub_returns_difference(self): 10855 self.assertEqual(set.__sub__({1, 2}, set()), {1, 2}) 10856 self.assertEqual(set.__sub__({1, 2}, {1}), {2}) 10857 self.assertEqual(set.__sub__({1, 2}, {1, 2}), set()) 10858 10859 def test_sub_with_frozenset_returns_difference(self): 10860 self.assertEqual(set.__sub__({1, 2}, frozenset({1})), {2}) 10861 10862 def test_sub_with_non_set_raises_type_error(self): 10863 with self.assertRaises(TypeError): 10864 set.__sub__("not a set", set()) 10865 with self.assertRaises(TypeError): 10866 set.__sub__("not a set", "also not a set") 10867 with self.assertRaises(TypeError): 10868 set.__sub__(frozenset(), set()) 10869 10870 def test_sub_with_non_set_other_returns_not_implemented(self): 10871 self.assertEqual(set.__sub__(set(), "not a set"), NotImplemented) 10872 10873 def test_isub_returns_difference(self): 10874 x1 = {1, 2} 10875 y1 = set() 10876 self.assertIs(set.__isub__(x1, y1), x1) 10877 self.assertEqual(x1, {1, 2}) 10878 10879 x2 = {1, 2} 10880 y2 = {1} 10881 self.assertIs(set.__isub__(x2, y2), x2) 10882 self.assertEqual(x2, {2}) 10883 10884 x3 = {1, 2} 10885 y3 = {1, 2} 10886 self.assertIs(set.__isub__(x3, y3), x3) 10887 self.assertEqual(x3, set()) 10888 10889 def test_isub_with_frozenset_returns_difference(self): 10890 x2 = {1, 2} 10891 y2 = frozenset({1}) 10892 self.assertIs(set.__isub__(x2, y2), x2) 10893 self.assertEqual(x2, {2}) 10894 10895 def test_isub_operator_returns_difference(self): 10896 x1 = {1, 2} 10897 y1 = set() 10898 x1 -= y1 10899 self.assertEqual(x1, {1, 2}) 10900 10901 x2 = {1, 2} 10902 y2 = {1} 10903 x2 -= y2 10904 self.assertEqual(x2, {2}) 10905 10906 x3 = {1, 2} 10907 y3 = {1, 2} 10908 x3 -= y3 10909 self.assertEqual(x3, set()) 10910 10911 def test_isub_with_non_set_raises_type_error(self): 10912 with self.assertRaises(TypeError): 10913 set.__isub__("not a set", set()) 10914 with self.assertRaises(TypeError): 10915 set.__isub__("not a set", "also not a set") 10916 with self.assertRaises(TypeError): 10917 set.__isub__(frozenset(), set()) 10918 10919 def test_isub_with_non_set_other_returns_not_implemented(self): 10920 self.assertEqual(set.__isub__(set(), "not a set"), NotImplemented) 10921 10922 def test_symmetric_difference_with_non_set_raises_type_error(self): 10923 self.assertRaisesRegex( 10924 TypeError, 10925 "'symmetric_difference' .* 'set' object.* a 'frozenset'", 10926 set.symmetric_difference, 10927 frozenset(), 10928 set(), 10929 ) 10930 10931 def test_symmetric_difference_with_non_anyset_other_returns_notimplemented(self): 10932 result = set.symmetric_difference(set(), ()) 10933 self.assertIs(type(result), set) 10934 self.assertSetEqual(result, set()) 10935 10936 def test_symmetric_difference_removes_common_elements(self): 10937 left = {1, 2, 3} 10938 right = {3, 4, 5} 10939 result = set.symmetric_difference(left, right) 10940 self.assertIs(type(result), set) 10941 self.assertSetEqual(result, {1, 2, 4, 5}) 10942 10943 def test_symmetric_difference_with_iterable_removes_common_elements(self): 10944 left = {1, 2, 3} 10945 right = (3, 4, 5) 10946 result = set.symmetric_difference(left, right) 10947 self.assertIs(type(result), set) 10948 self.assertSetEqual(result, {1, 2, 4, 5}) 10949 10950 def test_symmetric_difference_update_with_non_set_self_raises_type_error(self): 10951 with self.assertRaisesRegex( 10952 TypeError, 10953 "'symmetric_difference_update' .* 'set' object.* a 'int'", 10954 ): 10955 set.symmetric_difference_update(1, set()) 10956 10957 def test_symmetric_difference_update_with_non_iterable_other_raises_type_error( 10958 self, 10959 ): 10960 with self.assertRaisesRegex(TypeError, "object is not iterable"): 10961 set.symmetric_difference_update(set(), 1) 10962 10963 def test_symmetric_difference_update_with_identity_equal_params_clears_self(self): 10964 a = {1, 2, 3} 10965 self.assertSetEqual(a, {1, 2, 3}) 10966 set.symmetric_difference_update(a, a) 10967 self.assertSetEqual(a, set()) 10968 10969 def test_symmetric_difference_update_removes_self_items_found_in_other(self): 10970 left = {1, 2, 3} 10971 right = {3} 10972 set.symmetric_difference_update(left, right) 10973 self.assertSetEqual(left, {1, 2}) 10974 self.assertSetEqual(right, {3}) 10975 10976 def test_symmetric_difference_update_adds_items_found_in_other(self): 10977 left = {1, 2} 10978 right = {3, 4, 5} 10979 set.symmetric_difference_update(left, right) 10980 self.assertSetEqual(left, {1, 2, 3, 4, 5}) 10981 self.assertSetEqual(right, {3, 4, 5}) 10982 10983 def test_symmetric_difference_update_with_raising_iterable_does_not_remove(self): 10984 class C: 10985 def __init__(self): 10986 self.value = 0 10987 10988 def __iter__(self): 10989 return self 10990 10991 def __next__(self): 10992 if self.value > 3: 10993 raise UserWarning("foo") 10994 self.value += 1 10995 return self.value 10996 10997 left = {1, 2, 3} 10998 right = C() 10999 with self.assertRaisesRegex(UserWarning, "foo"): 11000 set.symmetric_difference_update(left, right) 11001 self.assertEqual(left, {1, 2, 3}) 11002 11003 def test_set_ignores_subclass_isub_update(self): 11004 class SubSet(set): 11005 def __isub__(self, other): 11006 pass 11007 11008 a = SubSet([1, 2, 3]) 11009 b = {2, 3} 11010 self.assertIs(set.__isub__(a, b), a) 11011 self.assertEqual(a, {1}) 11012 11013 def test_union_with_non_set_as_self_raises_type_error(self): 11014 with self.assertRaises(TypeError): 11015 set.union(frozenset(), set()) 11016 11017 def test_union_with_set_returns_union(self): 11018 set1 = {1, 2} 11019 set2 = {2, 3} 11020 set3 = {4, 5} 11021 self.assertEqual(set.union(set1, set2, set3), {1, 2, 3, 4, 5}) 11022 11023 def test_union_with_self_returns_copy(self): 11024 a_set = {1, 2, 3} 11025 self.assertIsNot(set.union(a_set), a_set) 11026 self.assertIsNot(set.union(a_set, a_set), a_set) 11027 11028 def test_union_with_iterable_contains_iterable_items(self): 11029 a_set = {1, 2} 11030 a_dict = {2: True, 3: True} 11031 self.assertEqual(set.union(a_set, a_dict), {1, 2, 3}) 11032 11033 def test_union_with_custom_iterable(self): 11034 class C: 11035 def __init__(self, start, end): 11036 self.pos = start 11037 self.end = end 11038 11039 def __iter__(self): 11040 return self 11041 11042 def __next__(self): 11043 if self.pos == self.end: 11044 raise StopIteration 11045 result = self.pos 11046 self.pos += 1 11047 return result 11048 11049 self.assertEqual(set.union(set(), C(1, 3), C(6, 9)), {1, 2, 6, 7, 8}) 11050 11051 def test_issuperset_with_non_set_raises_type_error(self): 11052 with self.assertRaises(TypeError): 11053 set.issuperset(None, set()) 11054 11055 def test_issuperset_with_frozenset_raises_type_error(self): 11056 with self.assertRaises(TypeError): 11057 set.issuperset(frozenset(), set()) 11058 11059 def test_issuperset_with_empty_sets_returns_true(self): 11060 self.assertTrue(set.issuperset(set(), frozenset())) 11061 self.assertTrue(set.issuperset(set(), set())) 11062 11063 def test_issuperset_with_anyset_subset_returns_true(self): 11064 self.assertTrue({1}.issuperset(set())) 11065 self.assertTrue({1}.issuperset(frozenset())) 11066 11067 self.assertTrue({1}.issuperset({1})) 11068 self.assertTrue({1}.issuperset(frozenset({1}))) 11069 11070 self.assertTrue({1, 2}.issuperset({1})) 11071 self.assertTrue({1, 2}.issuperset(frozenset({1}))) 11072 11073 self.assertTrue({1, 2}.issuperset({1, 2})) 11074 self.assertTrue({1, 2}.issuperset(frozenset({1, 2}))) 11075 11076 self.assertTrue({1, 2, 3}.issuperset({1, 2})) 11077 self.assertTrue({1, 2, 3}.issuperset(frozenset({1, 2}))) 11078 11079 def test_issuperset_with_iterable_subset_returns_true(self): 11080 self.assertTrue({1}.issuperset([])) 11081 self.assertTrue({1}.issuperset(range(1, 1))) 11082 11083 self.assertTrue({1}.issuperset([1])) 11084 self.assertTrue({1}.issuperset(range(1, 2))) 11085 11086 self.assertTrue({1, 2}.issuperset([1])) 11087 self.assertTrue({1, 2}.issuperset(range(1, 2))) 11088 11089 self.assertTrue({1, 2}.issuperset([1, 2])) 11090 self.assertTrue({1, 2}.issuperset(range(1, 3))) 11091 11092 self.assertTrue({1, 2, 3}.issuperset([1, 2])) 11093 self.assertTrue({1, 2, 3}.issuperset(range(1, 3))) 11094 11095 def test_issuperset_with_superset_returns_false(self): 11096 self.assertFalse(set().issuperset({1})) 11097 self.assertFalse(set().issuperset(frozenset({1}))) 11098 self.assertFalse(set().issuperset([1])) 11099 self.assertFalse(set().issuperset(range(1, 2))) 11100 11101 self.assertFalse({1}.issuperset({1, 2})) 11102 self.assertFalse({1}.issuperset(frozenset({1, 2}))) 11103 self.assertFalse({1}.issuperset([1, 2])) 11104 self.assertFalse({1}.issuperset(range(1, 3))) 11105 11106 self.assertFalse({1, 2}.issuperset({1, 2, 3})) 11107 self.assertFalse({1, 2}.issuperset(frozenset({1, 2, 3}))) 11108 self.assertFalse({1, 2}.issuperset([1, 2, 3])) 11109 self.assertFalse({1, 2}.issuperset(range(1, 4))) 11110 11111 def test_update_with_non_set_self_raises_type_error(self): 11112 self.assertRaisesRegex( 11113 TypeError, 11114 "'update' .* 'set' object.* a 'frozenset'", 11115 set.update, 11116 frozenset(), 11117 ) 11118 11119 11120class SimpleNamespaceTests(unittest.TestCase): 11121 def test_dunder_eq_returns_false(self): 11122 sn0 = SimpleNamespace(foo=42, bar="baz") 11123 self.assertIs(SimpleNamespace.__eq__(sn0, SimpleNamespace()), False) 11124 self.assertIs(SimpleNamespace.__eq__(SimpleNamespace(), sn0), False) 11125 sn1 = SimpleNamespace(foo=42) 11126 self.assertIs(SimpleNamespace.__eq__(sn0, sn1), False) 11127 self.assertIs(SimpleNamespace.__eq__(sn1, sn0), False) 11128 sn2 = SimpleNamespace(foo=42, bar="baz", bam=None) 11129 self.assertIs(SimpleNamespace.__eq__(sn0, sn2), False) 11130 self.assertIs(SimpleNamespace.__eq__(sn2, sn0), False) 11131 11132 def test_dunder_eq_returns_true(self): 11133 self.assertIs( 11134 SimpleNamespace.__eq__(SimpleNamespace(), SimpleNamespace()), True 11135 ) 11136 sn0 = SimpleNamespace(foo=42, bar="baz") 11137 sn1 = SimpleNamespace(bar="baz", foo=42) 11138 self.assertIs(SimpleNamespace.__eq__(sn0, sn1), True) 11139 self.assertIs(SimpleNamespace.__eq__(sn1, sn0), True) 11140 11141 def test_dunder_eq_returns_notimplemented(self): 11142 self.assertIs(SimpleNamespace.__eq__(SimpleNamespace(), {}), NotImplemented) 11143 11144 def test_dunder_init_returns_simple_namespace(self): 11145 11146 s = SimpleNamespace(foo=42, bar="baz") 11147 self.assertEqual(s.foo, 42) 11148 self.assertEqual(s.bar, "baz") 11149 11150 def test_dunder_ne_returns_false(self): 11151 self.assertIs( 11152 SimpleNamespace.__ne__(SimpleNamespace(), SimpleNamespace()), False 11153 ) 11154 sn0 = SimpleNamespace(foo=42, bar="baz") 11155 sn1 = SimpleNamespace(bar="baz", foo=42) 11156 self.assertIs(SimpleNamespace.__ne__(sn0, sn1), False) 11157 self.assertIs(SimpleNamespace.__ne__(sn1, sn0), False) 11158 11159 def test_dunder_ne_returns_true(self): 11160 sn0 = SimpleNamespace(foo=42, bar="baz") 11161 self.assertIs(SimpleNamespace.__ne__(sn0, SimpleNamespace()), True) 11162 self.assertIs(SimpleNamespace.__ne__(SimpleNamespace(), sn0), True) 11163 sn1 = SimpleNamespace(foo=42) 11164 self.assertIs(SimpleNamespace.__ne__(sn0, sn1), True) 11165 self.assertIs(SimpleNamespace.__ne__(sn1, sn0), True) 11166 sn2 = SimpleNamespace(foo=42, bar="baz", bam=None) 11167 self.assertIs(SimpleNamespace.__ne__(sn0, sn2), True) 11168 self.assertIs(SimpleNamespace.__ne__(sn2, sn0), True) 11169 11170 def test_dunder_ne_returns_notimplemented(self): 11171 self.assertIs(SimpleNamespace.__ne__(SimpleNamespace(), {}), NotImplemented) 11172 11173 def test_dunder_repr_returns_str(self): 11174 s = SimpleNamespace(foo=42, bar="baz") 11175 self.assertEqual(SimpleNamespace.__repr__(s), "namespace(bar='baz', foo=42)") 11176 11177 def test_dunder_repr_sorts_elements_and_returns_str(self): 11178 s = SimpleNamespace(x=1, y=2, w=3) 11179 self.assertEqual(list(s.__dict__.items()), [("x", 1), ("y", 2), ("w", 3)]) 11180 self.assertEqual(SimpleNamespace.__repr__(s), "namespace(w=3, x=1, y=2)") 11181 s = SimpleNamespace(w=3, y=2, x=1) 11182 self.assertEqual(list(s.__dict__.items()), [("w", 3), ("y", 2), ("x", 1)]) 11183 self.assertEqual(SimpleNamespace.__repr__(s), "namespace(w=3, x=1, y=2)") 11184 11185 def test_dunder_repr_recursive_returns_str(self): 11186 ns0 = SimpleNamespace() 11187 ns0.n = ns0 11188 self.assertEqual(SimpleNamespace.__repr__(ns0), "namespace(n=namespace(...))") 11189 11190 ns1 = SimpleNamespace() 11191 ns2 = SimpleNamespace() 11192 ns1.foo = ns2 11193 ns2.bar = ns1 11194 self.assertEqual( 11195 SimpleNamespace.__repr__(ns1), 11196 "namespace(foo=namespace(bar=namespace(...)))", 11197 ) 11198 self.assertEqual( 11199 SimpleNamespace.__repr__(ns2), 11200 "namespace(bar=namespace(foo=namespace(...)))", 11201 ) 11202 11203 def test_simple_namespace_is_non_heaptype(self): 11204 self.assertFalse(SimpleNamespace.__flags__ & Py_TPFLAGS_HEAPTYPE) 11205 11206 11207class SliceTest(unittest.TestCase): 11208 def test_dunder_repr_with_nones_returns_str(self): 11209 s = slice(None) 11210 self.assertEqual(repr(s), "slice(None, None, None)") 11211 11212 def test_dunder_repr_with_stop_returns_str(self): 11213 s = slice(5) 11214 self.assertEqual(repr(s), "slice(None, 5, None)") 11215 11216 def test_dunder_repr_with_values_returns_str(self): 11217 s = slice(1, 5, 2) 11218 self.assertEqual(repr(s), "slice(1, 5, 2)") 11219 11220 def test_dunder_repr_calls_dunder_repr(self): 11221 class C: 11222 def __repr__(self): 11223 return "repr" 11224 11225 def __str__(self): 11226 return "str" 11227 11228 c = C() 11229 s = slice(c, c, c) 11230 self.assertEqual(repr(s), "slice(repr, repr, repr)") 11231 11232 def test_indices_with_non_slice_self_raises_type_error(self): 11233 self.assertRaisesRegex( 11234 TypeError, 11235 "'indices' .* 'slice' object.* a 'list'", 11236 slice.indices, 11237 [], 11238 1, 11239 ) 11240 11241 11242class StaticMethodTests(unittest.TestCase): 11243 def test_dunder_abstractmethod_with_missing_attr_returns_false(self): 11244 def foo(): 11245 pass 11246 11247 method = staticmethod(foo) 11248 self.assertIs(method.__isabstractmethod__, False) 11249 11250 def test_dunder_abstractmethod_with_false_attr_returns_false(self): 11251 def foo(): 11252 pass 11253 11254 foo.__isabstractmethod__ = False 11255 with self.assertRaises(AttributeError): 11256 type(foo).__isabstractmethod__ 11257 method = staticmethod(foo) 11258 self.assertIs(method.__isabstractmethod__, False) 11259 11260 def test_dunder_abstractmethod_with_abstract_returns_true(self): 11261 def foo(): 11262 pass 11263 11264 foo.__isabstractmethod__ = 10 # non-zero is True 11265 with self.assertRaises(AttributeError): 11266 type(foo).__isabstractmethod__ 11267 method = staticmethod(foo) 11268 self.assertIs(method.__isabstractmethod__, True) 11269 11270 def test_dunder_abstractmethod_with_non_staticmethod_raises_type_error(self): 11271 with self.assertRaises(TypeError): 11272 staticmethod.__dict__["__isabstractmethod__"].__get__(42) 11273 11274 def test_dunder_func_returns_function(self): 11275 def foo(): 11276 pass 11277 11278 method = staticmethod(foo) 11279 self.assertIs(method.__func__, foo) 11280 11281 def test_dunder_func_assign_raises_attribute_error(self): 11282 def foo(): 11283 pass 11284 11285 def bar(): 11286 pass 11287 11288 method = staticmethod(foo) 11289 with self.assertRaises(AttributeError): 11290 method.__func__ = bar 11291 11292 def test_has_dunder_call(self): 11293 class C: 11294 @staticmethod 11295 def bar(self): 11296 pass 11297 11298 C.bar.__getattribute__("__call__") 11299 11300 def test_dunder_get_returns_value(self): 11301 class C: 11302 @staticmethod 11303 def bar(self): 11304 return 5 11305 11306 self.assertEqual(C.bar(C()), 5) 11307 11308 def test_dunder_get_with_subclassed_staticmethod_returns_value(self): 11309 class foo(staticmethod): 11310 pass 11311 11312 class C: 11313 @foo 11314 def bar(self): 11315 return 5 11316 11317 self.assertEqual(C.bar(C()), 5) 11318 11319 def test_dunder_get_called_with_non_staticmethod_raises_type_error(self): 11320 self.assertRaisesRegex( 11321 TypeError, 11322 "'__get__' .* 'staticmethod' object.* a 'float'", 11323 staticmethod.__get__, 11324 42.3, 11325 None, 11326 None, 11327 ) 11328 11329 def test_dunder_new_called_with_non_type_object_raises_type_error(self): 11330 with self.assertRaises(TypeError) as context: 11331 11332 def bar(): 11333 pass 11334 11335 staticmethod.__new__(42.3, bar) 11336 self.assertIn("not a type object", str(context.exception)) 11337 11338 def test_dunder_new_called_with_non_subtype_raises_type_error(self): 11339 with self.assertRaises(TypeError) as context: 11340 11341 def bar(): 11342 pass 11343 11344 staticmethod.__new__(float, bar) 11345 self.assertIn("not a subtype of staticmethod", str(context.exception)) 11346 11347 def test_dunder_new_with_subclassed_staticmethod_returns_instance_of_superclass( 11348 self, 11349 ): 11350 class foo(staticmethod): 11351 pass 11352 11353 def bar(): 11354 pass 11355 11356 self.assertIsInstance(staticmethod.__new__(foo, bar), foo) 11357 11358 11359class SumTests(unittest.TestCase): 11360 def test_str_as_start_raises_type_error(self): 11361 with self.assertRaises(TypeError) as context: 11362 sum([], "") 11363 self.assertEqual( 11364 str(context.exception), "sum() can't sum strings [use ''.join(seq) instead]" 11365 ) 11366 11367 def test_bytes_as_start_raises_type_error(self): 11368 with self.assertRaises(TypeError) as context: 11369 sum([], b"") 11370 self.assertEqual( 11371 str(context.exception), "sum() can't sum bytes [use b''.join(seq) instead]" 11372 ) 11373 11374 def test_bytearray_as_start_raises_type_error(self): 11375 with self.assertRaises(TypeError) as context: 11376 sum([], bytearray()) 11377 self.assertEqual( 11378 str(context.exception), 11379 "sum() can't sum bytearray [use b''.join(seq) instead]", 11380 ) 11381 11382 def test_non_iterable_raises_type_error(self): 11383 with self.assertRaises(TypeError): 11384 sum(None) 11385 # TODO(T43043290): Check for the exception message. 11386 11387 def test_int_list_without_start_returns_sum(self): 11388 result = sum([1, 2, 3]) 11389 self.assertEqual(result, 6) 11390 11391 def test_int_list_with_start_returns_sum(self): 11392 result = sum([1, 2, 3], -6) 11393 self.assertEqual(result, 0) 11394 11395 11396class SuperTests(unittest.TestCase): 11397 def test_dunder_thisclass_returns_this_class(self): 11398 class C: 11399 def get_super(self): 11400 return super() 11401 11402 class D(C): 11403 pass 11404 11405 self.assertIs(D().get_super().__thisclass__, C) 11406 11407 def test_dunder_self_returns_self(self): 11408 class C: 11409 def get_super(self): 11410 return super() 11411 11412 class D(C): 11413 pass 11414 11415 i = D() 11416 self.assertIs(i.get_super().__self__, i) 11417 11418 def test_dunder_self_class_returns_self_class(self): 11419 class C: 11420 def get_super(self): 11421 return super() 11422 11423 class D(C): 11424 pass 11425 11426 self.assertIs(D().get_super().__self_class__, D) 11427 11428 def test_dunder_init_resolves_cell_vars(self): 11429 class C: 11430 def foo(self, a1): 11431 def compute(): 11432 # This turns self, a1 into freevars in `compute` and 11433 # cellvars in `foo`. I am also using a1 here to have 11434 # `self` move at the end of the freevar/cellvar list to 11435 # make the test more interesting. 11436 self.dummy = a1 11437 11438 compute() 11439 s = super() 11440 return s 11441 11442 self.assertIn("self", C.foo.__code__.co_cellvars) 11443 11444 instance = C() 11445 s = instance.foo(None) 11446 self.assertEqual(s.__self__, instance) 11447 self.assertEqual(s.__self_class__, C) 11448 self.assertEqual(s.__thisclass__, C) 11449 11450 11451class SyntaxErrorTests(unittest.TestCase): 11452 def test_dunder_init_with_no_args_sets_msg_to_none(self): 11453 obj = SyntaxError() 11454 self.assertIsNone(obj.msg) 11455 11456 def test_dunder_init_with_arg_sets_msg_to_first_arg(self): 11457 obj = SyntaxError("hello") 11458 self.assertEqual(obj.msg, "hello") 11459 11460 def test_dunder_init_with_tuple_of_wrong_length_raises_index_error(self): 11461 with self.assertRaises(IndexError) as context: 11462 SyntaxError("hello", ()) 11463 self.assertEqual(str(context.exception), "tuple index out of range") 11464 11465 def test_dunder_init_sets_attributes(self): 11466 obj = SyntaxError("msg", ("filename", "lineno", "offset", "text")) 11467 self.assertEqual(obj.msg, "msg") 11468 self.assertEqual(obj.filename, "filename") 11469 self.assertEqual(obj.lineno, "lineno") 11470 self.assertEqual(obj.offset, "offset") 11471 self.assertEqual(obj.text, "text") 11472 11473 def test_dunder_str_with_no_filename_and_no_lineno_returns_msg(self): 11474 obj = SyntaxError("hello") 11475 self.assertEqual(obj.__str__(), "hello") 11476 11477 def test_dunder_str_calls_dunder_str_on_message(self): 11478 class C: 11479 def __str__(self): 11480 return "foo" 11481 11482 obj = SyntaxError(C()) 11483 result = obj.__str__() 11484 self.assertEqual(result, "foo") 11485 11486 def test_dunder_str_with_no_message_returns_none_string(self): 11487 obj = SyntaxError() 11488 result = obj.__str__() 11489 self.assertEqual(result, "None") 11490 11491 def test_dunder_str_with_filename_and_lineno(self): 11492 obj = SyntaxError("msg", ("filename", 5, "offset", "text")) 11493 result = obj.__str__() 11494 self.assertEqual(result, "msg (filename, line 5)") 11495 11496 def test_dunder_str_with_non_str_filename_and_lineno(self): 11497 obj = SyntaxError("msg", (10, 5, "offset", "text")) 11498 result = obj.__str__() 11499 self.assertEqual(result, "msg (line 5)") 11500 11501 def test_dunder_str_with_non_int_lineno_and_filename(self): 11502 obj = SyntaxError("msg", ("filename", "lineno", "offset", "text")) 11503 result = obj.__str__() 11504 self.assertEqual(result, "msg (filename)") 11505 11506 def test_dunder_str_with_str_filename_and_int_lineno(self): 11507 obj = SyntaxError("msg", ("path/to/foo.py", 5, "offset", "text")) 11508 result = obj.__str__() 11509 self.assertEqual(result, "msg (foo.py, line 5)") 11510 11511 def test_dunder_str_with_str_filename_and_non_int_lineno(self): 11512 obj = SyntaxError("msg", ("path/to/foo.py", "lineno", "offset", "test")) 11513 result = obj.__str__() 11514 self.assertEqual(result, "msg (foo.py)") 11515 11516 11517class TupleTests(unittest.TestCase): 11518 def test_dunder_repr_with_single_element(self): 11519 self.assertEqual(repr((1,)), "(1,)") 11520 self.assertEqual(repr(([1],)), "([1],)") 11521 11522 def test_dunder_repr_with_single_element_recursive(self): 11523 x = [] 11524 y = (x,) 11525 x.append(y) 11526 self.assertEqual(repr(y), "([(...)],)") 11527 11528 def test_dunder_repr_with_multi_element(self): 11529 self.assertEqual(repr((1, [])), "(1, [])") 11530 11531 def test_dunder_repr_with_multi_element_recursive(self): 11532 x = [] 11533 y = (x, [], 1) 11534 x.append(y) 11535 self.assertEqual(repr(y), "([(...)], [], 1)") 11536 11537 def test_dunder_eq_with_non_tuple_self_raises_type_error(self): 11538 self.assertRaisesRegex( 11539 TypeError, 11540 "'__eq__' .* 'tuple' object.* a 'NoneType'", 11541 tuple.__eq__, 11542 None, 11543 (), 11544 ) 11545 11546 def test_dunder_eq_with_non_tuple_other_return_not_implemented(self): 11547 self.assertIs(tuple.__eq__((), None), NotImplemented) 11548 11549 def test_dunder_eq_with_equal_tuples_returns_true(self): 11550 lhs = (1, 2, 3, 4) 11551 rhs = (1, 2, 3, 4) 11552 self.assertTrue(tuple.__eq__(lhs, rhs)) 11553 11554 def test_dunder_eq_with_longer_rhs_returns_false(self): 11555 lhs = (1, 2, 3, 4) 11556 rhs = (1, 2, 3, 4, 5) 11557 self.assertFalse(tuple.__eq__(lhs, rhs)) 11558 11559 def test_dunder_eq_with_shorter_rhs_returns_false(self): 11560 lhs = (1, 2, 3, 4) 11561 rhs = (1, 2, 3) 11562 self.assertFalse(tuple.__eq__(lhs, rhs)) 11563 11564 def test_dunder_eq_with_smaller_element_returns_false(self): 11565 lhs = (1, 2, 3) 11566 rhs = (1, 2, 2, 4) 11567 self.assertFalse(tuple.__eq__(lhs, rhs)) 11568 11569 def test_dunder_eq_with_larger_element_returns_false(self): 11570 lhs = (1, 2, 3, 4) 11571 rhs = (1, 4) 11572 self.assertFalse(tuple.__eq__(lhs, rhs)) 11573 11574 def test_dunder_ge_with_non_tuple_self_raises_type_error(self): 11575 self.assertRaisesRegex( 11576 TypeError, 11577 "'__ge__' .* 'tuple' object.* a 'NoneType'", 11578 tuple.__ge__, 11579 None, 11580 (), 11581 ) 11582 11583 def test_dunder_ge_with_non_tuple_other_return_not_implemented(self): 11584 self.assertIs(tuple.__ge__((), None), NotImplemented) 11585 11586 def test_dunder_ge_with_equal_tuples_returns_true(self): 11587 lhs = (1, 2, 3, 4) 11588 rhs = (1, 2, 3, 4) 11589 self.assertTrue(tuple.__ge__(lhs, rhs)) 11590 11591 def test_dunder_ge_with_longer_rhs_returns_false(self): 11592 lhs = (1, 2, 3, 4) 11593 rhs = (1, 2, 3, 4, 5) 11594 self.assertFalse(tuple.__ge__(lhs, rhs)) 11595 11596 def test_dunder_ge_with_shorter_rhs_returns_true(self): 11597 lhs = (1, 2, 3, 4) 11598 rhs = (1, 2, 3) 11599 self.assertTrue(tuple.__ge__(lhs, rhs)) 11600 11601 def test_dunder_ge_with_smaller_element_returns_true(self): 11602 lhs = (1, 2, 3) 11603 rhs = (1, 2, 2, 4) 11604 self.assertTrue(tuple.__ge__(lhs, rhs)) 11605 11606 def test_dunder_ge_with_larger_element_returns_false(self): 11607 lhs = (1, 2, 3, 4) 11608 rhs = (1, 4) 11609 self.assertFalse(tuple.__ge__(lhs, rhs)) 11610 11611 def test_dunder_getitem_with_non_tuple_self_raises_type_error(self): 11612 self.assertRaisesRegex( 11613 TypeError, 11614 "'__getitem__' .* 'tuple' object.* a 'NoneType'", 11615 tuple.__getitem__, 11616 None, 11617 1, 11618 ) 11619 11620 def test_dunder_getitem_with_int_subclass_does_not_call_dunder_index(self): 11621 class C(int): 11622 def __index__(self): 11623 raise ValueError("foo") 11624 11625 t = (1, 2, 3) 11626 self.assertEqual(tuple.__getitem__(t, C(0)), 1) 11627 11628 def test_dunder_getitem_with_raising_descriptor_propagates_exception(self): 11629 class Desc: 11630 def __get__(self, obj, type): 11631 raise AttributeError("foo") 11632 11633 class C: 11634 __index__ = Desc() 11635 11636 t = (1, 2, 3) 11637 with self.assertRaises(AttributeError) as context: 11638 tuple.__getitem__(t, C()) 11639 self.assertEqual(str(context.exception), "foo") 11640 11641 def test_dunder_getitem_with_non_int_raises_type_error(self): 11642 t = (1, 2, 3) 11643 with self.assertRaises(TypeError) as context: 11644 tuple.__getitem__(t, "3") 11645 self.assertEqual( 11646 str(context.exception), "tuple indices must be integers or slices, not str" 11647 ) 11648 11649 def test_dunder_getitem_with_tuple_subclass_returns_value(self): 11650 class Foo(tuple): 11651 pass 11652 11653 t = Foo((0, 1)) 11654 self.assertEqual(tuple.__getitem__(t, 0), 0) 11655 11656 def test_dunder_getitem_slice_with_tuple_subclass_returns_tuple(self): 11657 class Foo(tuple): 11658 pass 11659 11660 t = Foo((0, 1)) 11661 self.assertEqual(tuple.__getitem__(t, slice(2)), (0, 1)) 11662 11663 def test_dunder_getitem_with_dunder_index_calls_dunder_index(self): 11664 class C: 11665 def __index__(self): 11666 return 2 11667 11668 t = (1, 2, 3) 11669 self.assertEqual(tuple.__getitem__(t, C()), 3) 11670 11671 def test_dunder_getitem_index_too_small_raises_index_error(self): 11672 t = () 11673 with self.assertRaises(IndexError) as context: 11674 tuple.__getitem__(t, -1) 11675 self.assertEqual(str(context.exception), "tuple index out of range") 11676 11677 def test_dunder_getitem_index_too_large_raises_index_error(self): 11678 t = (1, 2, 3) 11679 with self.assertRaises(IndexError) as context: 11680 tuple.__getitem__(t, 3) 11681 self.assertEqual(str(context.exception), "tuple index out of range") 11682 11683 def test_dunder_getitem_negative_index_relative_to_end_value_error(self): 11684 t = (1, 2, 3) 11685 self.assertEqual(tuple.__getitem__(t, -3), 1) 11686 11687 def test_dunder_getitem_with_valid_indices_returns_subtuple(self): 11688 t = (1, 2, 3, 4, 5) 11689 self.assertEqual(tuple.__getitem__(t, slice(2, -1)), (3, 4)) 11690 11691 def test_dunder_getitem_with_negative_start_returns_trailing(self): 11692 t = (1, 2, 3) 11693 self.assertEqual(tuple.__getitem__(t, slice(-2, 5)), (2, 3)) 11694 11695 def test_dunder_getitem_with_positive_stop_returns_leading(self): 11696 t = (1, 2, 3) 11697 self.assertEqual(tuple.__getitem__(t, slice(2)), (1, 2)) 11698 11699 def test_dunder_getitem_with_negative_stop_returns_all_but_trailing(self): 11700 t = (1, 2, 3) 11701 self.assertEqual(tuple.__getitem__(t, slice(-2)), (1,)) 11702 11703 def test_dunder_getitem_with_positive_step_returns_forwards_list(self): 11704 t = (1, 2, 3) 11705 self.assertEqual(tuple.__getitem__(t, slice(0, 10, 2)), (1, 3)) 11706 11707 def test_dunder_getitem_with_negative_step_returns_backwards_list(self): 11708 t = (1, 2, 3) 11709 self.assertEqual(tuple.__getitem__(t, slice(2, -10, -2)), (3, 1)) 11710 11711 def test_dunder_getitem_with_large_negative_start_returns_copy(self): 11712 t = (1, 2, 3) 11713 self.assertIs(tuple.__getitem__(t, slice(-10, 10)), t) 11714 11715 def test_dunder_getitem_with_large_positive_start_returns_empty(self): 11716 t = (1, 2, 3) 11717 self.assertEqual(tuple.__getitem__(t, slice(10, 10)), ()) 11718 11719 def test_dunder_getitem_with_large_negative_stop_returns_empty(self): 11720 t = (1, 2, 3) 11721 self.assertEqual(tuple.__getitem__(t, slice(-10)), ()) 11722 11723 def test_dunder_getitem_with_large_positive_stop_returns_same_object(self): 11724 t = (1, 2, 3) 11725 self.assertIs(tuple.__getitem__(t, slice(10)), t) 11726 11727 def test_dunder_getitem_with_extended_empty_slice_neg_step_returns_empty(self): 11728 t = (1, 2, 3) 11729 self.assertEqual(tuple.__getitem__(t, slice(1, 2, -1)), ()) 11730 11731 def test_dunder_getitem_with_extended_empty_slice_pos_step_returns_empty(self): 11732 t = (1, 2, 3) 11733 self.assertEqual(tuple.__getitem__(t, slice(2, 1, 2)), ()) 11734 11735 def test_dunder_gt_with_non_tuple_self_raises_type_error(self): 11736 self.assertRaisesRegex( 11737 TypeError, 11738 "'__gt__' .* 'tuple' object.* a 'NoneType'", 11739 tuple.__gt__, 11740 None, 11741 (), 11742 ) 11743 11744 def test_dunder_gt_with_non_tuple_other_return_not_implemented(self): 11745 self.assertIs(tuple.__gt__((), None), NotImplemented) 11746 11747 def test_dunder_gt_with_equal_tuples_returns_false(self): 11748 lhs = (1, 2, 3, 4) 11749 rhs = (1, 2, 3, 4) 11750 self.assertFalse(tuple.__gt__(lhs, rhs)) 11751 11752 def test_dunder_gt_with_longer_rhs_returns_false(self): 11753 lhs = (1, 2, 3, 4) 11754 rhs = (1, 2, 3, 4, 5) 11755 self.assertFalse(tuple.__gt__(lhs, rhs)) 11756 11757 def test_dunder_gt_with_shorter_rhs_returns_true(self): 11758 lhs = (1, 2, 3, 4) 11759 rhs = (1, 2, 3) 11760 self.assertTrue(tuple.__gt__(lhs, rhs)) 11761 11762 def test_dunder_gt_with_smaller_element_returns_true(self): 11763 lhs = (1, 2, 3) 11764 rhs = (1, 2, 2, 4) 11765 self.assertTrue(tuple.__gt__(lhs, rhs)) 11766 11767 def test_dunder_gt_with_larger_element_returns_false(self): 11768 lhs = (1, 2, 3, 4) 11769 rhs = (1, 4) 11770 self.assertFalse(tuple.__gt__(lhs, rhs)) 11771 11772 def test_dunder_le_with_non_tuple_self_raises_type_error(self): 11773 self.assertRaisesRegex( 11774 TypeError, 11775 "'__le__' .* 'tuple' object.* a 'NoneType'", 11776 tuple.__le__, 11777 None, 11778 (), 11779 ) 11780 11781 def test_dunder_le_with_non_tuple_other_return_not_implemented(self): 11782 self.assertIs(tuple.__le__((), None), NotImplemented) 11783 11784 def test_dunder_le_with_equal_tuples_returns_true(self): 11785 lhs = (1, 2, 3, 4) 11786 rhs = (1, 2, 3, 4) 11787 self.assertTrue(tuple.__le__(lhs, rhs)) 11788 11789 def test_dunder_le_with_longer_rhs_returns_true(self): 11790 lhs = (1, 2, 3, 4) 11791 rhs = (1, 2, 3, 4, 5) 11792 self.assertTrue(tuple.__le__(lhs, rhs)) 11793 11794 def test_dunder_le_with_shorter_rhs_returns_false(self): 11795 lhs = (1, 2, 3, 4) 11796 rhs = (1, 2, 3) 11797 self.assertFalse(tuple.__le__(lhs, rhs)) 11798 11799 def test_dunder_le_with_smaller_element_returns_false(self): 11800 lhs = (1, 2, 3) 11801 rhs = (1, 2, 2, 4) 11802 self.assertFalse(tuple.__le__(lhs, rhs)) 11803 11804 def test_dunder_le_with_larger_element_returns_true(self): 11805 lhs = (1, 2, 3, 4) 11806 rhs = (1, 4) 11807 self.assertTrue(tuple.__le__(lhs, rhs)) 11808 11809 def test_dunder_lt_with_non_tuple_self_raises_type_error(self): 11810 self.assertRaisesRegex( 11811 TypeError, 11812 "'__lt__' .* 'tuple' object.* a 'NoneType'", 11813 tuple.__lt__, 11814 None, 11815 (), 11816 ) 11817 11818 def test_dunder_lt_with_non_tuple_other_returns_not_implemented(self): 11819 self.assertIs(tuple.__lt__((), None), NotImplemented) 11820 11821 def test_dunder_lt_with_equal_tuples_returns_false(self): 11822 lhs = (1, 2, 3, 4) 11823 rhs = (1, 2, 3, 4) 11824 self.assertFalse(tuple.__lt__(lhs, rhs)) 11825 11826 def test_dunder_lt_with_longer_rhs_returns_true(self): 11827 lhs = (1, 2, 3, 4) 11828 rhs = (1, 2, 3, 4, 5) 11829 self.assertTrue(tuple.__lt__(lhs, rhs)) 11830 11831 def test_dunder_lt_with_shorter_rhs_returns_false(self): 11832 lhs = (1, 2, 3, 4) 11833 rhs = (1, 2, 3) 11834 self.assertFalse(tuple.__lt__(lhs, rhs)) 11835 11836 def test_dunder_lt_with_smaller_element_returns_false(self): 11837 lhs = (1, 2, 3) 11838 rhs = (1, 2, 2, 4) 11839 self.assertFalse(tuple.__lt__(lhs, rhs)) 11840 11841 def test_dunder_lt_with_larger_element_returns_true(self): 11842 lhs = (1, 2, 3, 4) 11843 rhs = (1, 4) 11844 self.assertTrue(tuple.__lt__(lhs, rhs)) 11845 11846 def test_dunder_ne_with_non_tuple_self_raises_type_error(self): 11847 self.assertRaisesRegex( 11848 TypeError, 11849 "'__ne__' .* 'tuple' object.* a 'NoneType'", 11850 tuple.__ne__, 11851 None, 11852 (), 11853 ) 11854 11855 def test_dunder_ne_with_non_tuple_other_returns_not_implemented(self): 11856 self.assertIs(tuple.__lt__((), None), NotImplemented) 11857 11858 def test_dunder_ne_with_equal_tuples_returns_false(self): 11859 lhs = (1, 2, 3, 4) 11860 rhs = (1, 2, 3, 4) 11861 self.assertFalse(tuple.__ne__(lhs, rhs)) 11862 11863 def test_dunder_ne_with_different_element_returns_true(self): 11864 lhs = (1, 2, 3, 4) 11865 rhs = (1, 2, 3, 5) 11866 self.assertTrue(tuple.__ne__(lhs, rhs)) 11867 11868 def test_dunder_ne_with_longer_rhs_returns_true(self): 11869 lhs = (1, 2, 3, 4) 11870 rhs = (1, 2, 3, 4, 5) 11871 self.assertTrue(tuple.__ne__(lhs, rhs)) 11872 11873 def test_dunder_ne_with_shorter_rhs_returns_true(self): 11874 lhs = (1, 2, 3, 4) 11875 rhs = (1, 2, 3) 11876 self.assertTrue(tuple.__ne__(lhs, rhs)) 11877 11878 def test_dunder_ne_with_smaller_element_returns_true(self): 11879 lhs = (1, 2, 3) 11880 rhs = (1, 2, 2, 4) 11881 self.assertTrue(tuple.__ne__(lhs, rhs)) 11882 11883 def test_dunder_ne_with_larger_element_returns_true(self): 11884 lhs = (1, 2, 3, 4) 11885 rhs = (1, 4) 11886 self.assertTrue(tuple.__ne__(lhs, rhs)) 11887 11888 def test_dunder_new_with_no_iterable_arg_returns_empty_tuple(self): 11889 result = tuple.__new__(tuple) 11890 self.assertIs(result, ()) 11891 11892 def test_dunder_new_with_tuple_returns_same_object(self): 11893 src = (1, 2, 3) 11894 result = tuple.__new__(tuple, src) 11895 self.assertIs(result, src) 11896 11897 def test_dunder_new_with_list_returns_tuple(self): 11898 self.assertEqual(tuple([1, 2, 3]), (1, 2, 3)) 11899 11900 def test_dunder_new_with_tuple_subclass_and_tuple_returns_new_object(self): 11901 class C(tuple): 11902 pass 11903 11904 src = (1, 2, 3) 11905 result = tuple.__new__(C, src) 11906 self.assertTrue(result is not src) 11907 11908 def test_dunder_new_with_iterable_returns_tuple_with_elements(self): 11909 result = tuple.__new__(tuple, [1, 2, 3]) 11910 self.assertEqual(result, (1, 2, 3)) 11911 11912 def test_dunder_new_with_tuple_subclass_calls_dunder_iter(self): 11913 class C(tuple): 11914 def __iter__(self): 11915 raise UserWarning("foo") 11916 11917 c = C() 11918 self.assertRaises(UserWarning, tuple, c) 11919 11920 def test_dunder_new_with_list_subclass_calls_dunder_iter(self): 11921 class C(list): 11922 def __iter__(self): 11923 raise UserWarning("foo") 11924 11925 c = C() 11926 self.assertRaises(UserWarning, tuple, c) 11927 11928 def test_dunder_new_with_raising_dunder_iter_descriptor_raises_type_error(self): 11929 class Desc: 11930 def __get__(self, obj, type): 11931 raise UserWarning("foo") 11932 11933 class C: 11934 __iter__ = Desc() 11935 11936 with self.assertRaises(TypeError) as context: 11937 tuple(C()) 11938 self.assertEqual(str(context.exception), "'C' object is not iterable") 11939 11940 def test_dunder_new_with_raising_dunder_next_descriptor_propagates_exception(self): 11941 class Desc: 11942 def __get__(self, obj, type): 11943 raise UserWarning("foo") 11944 11945 class C: 11946 def __iter__(self): 11947 return self 11948 11949 __next__ = Desc() 11950 11951 with self.assertRaises(UserWarning): 11952 tuple(C()) 11953 11954 def test_dunder_rmul_with_one_element(self): 11955 left = (1,) 11956 result = tuple.__rmul__(left, 4) 11957 self.assertTupleEqual(result, (1, 1, 1, 1)) 11958 11959 def test_dunder_rmul_with_length_greater_than_one_and_times_is_one(self): 11960 left = (1, 2, 3) 11961 result = tuple.__rmul__(left, 1) 11962 self.assertIs(result, left) 11963 11964 def test_dunder_rmul_with_length_greater_than_one_and_times_greater_than_one(self): 11965 left = (1, 2, 3) 11966 result = tuple.__rmul__(left, 2) 11967 self.assertTupleEqual(result, (1, 2, 3, 1, 2, 3)) 11968 11969 def test_dunder_rmul_with_empty_tuple(self): 11970 left = () 11971 result = tuple.__rmul__(left, 5) 11972 self.assertIs(result, left) 11973 11974 def test_dunder_rmul_with_negative_times(self): 11975 left = (1, 2, 3) 11976 result = tuple.__rmul__(left, -2) 11977 self.assertIs(result, ()) 11978 11979 def test_dunder_rmul_with_tuple_subclass_returns_tuple(self): 11980 class C(tuple): 11981 pass 11982 11983 instance = C((1, 2, 3)) 11984 result = tuple.__rmul__(instance, 2) 11985 self.assertEqual(result.__class__, tuple) 11986 self.assertTupleEqual(result, (1, 2, 3, 1, 2, 3)) 11987 11988 def test_index_with_non_tuple_self_raises_type_error(self): 11989 with self.assertRaises(TypeError): 11990 tuple.index(object(), object()) 11991 11992 def test_index_with_no_start_starts_at_zero(self): 11993 result = (1, 2, 3, 1, 2, 3).index(1) 11994 self.assertEqual(result, 0) 11995 11996 def test_index_with_negative_start_starts_from_end(self): 11997 result = (1, 2, 3, 1, 2, 3).index(3, -1) 11998 self.assertEqual(result, 5) 11999 12000 def test_index_with_negative_start_greater_than_length_starts_from_zero(self): 12001 result = (1, 2, 3, 1, 2, 3).index(3, -10) 12002 self.assertEqual(result, 2) 12003 12004 def test_index_with_no_stop_ends_at_length(self): 12005 result = (1, 2, 3, 4).index(4) 12006 self.assertEqual(result, 3) 12007 12008 def test_index_starts_at_given_start(self): 12009 result = (1, 2, 3, 1, 2, 3).index(1, 2) 12010 self.assertEqual(result, 3) 12011 12012 def test_index_with_negative_one_stops_before_end(self): 12013 with self.assertRaisesRegex(ValueError, "not in tuple"): 12014 (1, 2, 3, 4).index(4, 0, -1) 12015 12016 def test_index_with_negative_stop_stops_at_end(self): 12017 result = (1, 2, 3, 4).index(3, 0, -1) 12018 self.assertEqual(result, 2) 12019 12020 def test_index_with_negative_stop_greater_than_length_stops_at_zero(self): 12021 with self.assertRaisesRegex(ValueError, "not in tuple"): 12022 (1, 2, 3).index(3, 0, -10) 12023 12024 def test_index_stops_at_given_stop(self): 12025 with self.assertRaisesRegex(ValueError, "not in tuple"): 12026 (1, 2, 3, 4).index(4, 0, 3) 12027 12028 def test_index_compares_identity(self): 12029 class C: 12030 __eq__ = Mock(name="__eq__", return_value=False) 12031 12032 instance = C() 12033 result = (instance,).index(instance) 12034 self.assertEqual(result, 0) 12035 instance.__eq__.assert_not_called() 12036 12037 def test_index_calls_dunder_index_on_start(self): 12038 class C: 12039 __index__ = Mock(name="__index__", return_value=0) 12040 12041 result = (1, 2, 3).index(2, C()) 12042 self.assertEqual(result, 1) 12043 C.__index__.assert_called_once() 12044 12045 def test_index_calls_dunder_index_on_stop(self): 12046 class C: 12047 __index__ = Mock(name="__index__", return_value=5) 12048 12049 result = (1, 2, 3).index(2, 0, C()) 12050 self.assertEqual(result, 1) 12051 C.__index__.assert_called_once() 12052 12053 def test_index_calls_dunder_eq(self): 12054 class C: 12055 __eq__ = Mock(name="__eq__", return_value=False) 12056 12057 instance = C() 12058 result = (instance, 4).index(4) 12059 self.assertEqual(result, 1) 12060 instance.__eq__.assert_called_once() 12061 12062 def test_count_with_non_tuple_raises_type_error(self): 12063 with self.assertRaises(TypeError): 12064 tuple.count("foo", 3) 12065 12066 def test_count_with_empty_returns_zero(self): 12067 result = ().count(3) 12068 self.assertEqual(result, 0) 12069 12070 def test_count_with_no_matches_returns_zero(self): 12071 result = (2, 4, 6, 8).count(3) 12072 self.assertEqual(result, 0) 12073 12074 def test_count_with_mixed_elements(self): 12075 t = (2, [1], 6, 8) 12076 self.assertEqual(t.count(3), 0) 12077 self.assertEqual(t.count(2), 1) 12078 12079 def test_count_with_identical_elements(self): 12080 N = 5 12081 t = (2,) * N 12082 self.assertEqual(t.count(3), 0) 12083 self.assertEqual(t.count(2), N) 12084 12085 def test_count_with_equivalent_objects(self): 12086 o = object() 12087 self.assertEqual(().count(o), 0) 12088 self.assertEqual((o,).count(o), 1) 12089 self.assertEqual((o, o).count(o), 2) 12090 12091 def test_count_with_incomparable_elements_raises(self): 12092 class MyException(Exception): 12093 pass 12094 12095 class NoCompare: 12096 def __eq__(self, other): 12097 raise MyException("oops") 12098 12099 # Create an object that doesn't support __eq__ 12100 # The exception should pass through the count 12101 bad = NoCompare() 12102 12103 with self.assertRaises(MyException): 12104 (1, 2, bad, 3).count(3) 12105 12106 with self.assertRaises(MyException): 12107 (1, 2, 3, 4).count(bad) 12108 12109 self.assertEqual((bad,).count(bad), 1) 12110 12111 def test_count_with_nan(self): 12112 nan = float("nan") 12113 self.assertEqual(().count(nan), 0) 12114 self.assertEqual((nan,).count(nan), 1) 12115 12116 def test_count_does_not_call_dunder_iter(self): 12117 class NoIterTuple(tuple): 12118 def __iter__(self): 12119 raise NotImplementedError("no iter") 12120 12121 t = NoIterTuple((1, 2, 3, 4, 3, 2, 1)) 12122 self.assertEqual(t.count(3), 2) 12123 12124 def pickle_with_tuple_returns_bytes(self, protocol): 12125 t = (11, 22, 33) 12126 # @lint-ignore PYTHONPICKLEISBAD 12127 pickled = pickle.dumps(t, protocol) 12128 self.assertIs(type(pickled), bytes) 12129 # @lint-ignore PYTHONPICKLEISBAD 12130 unpickled = pickle.loads(pickled) 12131 self.assertEqual(t, unpickled) 12132 # Type must precisely be a tuple 12133 self.assertIs(type(unpickled), tuple) 12134 12135 def test_pickle_with_tuple_and_default_protocol_returns_bytes(self): 12136 self.pickle_with_tuple_returns_bytes(None) 12137 12138 def test_pickle_with_tuple_and_protocol_0_returns_bytes(self): 12139 self.pickle_with_tuple_returns_bytes(0) 12140 12141 def test_pickle_with_tuple_and_protocol_1_returns_bytes(self): 12142 self.pickle_with_tuple_returns_bytes(1) 12143 12144 def test_pickle_with_tuple_and_protocol_2_returns_bytes(self): 12145 self.pickle_with_tuple_returns_bytes(2) 12146 12147 def test_pickle_with_tuple_and_protocol_3_returns_bytes(self): 12148 self.pickle_with_tuple_returns_bytes(3) 12149 12150 # TODO(T85833587): Test needs _object_reduce_getstate implemented 12151 @cpython_only 12152 def test_tuple_subclass_pickles(self): 12153 t = TupleSubclass((11, 22, 33)) 12154 # @lint-ignore PYTHONPICKLEISBAD 12155 pickled = pickle.dumps(t) 12156 self.assertIs(type(pickled), bytes) 12157 # @lint-ignore PYTHONPICKLEISBAD 12158 unpickled = pickle.loads(pickled) 12159 self.assertEqual(t, unpickled) 12160 # Type must precisely be a T 12161 self.assertIs(type(unpickled), TupleSubclass) 12162 12163 def pickle_with_tuple_iterator_returns_bytes(self, protocol): 12164 t = (11, 22, 33) 12165 it = iter(t) 12166 # @lint-ignore PYTHONPICKLEISBAD 12167 pickled = pickle.dumps(it, protocol) 12168 self.assertIs(type(pickled), bytes) 12169 # @lint-ignore PYTHONPICKLEISBAD 12170 unpickled_iterator = pickle.loads(pickled) 12171 self.assertIs(type(unpickled_iterator), type(it)) 12172 items = tuple(unpickled_iterator) 12173 self.assertEqual(t, items) 12174 12175 def test_pickle_with_tuple_iterator_protocol_default_returns_bytes(self): 12176 self.pickle_with_tuple_iterator_returns_bytes(None) 12177 12178 def test_pickle_with_tuple_iterator_protocol_0_returns_bytes(self): 12179 self.pickle_with_tuple_iterator_returns_bytes(0) 12180 12181 def test_pickle_with_tuple_iterator_protocol_1_returns_bytes(self): 12182 self.pickle_with_tuple_iterator_returns_bytes(1) 12183 12184 def test_pickle_with_tuple_iterator_protocol_2_returns_bytes(self): 12185 self.pickle_with_tuple_iterator_returns_bytes(2) 12186 12187 def test_pickle_with_tuple_iterator_protocol_3_returns_bytes(self): 12188 self.pickle_with_tuple_iterator_returns_bytes(3) 12189 12190 def test_tupliter_reduce_with_iter_builtin_missing_raises_attribute_error(self): 12191 class remove_builtins_iter: 12192 def __enter__(self): 12193 self._saveiter = __builtins__.iter 12194 del __builtins__.iter 12195 12196 def __exit__(self, type, value, traceback): 12197 __builtins__.iter = self._saveiter 12198 12199 t = TupleSubclass((11, 22, 33)) 12200 it = iter(t) 12201 with remove_builtins_iter(): 12202 with self.assertRaises(AttributeError): 12203 it.__reduce__() 12204 12205 def pickle_tuple_iterator_with_subclass_iter_returns_bytes(self, protocol): 12206 t = TupleSubclass((11, 22, 33)) 12207 it = iter(t) 12208 # @lint-ignore PYTHONPICKLEISBAD 12209 pickled = pickle.dumps(it, protocol) 12210 self.assertIs(type(pickled), bytes) 12211 # @lint-ignore PYTHONPICKLEISBAD 12212 unpickled_iterator = pickle.loads(pickled) 12213 self.assertIs(type(unpickled_iterator), type(it)) 12214 items = tuple(unpickled_iterator) 12215 self.assertEqual(tuple(it), items) 12216 self.assertEqual(t, items) 12217 12218 def test_pickle_with_tuple_iterator_subclass_and_default_protocol_returns_bytes( 12219 self, 12220 ): 12221 self.pickle_tuple_iterator_with_subclass_iter_returns_bytes(None) 12222 12223 def test_pickle_with_tuple_iterator_subclass_and_protocol_0_returns_bytes(self): 12224 self.pickle_tuple_iterator_with_subclass_iter_returns_bytes(0) 12225 12226 def test_pickle_with_tuple_iterator_subclass_and_protocol_1_returns_bytes(self): 12227 self.pickle_tuple_iterator_with_subclass_iter_returns_bytes(1) 12228 12229 def test_pickle_with_tuple_iterator_subclass_and_protocol_2_returns_bytes(self): 12230 self.pickle_tuple_iterator_with_subclass_iter_returns_bytes(2) 12231 12232 def test_pickle_with_tuple_iterator_subclass_and_protocol_3_returns_bytes(self): 12233 self.pickle_tuple_iterator_with_subclass_iter_returns_bytes(3) 12234 12235 def pickle_with_reversedtuple_returns_bytes(self, protocol): 12236 t = (11, 22, 33) 12237 it = reversed(t) 12238 # @lint-ignore PYTHONPICKLEISBAD 12239 pickled = pickle.dumps(it, protocol) 12240 self.assertIs(type(pickled), bytes) 12241 # @lint-ignore PYTHONPICKLEISBAD 12242 unpickled_iterator = pickle.loads(pickled) 12243 items = tuple(unpickled_iterator) 12244 self.assertEqual(tuple(it), items) 12245 12246 def test_pickle_with_reversedtuple_and_default_protocol_returns_bytes(self): 12247 self.pickle_with_reversedtuple_returns_bytes(None) 12248 12249 def test_pickle_with_reversedtuple_and_protocol_0_returns_bytes(self): 12250 self.pickle_with_reversedtuple_returns_bytes(0) 12251 12252 def test_pickle_with_reversedtuple_and_protocol_1_returns_bytes(self): 12253 self.pickle_with_reversedtuple_returns_bytes(1) 12254 12255 def test_pickle_with_reversedtuple_and_protocol_2_returns_bytes(self): 12256 self.pickle_with_reversedtuple_returns_bytes(2) 12257 12258 def test_pickle_with_reversedtuple_and_protocol_3_returns_bytes(self): 12259 self.pickle_with_reversedtuple_returns_bytes(3) 12260 12261 def pickle_with_used_tuple_iterator_returns_bytes(self, protocol): 12262 t = (11, 22, 33) 12263 it = iter(t) 12264 self.assertEqual(it.__next__(), 11) 12265 # @lint-ignore PYTHONPICKLEISBAD 12266 pickled = pickle.dumps(it, protocol) 12267 self.assertIs(type(pickled), bytes) 12268 # @lint-ignore PYTHONPICKLEISBAD 12269 unpickled_iterator = pickle.loads(pickled) 12270 self.assertIs(type(unpickled_iterator), type(it)) 12271 items = tuple(unpickled_iterator) 12272 self.assertEqual(t[1:], items) 12273 12274 def test_pickle_with_used_tuple_iterator_and_default_protocol_returns_bytes(self): 12275 self.pickle_with_used_tuple_iterator_returns_bytes(None) 12276 12277 def test_pickle_with_used_tuple_iterator_and_protocol_0_returns_bytes(self): 12278 self.pickle_with_used_tuple_iterator_returns_bytes(0) 12279 12280 def test_pickle_with_used_tuple_iterator_and_protocol_1_returns_bytes(self): 12281 self.pickle_with_used_tuple_iterator_returns_bytes(1) 12282 12283 def test_pickle_with_used_tuple_iterator_and_protocol_2_returns_bytes(self): 12284 self.pickle_with_used_tuple_iterator_returns_bytes(2) 12285 12286 def test_pickle_with_used_tuple_iterator_and_protocol_3_returns_bytes(self): 12287 self.pickle_with_used_tuple_iterator_returns_bytes(3) 12288 12289 def pickle_with_used_tuplesubclass_iter_returns_bytes(self, protocol): 12290 t = TupleSubclass((11, 22, 33)) 12291 it = iter(t) 12292 self.assertEqual(it.__next__(), 11) 12293 # @lint-ignore PYTHONPICKLEISBAD 12294 pickled = pickle.dumps(it, protocol) 12295 self.assertIs(type(pickled), bytes) 12296 # @lint-ignore PYTHONPICKLEISBAD 12297 unpickled_iterator = pickle.loads(pickled) 12298 self.assertIs(type(unpickled_iterator), type(it)) 12299 items = tuple(unpickled_iterator) 12300 self.assertEqual(t[1:], items) 12301 12302 def test_pickle_with_used_tuplesubclass_iter_and_default_protocol_returns_bytes( 12303 self, 12304 ): 12305 self.pickle_with_used_tuplesubclass_iter_returns_bytes(None) 12306 12307 def test_pickle_with_used_tuplesubclass_iter_and_protocol_0_returns_bytes( 12308 self, 12309 ): 12310 self.pickle_with_used_tuplesubclass_iter_returns_bytes(0) 12311 12312 def test_pickle_with_used_tuplesubclass_iter_and_protocol_1_returns_bytes( 12313 self, 12314 ): 12315 self.pickle_with_used_tuplesubclass_iter_returns_bytes(1) 12316 12317 def test_pickle_with_used_tuplesubclass_iter_and_protocol_2_returns_bytes( 12318 self, 12319 ): 12320 self.pickle_with_used_tuplesubclass_iter_returns_bytes(2) 12321 12322 def test_pickle_with_used_tuplesubclass_iter_and_protocol_3_returns_bytes( 12323 self, 12324 ): 12325 self.pickle_with_used_tuplesubclass_iter_returns_bytes(3) 12326 12327 def test_tuple_iterator_setstate_with_noninteger_raises_type_error(self): 12328 t = (11, 22, 33) 12329 it = iter(t) 12330 with self.assertRaises(TypeError): 12331 it.__setstate__("hello") 12332 12333 def test_getnewargs_with_ground_tuple_returns_tuple_of_self(self): 12334 t = (11, 22, 33) 12335 result = t.__getnewargs__() 12336 self.assertEqual(result, (t,)) 12337 self.assertIs(result[0], t) 12338 12339 def test_getnewargs_with_tuple_subclass_without_iter_returns_tuple(self): 12340 class T(tuple): 12341 def __iter__(self): 12342 raise NotImplementedError("bad") 12343 12344 t = T((11, 22, 33)) 12345 result = t.__getnewargs__() 12346 self.assertEqual(result, (t,)) 12347 self.assertIsNot(result[0], t) 12348 self.assertIs(type(result[0]), tuple) 12349 12350 def test_tuple_iterator_setstate_with_int_returns_none(self): 12351 t = (11, 22, 33) 12352 it = iter(t) 12353 self.assertIsNone(it.__setstate__(0)) 12354 12355 def test_tuple_iterator_setstate_with_int_in_range_returns_none(self): 12356 t = (11, 22, 33) 12357 it = iter(t) 12358 self.assertIsNone(it.__setstate__(0)) 12359 self.assertEqual(it.__reduce__()[2], 0) 12360 self.assertIsNone(it.__setstate__(1)) 12361 self.assertEqual(it.__reduce__()[2], 1) 12362 self.assertIsNone(it.__setstate__(2)) 12363 self.assertEqual(it.__reduce__()[2], 2) 12364 self.assertIsNone(it.__setstate__(3)) 12365 self.assertEqual(it.__reduce__()[2], 3) 12366 12367 def test_tuple_iterator_setstate_with_negative_int_returns_none(self): 12368 t = (11, 22, 33) 12369 it = iter(t) 12370 self.assertIsNone(it.__setstate__(-1)) 12371 self.assertEqual(it.__reduce__()[2], 0) 12372 12373 def test_tuple_iterator_setstate_with_int_greater_than_size_returns_none(self): 12374 t = (11, 22, 33) 12375 it = iter(t) 12376 self.assertIsNone(it.__setstate__(4)) 12377 self.assertEqual(it.__reduce__()[2], 3) 12378 12379 def test_tuple_iterator_setstate_with_largest_native_int_returns_none(self): 12380 t = (11, 22, 33) 12381 it = iter(t) 12382 self.assertIsNone(it.__setstate__(sys.maxsize)) 12383 self.assertEqual(it.__reduce__()[2], 3) 12384 12385 def test_tuple_iterator_setstate_with_most_negative_native_int_returns_none(self): 12386 t = (11, 22, 33) 12387 it = iter(t) 12388 verynegative = (-sys.maxsize) - 1 12389 self.assertIsNone(it.__setstate__(verynegative)) 12390 self.assertEqual(it.__reduce__()[2], 0) 12391 12392 def test_tuple_iterator_setstate_with_large_int_raises_overflow_error(self): 12393 t = (11, 22, 33) 12394 it = iter(t) 12395 large = 2 ** 1000 12396 with self.assertRaises(OverflowError): 12397 it.__setstate__(large) 12398 12399 def test_tuple_iterator_setstate_with_negative_large_int_raises_overflow_error( 12400 self, 12401 ): 12402 t = (11, 22, 33) 12403 it = iter(t) 12404 negative_large = -(2 ** 1000) 12405 with self.assertRaises(OverflowError): 12406 it.__setstate__(negative_large) 12407 12408 def test_tuple_iterator_setstate_with_noninteger_raises_type_error(self): 12409 t = (11, 22, 33) 12410 it = iter(t) 12411 with self.assertRaises(TypeError): 12412 it.__setstate__("hello") 12413 12414 def test_tuple_iterator_setstate_with_integer_convertable_raises_type_error(self): 12415 t = (11, 22, 33) 12416 it = iter(t) 12417 with self.assertRaises(TypeError): 12418 it.__setstate__(1.0) 12419 12420 def test_tuple_iterator_setstate_with_int_subclass_returns_none(self): 12421 class T(int): 12422 pass 12423 12424 t = (11, 22, 33) 12425 it = iter(t) 12426 n = T(1) 12427 self.assertIsNone(it.__setstate__(n)) 12428 self.assertEqual(it.__reduce__()[2], n) 12429 self.assertIs(type(it.__reduce__()[2]), int) 12430 12431 def test_tuple_iterator_reduce_with_ground_tuple_returns_tuple(self): 12432 t = (11, 22, 33) 12433 it = iter(t) 12434 reduction = it.__reduce__() 12435 self.assertEqual(reduction, (iter, (t,), 0)) 12436 self.assertIs(reduction[0], iter) 12437 self.assertIs(type(reduction[1]), tuple) 12438 self.assertIs(type(reduction[1][0]), tuple) 12439 self.assertIs(type(reduction[2]), int) 12440 12441 def test_tuple_iterator_reduce_with_empty_tuple_returns_tuple(self): 12442 t = () 12443 it = iter(t) 12444 reduction = it.__reduce__() 12445 self.assertEqual(reduction, (iter, (t,), 0)) 12446 self.assertIs(reduction[0], iter) 12447 self.assertIs(type(reduction[1]), tuple) 12448 self.assertIs(type(reduction[1][0]), tuple) 12449 12450 def test_tuple_iterator_reduce_with_tuple_subclass_returns_tuple(self): 12451 class T(tuple): 12452 pass 12453 12454 ground = (11, 22, 33) 12455 t = T(ground) 12456 it = iter(t) 12457 reduction = it.__reduce__() 12458 self.assertEqual(reduction, (iter, (t,), 0)) 12459 self.assertIs(reduction[0], iter) 12460 self.assertIs(type(reduction[1]), tuple) 12461 self.assertIs(type(reduction[2]), int) 12462 12463 def test_tuple_iterator_reduce_with_empty_tuple_subclass_returns_tuple(self): 12464 class T(tuple): 12465 pass 12466 12467 ground = (11, 22, 33) 12468 t = T(ground) 12469 it = iter(t) 12470 reduction = it.__reduce__() 12471 self.assertEqual(reduction, (iter, (t,), 0)) 12472 self.assertIs(reduction[0], iter) 12473 self.assertIs(type(reduction[1]), tuple) 12474 12475 12476class VarsTests(unittest.TestCase): 12477 def test_no_arg_delegates_to_locals(self): 12478 def foo(): 12479 a = 4 12480 a = a # noqa: F841 12481 b = 5 12482 b = b # noqa: F841 12483 return vars() 12484 12485 result = foo() 12486 self.assertIsInstance(result, dict) 12487 self.assertEqual(len(result), 2) 12488 self.assertEqual(result["a"], 4) 12489 self.assertEqual(result["b"], 5) 12490 12491 def test_arg_with_no_dunder_dict_raises_type_error(self): 12492 with self.assertRaises(TypeError) as context: 12493 vars(None) 12494 self.assertEqual( 12495 str(context.exception), "vars() argument must have __dict__ attribute" 12496 ) 12497 12498 def test_arg_with_dunder_dict_raising_attribute_error_raises_type_error(self): 12499 class Desc: 12500 def __get__(self, obj, type): 12501 raise AttributeError("called descriptor") 12502 12503 class C: 12504 __dict__ = Desc() 12505 12506 c = C() 12507 with self.assertRaises(TypeError) as context: 12508 vars(c) 12509 self.assertEqual( 12510 str(context.exception), "vars() argument must have __dict__ attribute" 12511 ) 12512 12513 def test_arg_with_dunder_dict_propagates_exception(self): 12514 class Desc: 12515 def __get__(self, obj, type): 12516 raise UserWarning("called descriptor") 12517 12518 class C: 12519 __dict__ = Desc() 12520 12521 c = C() 12522 with self.assertRaises(UserWarning): 12523 vars(c) 12524 12525 def test_arg_with_dunder_dict_returns_dunder_dict(self): 12526 class C: 12527 __dict__ = 4 12528 12529 c = C() 12530 self.assertEqual(vars(c), 4) 12531 12532 12533@pyro_only 12534class UnderNumberCheckTests(unittest.TestCase): 12535 def test_number_check_with_builtin_number_returns_true(self): 12536 self.assertTrue(_number_check(2)) 12537 self.assertTrue(_number_check(False)) 12538 self.assertTrue(_number_check(5.0)) 12539 12540 def test_number_check_without_class_method_returns_false(self): 12541 class Foo: 12542 pass 12543 12544 foo = Foo() 12545 foo.__float__ = lambda: 1.0 12546 foo.__int__ = lambda: 2 12547 self.assertFalse(_number_check(foo)) 12548 12549 def test_number_check_with_dunder_index_descriptor_does_not_call(self): 12550 class Raise: 12551 def __get__(self, obj, type): 12552 raise AttributeError("bad") 12553 12554 class FloatLike: 12555 __float__ = Raise() 12556 12557 class IntLike: 12558 __int__ = Raise() 12559 12560 self.assertTrue(_number_check(FloatLike())) 12561 self.assertTrue(_number_check(IntLike())) 12562 12563 12564@unittest.skipIf( 12565 sys.version_info < (3, 10) and sys.implementation.name != "skybison", 12566 "Union requrires CPython 3.10", 12567) 12568class UnionTests(unittest.TestCase): 12569 def test_or_type_operator(self): 12570 self.assertEqual(int | str, typing.Union[int, str]) 12571 self.assertNotEqual(int | list, typing.Union[int, str]) 12572 self.assertEqual(str | int, typing.Union[int, str]) 12573 self.assertEqual(int | None, typing.Union[int, None]) 12574 self.assertEqual(None | int, typing.Union[int, None]) 12575 self.assertEqual(int | str | list, typing.Union[int, str, list]) 12576 self.assertEqual(int | (str | list), typing.Union[int, str, list]) 12577 self.assertEqual(str | (int | list), typing.Union[int, str, list]) 12578 self.assertEqual( 12579 typing.List | typing.Tuple, typing.Union[typing.List, typing.Tuple] 12580 ) 12581 self.assertEqual( 12582 typing.List[int] | typing.Tuple[int], 12583 typing.Union[typing.List[int], typing.Tuple[int]], 12584 ) 12585 self.assertEqual(typing.List[int] | None, typing.Union[typing.List[int], None]) 12586 self.assertEqual(None | typing.List[int], typing.Union[None, typing.List[int]]) 12587 self.assertEqual( 12588 str | float | int | complex | int, (int | str) | (float | complex) 12589 ) 12590 self.assertEqual( 12591 typing.Union[str, int, typing.List[int]], str | int | typing.List[int] 12592 ) 12593 self.assertEqual( 12594 typing.Union[str, int, float, complex], (int | str) | (float | complex) 12595 ) 12596 self.assertEqual(int | int, int) 12597 self.assertEqual( 12598 BaseException | bool | bytes | complex | float | int | list | map | set, 12599 typing.Union[ 12600 BaseException, 12601 bool, 12602 bytes, 12603 complex, 12604 float, 12605 int, 12606 list, 12607 map, 12608 set, 12609 ], 12610 ) 12611 with self.assertRaises(TypeError): 12612 int | 3 12613 with self.assertRaises(TypeError): 12614 3 | int 12615 with self.assertRaises(TypeError): 12616 Example() | int 12617 with self.assertRaises(TypeError): 12618 (int | str) < typing.Union[str, int] 12619 with self.assertRaises(TypeError): 12620 (int | str) < (int | bool) 12621 with self.assertRaises(TypeError): 12622 (int | str) <= (int | str) 12623 12624 def test_or_type_operator_with_Alias(self): 12625 self.assertEqual(list | str, typing.Union[list, str]) 12626 self.assertEqual(typing.List | str, typing.Union[typing.List, str]) 12627 12628 def test_or_type_operator_with_IO(self): 12629 self.assertEqual(typing.IO | str, typing.Union[typing.IO, str]) 12630 12631 def test_or_type_operator_with_NamedTuple(self): 12632 NT = namedtuple("A", ["B", "C", "D"]) 12633 self.assertEqual(NT | str, typing.Union[NT, str]) 12634 12635 def test_or_type_operator_with_NewType(self): 12636 UserId = typing.NewType("UserId", int) 12637 self.assertEqual(UserId | str, typing.Union[UserId, str]) 12638 12639 def test_or_type_operator_with_SpecialForm(self): 12640 self.assertEqual(typing.Any | str, typing.Union[typing.Any, str]) 12641 self.assertEqual(typing.NoReturn | str, typing.Union[typing.NoReturn, str]) 12642 self.assertEqual( 12643 typing.Optional[int] | str, typing.Union[typing.Optional[int], str] 12644 ) 12645 self.assertEqual(typing.Optional[int] | str, typing.Union[int, str, None]) 12646 self.assertEqual(typing.Union[int, bool] | str, typing.Union[int, bool, str]) 12647 self.assertNotEqual(str | int, typing.Tuple[str, int]) 12648 12649 def test_or_type_operator_with_TypeVar(self): 12650 TV = typing.TypeVar("T") 12651 self.assertEqual(TV | str, typing.Union[TV, str]) 12652 self.assertEqual(str | TV, typing.Union[str, TV]) 12653 12654 def test_or_type_repr(self): 12655 self.assertEqual(repr(int | None), "int | None") 12656 12657 def test_isinstance_with_or_union(self): 12658 self.assertTrue(isinstance(Super(), Super | int)) 12659 self.assertFalse(isinstance(None, str | int)) 12660 self.assertTrue(isinstance(3, str | int)) 12661 self.assertTrue(isinstance("", str | int)) 12662 self.assertTrue(isinstance(None, int | None)) 12663 self.assertFalse(isinstance(3.14, int | str)) 12664 12665 def test_isinstance_raises_type_error(self): 12666 with self.assertRaises(TypeError): 12667 isinstance(2, list[int]) 12668 with self.assertRaises(TypeError): 12669 isinstance(2, list[int] | int) 12670 with self.assertRaises(TypeError): 12671 isinstance(2, int | str | list[int] | float) 12672 12673 def test_subclass_with_union(self): 12674 self.assertTrue(issubclass(int, int | float | int)) 12675 self.assertTrue(issubclass(str, str | Child | str)) 12676 self.assertFalse(issubclass(dict, float | str)) 12677 self.assertFalse(issubclass(object, float | str)) 12678 with self.assertRaises(TypeError): 12679 issubclass(2, Child | Super) 12680 with self.assertRaises(TypeError): 12681 issubclass(int, list[int] | Child) 12682 12683 12684class ZipTests(unittest.TestCase): 12685 def test_no_iterables_returns_stopped_iterator(self): 12686 self.assertTupleEqual(tuple(zip()), ()) 12687 12688 def test_one_iterable_returns_1_tuples(self): 12689 self.assertTupleEqual(tuple(zip(range(3))), ((0,), (1,), (2,))) 12690 12691 def test_two_iterables_returns_2_tuples(self): 12692 self.assertTupleEqual( 12693 tuple(zip(range(0, 6, 2), range(1, 6, 2))), ((0, 1), (2, 3), (4, 5)) 12694 ) 12695 12696 def test_two_iterables_returns_shortest(self): 12697 self.assertTupleEqual(tuple(zip(range(10), range(3))), ((0, 0), (1, 1), (2, 2))) 12698 self.assertTupleEqual(tuple(zip(range(3), range(10))), ((0, 0), (1, 1), (2, 2))) 12699 12700 def test_three_iterables_returns_3_tuples(self): 12701 self.assertTupleEqual( 12702 tuple(zip(range(0, 10, 3), range(1, 10, 3), range(2, 10, 3))), 12703 ((0, 1, 2), (3, 4, 5), (6, 7, 8)), 12704 ) 12705 12706 def test_three_iterables_returns_shortest(self): 12707 self.assertTupleEqual( 12708 tuple(zip(range(3), range(10), range(4))), ((0, 0, 0), (1, 1, 1), (2, 2, 2)) 12709 ) 12710 self.assertTupleEqual( 12711 tuple(zip(range(3), range(4), range(10))), ((0, 0, 0), (1, 1, 1), (2, 2, 2)) 12712 ) 12713 self.assertTupleEqual( 12714 tuple(zip(range(10), range(3), range(4))), ((0, 0, 0), (1, 1, 1), (2, 2, 2)) 12715 ) 12716 self.assertTupleEqual( 12717 tuple(zip(range(10), range(4), range(3))), ((0, 0, 0), (1, 1, 1), (2, 2, 2)) 12718 ) 12719 self.assertTupleEqual( 12720 tuple(zip(range(4), range(3), range(10))), ((0, 0, 0), (1, 1, 1), (2, 2, 2)) 12721 ) 12722 self.assertTupleEqual( 12723 tuple(zip(range(4), range(10), range(3))), ((0, 0, 0), (1, 1, 1), (2, 2, 2)) 12724 ) 12725 12726 12727@pyro_only 12728class TestUnimplemented(unittest.TestCase): 12729 def test_unimplemented_raises_with_env_variable(self): 12730 @contextlib.contextmanager 12731 def temporary_env(name, value): 12732 previous_value = os.getenv(name) 12733 os.putenv(name, value) 12734 try: 12735 yield 12736 finally: 12737 if previous_value is None: 12738 os.unsetenv(name) 12739 else: 12740 os.putenv(name, previous_value) 12741 12742 with temporary_env("PYRO_RAISE_ON_UNIMPLEMENTED", "1"): 12743 with self.assertRaises(NotImplementedError): 12744 ImportError().__reduce__() 12745 12746 def test_unimplemented_raises_with_system_variable(self): 12747 class temporary_sysvar: 12748 def __init__(self, name, value): 12749 self._name = name 12750 self._value = value 12751 self._empty = object() 12752 12753 def __enter__(self): 12754 self._previous_value = getattr(sys, self._name, self._empty) 12755 setattr(sys, self._name, self._value) 12756 12757 def __exit__(self, exctype, excinst, exctb): 12758 if self._previous_value is self._empty: 12759 delattr(sys, self._name) 12760 else: 12761 setattr(sys, self._name, self._previous_value) 12762 12763 with temporary_sysvar("PYRO_RAISE_ON_UNIMPLEMENTED", True): 12764 with self.assertRaises(NotImplementedError): 12765 ImportError().__reduce__() 12766 12767 12768class FrameTests(unittest.TestCase): 12769 def test_clear_clears_locals(self): 12770 def inner(): 12771 try: 12772 raise Exception("test") 12773 except Exception as e: 12774 return e.__traceback__.tb_frame 12775 12776 frame = inner() 12777 self.assertIsNot(frame, None) 12778 self.assertIsNot(frame.f_locals, None) 12779 # Ensure that frame.clear() exists. 12780 # TODO(T86451971): Properly test behavior once we implement it. For now, we just test that 12781 # clear() doesn't raise. 12782 frame.clear() 12783 12784 12785if __name__ == "__main__": 12786 unittest.main()