From e599c936d85719bb54a42d3fc52e0b67ec044dea Mon Sep 17 00:00:00 2001 From: akr Date: Thu, 25 Feb 2010 14:00:48 +0000 Subject: * pack.c: consider DYNAMIC_ENDIAN. refactored. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26761 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- test/ruby/test_integer_comb.rb | 2 + test/ruby/test_pack.rb | 119 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 120 insertions(+), 1 deletion(-) (limited to 'test/ruby') diff --git a/test/ruby/test_integer_comb.rb b/test/ruby/test_integer_comb.rb index a8ac340d07..c057deb36f 100644 --- a/test/ruby/test_integer_comb.rb +++ b/test/ruby/test_integer_comb.rb @@ -587,6 +587,8 @@ class TestIntegerComb < Test::Unit::TestCase if min <= a && a <= max assert_equal(a, b, "[#{a}].pack(#{template.dump}).unpack(#{template.dump})[0]") end + assert_operator(min, :<=, b) + assert_operator(b, :<=, max) assert_equal(a & mask, b & mask, "[#{a}].pack(#{template.dump}).unpack(#{template.dump})[0] & #{mask}") } } diff --git a/test/ruby/test_pack.rb b/test/ruby/test_pack.rb index 518708c99d..58154128e6 100644 --- a/test/ruby/test_pack.rb +++ b/test/ruby/test_pack.rb @@ -20,6 +20,31 @@ class TestPack < Test::Unit::TestCase assert_equal($x, $x.pack("l").unpack("l")) end + def test_pack_n + assert_equal "\000\000", [0].pack('n') + assert_equal "\000\001", [1].pack('n') + assert_equal "\000\002", [2].pack('n') + assert_equal "\000\003", [3].pack('n') + assert_equal "\377\376", [65534].pack('n') + assert_equal "\377\377", [65535].pack('n') + + assert_equal "\200\000", [2**15].pack('n') + assert_equal "\177\377", [-2**15-1].pack('n') + assert_equal "\377\377", [-1].pack('n') + + assert_equal "\000\001\000\001", [1,1].pack('n*') + assert_equal "\000\001\000\001\000\001", [1,1,1].pack('n*') + end + + def test_unpack_n + assert_equal 1, "\000\001".unpack('n')[0] + assert_equal 2, "\000\002".unpack('n')[0] + assert_equal 3, "\000\003".unpack('n')[0] + assert_equal 65535, "\377\377".unpack('n')[0] + assert_equal [1,1], "\000\001\000\001".unpack('n*') + assert_equal [1,1,1], "\000\001\000\001\000\001".unpack('n*') + end + def test_pack_N assert_equal "\000\000\000\000", [0].pack('N') assert_equal "\000\000\000\001", [1].pack('N') @@ -40,12 +65,80 @@ class TestPack < Test::Unit::TestCase assert_equal 1, "\000\000\000\001".unpack('N')[0] assert_equal 2, "\000\000\000\002".unpack('N')[0] assert_equal 3, "\000\000\000\003".unpack('N')[0] - assert_equal 3, "\000\000\000\003".unpack('N')[0] assert_equal 4294967295, "\377\377\377\377".unpack('N')[0] assert_equal [1,1], "\000\000\000\001\000\000\000\001".unpack('N*') assert_equal [1,1,1], "\000\000\000\001\000\000\000\001\000\000\000\001".unpack('N*') end + def test_integer_endian + s = [1].pack("s") + assert_includes(["\0\1", "\1\0"], s) + if s == "\0\1" + # big endian + assert_equal("\x01\x02", [0x0102].pack("s")) + assert_equal("\x01\x02", [0x0102].pack("S")) + assert_equal("\x01\x02\x03\x04", [0x01020304].pack("l")) + assert_equal("\x01\x02\x03\x04", [0x01020304].pack("L")) + assert_equal("\x01\x02\x03\x04\x05\x06\x07\x08", [0x0102030405060708].pack("q")) + assert_equal("\x01\x02\x03\x04\x05\x06\x07\x08", [0x0102030405060708].pack("Q")) + assert_match(/\A\x00*\x01\x02\z/, [0x0102].pack("s!")) + assert_match(/\A\x00*\x01\x02\z/, [0x0102].pack("S!")) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("i")) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("I")) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("i!")) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("I!")) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("l!")) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("L!")) + %w[s S l L q Q s! S! i I i! I! l! L!].each {|fmt| + nuls = [0].pack(fmt) + v = 0 + s = "".force_encoding("ascii-8bit") + nuls.bytesize.times {|i| + j = i + 40 + v = v * 256 + j + s << [j].pack("C") + } + assert_equal(s, [v].pack(fmt), "[#{v}].pack(#{fmt.dump})") + assert_equal([v], s.unpack(fmt), "#{s.dump}.unpack(#{fmt.dump})") + s2 = s+s + fmt2 = fmt+"*" + assert_equal([v,v], s2.unpack(fmt2), "#{s2.dump}.unpack(#{fmt2.dump})") + } + else + # little endian + assert_equal("\x02\x01", [0x0102].pack("s")) + assert_equal("\x02\x01", [0x0102].pack("S")) + assert_equal("\x04\x03\x02\x01", [0x01020304].pack("l")) + assert_equal("\x04\x03\x02\x01", [0x01020304].pack("L")) + assert_equal("\x08\x07\x06\x05\x04\x03\x02\x01", [0x0102030405060708].pack("q")) + assert_equal("\x08\x07\x06\x05\x04\x03\x02\x01", [0x0102030405060708].pack("Q")) + assert_match(/\A\x02\x01\x00*\z/, [0x0102].pack("s!")) + assert_match(/\A\x02\x01\x00*\z/, [0x0102].pack("S!")) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("i")) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("I")) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("i!")) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("I!")) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("l!")) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("L!")) + %w[s S l L q Q s! S! i I i! I! l! L!].each {|fmt| + nuls = [0].pack(fmt) + v = 0 + s = "".force_encoding("ascii-8bit") + nuls.bytesize.times {|i| + j = i+40 + v = v * 256 + j + s << [j].pack("C") + } + s.reverse! + assert_equal(s, [v].pack(fmt), "[#{v}].pack(#{fmt.dump})") + assert_equal([v], s.unpack(fmt), "#{s.dump}.unpack(#{fmt.dump})") + s2 = s+s + fmt2 = fmt+"*" + assert_equal([v,v], s2.unpack(fmt2), "#{s2.dump}.unpack(#{fmt2.dump})") + } + end + end + def test_pack_U assert_raise(RangeError) { [-0x40000001].pack("U") } assert_raise(RangeError) { [-0x40000000].pack("U") } @@ -238,6 +331,11 @@ class TestPack < Test::Unit::TestCase assert_equal(s1, s2) assert_equal([513, -514], s2.unpack("s!*")) assert_equal([513, 65022], s1.unpack("S!*")) + + assert_equal(2, [1].pack("s").bytesize) + assert_equal(2, [1].pack("S").bytesize) + assert_operator(2, :<=, [1].pack("s!").bytesize) + assert_operator(2, :<=, [1].pack("S!").bytesize) end def test_pack_unpack_iI @@ -251,6 +349,11 @@ class TestPack < Test::Unit::TestCase s2 = [67305985, 4244504319].pack("I!*") assert_equal([67305985, -50462977], s1.unpack("i!*")) assert_equal([67305985, 4244504319], s2.unpack("I!*")) + + assert_operator(4, :<=, [1].pack("i").bytesize) + assert_operator(4, :<=, [1].pack("I").bytesize) + assert_operator(4, :<=, [1].pack("i!").bytesize) + assert_operator(4, :<=, [1].pack("I!").bytesize) end def test_pack_unpack_lL @@ -264,6 +367,11 @@ class TestPack < Test::Unit::TestCase s2 = [67305985, 4244504319].pack("L!*") assert_equal([67305985, -50462977], s1.unpack("l!*")) assert_equal([67305985, 4244504319], s2.unpack("L!*")) + + assert_equal(4, [1].pack("l").bytesize) + assert_equal(4, [1].pack("L").bytesize) + assert_operator(4, :<=, [1].pack("l!").bytesize) + assert_operator(4, :<=, [1].pack("L!").bytesize) end def test_pack_unpack_qQ @@ -272,6 +380,9 @@ class TestPack < Test::Unit::TestCase assert_equal(s1, s2) assert_equal([578437695752307201, -506097522914230529], s2.unpack("q*")) assert_equal([578437695752307201, 17940646550795321087], s1.unpack("Q*")) + + assert_equal(8, [1].pack("q").bytesize) + assert_equal(8, [1].pack("Q").bytesize) end def test_pack_unpack_nN @@ -280,6 +391,9 @@ class TestPack < Test::Unit::TestCase assert_equal([0,1,65535,32767,32768,65535], "\000\000\000\001\377\377\177\377\200\000\377\377".unpack("n*")) assert_equal([0,1,4294967295], "\000\000\000\000\000\000\000\001\377\377\377\377".unpack("N*")) + + assert_equal(2, [1].pack("n").bytesize) + assert_equal(4, [1].pack("N").bytesize) end def test_pack_unpack_vV @@ -288,6 +402,9 @@ class TestPack < Test::Unit::TestCase assert_equal([0,1,65535,32767,32768,65535], "\000\000\001\000\377\377\377\177\000\200\377\377".unpack("v*")) assert_equal([0,1,4294967295], "\000\000\000\000\001\000\000\000\377\377\377\377".unpack("V*")) + + assert_equal(2, [1].pack("v").bytesize) + assert_equal(4, [1].pack("V").bytesize) end def test_pack_unpack_fdeEgG -- cgit v1.2.3