diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-14 13:12:56 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-14 13:12:56 +0000 |
commit | 5825359dd87a26d5daf7a604583baa0ab48cc543 (patch) | |
tree | 1eb6d5ca5ebd4c7e8159048d557264ecb2692486 /test/ruby/test_pack.rb | |
parent | b1085abaeb5f19dd76ac5650c9c8ec50c1e4db02 (diff) | |
download | ruby-5825359dd87a26d5daf7a604583baa0ab48cc543.tar.gz |
* pack.c (pack_pack): support endian modifiers: < and >.
[ruby-dev:42376] Feature #3491
* pack.c (pack_unpack): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29496 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/ruby/test_pack.rb')
-rw-r--r-- | test/ruby/test_pack.rb | 135 |
1 files changed, 74 insertions, 61 deletions
diff --git a/test/ruby/test_pack.rb b/test/ruby/test_pack.rb index a4a6308299..6f746f2596 100644 --- a/test/ruby/test_pack.rb +++ b/test/ruby/test_pack.rb @@ -70,75 +70,88 @@ class TestPack < Test::Unit::TestCase assert_equal [1,1,1], "\000\000\000\001\000\000\000\001\000\000\000\001".unpack('N*') end + def _integer_big_endian(mod='') + assert_equal("\x01\x02", [0x0102].pack("s"+mod)) + assert_equal("\x01\x02", [0x0102].pack("S"+mod)) + assert_equal("\x01\x02\x03\x04", [0x01020304].pack("l"+mod)) + assert_equal("\x01\x02\x03\x04", [0x01020304].pack("L"+mod)) + assert_equal("\x01\x02\x03\x04\x05\x06\x07\x08", [0x0102030405060708].pack("q"+mod)) + assert_equal("\x01\x02\x03\x04\x05\x06\x07\x08", [0x0102030405060708].pack("Q"+mod)) + assert_match(/\A\x00*\x01\x02\z/, [0x0102].pack("s!"+mod)) + assert_match(/\A\x00*\x01\x02\z/, [0x0102].pack("S!"+mod)) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("i"+mod)) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("I"+mod)) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("i!"+mod)) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("I!"+mod)) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("l!"+mod)) + assert_match(/\A\x00*\x01\x02\x03\x04\z/, [0x01020304].pack("L!"+mod)) + %w[s S l L q Q s! S! i I i! I! l! L!].each {|fmt| + fmt += mod + 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})") + } + end + + def _integer_little_endian(mod='') + assert_equal("\x02\x01", [0x0102].pack("s"+mod)) + assert_equal("\x02\x01", [0x0102].pack("S"+mod)) + assert_equal("\x04\x03\x02\x01", [0x01020304].pack("l"+mod)) + assert_equal("\x04\x03\x02\x01", [0x01020304].pack("L"+mod)) + assert_equal("\x08\x07\x06\x05\x04\x03\x02\x01", [0x0102030405060708].pack("q"+mod)) + assert_equal("\x08\x07\x06\x05\x04\x03\x02\x01", [0x0102030405060708].pack("Q"+mod)) + assert_match(/\A\x02\x01\x00*\z/, [0x0102].pack("s!"+mod)) + assert_match(/\A\x02\x01\x00*\z/, [0x0102].pack("S!"+mod)) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("i"+mod)) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("I"+mod)) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("i!"+mod)) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("I!"+mod)) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("l!"+mod)) + assert_match(/\A\x04\x03\x02\x01\x00*\z/, [0x01020304].pack("L!"+mod)) + %w[s S l L q Q s! S! i I i! I! l! L!].each {|fmt| + fmt += mod + 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 + 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})") - } + _integer_big_endian() 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})") - } + _integer_little_endian() end end + def test_integer_endian_explicit + _integer_big_endian('>') + _integer_little_endian('<') + end + def test_pack_U assert_raise(RangeError) { [-0x40000001].pack("U") } assert_raise(RangeError) { [-0x40000000].pack("U") } |