run-bytes.test 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. # Bytes test cases (compile and run)
  2. [case testBytesBasics]
  3. # Note: Add tests for additional operations to testBytesOps or in a new test case
  4. def f(x: bytes) -> bytes:
  5. return x
  6. def eq(a: bytes, b: bytes) -> bool:
  7. return a == b
  8. def neq(a: bytes, b: bytes) -> bool:
  9. return a != b
  10. [file driver.py]
  11. from native import f, eq, neq
  12. assert f(b'123') == b'123'
  13. assert f(b'\x07 \x0b " \t \x7f \xf0') == b'\x07 \x0b " \t \x7f \xf0'
  14. assert eq(b'123', b'123')
  15. assert not eq(b'123', b'1234')
  16. assert not eq(b'123', b'124')
  17. assert not eq(b'123', b'223')
  18. assert neq(b'123', b'1234')
  19. try:
  20. f('x')
  21. assert False
  22. except TypeError:
  23. pass
  24. [case testBytesInit]
  25. def test_bytes_init() -> None:
  26. b1 = bytes([5])
  27. assert b1 == b'\x05'
  28. b2 = bytes([5, 10, 12])
  29. assert b2 == b'\x05\n\x0c'
  30. b3 = bytes(bytearray(b'foo'))
  31. assert b3 == b'foo'
  32. b4 = bytes(b'aaa')
  33. assert b4 == b'aaa'
  34. b5 = bytes(5)
  35. assert b5 == b'\x00\x00\x00\x00\x00'
  36. try:
  37. bytes('x')
  38. assert False
  39. except TypeError:
  40. pass
  41. [case testBytesOps]
  42. from testutil import assertRaises
  43. def test_indexing() -> None:
  44. # Use bytes() to avoid constant folding
  45. b = b'asdf' + bytes()
  46. assert b[0] == 97
  47. assert b[1] == 115
  48. assert b[3] == 102
  49. assert b[-1] == 102
  50. b = b'\xae\x80\xfe\x15' + bytes()
  51. assert b[0] == 174
  52. assert b[1] == 128
  53. assert b[2] == 254
  54. assert b[3] == 21
  55. assert b[-4] == 174
  56. with assertRaises(IndexError, "index out of range"):
  57. b[4]
  58. with assertRaises(IndexError, "index out of range"):
  59. b[-5]
  60. with assertRaises(IndexError, "index out of range"):
  61. b[2**26]
  62. def test_concat() -> None:
  63. b1 = b'123' + bytes()
  64. b2 = b'456' + bytes()
  65. assert b1 + b2 == b'123456'
  66. b3 = b1 + b2
  67. b3 = b3 + b1
  68. assert b3 == b'123456123'
  69. assert b1 == b'123'
  70. assert b2 == b'456'
  71. assert type(b1) == bytes
  72. assert type(b2) == bytes
  73. assert type(b3) == bytes
  74. brr1: bytes = bytearray(3)
  75. brr2: bytes = bytearray(range(5))
  76. b4 = b1 + brr1
  77. assert b4 == b'123\x00\x00\x00'
  78. assert type(brr1) == bytearray
  79. assert type(b4) == bytes
  80. brr3 = brr1 + brr2
  81. assert brr3 == bytearray(b'\x00\x00\x00\x00\x01\x02\x03\x04')
  82. assert len(brr3) == 8
  83. assert type(brr3) == bytearray
  84. brr3 = brr3 + bytearray([10])
  85. assert brr3 == bytearray(b'\x00\x00\x00\x00\x01\x02\x03\x04\n')
  86. b5 = brr2 + b2
  87. assert b5 == bytearray(b'\x00\x01\x02\x03\x04456')
  88. assert type(b5) == bytearray
  89. b5 = b2 + brr2
  90. assert b5 == b'456\x00\x01\x02\x03\x04'
  91. assert type(b5) == bytes
  92. def test_join() -> None:
  93. seq = (b'1', b'"', b'\xf0')
  94. assert b'\x07'.join(seq) == b'1\x07"\x07\xf0'
  95. assert b', '.join(()) == b''
  96. assert b', '.join([bytes() + b'ab']) == b'ab'
  97. assert b', '.join([bytes() + b'ab', b'cd']) == b'ab, cd'
  98. def test_len() -> None:
  99. # Use bytes() to avoid constant folding
  100. b = b'foo' + bytes()
  101. assert len(b) == 3
  102. assert len(bytes()) == 0
  103. [case testBytesSlicing]
  104. def test_bytes_slicing() -> None:
  105. b = b'abcdefg'
  106. zero = int()
  107. ten = 10 + zero
  108. two = 2 + zero
  109. five = 5 + zero
  110. seven = 7 + zero
  111. assert b[:ten] == b'abcdefg'
  112. assert b[0:seven] == b'abcdefg'
  113. assert b[0:(len(b)+1)] == b'abcdefg'
  114. assert b[two:five] == b'cde'
  115. assert b[two:two] == b''
  116. assert b[-two:-two] == b''
  117. assert b[-ten:(-ten+1)] == b''
  118. assert b[:-two] == b'abcde'
  119. assert b[:two] == b'ab'
  120. assert b[:] == b'abcdefg'
  121. assert b[-two:] == b'fg'
  122. assert b[zero:] == b'abcdefg'
  123. assert b[:zero] == b''
  124. assert b[-ten:] == b'abcdefg'
  125. assert b[-ten:ten] == b'abcdefg'
  126. big_ints = [1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000, 2**24, 2**63]
  127. for big_int in big_ints:
  128. assert b[1:big_int] == b'bcdefg'
  129. assert b[big_int:] == b''
  130. assert b[-big_int:-1] == b'abcdef'
  131. assert b[-big_int:big_int] == b'abcdefg'
  132. assert type(b[-big_int:-1]) == bytes
  133. assert type(b[-ten:]) == bytes
  134. assert type(b[:]) == bytes
  135. [case testBytearrayBasics]
  136. from typing import Any
  137. def test_basics() -> None:
  138. brr1: bytes = bytearray(3)
  139. assert brr1 == bytearray(b'\x00\x00\x00')
  140. assert brr1 == b'\x00\x00\x00'
  141. l = [10, 20, 30, 40]
  142. brr2: bytes = bytearray(l)
  143. assert brr2 == bytearray(b'\n\x14\x1e(')
  144. assert brr2 == b'\n\x14\x1e('
  145. brr3: bytes = bytearray(range(5))
  146. assert brr3 == bytearray(b'\x00\x01\x02\x03\x04')
  147. assert brr3 == b'\x00\x01\x02\x03\x04'
  148. brr4: bytes = bytearray('string', 'utf-8')
  149. assert brr4 == bytearray(b'string')
  150. assert brr4 == b'string'
  151. assert len(brr1) == 3
  152. assert len(brr2) == 4
  153. def f(b: bytes) -> bool:
  154. return True
  155. def test_bytearray_passed_into_bytes() -> None:
  156. assert f(bytearray(3))
  157. brr1: Any = bytearray()
  158. assert f(brr1)
  159. [case testBytearraySlicing]
  160. def test_bytearray_slicing() -> None:
  161. b: bytes = bytearray(b'abcdefg')
  162. zero = int()
  163. ten = 10 + zero
  164. two = 2 + zero
  165. five = 5 + zero
  166. seven = 7 + zero
  167. assert b[:ten] == b'abcdefg'
  168. assert b[0:seven] == b'abcdefg'
  169. assert b[two:five] == b'cde'
  170. assert b[two:two] == b''
  171. assert b[-two:-two] == b''
  172. assert b[-ten:(-ten+1)] == b''
  173. assert b[:-two] == b'abcde'
  174. assert b[:two] == b'ab'
  175. assert b[:] == b'abcdefg'
  176. assert b[-two:] == b'fg'
  177. assert b[zero:] == b'abcdefg'
  178. assert b[:zero] == b''
  179. assert b[-ten:] == b'abcdefg'
  180. assert b[-ten:ten] == b'abcdefg'
  181. big_ints = [1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000, 2**24, 2**63]
  182. for big_int in big_ints:
  183. assert b[1:big_int] == b'bcdefg'
  184. assert b[big_int:] == b''
  185. assert b[-big_int:-1] == b'abcdef'
  186. assert b[-big_int:big_int] == b'abcdefg'
  187. assert type(b[-big_int:-1]) == bytearray
  188. assert type(b[-ten:]) == bytearray
  189. assert type(b[:]) == bytearray
  190. [case testBytearrayIndexing]
  191. from testutil import assertRaises
  192. def test_bytearray_indexing() -> None:
  193. b: bytes = bytearray(b'\xae\x80\xfe\x15')
  194. assert b[0] == 174
  195. assert b[1] == 128
  196. assert b[2] == 254
  197. assert b[3] == 21
  198. assert b[-4] == 174
  199. with assertRaises(IndexError, "index out of range"):
  200. b[4]
  201. with assertRaises(IndexError, "index out of range"):
  202. b[-5]
  203. b2 = bytearray([175, 255, 128, 22])
  204. assert b2[0] == 175
  205. assert b2[1] == 255
  206. assert b2[-1] == 22
  207. assert b2[2] == 128
  208. with assertRaises(ValueError, "byte must be in range(0, 256)"):
  209. b2[0] = -1
  210. with assertRaises(ValueError, "byte must be in range(0, 256)"):
  211. b2[0] = 256
  212. [case testBytesJoin]
  213. from typing import Any
  214. from testutil import assertRaises
  215. from a import bytes_subclass
  216. def test_bytes_join() -> None:
  217. assert b' '.join([b'a', b'b']) == b'a b'
  218. assert b' '.join([]) == b''
  219. x: bytes = bytearray(b' ')
  220. assert x.join([b'a', b'b']) == b'a b'
  221. assert type(x.join([b'a', b'b'])) == bytearray
  222. y: bytes = bytes_subclass()
  223. assert y.join([]) == b'spook'
  224. n: Any = 5
  225. with assertRaises(TypeError, "can only join an iterable"):
  226. assert b' '.join(n)
  227. [file a.py]
  228. class bytes_subclass(bytes):
  229. def join(self, iter):
  230. return b'spook'
  231. [case testBytesFormatting]
  232. [typing fixtures/typing-full.pyi]
  233. from testutil import assertRaises
  234. # https://www.python.org/dev/peps/pep-0461/
  235. def test_bytes_formatting() -> None:
  236. val = 10
  237. assert b"%x" % val == b'a'
  238. assert b'%4x' % val == b' a'
  239. assert b'%#4x' % val == b' 0xa'
  240. assert b'%04X' % val == b'000A'
  241. assert b'%c' % 48 == b'0'
  242. assert b'%c' % b'a' == b'a'
  243. assert b'%c%c' % (48, b'a') == b'0a'
  244. assert b'%b' % b'abc' == b'abc'
  245. assert b'%b' % 'some string'.encode('utf8') == b'some string'
  246. assert b'%a' % 3.14 == b'3.14'
  247. assert b'%a' % b'abc' == b"b'abc'"
  248. assert b'%a' % 'def' == b"'def'"
  249. def test_bytes_formatting_2() -> None:
  250. var = b'bb'
  251. num = 10
  252. assert b'aaa%bbbb%s' % (var, var) == b'aaabbbbbbb'
  253. assert b'aaa%dbbb%b' % (num, var) == b'aaa10bbbbb'
  254. assert b'%s%b' % (var, var) == b'bbbb'
  255. assert b'%b' % bytes() == b''
  256. assert b'%b' % b'' == b''
  257. assert b'\xff%s' % b'\xff' == b'\xff\xff'
  258. assert b'\xff%b' % '你好'.encode() == b'\xff\xe4\xbd\xa0\xe5\xa5\xbd'
  259. aa = b'\xe4\xbd\xa0\xe5\xa5\xbd%b' % b'\xe4\xbd\xa0\xe5\xa5\xbd'
  260. assert aa == b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe5\xa5\xbd'
  261. assert aa.decode() == '你好你好'
  262. class A:
  263. def __bytes__(self):
  264. return b'aaa'
  265. def test_bytes_dunder() -> None:
  266. assert b'%b' % A() == b'aaa'
  267. assert b'%s' % A() == b'aaa'