Skip to content

Commit 011af1c

Browse files
committed
[GR-12516] Int.to_bytes is not implemented.
PullRequest: graalpython/275
2 parents f1a9e6e + 9cc9bcf commit 011af1c

File tree

3 files changed

+398
-4
lines changed

3 files changed

+398
-4
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_int.py

Lines changed: 152 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242

4343
import array
4444

45+
BIG_NUMBER = 99999937497465632974931
46+
4547
class _NamedIntConstant(int):
4648
def __new__(cls, value, name):
4749
self = super(_NamedIntConstant, cls).__new__(cls, value)
@@ -473,12 +475,9 @@ def test_from_array(self):
473475
self.assertEqual(int.from_bytes(
474476
array.array('b', b'\xff\x00\x00'), 'big', signed=True), -65536)
475477

476-
'''
477-
TODO This test is commented out until GR-12448 is not fixed.
478478
def test_from_memoryview(self):
479479
self.assertEqual(int.from_bytes(
480480
memoryview(b'\xff\x00\x00'), 'big', signed=True), -65536)
481-
'''
482481

483482
def test_wrong_input(self):
484483
self.assertRaises(ValueError, int.from_bytes, [256], 'big')
@@ -561,3 +560,153 @@ def __iter__(self):
561560
return iter([10])
562561

563562
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

Comments
 (0)