test_literals.py 3.2 KB

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