/test/-ext-/bignum/test_pack.rb

https://github.com/kosaki/ruby · Ruby · 374 lines · 328 code · 43 blank · 3 comment · 0 complexity · 82f55a178ba8e16b426afd48ae3a6206 MD5 · raw file

  1. # coding: ASCII-8BIT
  2. require 'test/unit'
  3. require "-test-/bignum"
  4. class TestBignum < Test::Unit::TestCase
  5. class TestPack < Test::Unit::TestCase
  6. MSWORD_FIRST = Integer::INTEGER_PACK_MSWORD_FIRST
  7. LSWORD_FIRST = Integer::INTEGER_PACK_LSWORD_FIRST
  8. MSBYTE_FIRST = Integer::INTEGER_PACK_MSBYTE_FIRST
  9. LSBYTE_FIRST = Integer::INTEGER_PACK_LSBYTE_FIRST
  10. NATIVE_BYTE_ORDER = Integer::INTEGER_PACK_NATIVE_BYTE_ORDER
  11. TWOCOMP = Integer::INTEGER_PACK_2COMP
  12. LITTLE_ENDIAN = Integer::INTEGER_PACK_LITTLE_ENDIAN
  13. BIG_ENDIAN = Integer::INTEGER_PACK_BIG_ENDIAN
  14. NEGATIVE = Integer::INTEGER_PACK_NEGATIVE
  15. GENERIC = Integer::INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION
  16. def test_pack_zero
  17. assert_equal([0, ""], 0.test_pack(0, 1, 0, BIG_ENDIAN))
  18. end
  19. def test_pack_argument_check
  20. assert_raise(ArgumentError) { 0.test_pack_raw("", 2, 1, 0, MSBYTE_FIRST) }
  21. assert_raise(ArgumentError) { 0.test_pack_raw("", 0, 1, 0, MSWORD_FIRST) }
  22. assert_raise(ArgumentError) { 0.test_pack_raw("", 0, 0, 0, BIG_ENDIAN) }
  23. assert_raise(ArgumentError) { 0.test_pack_raw("", 0, 1, 8, BIG_ENDIAN) }
  24. # assume sizeof(ssize_t) == sizeof(intptr_t)
  25. assert_raise(ArgumentError) { 0.test_pack_raw("", 1 << ([""].pack("p").length * 8 - 1), 0, BIG_ENDIAN) }
  26. end
  27. def test_pack_wordsize
  28. assert_equal([1, "\x01"], 1.test_pack(1, 1, 0, BIG_ENDIAN))
  29. assert_equal([1, "\x00\x01"], 1.test_pack(1, 2, 0, BIG_ENDIAN))
  30. assert_equal([1, "\x00\x00\x01"], 1.test_pack(1, 3, 0, BIG_ENDIAN))
  31. assert_equal([1, "\x01"], 1.test_pack(1, 1, 0, LITTLE_ENDIAN))
  32. assert_equal([1, "\x01\x00"], 1.test_pack(1, 2, 0, LITTLE_ENDIAN))
  33. assert_equal([1, "\x01\x00\x00"], 1.test_pack(1, 3, 0, LITTLE_ENDIAN))
  34. end
  35. def test_pack_fixed_buffer
  36. assert_equal([0, "\x00\x00"], 0.test_pack(2, 1, 0, BIG_ENDIAN))
  37. assert_equal([1, "\x00\x01"], 0x01.test_pack(2, 1, 0, BIG_ENDIAN))
  38. assert_equal([1, "\x02\x01"], 0x0201.test_pack(2, 1, 0, BIG_ENDIAN))
  39. assert_equal([2, "\x02\x01"], 0x030201.test_pack(2, 1, 0, BIG_ENDIAN))
  40. assert_equal([2, "\x02\x01"], 0x04030201.test_pack(2, 1, 0, BIG_ENDIAN))
  41. assert_equal([0, "\x00\x00"], 0.test_pack(2, 1, 0, LITTLE_ENDIAN))
  42. assert_equal([1, "\x01\x00"], 0x01.test_pack(2, 1, 0, LITTLE_ENDIAN))
  43. assert_equal([1, "\x01\x02"], 0x0201.test_pack(2, 1, 0, LITTLE_ENDIAN))
  44. assert_equal([2, "\x01\x02"], 0x030201.test_pack(2, 1, 0, LITTLE_ENDIAN))
  45. assert_equal([2, "\x01\x02"], 0x04030201.test_pack(2, 1, 0, LITTLE_ENDIAN))
  46. end
  47. def test_pack_wordorder_and_endian
  48. assert_equal([1, "\x12\x34\x56\x78"], 0x12345678.test_pack(2, 2, 0, MSWORD_FIRST|MSBYTE_FIRST))
  49. assert_equal([1, "\x34\x12\x78\x56"], 0x12345678.test_pack(2, 2, 0, MSWORD_FIRST|LSBYTE_FIRST))
  50. assert_equal([1, "\x56\x78\x12\x34"], 0x12345678.test_pack(2, 2, 0, LSWORD_FIRST|MSBYTE_FIRST))
  51. assert_equal([1, "\x78\x56\x34\x12"], 0x12345678.test_pack(2, 2, 0, LSWORD_FIRST|LSBYTE_FIRST))
  52. end
  53. def test_pack_native_endian
  54. assert_equal([1, [0x1234].pack("S!")], 0x1234.test_pack(1, 2, 0, MSWORD_FIRST|NATIVE_BYTE_ORDER))
  55. end
  56. def test_pack_nail
  57. assert_equal([1, "\x01\x00\x00\x00\x01\x01"], 0b100011.test_pack(6, 1, 7, BIG_ENDIAN))
  58. assert_equal([1, "\x01\x02\x03\x04\x05\x06\x07\x08"], 0x12345678.test_pack(8, 1, 4, BIG_ENDIAN))
  59. assert_equal([1, "\x00\x12\x00\x34\x00\x56\x00\x78"], 0x12345678.test_pack(4, 2, 8, BIG_ENDIAN))
  60. end
  61. def test_pack_overflow
  62. assert_equal([-2, "\x1"], (-0x11).test_pack(1, 1, 4, BIG_ENDIAN))
  63. assert_equal([-2, "\x0"], (-0x10).test_pack(1, 1, 4, BIG_ENDIAN))
  64. assert_equal([-1, "\xF"], (-0x0F).test_pack(1, 1, 4, BIG_ENDIAN))
  65. assert_equal([+1, "\xF"], (+0x0F).test_pack(1, 1, 4, BIG_ENDIAN))
  66. assert_equal([+2, "\x0"], (+0x10).test_pack(1, 1, 4, BIG_ENDIAN))
  67. assert_equal([+2, "\x1"], (+0x11).test_pack(1, 1, 4, BIG_ENDIAN))
  68. assert_equal([-2, "\x01"], (-0x101).test_pack(1, 1, 0, BIG_ENDIAN))
  69. assert_equal([-2, "\x00"], (-0x100).test_pack(1, 1, 0, BIG_ENDIAN))
  70. assert_equal([-1, "\xFF"], (-0x0FF).test_pack(1, 1, 0, BIG_ENDIAN))
  71. assert_equal([+1, "\xFF"], (+0x0FF).test_pack(1, 1, 0, BIG_ENDIAN))
  72. assert_equal([+2, "\x00"], (+0x100).test_pack(1, 1, 0, BIG_ENDIAN))
  73. assert_equal([+2, "\x01"], (+0x101).test_pack(1, 1, 0, BIG_ENDIAN))
  74. assert_equal([-2, "\x00\x00\x00\x00\x00\x00\x00\x01"], (-0x10000000000000001).test_pack(2, 4, 0, BIG_ENDIAN))
  75. assert_equal([-2, "\x00\x00\x00\x00\x00\x00\x00\x00"], (-0x10000000000000000).test_pack(2, 4, 0, BIG_ENDIAN))
  76. assert_equal([-1, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"], (-0x0FFFFFFFFFFFFFFFF).test_pack(2, 4, 0, BIG_ENDIAN))
  77. assert_equal([+1, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"], (+0x0FFFFFFFFFFFFFFFF).test_pack(2, 4, 0, BIG_ENDIAN))
  78. assert_equal([+2, "\x00\x00\x00\x00\x00\x00\x00\x00"], (+0x10000000000000000).test_pack(2, 4, 0, BIG_ENDIAN))
  79. assert_equal([+2, "\x00\x00\x00\x00\x00\x00\x00\x01"], (+0x10000000000000001).test_pack(2, 4, 0, BIG_ENDIAN))
  80. 1.upto(16) {|wordsize|
  81. 1.upto(20) {|numwords|
  82. w = numwords*wordsize
  83. n = 256**w
  84. assert_equal([-2, "\x00"*(w-1)+"\x01"], (-n-1).test_pack(numwords, wordsize, 0, BIG_ENDIAN))
  85. assert_equal([-2, "\x00"*w], (-n ).test_pack(numwords, wordsize, 0, BIG_ENDIAN))
  86. assert_equal([-1, "\xFF"*w], (-n+1).test_pack(numwords, wordsize, 0, BIG_ENDIAN))
  87. assert_equal([+1, "\xFF"*w], (+n-1).test_pack(numwords, wordsize, 0, BIG_ENDIAN))
  88. assert_equal([+2, "\x00"*w], (+n ).test_pack(numwords, wordsize, 0, BIG_ENDIAN))
  89. assert_equal([+2, "\x00"*(w-1)+"\x01"], (+n+1).test_pack(numwords, wordsize, 0, BIG_ENDIAN))
  90. }
  91. }
  92. 1.upto(16) {|wordsize|
  93. 1.upto(20) {|numwords|
  94. w = numwords*wordsize
  95. n = 256**w
  96. assert_equal([-2, "\x01"+"\x00"*(w-1)], (-n-1).test_pack(numwords, wordsize, 0, LITTLE_ENDIAN))
  97. assert_equal([-2, "\x00"*w], (-n ).test_pack(numwords, wordsize, 0, LITTLE_ENDIAN))
  98. assert_equal([-1, "\xFF"*w], (-n+1).test_pack(numwords, wordsize, 0, LITTLE_ENDIAN))
  99. assert_equal([+1, "\xFF"*w], (+n-1).test_pack(numwords, wordsize, 0, LITTLE_ENDIAN))
  100. assert_equal([+2, "\x00"*w], (+n ).test_pack(numwords, wordsize, 0, LITTLE_ENDIAN))
  101. assert_equal([+2, "\x01"+"\x00"*(w-1)], (+n+1).test_pack(numwords, wordsize, 0, LITTLE_ENDIAN))
  102. }
  103. }
  104. end
  105. def test_pack_sign
  106. assert_equal([-1, "\x01"], (-1).test_pack(1, 1, 0, BIG_ENDIAN))
  107. assert_equal([-1, "\x80\x70\x60\x50\x40\x30\x20\x10"], (-0x8070605040302010).test_pack(8, 1, 0, BIG_ENDIAN))
  108. end
  109. def test_pack_orders
  110. [MSWORD_FIRST, LSWORD_FIRST].each {|word_order|
  111. [MSBYTE_FIRST, LSBYTE_FIRST, NATIVE_BYTE_ORDER].each {|byte_order|
  112. 1.upto(16) {|wordsize|
  113. 1.upto(20) {|numwords|
  114. w = numwords*wordsize
  115. n = 0;
  116. 0.upto(w) {|i|
  117. n |= ((i+1) % 256) << (i*8)
  118. }
  119. assert_equal(n.test_pack(numwords, wordsize, 0, word_order|byte_order|GENERIC),
  120. n.test_pack(numwords, wordsize, 0, word_order|byte_order),
  121. "#{'%#x' % n}.test_pack(#{numwords}, #{wordsize}, 0, #{'%#x' % (word_order|byte_order)})")
  122. }
  123. }
  124. }
  125. }
  126. end
  127. def test_pack2comp_zero
  128. assert_equal([0, ""], 0.test_pack(0, 1, 0, TWOCOMP|BIG_ENDIAN))
  129. end
  130. def test_pack2comp_emptybuf
  131. assert_equal([-2, ""], (-3).test_pack(0, 1, 0, TWOCOMP|BIG_ENDIAN))
  132. assert_equal([-2, ""], (-2).test_pack(0, 1, 0, TWOCOMP|BIG_ENDIAN))
  133. assert_equal([-1, ""], (-1).test_pack(0, 1, 0, TWOCOMP|BIG_ENDIAN))
  134. assert_equal([ 0, ""], 0.test_pack(0, 1, 0, TWOCOMP|BIG_ENDIAN))
  135. assert_equal([+2, ""], 1.test_pack(0, 1, 0, TWOCOMP|BIG_ENDIAN))
  136. assert_equal([+2, ""], 2.test_pack(0, 1, 0, TWOCOMP|BIG_ENDIAN))
  137. end
  138. def test_pack2comp_nearly_zero
  139. assert_equal([-1, "\xFE"], (-2).test_pack(1, 1, 0, TWOCOMP|BIG_ENDIAN))
  140. assert_equal([-1, "\xFF"], (-1).test_pack(1, 1, 0, TWOCOMP|BIG_ENDIAN))
  141. assert_equal([ 0, "\x00"], 0.test_pack(1, 1, 0, TWOCOMP|BIG_ENDIAN))
  142. assert_equal([+1, "\x01"], 1.test_pack(1, 1, 0, TWOCOMP|BIG_ENDIAN))
  143. assert_equal([+1, "\x02"], 2.test_pack(1, 1, 0, TWOCOMP|BIG_ENDIAN))
  144. end
  145. def test_pack2comp_overflow
  146. assert_equal([-2, "\xF"], (-0x11).test_pack(1, 1, 4, TWOCOMP|BIG_ENDIAN))
  147. assert_equal([-1, "\x0"], (-0x10).test_pack(1, 1, 4, TWOCOMP|BIG_ENDIAN))
  148. assert_equal([-1, "\x1"], (-0x0F).test_pack(1, 1, 4, TWOCOMP|BIG_ENDIAN))
  149. assert_equal([+1, "\xF"], (+0x0F).test_pack(1, 1, 4, TWOCOMP|BIG_ENDIAN))
  150. assert_equal([+2, "\x0"], (+0x10).test_pack(1, 1, 4, TWOCOMP|BIG_ENDIAN))
  151. assert_equal([+2, "\x1"], (+0x11).test_pack(1, 1, 4, TWOCOMP|BIG_ENDIAN))
  152. assert_equal([-2, "\xFF"], (-0x101).test_pack(1, 1, 0, TWOCOMP|BIG_ENDIAN))
  153. assert_equal([-1, "\x00"], (-0x100).test_pack(1, 1, 0, TWOCOMP|BIG_ENDIAN))
  154. assert_equal([-1, "\x01"], (-0x0FF).test_pack(1, 1, 0, TWOCOMP|BIG_ENDIAN))
  155. assert_equal([+1, "\xFF"], (+0x0FF).test_pack(1, 1, 0, TWOCOMP|BIG_ENDIAN))
  156. assert_equal([+2, "\x00"], (+0x100).test_pack(1, 1, 0, TWOCOMP|BIG_ENDIAN))
  157. assert_equal([+2, "\x01"], (+0x101).test_pack(1, 1, 0, TWOCOMP|BIG_ENDIAN))
  158. assert_equal([-2, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"], (-0x10000000000000001).test_pack(2, 4, 0, TWOCOMP|BIG_ENDIAN))
  159. assert_equal([-1, "\x00\x00\x00\x00\x00\x00\x00\x00"], (-0x10000000000000000).test_pack(2, 4, 0, TWOCOMP|BIG_ENDIAN))
  160. assert_equal([-1, "\x00\x00\x00\x00\x00\x00\x00\x01"], (-0x0FFFFFFFFFFFFFFFF).test_pack(2, 4, 0, TWOCOMP|BIG_ENDIAN))
  161. assert_equal([+1, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"], (+0x0FFFFFFFFFFFFFFFF).test_pack(2, 4, 0, TWOCOMP|BIG_ENDIAN))
  162. assert_equal([+2, "\x00\x00\x00\x00\x00\x00\x00\x00"], (+0x10000000000000000).test_pack(2, 4, 0, TWOCOMP|BIG_ENDIAN))
  163. assert_equal([+2, "\x00\x00\x00\x00\x00\x00\x00\x01"], (+0x10000000000000001).test_pack(2, 4, 0, TWOCOMP|BIG_ENDIAN))
  164. 1.upto(16) {|wordsize|
  165. 1.upto(20) {|numwords|
  166. w = numwords*wordsize
  167. n = 256**w
  168. assert_equal([-2, "\xFF"*w ], (-n-1).test_pack(numwords, wordsize, 0, TWOCOMP|BIG_ENDIAN))
  169. assert_equal([-1, "\x00"*w], (-n ).test_pack(numwords, wordsize, 0, TWOCOMP|BIG_ENDIAN))
  170. assert_equal([-1, "\x00"*(w-1)+"\x01"], (-n+1).test_pack(numwords, wordsize, 0, TWOCOMP|BIG_ENDIAN))
  171. assert_equal([+1, "\xFF"*w], (+n-1).test_pack(numwords, wordsize, 0, TWOCOMP|BIG_ENDIAN))
  172. assert_equal([+2, "\x00"*w], (+n ).test_pack(numwords, wordsize, 0, TWOCOMP|BIG_ENDIAN))
  173. assert_equal([+2, "\x00"*(w-1)+"\x01"], (+n+1).test_pack(numwords, wordsize, 0, TWOCOMP|BIG_ENDIAN))
  174. }
  175. }
  176. 1.upto(16) {|wordsize|
  177. 1.upto(20) {|numwords|
  178. w = numwords*wordsize
  179. n = 256**w
  180. assert_equal([-2, "\xFF"*w ], (-n-1).test_pack(numwords, wordsize, 0, TWOCOMP|LITTLE_ENDIAN))
  181. assert_equal([-1, "\x00"*w], (-n ).test_pack(numwords, wordsize, 0, TWOCOMP|LITTLE_ENDIAN))
  182. assert_equal([-1, "\x01"+"\x00"*(w-1)], (-n+1).test_pack(numwords, wordsize, 0, TWOCOMP|LITTLE_ENDIAN))
  183. assert_equal([+1, "\xFF"*w], (+n-1).test_pack(numwords, wordsize, 0, TWOCOMP|LITTLE_ENDIAN))
  184. assert_equal([+2, "\x00"*w], (+n ).test_pack(numwords, wordsize, 0, TWOCOMP|LITTLE_ENDIAN))
  185. assert_equal([+2, "\x01"+"\x00"*(w-1)], (+n+1).test_pack(numwords, wordsize, 0, TWOCOMP|LITTLE_ENDIAN))
  186. }
  187. }
  188. end
  189. def test_unpack_zero
  190. assert_equal(0, Integer.test_unpack("", 0, 1, 0, BIG_ENDIAN))
  191. end
  192. def test_unpack_argument_check
  193. assert_raise(ArgumentError) { Integer.test_unpack("x", 2, 1, 0, MSBYTE_FIRST) }
  194. assert_raise(ArgumentError) { Integer.test_unpack("x", 1, 1, 0, MSWORD_FIRST) }
  195. assert_raise(ArgumentError) { Integer.test_unpack("x", 1, 0, 0, BIG_ENDIAN) }
  196. assert_raise(ArgumentError) { Integer.test_unpack("x", 1, 1, 8, BIG_ENDIAN) }
  197. # assume sizeof(ssize_t) == sizeof(intptr_t)
  198. assert_raise(ArgumentError) { Integer.test_unpack("x", 1, 1 << ([""].pack("p").length * 8 - 1), 0, BIG_ENDIAN) }
  199. end
  200. def test_unpack_wordsize
  201. assert_equal(1, Integer.test_unpack("\x01", 1, 1, 0, BIG_ENDIAN))
  202. assert_equal(1, Integer.test_unpack("\x00\x01", 1, 2, 0, BIG_ENDIAN))
  203. assert_equal(1, Integer.test_unpack("\x00\x00\x01", 1, 3, 0, BIG_ENDIAN))
  204. assert_equal(1, Integer.test_unpack("\x01", 1, 1, 0, LITTLE_ENDIAN))
  205. assert_equal(1, Integer.test_unpack("\x01\x00", 1, 2, 0, LITTLE_ENDIAN))
  206. assert_equal(1, Integer.test_unpack("\x01\x00\x00", 1, 3, 0, LITTLE_ENDIAN))
  207. end
  208. def test_unpack_wordorder_and_endian
  209. assert_equal(0x01020304, Integer.test_unpack("\x01\x02\x03\x04", 2, 2, 0, MSWORD_FIRST|MSBYTE_FIRST))
  210. assert_equal(0x02010403, Integer.test_unpack("\x01\x02\x03\x04", 2, 2, 0, MSWORD_FIRST|LSBYTE_FIRST))
  211. assert_equal(0x03040102, Integer.test_unpack("\x01\x02\x03\x04", 2, 2, 0, LSWORD_FIRST|MSBYTE_FIRST))
  212. assert_equal(0x04030201, Integer.test_unpack("\x01\x02\x03\x04", 2, 2, 0, LSWORD_FIRST|LSBYTE_FIRST))
  213. end
  214. def test_unpack_native_endian
  215. assert_equal("\x12\x34".unpack("S!")[0], Integer.test_unpack("\x12\x34", 1, 2, 0, MSWORD_FIRST|NATIVE_BYTE_ORDER))
  216. end
  217. def test_unpack_nail
  218. assert_equal(0b100011, Integer.test_unpack("\x01\x00\x00\x00\x01\x01", 6, 1, 7, BIG_ENDIAN))
  219. assert_equal(0x12345678, Integer.test_unpack("\x01\x02\x03\x04\x05\x06\x07\x08", 8, 1, 4, BIG_ENDIAN))
  220. assert_equal(0x12345678, Integer.test_unpack("\x00\x12\x00\x34\x00\x56\x00\x78", 4, 2, 8, BIG_ENDIAN))
  221. end
  222. def test_unpack_sign
  223. assert_equal(-1, Integer.test_unpack("\x01", 1, 1, 0, BIG_ENDIAN|NEGATIVE))
  224. assert_equal(-0x8070605040302010, Integer.test_unpack("\x80\x70\x60\x50\x40\x30\x20\x10", 8, 1, 0, BIG_ENDIAN|NEGATIVE))
  225. end
  226. def test_unpack_orders
  227. [MSWORD_FIRST, LSWORD_FIRST].each {|word_order|
  228. [MSBYTE_FIRST, LSBYTE_FIRST, NATIVE_BYTE_ORDER].each {|byte_order|
  229. 1.upto(16) {|wordsize|
  230. 1.upto(20) {|numwords|
  231. w = numwords*wordsize
  232. ary = []
  233. 0.upto(w) {|i|
  234. ary << ((i+1) % 256);
  235. }
  236. str = ary.pack("C*")
  237. flags = word_order|byte_order
  238. assert_equal(Integer.test_unpack(str, numwords, wordsize, 0, flags|GENERIC),
  239. Integer.test_unpack(str, numwords, wordsize, 0, flags),
  240. "Integer.test_unpack(#{str.dump}, #{numwords}, #{wordsize}, 0, #{'%#x' % flags})")
  241. }
  242. }
  243. }
  244. }
  245. end
  246. def test_unpack2comp_single_byte
  247. assert_equal(-128, Integer.test_unpack("\x80", 1, 1, 0, TWOCOMP|BIG_ENDIAN))
  248. assert_equal( -2, Integer.test_unpack("\xFE", 1, 1, 0, TWOCOMP|BIG_ENDIAN))
  249. assert_equal( -1, Integer.test_unpack("\xFF", 1, 1, 0, TWOCOMP|BIG_ENDIAN))
  250. assert_equal( 0, Integer.test_unpack("\x00", 1, 1, 0, TWOCOMP|BIG_ENDIAN))
  251. assert_equal( 1, Integer.test_unpack("\x01", 1, 1, 0, TWOCOMP|BIG_ENDIAN))
  252. assert_equal( 2, Integer.test_unpack("\x02", 1, 1, 0, TWOCOMP|BIG_ENDIAN))
  253. assert_equal( 127, Integer.test_unpack("\x7F", 1, 1, 0, TWOCOMP|BIG_ENDIAN))
  254. end
  255. def test_unpack2comp_sequence_of_ff
  256. assert_equal(-1, Integer.test_unpack("\xFF"*2, 2, 1, 0, TWOCOMP|BIG_ENDIAN))
  257. assert_equal(-1, Integer.test_unpack("\xFF"*3, 3, 1, 0, TWOCOMP|BIG_ENDIAN))
  258. assert_equal(-1, Integer.test_unpack("\xFF"*4, 4, 1, 0, TWOCOMP|BIG_ENDIAN))
  259. assert_equal(-1, Integer.test_unpack("\xFF"*5, 5, 1, 0, TWOCOMP|BIG_ENDIAN))
  260. assert_equal(-1, Integer.test_unpack("\xFF"*6, 6, 1, 0, TWOCOMP|BIG_ENDIAN))
  261. assert_equal(-1, Integer.test_unpack("\xFF"*7, 7, 1, 0, TWOCOMP|BIG_ENDIAN))
  262. assert_equal(-1, Integer.test_unpack("\xFF"*8, 8, 1, 0, TWOCOMP|BIG_ENDIAN))
  263. assert_equal(-1, Integer.test_unpack("\xFF"*9, 9, 1, 0, TWOCOMP|BIG_ENDIAN))
  264. end
  265. def test_unpack2comp_negative_single_byte
  266. assert_equal(-256, Integer.test_unpack("\x00", 1, 1, 0, TWOCOMP|BIG_ENDIAN|NEGATIVE))
  267. assert_equal(-255, Integer.test_unpack("\x01", 1, 1, 0, TWOCOMP|BIG_ENDIAN|NEGATIVE))
  268. assert_equal(-254, Integer.test_unpack("\x02", 1, 1, 0, TWOCOMP|BIG_ENDIAN|NEGATIVE))
  269. assert_equal(-129, Integer.test_unpack("\x7F", 1, 1, 0, TWOCOMP|BIG_ENDIAN|NEGATIVE))
  270. assert_equal(-128, Integer.test_unpack("\x80", 1, 1, 0, TWOCOMP|BIG_ENDIAN|NEGATIVE))
  271. assert_equal( -2, Integer.test_unpack("\xFE", 1, 1, 0, TWOCOMP|BIG_ENDIAN|NEGATIVE))
  272. assert_equal( -1, Integer.test_unpack("\xFF", 1, 1, 0, TWOCOMP|BIG_ENDIAN|NEGATIVE))
  273. end
  274. def test_unpack2comp_negative_zero
  275. 0.upto(100) {|n|
  276. str = "\x00"*n
  277. flags = TWOCOMP|BIG_ENDIAN|NEGATIVE
  278. assert_equal(-(256**n), Integer.test_unpack(str, n, 1, 0, flags))
  279. flags = TWOCOMP|LITTLE_ENDIAN|NEGATIVE
  280. assert_equal(-(256**n), Integer.test_unpack(str, n, 1, 0, flags),
  281. "Integer.test_unpack(#{str.dump}, #{n}, 1, 0, #{'%#x' % flags})")
  282. }
  283. end
  284. end
  285. def test_numbits_2comp
  286. assert_equal(4, -9.test_numbits_2comp_without_sign)
  287. assert_equal(3, -8.test_numbits_2comp_without_sign)
  288. assert_equal(3, -7.test_numbits_2comp_without_sign)
  289. assert_equal(3, -6.test_numbits_2comp_without_sign)
  290. assert_equal(3, -5.test_numbits_2comp_without_sign)
  291. assert_equal(2, -4.test_numbits_2comp_without_sign)
  292. assert_equal(2, -3.test_numbits_2comp_without_sign)
  293. assert_equal(1, -2.test_numbits_2comp_without_sign)
  294. assert_equal(0, -1.test_numbits_2comp_without_sign)
  295. assert_equal(0, 0.test_numbits_2comp_without_sign)
  296. assert_equal(1, 1.test_numbits_2comp_without_sign)
  297. assert_equal(2, 2.test_numbits_2comp_without_sign)
  298. assert_equal(2, 3.test_numbits_2comp_without_sign)
  299. assert_equal(3, 4.test_numbits_2comp_without_sign)
  300. assert_equal(3, 5.test_numbits_2comp_without_sign)
  301. assert_equal(3, 6.test_numbits_2comp_without_sign)
  302. assert_equal(3, 7.test_numbits_2comp_without_sign)
  303. assert_equal(4, 8.test_numbits_2comp_without_sign)
  304. assert_equal(4, 9.test_numbits_2comp_without_sign)
  305. end
  306. def test_numbytes_2comp
  307. assert_equal(6, -0x8000000001.test_numbytes_2comp_with_sign)
  308. assert_equal(5, -0x8000000000.test_numbytes_2comp_with_sign)
  309. assert_equal(5, -0x80000001.test_numbytes_2comp_with_sign)
  310. assert_equal(4, -0x80000000.test_numbytes_2comp_with_sign)
  311. assert_equal(4, -0x800001.test_numbytes_2comp_with_sign)
  312. assert_equal(3, -0x800000.test_numbytes_2comp_with_sign)
  313. assert_equal(3, -0x8001.test_numbytes_2comp_with_sign)
  314. assert_equal(2, -0x8000.test_numbytes_2comp_with_sign)
  315. assert_equal(2, -0x81.test_numbytes_2comp_with_sign)
  316. assert_equal(1, -0x80.test_numbytes_2comp_with_sign)
  317. assert_equal(1, -1.test_numbytes_2comp_with_sign)
  318. assert_equal(1, 0.test_numbytes_2comp_with_sign)
  319. assert_equal(1, 1.test_numbytes_2comp_with_sign)
  320. assert_equal(1, 0x7f.test_numbytes_2comp_with_sign)
  321. assert_equal(2, 0x80.test_numbytes_2comp_with_sign)
  322. assert_equal(2, 0x7fff.test_numbytes_2comp_with_sign)
  323. assert_equal(3, 0x8000.test_numbytes_2comp_with_sign)
  324. assert_equal(3, 0x7fffff.test_numbytes_2comp_with_sign)
  325. assert_equal(4, 0x800000.test_numbytes_2comp_with_sign)
  326. assert_equal(4, 0x7fffffff.test_numbytes_2comp_with_sign)
  327. assert_equal(5, 0x80000000.test_numbytes_2comp_with_sign)
  328. assert_equal(5, 0x7fffffffff.test_numbytes_2comp_with_sign)
  329. assert_equal(6, 0x8000000000.test_numbytes_2comp_with_sign)
  330. end
  331. end