pwntools 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,36 @@
1
+ # encoding: ASCII-8BIT
2
+
3
+ require 'test_helper'
4
+ require 'pwnlib/util/cyclic'
5
+
6
+ class CyclicTest < MiniTest::Test
7
+ include ::Pwnlib::Util::Cyclic::ClassMethods
8
+
9
+ def test_cyclic
10
+ assert_equal('AAABAACABBABCACBACCBBBCBCCC', cyclic(alphabet: 'ABC', n: 3))
11
+ assert_equal('aaaabaaacaaadaaaeaaa', cyclic(20))
12
+ assert_equal(27_000, cyclic(alphabet: (0...30).to_a, n: 3).size)
13
+ assert_equal([1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 2, 2],
14
+ cyclic(alphabet: [1, 2], n: 4))
15
+ end
16
+
17
+ def test_cyclic_find
18
+ r = cyclic(1000)
19
+ 10.times do
20
+ idx = rand(0...1000 - 4)
21
+ assert_equal(idx, cyclic_find(r[idx, 4]))
22
+ end
23
+
24
+ r = cyclic(1000)
25
+ 10.times do
26
+ idx = rand(0...1000 - 5)
27
+ assert_equal(idx, cyclic_find(r[idx, 5], n: 4))
28
+ end
29
+
30
+ r = cyclic(1000, alphabet: (0...10).to_a)
31
+ 10.times do
32
+ idx = rand(0...1000 - 4)
33
+ assert_equal(idx, cyclic_find(r[idx, 4], alphabet: (0...10).to_a))
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,106 @@
1
+ # encoding: ASCII-8BIT
2
+
3
+ require 'test_helper'
4
+ require 'pwnlib/util/fiddling'
5
+
6
+ class FiddlingTest < MiniTest::Test
7
+ include ::Pwnlib::Util::Fiddling::ClassMethods
8
+
9
+ def test_enhex
10
+ assert_equal('4141313233', enhex('AA123'))
11
+ assert_equal('74657374', enhex('test'))
12
+ assert_equal('122355ff4499', enhex("\x12\x23\x55\xff\x44\x99"))
13
+ assert_equal('21402324255e262a28295f2b5f29282a265e2524234040213f7b7d5d5b2f2f5c60607e',
14
+ enhex('!@#$%^&*()_+_)(*&^%$#@@!?{}][//\``~'))
15
+ end
16
+
17
+ def test_unhex
18
+ assert_equal('AA123', unhex('4141313233'))
19
+ assert_equal('test', unhex('74657374'))
20
+ assert_equal("\x12\x23\x55\xff\x44\x99", unhex('122355ff4499'))
21
+ assert_equal('!@#$%^&*()_+_)(*&^%$#@@!?{}][//\``~',
22
+ unhex('21402324255e262a28295f2b5f29282a265e2524234040213f7b7d5d5b2f2f5c60607e'))
23
+ end
24
+
25
+ def test_hex
26
+ assert_equal('0x0', hex(0))
27
+ assert_equal('0x64', hex(100))
28
+ assert_equal('-0xa', hex(-10))
29
+ assert_equal('0xfaceb00cdeadbeef', hex(0xfaceb00cdeadbeef))
30
+ end
31
+
32
+ def test_urlencode
33
+ assert_equal('%74%65%73%74%20%41', urlencode('test A'))
34
+ assert_equal('%00%ff%01%fe', urlencode("\x00\xff\x01\xfe"))
35
+ end
36
+
37
+ def test_urldecode
38
+ assert_equal('test A', urldecode('te%73t%20%41'))
39
+ assert_equal("\x00\xff\x01\xfe", urldecode('%00%ff%01%fe'))
40
+
41
+ assert_equal('%qq', urldecode('%qq', true))
42
+ err = assert_raises(ArgumentError) { urldecode('%qq') }
43
+ assert_match(/Invalid input to urldecode/, err.message)
44
+
45
+ assert_equal('%%1z2%orz%%%%%#$!#)@%', urldecode('%%1z2%orz%%%%%#$!#)@%', true))
46
+ err = assert_raises(ArgumentError) { urldecode('%ff%') }
47
+ assert_match(/Invalid input to urldecode/, err.message)
48
+ end
49
+
50
+ def test_bits
51
+ assert_equal(['+', '+', '+', '+', '+', '+', '+', '-', '-', '-', '-', '-', '-', '-', '-', '-'],
52
+ bits(511, zero: '+', one: '-'))
53
+ assert_equal([0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0], bits('XD'))
54
+ assert_equal([0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0],
55
+ bits('XD', endian: 'le'))
56
+ assert_equal([0, 0, 0, 0, 0, 0, 0, 0], bits(0))
57
+
58
+ err = assert_raises(ArgumentError) { bits(2.0) }
59
+ assert_match(/must be either String or Integer/, err.message)
60
+
61
+ err = assert_raises(ArgumentError) { bits(-1) }
62
+ assert_match(/must be non-negative/, err.message)
63
+ end
64
+
65
+ def test_bits_str
66
+ assert_equal('0000000111111111', bits_str(511))
67
+ assert_equal('0100011010010110001011101100111011111010110011100010111001001110',
68
+ bits_str('bits_str', endian: 'little'))
69
+ end
70
+
71
+ def test_unbits
72
+ assert_equal("\x80", unbits([1]))
73
+ assert_equal("\x01", unbits([1], endian: 'le'))
74
+ assert_equal("\x16\xa666\xf6", unbits(bits('hello'), endian: 'le'))
75
+
76
+ err = assert_raises(ArgumentError) { unbits(%w(hi there)) }
77
+ assert_match(/cannot decode value/, err.message)
78
+
79
+ assert_equal("\xf0", unbits('11110000'))
80
+ end
81
+
82
+ def test_bitswap
83
+ assert_equal("\x8cL\xcc,", bitswap('1234'))
84
+ end
85
+
86
+ def test_bitswap_int
87
+ assert_equal(0x2c, bitswap_int(0x1234, bits: 8))
88
+ assert_equal(0x2c48, bitswap_int(0x1234, bits: 16))
89
+ assert_equal(0x2c4800, bitswap_int(0x1234, bits: 24))
90
+ assert_equal(0x589000, bitswap_int(0x1234, bits: 25))
91
+
92
+ context.local(bits: 36) do
93
+ assert_equal(0xf77db57b0, bitswap_int(0xdeadbeef))
94
+ end
95
+ end
96
+
97
+ def test_b64e
98
+ assert_equal('dGVzdA==', b64e('test'))
99
+ assert_equal('shik' * 100, b64e("\xb2\x18\xa4" * 100))
100
+ end
101
+
102
+ def test_b64d
103
+ assert_equal('test', b64d('dGVzdA=='))
104
+ assert_equal("\xb2\x18\xa4" * 100, b64d('shik' * 100))
105
+ end
106
+ end
@@ -0,0 +1,179 @@
1
+ require 'rainbow'
2
+
3
+ require 'test_helper'
4
+ require 'pwnlib/util/hexdump'
5
+
6
+ class HexDumpTest < MiniTest::Test
7
+ include ::Pwnlib::Util::HexDump::ClassMethods
8
+
9
+ def setup
10
+ # Default to disable coloring for easier testing.
11
+ Rainbow.enabled = false
12
+ end
13
+
14
+ def assert_lines_equal(s1, s2)
15
+ s1l = s1.chomp.lines
16
+ s2l = s2.chomp.lines
17
+ assert_equal(s1l, s2l)
18
+ end
19
+
20
+ def test_hexdump_basic
21
+ assert_lines_equal(<<-'EOS', hexdump('A'))
22
+ 00000000 41 │A│
23
+ 00000001
24
+ EOS
25
+ assert_lines_equal(<<-'EOS', hexdump('ABCD'))
26
+ 00000000 41 42 43 44 │ABCD│
27
+ 00000004
28
+ EOS
29
+ assert_lines_equal(<<-'EOS', hexdump('<3 Ruby :)'))
30
+ 00000000 3c 33 20 52 75 62 79 20 3a 29 │<3 R│uby │:)│
31
+ 0000000a
32
+ EOS
33
+ assert_lines_equal(<<-'EOS', hexdump('><>><>><>><>><>><>>'))
34
+ 00000000 3e 3c 3e 3e 3c 3e 3e 3c 3e 3e 3c 3e 3e 3c 3e 3e │><>>│<>><│>><>│><>>│
35
+ 00000010 3c 3e 3e │<>>│
36
+ 00000013
37
+ EOS
38
+ assert_lines_equal(<<-'EOS', hexdump('ABCD' * 5))
39
+ 00000000 41 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 │ABCD│ABCD│ABCD│ABCD│
40
+ 00000010 41 42 43 44 │ABCD│
41
+ 00000014
42
+ EOS
43
+ assert_lines_equal(<<-'EOS', hexdump((0..255).map(&:chr).join))
44
+ 00000000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f │····│····│····│····│
45
+ 00000010 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f │····│····│····│····│
46
+ 00000020 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f │ !"#│$%&'│()*+│,-./│
47
+ 00000030 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f │0123│4567│89:;│<=>?│
48
+ 00000040 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f │@ABC│DEFG│HIJK│LMNO│
49
+ 00000050 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f │PQRS│TUVW│XYZ[│\]^_│
50
+ 00000060 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f │`abc│defg│hijk│lmno│
51
+ 00000070 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f │pqrs│tuvw│xyz{│|}~·│
52
+ 00000080 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f │····│····│····│····│
53
+ 00000090 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f │····│····│····│····│
54
+ 000000a0 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af │····│····│····│····│
55
+ 000000b0 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf │····│····│····│····│
56
+ 000000c0 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf │····│····│····│····│
57
+ 000000d0 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df │····│····│····│····│
58
+ 000000e0 e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef │····│····│····│····│
59
+ 000000f0 f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff │····│····│····│····│
60
+ 00000100
61
+ EOS
62
+ end
63
+
64
+ def test_hexdump_width
65
+ assert_lines_equal(<<-'EOS', hexdump('vert~', width: 1))
66
+ 00000000 76 │v│
67
+ 00000001 65 │e│
68
+ 00000002 72 │r│
69
+ 00000003 74 │t│
70
+ 00000004 7e │~│
71
+ 00000005
72
+ EOS
73
+ assert_lines_equal(<<-'EOS', hexdump('~!@$%^&*()_+{}:"<>?', width: 13))
74
+ 00000000 7e 21 40 24 25 5e 26 2a 28 29 5f 2b 7b │~!@$│%^&*│()_+│{│
75
+ 0000000d 7d 3a 22 3c 3e 3f │}:"<│>?│
76
+ 00000013
77
+ EOS
78
+ assert_lines_equal(<<-'EOS', hexdump('xoxoxoxo', width: 6))
79
+ 00000000 78 6f 78 6f 78 6f │xoxo│xo│
80
+ 00000006 78 6f │xo│
81
+ 00000008
82
+ EOS
83
+ end
84
+
85
+ def test_hexdump_skip
86
+ assert_lines_equal(<<-'EOS', hexdump('A' * 49))
87
+ 00000000 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 │AAAA│AAAA│AAAA│AAAA│
88
+ *
89
+ 00000030 41 │A│
90
+ 00000031
91
+ EOS
92
+ assert_lines_equal(<<-'EOS', hexdump('A' * 49, skip: false))
93
+ 00000000 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 │AAAA│AAAA│AAAA│AAAA│
94
+ 00000010 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 │AAAA│AAAA│AAAA│AAAA│
95
+ 00000020 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 │AAAA│AAAA│AAAA│AAAA│
96
+ 00000030 41 │A│
97
+ 00000031
98
+ EOS
99
+ end
100
+
101
+ def test_offset
102
+ assert_lines_equal(<<-'EOS', hexdump('ELF' * 10, offset: 0x400000))
103
+ 00400000 45 4c 46 45 4c 46 45 4c 46 45 4c 46 45 4c 46 45 │ELFE│LFEL│FELF│ELFE│
104
+ 00400010 4c 46 45 4c 46 45 4c 46 45 4c 46 45 4c 46 │LFEL│FELF│ELFE│LF│
105
+ 0040001e
106
+ EOS
107
+ end
108
+
109
+ def test_style_byte
110
+ assert_lines_equal(
111
+ <<-'EOS',
112
+ 00000000 (3f) [21] 61 62 (3f) [21] 63 64 │(?)[!]ab│(?)[!]cd│
113
+ 00000008
114
+ EOS
115
+ hexdump('?!ab?!cd', style: { 0x21 => ->(s) { "[#{s}]" }, 0x3f => ->(s) { "(#{s})" } })
116
+ )
117
+ end
118
+
119
+ def test_style_marker
120
+ assert_lines_equal(
121
+ <<-'EOS',
122
+ 00000000 74 65 73 74 74 65 73 74 74 65 73 74 │test☆test☆test│
123
+ 0000000c
124
+ EOS
125
+ hexdump('testtesttest', style: { marker: ->(_) { '☆' } })
126
+ )
127
+ end
128
+
129
+ def test_style_printable
130
+ assert_lines_equal(
131
+ <<-'EOS',
132
+ 00000000 14 15 92 [65] [35] 89 [79] │···[e]│[5]·[y]│
133
+ 00000007
134
+ EOS
135
+ hexdump("\x14\x15\x92\x65\x35\x89\x79", style: { printable: ->(s) { "[#{s}]" } })
136
+ )
137
+ end
138
+
139
+ def test_style_unprintable
140
+ assert_lines_equal(
141
+ <<-'EOS',
142
+ 00000000 [14] [15] [92] 65 35 [89] 79 │[·][·][·]e│5[·]y│
143
+ 00000007
144
+ EOS
145
+ hexdump("\x14\x15\x92\x65\x35\x89\x79", style: { unprintable: ->(s) { "[#{s}]" } })
146
+ )
147
+ end
148
+
149
+ def test_highlight
150
+ orig_verbose = $VERBOSE
151
+ orig_style = HIGHLIGHT_STYLE
152
+ begin
153
+ $VERBOSE = nil
154
+ ::Pwnlib::Util::HexDump::ClassMethods.const_set(:HIGHLIGHT_STYLE, ->(s) { "#{s}!" })
155
+ assert_lines_equal(<<-'EOS', hexdump('abcdefghi', highlight: 'aeiou'))
156
+ 00000000 61! 62 63 64 65! 66 67 68 69! │a!bcd│e!fgh│i!│
157
+ 00000009
158
+ EOS
159
+ ensure
160
+ ::Pwnlib::Util::HexDump::ClassMethods.const_set(:HIGHLIGHT_STYLE, orig_style)
161
+ $VERBOSE = orig_verbose
162
+ end
163
+ end
164
+
165
+ class QQStream
166
+ def read(n)
167
+ 'Q' * n
168
+ end
169
+ end
170
+
171
+ def test_iterator_lazy
172
+ assert_equal(<<-'EOS'.lines.map(&:chomp), hexdump_iter(QQStream.new, skip: false).take(4))
173
+ 00000000 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 │QQQQ│QQQQ│QQQQ│QQQQ│
174
+ 00000010 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 │QQQQ│QQQQ│QQQQ│QQQQ│
175
+ 00000020 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 │QQQQ│QQQQ│QQQQ│QQQQ│
176
+ 00000030 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 │QQQQ│QQQQ│QQQQ│QQQQ│
177
+ EOS
178
+ end
179
+ end
@@ -0,0 +1,168 @@
1
+ # encoding: ASCII-8BIT
2
+
3
+ require 'test_helper'
4
+ require 'pwnlib/util/packing'
5
+
6
+ class PackingTest < MiniTest::Test
7
+ include ::Pwnlib::Util::Packing::ClassMethods
8
+
9
+ def test_pack
10
+ assert_equal('ABC',
11
+ pack(0x414243, bits: 24, endian: 'big', signed: true))
12
+ assert_equal('CBA',
13
+ pack(0x414243, bits: 24, endian: 'little', signed: true))
14
+
15
+ assert_equal("\x81BC", pack(0x814243, bits: 24, endian: 'big', signed: false))
16
+ err = assert_raises(ArgumentError) do
17
+ pack(0x814243, bits: 23, endian: 'big', signed: false)
18
+ end
19
+ assert_match(/does not fit/, err.message)
20
+
21
+ assert_equal("\x00\x81BC", pack(0x814243, bits: 25, endian: 'big', signed: true))
22
+ err = assert_raises(ArgumentError) do
23
+ pack(0x814243, bits: 24, endian: 'big', signed: true)
24
+ end
25
+ assert_match(/does not fit/, err.message)
26
+
27
+ assert_equal("\xff", pack(-1, bits: 'all', endian: 'little', signed: true))
28
+ assert_equal("\xff\x00", pack(-256, bits: 'all', endian: 'big', signed: true))
29
+ assert_equal("\xde\xad\xbe\xef",
30
+ pack(0xdeadbeef, bits: 'all', endian: 'big', signed: false))
31
+ assert_equal("\x05\x04\x03\x02\x01",
32
+ pack(0x0102030405, bits: 'all', endian: 'little', signed: true))
33
+ assert_equal("\x00\x00\x00\x80\x00",
34
+ pack(0x80000000, bits: 'all', endian: 'little', signed: true))
35
+
36
+ assert_equal('ABC', pack(0x414243, bits: 24, endian: 'big'))
37
+
38
+ err = assert_raises(ArgumentError) { pack(-514, bits: 'all', signed: 'unsigned') }
39
+ assert_match(/Can't pack negative number/, err.message)
40
+ end
41
+
42
+ def test_unpack
43
+ assert_equal(0x55aa,
44
+ unpack("\xaa\x55", bits: 16, endian: 'little', signed: false))
45
+ assert_equal(0xaa55,
46
+ unpack("\xaa\x55", bits: 16, endian: 'big', signed: false))
47
+ assert_equal(-0x55ab, unpack("\xaa\x55", bits: 16, endian: 'big', signed: true))
48
+ assert_equal(0x2a55, unpack("\xaa\x55", bits: 15, endian: 'big', signed: true))
49
+ assert_equal(0x0302ff,
50
+ unpack("\xff\x02\x03", bits: 'all', endian: 'little', signed: true))
51
+ assert_equal(-0xfdfd, unpack("\xff\x02\x03", bits: 'all', endian: 'big', signed: true))
52
+ assert_equal(0x80000000,
53
+ unpack("\x00\x00\x00\x80\x00", bits: 'all', endian: 'little', signed: true))
54
+
55
+ err = assert_raises(ArgumentError) do
56
+ unpack("\xff\xff", bits: 8, endian: 'big', signed: false)
57
+ end
58
+ assert_match(/does not match/, err.message)
59
+
60
+ assert_equal(0x414243, unpack('ABC', bits: 'all', endian: 'big', signed: false))
61
+ end
62
+
63
+ def test_unpack_many
64
+ assert_equal([0x55aa, 0x33cc],
65
+ unpack_many("\xaa\x55\xcc\x33", bits: 16, endian: 'little', signed: false))
66
+ assert_equal([0xaa55, 0xcc33],
67
+ unpack_many("\xaa\x55\xcc\x33", bits: 16, endian: 'big', signed: false))
68
+ assert_equal([-0x55ab, -0x33cd],
69
+ unpack_many("\xaa\x55\xcc\x33", bits: 16, endian: 'big', signed: true))
70
+ assert_equal([0x0302ff],
71
+ unpack_many("\xff\x02\x03", bits: 'all', endian: 'little', signed: true))
72
+ assert_equal([-0xfdfd],
73
+ unpack_many("\xff\x02\x03", bits: 'all', endian: 'big', signed: true))
74
+
75
+ err = assert_raises(ArgumentError) { unpack_many('ABCD', bits: 12) }
76
+ assert_match(/bits must be a multiple of 8/, err.message)
77
+
78
+ err = assert_raises(ArgumentError) { unpack_many('ABC', bits: 16) }
79
+ assert_match(/must be a multiple of bytes/, err.message)
80
+
81
+ assert_equal([0x41, 0x42, 0x43, 0x44], unpack_many('ABCD', bits: 8))
82
+ assert_equal([0x4142, 0x4344],
83
+ unpack_many('ABCD', bits: 16, endian: 'big', signed: 'signed'))
84
+ assert_equal([-2, -1],
85
+ unpack_many("\xff\xfe\xff\xff", bits: 16, endian: 'big', signed: 'signed'))
86
+ end
87
+
88
+ def test_ps
89
+ assert_equal('A', p8(0x41))
90
+ assert_equal('BA', p16(0x4142))
91
+ assert_equal('DCBA', p32(0x41424344))
92
+ assert_equal('4321DCBA', p64(0x4142434431323334))
93
+
94
+ assert_equal('AB', p16(0x4142, endian: 'big'))
95
+ assert_equal('ABCD', p32(0x41424344, endian: 'big'))
96
+ assert_equal('ABCD1234', p64(0x4142434431323334, endian: 'big'))
97
+
98
+ assert_equal("\xff\xff\xff\xff", p32(-1))
99
+ end
100
+
101
+ def test_us
102
+ assert_equal(0x41, u8('A'))
103
+ assert_equal(0x4142, u16('BA'))
104
+ assert_equal(0x41424344, u32('DCBA'))
105
+ assert_equal(0x4142434431323334, u64('4321DCBA'))
106
+
107
+ assert_equal(0x4142, u16('AB', endian: 'big'))
108
+ assert_equal(0x41424344, u32('ABCD', endian: 'big'))
109
+ assert_equal(0x4142434431323334, u64('ABCD1234', endian: 'big'))
110
+
111
+ assert_equal(0xFFFFFFFF, u32("\xff\xff\xff\xff", signed: false))
112
+ assert_equal(-1, u32("\xff\xff\xff\xff", signed: true))
113
+ end
114
+
115
+ def test_up_rand
116
+ srand(217)
117
+ [8, 16, 32, 64].each do |sz|
118
+ u = ->(*x) { public_send("u#{sz}", *x) }
119
+ p = ->(*x) { public_send("p#{sz}", *x) }
120
+ 100.times do
121
+ limit = (1 << sz)
122
+ val = rand(0...limit)
123
+ assert_equal(val, u[p[val, signed: false], signed: false])
124
+
125
+ limit = (1 << (sz - 1))
126
+ val = rand(-limit...limit)
127
+ assert_equal(val, u[p[val, signed: true], signed: true])
128
+
129
+ rs = Array.new(sz / 8) { rand(256).chr }.join
130
+ assert_equal(rs, p[u[rs, signed: false], signed: false])
131
+ assert_equal(rs, p[u[rs, signed: true], signed: true])
132
+ end
133
+ end
134
+ end
135
+
136
+ def test_make_packer
137
+ p = context.local(bits: 32, signed: 'no') { make_packer(endian: 'be') }
138
+ assert_equal("\x00\x00\x00A", p[0x41])
139
+
140
+ context.local(bits: 64, endian: 'le', signed: true) do
141
+ assert_equal("\x00\x00\x00A", p[0x41])
142
+ end
143
+
144
+ p = make_packer(bits: 24)
145
+ assert_equal("B\x00\x00", p[0x42])
146
+ end
147
+
148
+ def test_make_unpacker
149
+ u = context.local(bits: 32, signed: 'no') { make_unpacker(endian: 'be') }
150
+ assert_equal(0x41, u["\x00\x00\x00A"])
151
+
152
+ context.local(bits: 64, endian: 'le', signed: true) do
153
+ assert_equal(0x41, u["\x00\x00\x00A"])
154
+ end
155
+
156
+ u = make_unpacker(bits: 24)
157
+ assert_equal(0x42, u["B\x00\x00"])
158
+ end
159
+
160
+ def test_flat
161
+ assert_equal("\x01\x00testABABABABABAB",
162
+ flat(1, 'test', [[['AB'] * 2] * 3], endian: 'le', bits: 16))
163
+ assert_equal('234', flat([1, [2, 3]]) { |x| (x + 1).to_s })
164
+
165
+ err = assert_raises(ArgumentError) { flat(1.23) }
166
+ assert_match(/flat does not support values of type/, err.message)
167
+ end
168
+ end