1"""Test code geneneration for literals.""" 2 3import unittest 4 5from mypyc.codegen.literals import ( 6 Literals, format_str_literal, _encode_str_values, _encode_bytes_values, _encode_int_values 7) 8 9 10class TestLiterals(unittest.TestCase): 11 def test_format_str_literal(self) -> None: 12 assert format_str_literal('') == b'\x00' 13 assert format_str_literal('xyz') == b'\x03xyz' 14 assert format_str_literal('x' * 127) == b'\x7f' + b'x' * 127 15 assert format_str_literal('x' * 128) == b'\x81\x00' + b'x' * 128 16 assert format_str_literal('x' * 131) == b'\x81\x03' + b'x' * 131 17 18 def test_encode_str_values(self) -> None: 19 assert _encode_str_values({}) == [b''] 20 assert _encode_str_values({'foo': 0}) == [b'\x01\x03foo', b''] 21 assert _encode_str_values({'foo': 0, 'b': 1}) == [b'\x02\x03foo\x01b', b''] 22 assert _encode_str_values({'foo': 0, 'x' * 70: 1}) == [ 23 b'\x01\x03foo', 24 bytes([1, 70]) + b'x' * 70, 25 b'' 26 ] 27 assert _encode_str_values({'y' * 100: 0}) == [ 28 bytes([1, 100]) + b'y' * 100, 29 b'' 30 ] 31 32 def test_encode_bytes_values(self) -> None: 33 assert _encode_bytes_values({}) == [b''] 34 assert _encode_bytes_values({b'foo': 0}) == [b'\x01\x03foo', b''] 35 assert _encode_bytes_values({b'foo': 0, b'b': 1}) == [b'\x02\x03foo\x01b', b''] 36 assert _encode_bytes_values({b'foo': 0, b'x' * 70: 1}) == [ 37 b'\x01\x03foo', 38 bytes([1, 70]) + b'x' * 70, 39 b'' 40 ] 41 assert _encode_bytes_values({b'y' * 100: 0}) == [ 42 bytes([1, 100]) + b'y' * 100, 43 b'' 44 ] 45 46 def test_encode_int_values(self) -> None: 47 assert _encode_int_values({}) == [b''] 48 assert _encode_int_values({123: 0}) == [b'\x01123', b''] 49 assert _encode_int_values({123: 0, 9: 1}) == [b'\x02123\x009', b''] 50 assert _encode_int_values({123: 0, 45: 1, 5 * 10**70: 2}) == [ 51 b'\x02123\x0045', 52 b'\x015' + b'0' * 70, 53 b'' 54 ] 55 assert _encode_int_values({6 * 10**100: 0}) == [ 56 b'\x016' + b'0' * 100, 57 b'' 58 ] 59 60 def test_simple_literal_index(self) -> None: 61 lit = Literals() 62 lit.record_literal(1) 63 lit.record_literal('y') 64 lit.record_literal(True) 65 lit.record_literal(None) 66 lit.record_literal(False) 67 assert lit.literal_index(None) == 0 68 assert lit.literal_index(False) == 1 69 assert lit.literal_index(True) == 2 70 assert lit.literal_index('y') == 3 71 assert lit.literal_index(1) == 4 72 73 def test_tuple_literal(self) -> None: 74 lit = Literals() 75 lit.record_literal((1, 'y', None, (b'a', 'b'))) 76 lit.record_literal((b'a', 'b')) 77 lit.record_literal(()) 78 assert lit.literal_index((b'a', 'b')) == 7 79 assert lit.literal_index((1, 'y', None, (b'a', 'b'))) == 8 80 assert lit.literal_index(()) == 9 81 print(lit.encoded_tuple_values()) 82 assert lit.encoded_tuple_values() == [ 83 '3', # Number of tuples 84 '2', '5', '4', # First tuple (length=2) 85 '4', '6', '3', '0', '7', # Second tuple (length=4) 86 '0', # Third tuple (length=0) 87 ] 88