|
42 | 42 |
|
43 | 43 | import array
|
44 | 44 |
|
| 45 | +BIG_NUMBER = 99999937497465632974931 |
| 46 | + |
45 | 47 | class _NamedIntConstant(int):
|
46 | 48 | def __new__(cls, value, name):
|
47 | 49 | self = super(_NamedIntConstant, cls).__new__(cls, value)
|
@@ -473,12 +475,9 @@ def test_from_array(self):
|
473 | 475 | self.assertEqual(int.from_bytes(
|
474 | 476 | array.array('b', b'\xff\x00\x00'), 'big', signed=True), -65536)
|
475 | 477 |
|
476 |
| - ''' |
477 |
| - TODO This test is commented out until GR-12448 is not fixed. |
478 | 478 | def test_from_memoryview(self):
|
479 | 479 | self.assertEqual(int.from_bytes(
|
480 | 480 | memoryview(b'\xff\x00\x00'), 'big', signed=True), -65536)
|
481 |
| - ''' |
482 | 481 |
|
483 | 482 | def test_wrong_input(self):
|
484 | 483 | self.assertRaises(ValueError, int.from_bytes, [256], 'big')
|
@@ -561,3 +560,153 @@ def __iter__(self):
|
561 | 560 | return iter([10])
|
562 | 561 |
|
563 | 562 | self.assertEqual(int.from_bytes(StrangeList([4,5]), 'big'), 3)
|
| 563 | + |
| 564 | +class ToBytesTests(unittest.TestCase): |
| 565 | + |
| 566 | + class MyInt(int): |
| 567 | + pass |
| 568 | + |
| 569 | + def check(self, tests, byteorder, signed=False): |
| 570 | + for test, expected in tests.items(): |
| 571 | + try: |
| 572 | + self.assertEqual( |
| 573 | + test.to_bytes(len(expected), byteorder, signed=signed), expected) |
| 574 | + except Exception as err: |
| 575 | + raise AssertionError( |
| 576 | + "failed to convert {0} with byteorder={1} and signed={2}" |
| 577 | + .format(test, byteorder, signed)) from err |
| 578 | + |
| 579 | + def checkPIntSpec(self, tests, byteorder, signed=False): |
| 580 | + for test, expected in tests.items(): |
| 581 | + try: |
| 582 | + self.assertEqual( |
| 583 | + MyInt(test).to_bytes(len(expected), byteorder, signed=signed), expected) |
| 584 | + except Exception as err: |
| 585 | + raise AssertionError( |
| 586 | + "failed to convert {0} with byteorder={1} and signed={2}" |
| 587 | + .format(test, byteorder, signed)) from err |
| 588 | + |
| 589 | + |
| 590 | + def test_SignedBitEndian(self): |
| 591 | + # Convert integers to signed big-endian byte arrays. |
| 592 | + tests1 = { |
| 593 | + 0: b'\x00', |
| 594 | + 1: b'\x01', |
| 595 | + -1: b'\xff', |
| 596 | + -127: b'\x81', |
| 597 | + -128: b'\x80', |
| 598 | + -129: b'\xff\x7f', |
| 599 | + 127: b'\x7f', |
| 600 | + 129: b'\x00\x81', |
| 601 | + -255: b'\xff\x01', |
| 602 | + -256: b'\xff\x00', |
| 603 | + 255: b'\x00\xff', |
| 604 | + 256: b'\x01\x00', |
| 605 | + 32767: b'\x7f\xff', |
| 606 | + -32768: b'\xff\x80\x00', |
| 607 | + 65535: b'\x00\xff\xff', |
| 608 | + -65536: b'\xff\x00\x00', |
| 609 | + -8388608: b'\x80\x00\x00' |
| 610 | + } |
| 611 | + self.check(tests1, 'big', signed=True) |
| 612 | + self.checkPIntSpec(tests1, 'big', signed=True) |
| 613 | + |
| 614 | + def test_SignedLittleEndian(self): |
| 615 | + # Convert integers to signed little-endian byte arrays. |
| 616 | + tests2 = { |
| 617 | + 0: b'\x00', |
| 618 | + 1: b'\x01', |
| 619 | + -1: b'\xff', |
| 620 | + -127: b'\x81', |
| 621 | + -128: b'\x80', |
| 622 | + -129: b'\x7f\xff', |
| 623 | + 127: b'\x7f', |
| 624 | + 129: b'\x81\x00', |
| 625 | + -255: b'\x01\xff', |
| 626 | + -256: b'\x00\xff', |
| 627 | + 255: b'\xff\x00', |
| 628 | + 256: b'\x00\x01', |
| 629 | + 32767: b'\xff\x7f', |
| 630 | + -32768: b'\x00\x80', |
| 631 | + 65535: b'\xff\xff\x00', |
| 632 | + -65536: b'\x00\x00\xff', |
| 633 | + -8388608: b'\x00\x00\x80' |
| 634 | + } |
| 635 | + self.check(tests2, 'little', signed=True) |
| 636 | + self.checkPIntSpec(tests2, 'little', signed=True) |
| 637 | + |
| 638 | + def test_UnsignedBigEndian(self): |
| 639 | + # Convert integers to unsigned big-endian byte arrays. |
| 640 | + tests3 = { |
| 641 | + 0: b'\x00', |
| 642 | + 1: b'\x01', |
| 643 | + 127: b'\x7f', |
| 644 | + 128: b'\x80', |
| 645 | + 255: b'\xff', |
| 646 | + 256: b'\x01\x00', |
| 647 | + 32767: b'\x7f\xff', |
| 648 | + 32768: b'\x80\x00', |
| 649 | + 65535: b'\xff\xff', |
| 650 | + 65536: b'\x01\x00\x00' |
| 651 | + } |
| 652 | + self.check(tests3, 'big', signed=False) |
| 653 | + self.checkPIntSpec(tests3, 'big', signed=False) |
| 654 | + |
| 655 | + def test_UnsignedLittleEndian(self): |
| 656 | + # Convert integers to unsigned little-endian byte arrays. |
| 657 | + tests4 = { |
| 658 | + 0: b'\x00', |
| 659 | + 1: b'\x01', |
| 660 | + 127: b'\x7f', |
| 661 | + 128: b'\x80', |
| 662 | + 255: b'\xff', |
| 663 | + 256: b'\x00\x01', |
| 664 | + 32767: b'\xff\x7f', |
| 665 | + 32768: b'\x00\x80', |
| 666 | + 65535: b'\xff\xff', |
| 667 | + 65536: b'\x00\x00\x01' |
| 668 | + } |
| 669 | + self.check(tests4, 'little', signed=False) |
| 670 | + self.checkPIntSpec(tests4, 'little', signed=False) |
| 671 | + |
| 672 | + def test_SpecialCases(self): |
| 673 | + self.assertEqual((0).to_bytes(0, 'big'), b'') |
| 674 | + self.assertEqual((1).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x01') |
| 675 | + self.assertEqual((0).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x00') |
| 676 | + self.assertEqual((-1).to_bytes(5, 'big', signed=True), |
| 677 | + b'\xff\xff\xff\xff\xff') |
| 678 | + |
| 679 | + def test_WrongInput(self): |
| 680 | + self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=False) |
| 681 | + self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=True) |
| 682 | + self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=False) |
| 683 | + self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=True) |
| 684 | + self.assertRaises(OverflowError, (-1).to_bytes, 2, 'big', signed=False) |
| 685 | + self.assertRaises(OverflowError, (-1).to_bytes, 2, 'little', signed=False) |
| 686 | + self.assertRaises(OverflowError, (1).to_bytes, 0, 'big') |
| 687 | + |
| 688 | + def test_WrongTypes(self): |
| 689 | + class MyTest(): |
| 690 | + def __int__(self): |
| 691 | + return 3 |
| 692 | + |
| 693 | + self.assertRaises(TypeError, (1).to_bytes, MyTest(), 'big') |
| 694 | + |
| 695 | + class MyTest2(): |
| 696 | + def __int__(self): |
| 697 | + return 3 |
| 698 | + def __index__(self): |
| 699 | + return 4 |
| 700 | + |
| 701 | + self.assertEqual((1).to_bytes(MyTest2(), 'big'), b'\x00\x00\x00\x01') |
| 702 | + |
| 703 | + def test_SubClass(self): |
| 704 | + class MyTest(int): |
| 705 | + def __int__(self): |
| 706 | + return 3 |
| 707 | + def __index__(self): |
| 708 | + return 4 |
| 709 | + |
| 710 | + self.assertEqual(MyTest(1).to_bytes(MyTest(10), 'big'), b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') |
| 711 | + |
| 712 | + |
0 commit comments