PageRenderTime 53ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/priv/ruby1.8/test/erlterms_tests.rb

http://github.com/hdima/erlport
Ruby | 484 lines | 446 code | 11 blank | 27 comment | 0 complexity | 936141a14b945aa6883e54f7dcfc856a MD5 | raw file
Possible License(s): BSD-3-Clause
  1. # encoding: binary
  2. # Copyright (c) 2009-2015, Dmitry Vasiliev <dima@hlabs.org>
  3. # All rights reserved.
  4. #
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions are met:
  7. #
  8. # * Redistributions of source code must retain the above copyright notice,
  9. # this list of conditions and the following disclaimer.
  10. # * Redistributions in binary form must reproduce the above copyright notice,
  11. # this list of conditions and the following disclaimer in the documentation
  12. # and/or other materials provided with the distribution.
  13. # * Neither the name of the copyright holders nor the names of its
  14. # contributors may be used to endorse or promote products derived from this
  15. # software without specific prior written permission.
  16. #
  17. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  18. # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20. # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  21. # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  22. # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  23. # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  24. # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  25. # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  26. # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  27. # POSSIBILITY OF SUCH DAMAGE.
  28. require 'test/unit'
  29. require 'erlport/erlterms'
  30. include ErlPort::ErlTerm
  31. class EmptySymbolTestCase < Test::Unit::TestCase
  32. def test_empty_symbol
  33. e = EmptySymbol.new
  34. e2 = EmptySymbol.new
  35. assert_equal e, e2
  36. assert_equal "", e.to_s
  37. assert_equal e.to_s, e2.to_s
  38. end
  39. end
  40. class TupleTestCase < Test::Unit::TestCase
  41. def test_tuple
  42. tuple = Tuple.new([1, 2, 3])
  43. assert_equal Tuple, tuple.class
  44. assert_equal 3, tuple.length
  45. assert_equal 1, tuple[0]
  46. assert_equal 2, tuple[1]
  47. assert_equal 3, tuple[2]
  48. assert_equal [1, 2, 3], tuple.to_a
  49. end
  50. def test_multiple_assignment
  51. tuple = Tuple.new([1, 2, 3])
  52. a, b, c = tuple
  53. assert_equal a, 1
  54. assert_equal b, 2
  55. assert_equal c, 3
  56. end
  57. def test_comparison
  58. tuple = Tuple.new([1, 2, 3])
  59. assert_equal tuple, tuple
  60. assert_equal tuple, Tuple.new([1, 2, 3])
  61. assert_not_equal tuple, Tuple.new([3, 2, 1])
  62. end
  63. end
  64. class OpaqueObjectTestCase < Test::Unit::TestCase
  65. def test_opaque_object
  66. obj = OpaqueObject.new "data", :language
  67. assert_equal "data", obj.data
  68. assert_equal :language, obj.language
  69. assert_raise(TypeError){OpaqueObject.new("data", "language")}
  70. assert_raise(TypeError){OpaqueObject.new([1, 2], :language)}
  71. end
  72. def test_comparison
  73. obj = OpaqueObject.new "data", :language
  74. assert_equal obj, obj
  75. assert_equal obj, OpaqueObject.new("data", :language)
  76. assert_not_equal obj, OpaqueObject.new("data", :language2)
  77. assert_not_equal obj, OpaqueObject.new("data2", :language)
  78. end
  79. def test_decode
  80. obj = OpaqueObject.decode "data", :language
  81. assert_equal "data", obj.data
  82. assert_equal :language, obj.language
  83. end
  84. def test_decode_ruby
  85. data = OpaqueObject.decode "\004\b\"\ttest", :ruby
  86. assert_equal "test", data
  87. end
  88. def test_encode
  89. obj = OpaqueObject.new("data", :language)
  90. term = Tuple.new([:"$erlport.opaque", :language, "data"])
  91. assert_equal encode(term), "\x83" + obj.encode()
  92. end
  93. def test_encode_erlang
  94. obj = OpaqueObject.new "data", :erlang
  95. assert_equal "data", obj.encode
  96. end
  97. def test_hashing
  98. obj = OpaqueObject.new "data", :language
  99. obj2 = OpaqueObject.new "data", :language
  100. assert_equal obj.hash, obj2.hash
  101. obj3 = OpaqueObject.new "data", :language2
  102. assert_not_equal obj.hash, obj3.hash
  103. obj4 = OpaqueObject.new "data2", :language
  104. assert_not_equal obj.hash, obj4.hash
  105. end
  106. end
  107. class ImproperListTestCase < Test::Unit::TestCase
  108. def test_improper_list
  109. improper = ImproperList.new [1, 2, 3], "tail"
  110. assert_equal ImproperList, improper.class
  111. assert_equal [1, 2, 3], improper
  112. assert_equal "tail", improper.tail
  113. end
  114. def test_comparison
  115. improper = ImproperList.new [1, 2, 3], "tail"
  116. assert_equal improper, improper
  117. assert_equal improper, ImproperList.new([1, 2, 3], "tail")
  118. assert_not_equal improper, ImproperList.new([1, 2, 3], "tail2")
  119. assert_not_equal improper, ImproperList.new([1, 2], "tail")
  120. end
  121. def test_hashing
  122. hash = ImproperList.new([1, 2, 3], "tail").hash
  123. assert_equal hash, ImproperList.new([1, 2, 3], "tail").hash
  124. assert_not_equal hash, ImproperList.new([1, 2, 3], "tail2").hash
  125. assert_not_equal hash, ImproperList.new([1, 2], "tail").hash
  126. end
  127. def test_errors
  128. assert_raise(TypeError){ImproperList.new([1, 2, 3], ["invalid"])}
  129. assert_raise(ValueError){ImproperList.new([], "tail")}
  130. end
  131. end
  132. class DecodeTestCase < Test::Unit::TestCase
  133. def test_decode
  134. assert_raise(IncompleteData){decode("")}
  135. assert_raise(ValueError){decode("\0")}
  136. assert_raise(IncompleteData){decode("\x83")}
  137. assert_raise(ValueError){decode("\x83z")}
  138. end
  139. def test_decode_atom
  140. assert_raise(IncompleteData){decode("\x83d")}
  141. assert_raise(IncompleteData){decode("\x83d\0")}
  142. assert_raise(IncompleteData){decode("\x83d\0\1")}
  143. assert_equal EmptySymbol, decode("\x83d\0\0")[0].class
  144. assert_equal [EmptySymbol.new, ""], decode("\x83d\0\0")
  145. assert_equal [EmptySymbol.new, "tail"], decode("\x83d\0\0tail")
  146. assert_equal [:test, ""], decode("\x83d\0\4test")
  147. assert_equal [:test, "tail"], decode("\x83d\0\4testtail")
  148. end
  149. def test_decode_predefined_atoms
  150. assert_equal [true, ""], decode("\x83d\0\4true")
  151. assert_equal [true, "tail"], decode("\x83d\0\4truetail")
  152. assert_equal [false, ""], decode("\x83d\0\5false")
  153. assert_equal [false, "tail"], decode("\x83d\0\5falsetail")
  154. assert_equal [nil, ""], decode("\x83d\0\11undefined")
  155. assert_equal [nil, "tail"], decode("\x83d\0\11undefinedtail")
  156. end
  157. def test_decode_empty_list
  158. assert_equal [[], ""], decode("\x83j")
  159. assert_equal [[], "tail"], decode("\x83jtail")
  160. end
  161. def test_decode_string_list
  162. assert_raise(IncompleteData){decode("\x83k")}
  163. assert_raise(IncompleteData){decode("\x83k\0")}
  164. assert_raise(IncompleteData){decode("\x83k\0\1")}
  165. # Erlang use 'j' tag for empty lists
  166. assert_equal [[], ""], decode("\x83k\0\0")
  167. assert_equal [[], "tail"], decode("\x83k\0\0tail")
  168. assert_equal [[116, 101, 115, 116], ""], decode("\x83k\0\4test")
  169. assert_equal [[116, 101, 115, 116], "tail"],
  170. decode("\x83k\0\4testtail")
  171. end
  172. def test_decode_list
  173. assert_raise(IncompleteData){decode("\x83l")}
  174. assert_raise(IncompleteData){decode("\x83l\0")}
  175. assert_raise(IncompleteData){decode("\x83l\0\0")}
  176. assert_raise(IncompleteData){decode("\x83l\0\0\0")}
  177. assert_raise(IncompleteData){decode("\x83l\0\0\0\0")}
  178. # Erlang use 'j' tag for empty lists
  179. assert_equal [[], ""], decode("\x83l\0\0\0\0j")
  180. assert_equal [[], "tail"], decode("\x83l\0\0\0\0jtail")
  181. assert_equal [[[], []], ""], decode("\x83l\0\0\0\2jjj")
  182. assert_equal [[[], []], "tail"], decode("\x83l\0\0\0\2jjjtail")
  183. end
  184. def test_decode_improper_list
  185. assert_raise(IncompleteData){decode("\x83l\0\0\0\0k")}
  186. improper, tail = decode("\x83l\0\0\0\1jd\0\4tail")
  187. assert_equal ImproperList, improper.class
  188. assert_equal [[]], improper
  189. assert_equal Symbol, improper.tail.class
  190. assert_equal :tail, improper.tail
  191. assert_equal "", tail
  192. improper, tail = decode("\x83l\0\0\0\1jd\0\4tailtail")
  193. assert_equal ImproperList, improper.class
  194. assert_equal [[]], improper
  195. assert_equal Symbol, improper.tail.class
  196. assert_equal :tail, improper.tail
  197. assert_equal "tail", tail
  198. end
  199. def test_decode_small_tuple
  200. assert_raise(IncompleteData){decode("\x83h")}
  201. assert_raise(IncompleteData){decode("\x83h\1")}
  202. assert_equal Tuple, decode("\x83h\0")[0].class
  203. assert_equal [Tuple.new([]), ""], decode("\x83h\0")
  204. assert_equal [Tuple.new([]), "tail"], decode("\x83h\0tail")
  205. assert_equal [Tuple.new([[], []]), ""], decode("\x83h\2jj")
  206. assert_equal [Tuple.new([[], []]), "tail"], decode("\x83h\2jjtail")
  207. end
  208. def test_decode_large_tuple
  209. assert_raise(IncompleteData){decode("\x83i")}
  210. assert_raise(IncompleteData){decode("\x83i\0")}
  211. assert_raise(IncompleteData){decode("\x83i\0\0")}
  212. assert_raise(IncompleteData){decode("\x83i\0\0\0")}
  213. assert_raise(IncompleteData){decode("\x83i\0\0\0\1")}
  214. # Erlang use 'h' tag for small tuples
  215. assert_equal [Tuple.new([]), ""], decode("\x83i\0\0\0\0")
  216. assert_equal [Tuple.new([]), "tail"], decode("\x83i\0\0\0\0tail")
  217. assert_equal [Tuple.new([[], []]), ""], decode("\x83i\0\0\0\2jj")
  218. assert_equal [Tuple.new([[], []]), "tail"],
  219. decode("\x83i\0\0\0\2jjtail")
  220. end
  221. def test_decode_opaque_object
  222. opaque, tail = decode("\x83h\3d\0\x0f$erlport.opaqued\0\10language" \
  223. "m\0\0\0\4data")
  224. assert_equal OpaqueObject, opaque.class
  225. assert_equal "data", opaque.data
  226. assert_equal :language, opaque.language
  227. assert_equal "", tail
  228. opaque, tail = decode("\x83h\3d\0\x0f$erlport.opaqued\0\10language" \
  229. "m\0\0\0\4datatail")
  230. assert_equal OpaqueObject, opaque.class
  231. assert_equal "data", opaque.data
  232. assert_equal :language, opaque.language
  233. assert_equal "tail", tail
  234. end
  235. def test_decode_ruby_opaque_object
  236. opaque, tail = decode("\x83h\3d\0\x0f$erlport.opaqued\0\4ruby" \
  237. "m\0\0\0\10\4\b\"\ttest")
  238. assert_equal String, opaque.class
  239. assert_equal "test", opaque
  240. assert_equal "", tail
  241. opaque, tail = decode("\x83h\3d\0\x0f$erlport.opaqued\0\4ruby" \
  242. "m\0\0\0\10\4\b\"\ttesttail")
  243. assert_equal String, opaque.class
  244. assert_equal "test", opaque
  245. assert_equal "tail", tail
  246. end
  247. def test_decode_small_integer
  248. assert_raise(IncompleteData){decode("\x83a")}
  249. assert_equal [0, ""], decode("\x83a\0")
  250. assert_equal [0, "tail"], decode("\x83a\0tail")
  251. assert_equal [255, ""], decode("\x83a\xff")
  252. assert_equal [255, "tail"], decode("\x83a\xfftail")
  253. end
  254. def test_decode_integer
  255. assert_raise(IncompleteData){decode("\x83b")}
  256. assert_raise(IncompleteData){decode("\x83b\0")}
  257. assert_raise(IncompleteData){decode("\x83b\0\0")}
  258. assert_raise(IncompleteData){decode("\x83b\0\0\0")}
  259. # Erlang use 'a' tag for small integers
  260. assert_equal [0, ""], decode("\x83b\0\0\0\0")
  261. assert_equal [0, "tail"], decode("\x83b\0\0\0\0tail")
  262. assert_equal [2147483647, ""], decode("\x83b\x7f\xff\xff\xff")
  263. assert_equal [2147483647, "tail"], decode("\x83b\x7f\xff\xff\xfftail")
  264. assert_equal [-2147483648, ""], decode("\x83b\x80\0\0\0")
  265. assert_equal [-2147483648, "tail"], decode("\x83b\x80\0\0\0tail")
  266. assert_equal [-1, ""], decode("\x83b\xff\xff\xff\xff")
  267. assert_equal [-1, "tail"], decode("\x83b\xff\xff\xff\xfftail")
  268. end
  269. def test_decode_binary
  270. assert_raise(IncompleteData){decode("\x83m")}
  271. assert_raise(IncompleteData){decode("\x83m\0")}
  272. assert_raise(IncompleteData){decode("\x83m\0\0")}
  273. assert_raise(IncompleteData){decode("\x83m\0\0\0")}
  274. assert_raise(IncompleteData){decode("\x83m\0\0\0\1")}
  275. assert_equal ["", ""], decode("\x83m\0\0\0\0")
  276. assert_equal ["", "tail"], decode("\x83m\0\0\0\0tail")
  277. assert_equal ["data", ""], decode("\x83m\0\0\0\4data")
  278. assert_equal ["data", "tail"], decode("\x83m\0\0\0\4datatail")
  279. end
  280. def test_decode_float
  281. assert_raise(IncompleteData){decode("\x83F")}
  282. assert_raise(IncompleteData){decode("\x83F\0")}
  283. assert_raise(IncompleteData){decode("\x83F\0\0")}
  284. assert_raise(IncompleteData){decode("\x83F\0\0\0")}
  285. assert_raise(IncompleteData){decode("\x83F\0\0\0\0")}
  286. assert_raise(IncompleteData){decode("\x83F\0\0\0\0\0")}
  287. assert_raise(IncompleteData){decode("\x83F\0\0\0\0\0\0")}
  288. assert_raise(IncompleteData){decode("\x83F\0\0\0\0\0\0\0")}
  289. assert_equal [0.0, ""], decode("\x83F\0\0\0\0\0\0\0\0")
  290. assert_equal [0.0, "tail"], decode("\x83F\0\0\0\0\0\0\0\0tail")
  291. assert_equal [1.5, ""], decode("\x83F?\xf8\0\0\0\0\0\0")
  292. assert_equal [1.5, "tail"], decode("\x83F?\xf8\0\0\0\0\0\0tail")
  293. end
  294. def test_decode_small_big_integer
  295. assert_raise(IncompleteData){decode("\x83n")}
  296. assert_raise(IncompleteData){decode("\x83n\0")}
  297. assert_raise(IncompleteData){decode("\x83n\1\0")}
  298. # Erlang use 'a' tag for small integers
  299. assert_equal [0, ""], decode("\x83n\0\0")
  300. assert_equal [0, "tail"], decode("\x83n\0\0tail")
  301. assert_equal [6618611909121, ""], decode("\x83n\6\0\1\2\3\4\5\6")
  302. assert_equal [-6618611909121, ""], decode("\x83n\6\1\1\2\3\4\5\6")
  303. assert_equal [6618611909121, "tail"],
  304. decode("\x83n\6\0\1\2\3\4\5\6tail")
  305. end
  306. def test_decode_big_integer
  307. assert_raise(IncompleteData){decode("\x83o")}
  308. assert_raise(IncompleteData){decode("\x83o\0")}
  309. assert_raise(IncompleteData){decode("\x83o\0\0")}
  310. assert_raise(IncompleteData){decode("\x83o\0\0\0")}
  311. assert_raise(IncompleteData){decode("\x83o\0\0\0\0")}
  312. assert_raise(IncompleteData){decode("\x83o\0\0\0\1\0")}
  313. # Erlang use 'a' tag for small integers
  314. assert_equal [0, ""], decode("\x83o\0\0\0\0\0")
  315. assert_equal [0, "tail"], decode("\x83o\0\0\0\0\0tail")
  316. assert_equal [6618611909121, ""], decode("\x83o\0\0\0\6\0\1\2\3\4\5\6")
  317. assert_equal [-6618611909121, ""],
  318. decode("\x83o\0\0\0\6\1\1\2\3\4\5\6")
  319. assert_equal [6618611909121, "tail"],
  320. decode("\x83o\0\0\0\6\0\1\2\3\4\5\6tail")
  321. end
  322. def test_decode_compressed_term
  323. assert_raise(IncompleteData){decode("\x83P")}
  324. assert_raise(IncompleteData){decode("\x83P\0")}
  325. assert_raise(IncompleteData){decode("\x83P\0\0")}
  326. assert_raise(IncompleteData){decode("\x83P\0\0\0")}
  327. assert_raise(IncompleteData){decode("\x83P\0\0\0\0")}
  328. assert_raise(ValueError){decode("\x83P\0\0\0\x16" \
  329. "\x78\xda\xcb\x66\x10\x49\xc1\2\0\x5d\x60\x08\x50")}
  330. assert_equal [[100] * 20, ""], decode("\x83P\0\0\0\x17" \
  331. "\x78\xda\xcb\x66\x10\x49\xc1\2\0\x5d\x60\x08\x50")
  332. assert_equal [[100] * 20, "tail"], decode("\x83P\0\0\0\x17" \
  333. "\x78\xda\xcb\x66\x10\x49\xc1\2\0\x5d\x60\x08\x50tail")
  334. end
  335. end
  336. class EncodeTestCase < Test::Unit::TestCase
  337. def test_decode
  338. assert_equal "\x83h\0", encode(Tuple.new([]))
  339. assert_equal "\x83h\2h\0h\0",
  340. encode(Tuple.new([Tuple.new([]), Tuple.new([])]))
  341. assert_equal "\x83h\xff" + "h\0" * 255,
  342. encode(Tuple.new([Tuple.new([])] * 255))
  343. assert_equal "\x83i\0\0\1\0" + "h\0" * 256,
  344. encode(Tuple.new([Tuple.new([])] * 256))
  345. end
  346. def test_encode_empty_list
  347. assert_equal "\x83j", encode([])
  348. end
  349. def test_encode_string_list
  350. assert_equal "\x83k\0\1\0", encode([0])
  351. r = (0..255).to_a
  352. assert_equal "\x83k\1\0" + r.pack("C*"), encode(r)
  353. end
  354. def test_encode_list
  355. assert_equal "\x83l\0\0\0\1jj", encode([[]])
  356. assert_equal "\x83l\0\0\0\5jjjjjj", encode([[], [], [], [], []])
  357. end
  358. def test_encode_improper_list
  359. assert_equal "\x83l\0\0\0\1h\0h\0",
  360. encode(ImproperList.new([Tuple.new([])], Tuple.new([])))
  361. assert_equal "\x83l\0\0\0\1a\0a\1", encode(ImproperList.new([0], 1))
  362. end
  363. def test_encode_atom
  364. assert_equal "\x83d\0\0", encode(EmptySymbol.new)
  365. assert_equal "\x83d\0\4test", encode(:test)
  366. assert_equal "\x83d\0\2\xd0\x90", encode([0x410].pack("U*").to_sym)
  367. end
  368. def test_encode_string
  369. assert_equal "\x83m\0\0\0\0", encode("")
  370. assert_equal "\x83m\0\0\0\4test", encode("test")
  371. assert_equal "\x83m\0\0\0\2\xd0\x90", encode([0x410].pack("U*"))
  372. end
  373. def test_encode_boolean
  374. assert_equal "\x83d\0\4true", encode(true)
  375. assert_equal "\x83d\0\5false", encode(false)
  376. end
  377. def test_encode_short_integer
  378. assert_equal "\x83a\0", encode(0)
  379. assert_equal "\x83a\xff", encode(255)
  380. end
  381. def test_encode_integer
  382. assert_equal "\x83b\xff\xff\xff\xff", encode(-1)
  383. assert_equal "\x83b\x80\0\0\0", encode(-2147483648)
  384. assert_equal "\x83b\0\0\1\0", encode(256)
  385. assert_equal "\x83b\x7f\xff\xff\xff", encode(2147483647)
  386. end
  387. def test_encode_long_integer
  388. assert_equal "\x83n\4\0\0\0\0\x80", encode(2147483648)
  389. assert_equal "\x83n\4\1\1\0\0\x80", encode(-2147483649)
  390. assert_equal "\x83o\0\0\1\0\0" + "\0" * 255 + "\1", encode(2 ** 2040)
  391. assert_equal "\x83o\0\0\1\0\1" + "\0" * 255 + "\1", encode(-2 ** 2040)
  392. end
  393. def test_encode_float
  394. assert_equal "\x83F\0\0\0\0\0\0\0\0", encode(0.0)
  395. assert_equal "\x83F?\xe0\0\0\0\0\0\0", encode(0.5)
  396. assert_equal "\x83F\xbf\xe0\0\0\0\0\0\0", encode(-0.5)
  397. assert_equal "\x83F@\t!\xfbM\x12\xd8J", encode(3.1415926)
  398. assert_equal "\x83F\xc0\t!\xfbM\x12\xd8J", encode(-3.1415926)
  399. end
  400. def test_encode_none
  401. assert_equal "\x83d\0\11undefined", encode(nil)
  402. end
  403. def test_encode_opaque_object
  404. assert_equal "\x83h\3d\0\x0f$erlport.opaqued\0\10language" \
  405. "m\0\0\0\4data", encode(OpaqueObject.new("data", \
  406. :language))
  407. assert_equal "\x83data",
  408. encode(OpaqueObject.new("data", :erlang))
  409. end
  410. def test_ruby_opaque_object
  411. assert_equal "\203h\003d\000\017$erlport.opaqued" \
  412. "\000\004rubym\000\000\000\004\004\b{\000", encode({})
  413. assert_raise(ValueError){encode(Module.new())}
  414. end
  415. def test_encode_compressed_term
  416. assert_equal "\x83l\x00\x00\x00\x05jjjjjj", encode([[]] * 5, true)
  417. assert_equal "\x83P\x00\x00\x00\x15" \
  418. "x\x9c\xcba``\xe0\xcfB\x03\x00B@\x07\x1c",
  419. encode([[]] * 15, true)
  420. assert_equal "\x83P\x00\x00\x00\x15" \
  421. "x\x9c\xcba``\xe0\xcfB\x03\x00B@\x07\x1c",
  422. encode([[]] * 15, 6)
  423. assert_equal "\x83P\x00\x00\x00\x15" \
  424. "x\xda\xcba``\xe0\xcfB\x03\x00B@\x07\x1c",
  425. encode([[]] * 15, 9)
  426. assert_equal "\x83l\0\0\0\x0f" + "j" * 15 + "j",
  427. encode([[]] * 15, 0)
  428. assert_equal "\x83P\x00\x00\x00\x15" \
  429. "x\x01\xcba``\xe0\xcfB\x03\x00B@\x07\x1c",
  430. encode([[]] * 15, 1)
  431. end
  432. end