unageanu-javaclass 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,955 +1,955 @@
1
- #!/usr/bin/ruby
2
-
3
- $: << "../lib"
4
-
5
- require "test/unit"
6
- require "javaclass"
7
- require "test_util"
8
-
9
- require "javaclass"
10
-
11
- module JavaClass
12
-
13
- #
14
- #=== Attributesのテスト
15
- #
16
- class AttributeTest < Test::Unit::TestCase
17
-
18
- include TestUtil
19
-
20
- def setup
21
- @java_class = JavaClass::Class.new
22
-
23
- @java_class.constant_pool[1] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "ConstantValue" )
24
- @java_class.constant_pool[2] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Exceptions" )
25
- @java_class.constant_pool[3] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "InnerClasses" )
26
- @java_class.constant_pool[4] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "EnclosingMethod" )
27
- @java_class.constant_pool[5] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Deprecated" )
28
- @java_class.constant_pool[6] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Synthetic" )
29
- @java_class.constant_pool[7] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "SourceFile" )
30
- @java_class.constant_pool[8] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "SourceDebugExtension" )
31
- @java_class.constant_pool[9] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Signature" )
32
- @java_class.constant_pool[10] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "RuntimeVisibleAnnotations" )
33
- @java_class.constant_pool[11] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "RuntimeInvisibleParameterAnnotations" )
34
- @java_class.constant_pool[12] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "AnnotationDefault" )
35
- @java_class.constant_pool[13] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Code" )
36
- @java_class.constant_pool[14] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "LineNumberTable" )
37
- @java_class.constant_pool[15] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "LocalVariableTable" )
38
- @java_class.constant_pool[16] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "LocalVariableTypeTable" )
39
-
40
- @java_class.constant_pool[30] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "aaa" )
41
- @java_class.constant_pool[31] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "bbb" )
42
- @java_class.constant_pool[32] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "ccc" )
43
-
44
- @java_class.constant_pool[40] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "com/foo/Hoge" )
45
- @java_class.constant_pool[41] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "com/foo/Var" )
46
- @java_class.constant_pool[42] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "com/foo/Piyo" )
47
- @java_class.constant_pool[43] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "java/lang/Exception" )
48
- @java_class.constant_pool[44] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "java/lang/Throwable" )
49
- @java_class.constant_pool[45] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "com/foo/HogeException" )
50
- @java_class.constant_pool[46] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "FOO" )
51
- @java_class.constant_pool[47] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "VAR" )
52
- @java_class.constant_pool[48] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Lcom/foo/Hoge;" )
53
- @java_class.constant_pool[49] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Lcom/foo/Var;" )
54
-
55
- @java_class.constant_pool[50] = IntegerConstant.new( @java_class, Constant::CONSTANT_Integer, 0 )
56
- @java_class.constant_pool[51] = IntegerConstant.new( @java_class, Constant::CONSTANT_Integer, 10 )
57
- @java_class.constant_pool[52] = IntegerConstant.new( @java_class, Constant::CONSTANT_Integer, 100 )
58
-
59
- @java_class.constant_pool[100] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 40 )
60
- @java_class.constant_pool[101] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 41 )
61
- @java_class.constant_pool[102] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 42 )
62
- @java_class.constant_pool[103] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 43 )
63
- @java_class.constant_pool[104] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 44 )
64
- @java_class.constant_pool[105] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 45 )
65
-
66
- @java_class.constant_pool[120] = NameAndTypeConstant.new( @java_class, Constant::CONSTANT_NameAndType, 30, 40 )
67
- @java_class.constant_pool[121] = NameAndTypeConstant.new( @java_class, Constant::CONSTANT_NameAndType, 31, 41 )
68
- end
69
-
70
- def teardown
71
- end
72
-
73
- #
74
- #=== LocalVariableTypeTableAttributeのテスト
75
- #
76
- def test_LocalVariableTypeTableAttribute
77
-
78
- lvs = [
79
- LocalVariableType.new( @java_class, 2, 12, 30, 48, 1 ),
80
- LocalVariableType.new( @java_class, 5, 8, 31, 49, 3 )
81
- ]
82
- attr = LocalVariableTypeTableAttribute.new( @java_class, 16, lvs )
83
- assert_attribute( attr ) {|a|
84
- assert_equal a.name, "LocalVariableTypeTable"
85
- assert_equal a.local_variable_type_table, lvs
86
- assert_equal a.find_by_index(1), lvs[0]
87
- assert_equal a.find_by_index(3), lvs[1]
88
- assert_equal a.find_by_index(100), nil
89
- assert_equal a.dump, "00100000 00160002 0002000C 001E0030\n00010005 0008001F 00310003"
90
- assert_equal a.to_bytes, [0x00, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
91
- }
92
-
93
- lvs = [LocalVariableType.new( @java_class, 5, 8, 31, 49, 3 )]
94
- attr.local_variable_type_table = lvs
95
- assert_attribute( attr ) {|a|
96
- assert_equal a.name, "LocalVariableTypeTable"
97
- assert_equal a.local_variable_type_table, lvs
98
- assert_equal a.find_by_index(1), nil
99
- assert_equal a.find_by_index(3), lvs[0]
100
- assert_equal a.find_by_index(100), nil
101
- assert_equal a.dump, "00100000 000C0001 00050008 001F0031\n0003"
102
- assert_equal a.to_bytes, [0x00, 0x10, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
103
- }
104
- end
105
-
106
- #
107
- #=== LocalVariableTypeのテスト
108
- #
109
- def test_LocalVariableType
110
-
111
- lv = LocalVariableType.new( @java_class, 2, 12, 30, 48, 1 )
112
- assert_local_variable_type( lv ) {|a|
113
- #assert_equal a.to_s, "com.foo.Hoge aaa"
114
- assert_equal a.start_pc, 2
115
- assert_equal a.length, 12
116
- assert_equal a.name, "aaa"
117
- assert_equal a.name_index, 30
118
- assert_equal a.signature, "Lcom/foo/Hoge;"
119
- assert_equal a.signature_index, 48
120
- assert_equal a.index, 1
121
- assert_equal a.dump, "0002000C 001E0030 0001"
122
- assert_equal a.to_bytes, [0x00, 0x02, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x01]
123
- }
124
-
125
- lv.start_pc = 8
126
- lv.length = 5
127
- lv.name_index = 31
128
- lv.signature_index = 49
129
- lv.index = 3
130
- assert_local_variable_type( lv ) {|a|
131
- #assert_equal a.to_s, "com.foo.Var bbb"
132
- assert_equal a.start_pc, 8
133
- assert_equal a.length, 5
134
- assert_equal a.name, "bbb"
135
- assert_equal a.name_index, 31
136
- assert_equal a.signature, "Lcom/foo/Var;"
137
- assert_equal a.signature_index, 49
138
- assert_equal a.index, 3
139
- assert_equal a.dump, "00080005 001F0031 0003"
140
- assert_equal a.to_bytes, [0x00, 0x08, 0x00, 0x05, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
141
- }
142
- end
143
-
144
- #
145
- #=== LocalVariableTableAttributeのテスト
146
- #
147
- def test_LocalVariableTableAttribute
148
-
149
- lvs = [
150
- LocalVariable.new( @java_class, 2, 12, 30, 48, 1 ),
151
- LocalVariable.new( @java_class, 5, 8, 31, 49, 3 )
152
- ]
153
- attr = LocalVariableTableAttribute.new( @java_class, 15, lvs )
154
- assert_attribute( attr ) {|a|
155
- assert_equal a.name, "LocalVariableTable"
156
- assert_equal a.local_variable_table, lvs
157
- assert_equal a.find_by_index(1), lvs[0]
158
- assert_equal a.find_by_index(3), lvs[1]
159
- assert_equal a.find_by_index(100), nil
160
- assert_equal a.dump, "000F0000 00160002 0002000C 001E0030\n00010005 0008001F 00310003"
161
- assert_equal a.to_bytes, [0x00, 0x0F, 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
162
- }
163
-
164
- lvs = [LocalVariable.new( @java_class, 5, 8, 31, 49, 3 )]
165
- attr.local_variable_table = lvs
166
- assert_attribute( attr ) {|a|
167
- assert_equal a.name, "LocalVariableTable"
168
- assert_equal a.local_variable_table, lvs
169
- assert_equal a.find_by_index(1), nil
170
- assert_equal a.find_by_index(3), lvs[0]
171
- assert_equal a.find_by_index(100), nil
172
- assert_equal a.dump, "000F0000 000C0001 00050008 001F0031\n0003"
173
- assert_equal a.to_bytes, [0x00, 0x0F, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
174
- }
175
- end
176
-
177
- #
178
- #=== LocalVariableのテスト
179
- #
180
- def test_LocalVariable
181
-
182
- lv = LocalVariable.new( @java_class, 2, 12, 30, 48, 1 )
183
- assert_local_variable( lv ) {|a|
184
- assert_equal a.to_s, "com.foo.Hoge aaa"
185
- assert_equal a.start_pc, 2
186
- assert_equal a.length, 12
187
- assert_equal a.name, "aaa"
188
- assert_equal a.name_index, 30
189
- assert_equal a.descriptor, "Lcom/foo/Hoge;"
190
- assert_equal a.descriptor_index, 48
191
- assert_equal a.index, 1
192
- assert_equal a.dump, "0002000C 001E0030 0001"
193
- assert_equal a.to_bytes, [0x00, 0x02, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x01]
194
- }
195
-
196
- lv.start_pc = 8
197
- lv.length = 5
198
- lv.name_index = 31
199
- lv.descriptor_index = 49
200
- lv.index = 3
201
- assert_local_variable( lv ) {|a|
202
- assert_equal a.to_s, "com.foo.Var bbb"
203
- assert_equal a.start_pc, 8
204
- assert_equal a.length, 5
205
- assert_equal a.name, "bbb"
206
- assert_equal a.name_index, 31
207
- assert_equal a.descriptor, "Lcom/foo/Var;"
208
- assert_equal a.descriptor_index, 49
209
- assert_equal a.index, 3
210
- assert_equal a.dump, "00080005 001F0031 0003"
211
- assert_equal a.to_bytes, [0x00, 0x08, 0x00, 0x05, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
212
- }
213
- end
214
-
215
- #
216
- #=== LineNumberTableAttributeのテスト
217
- #
218
- def test_LineNumberTableAttribute
219
-
220
- lns = [
221
- LineNumber.new( @java_class, 2, 5 ),
222
- LineNumber.new( @java_class, 8, 9 ),
223
- LineNumber.new( @java_class, 12, 15 )
224
- ]
225
- attr = LineNumberTableAttribute.new( @java_class, 14, lns )
226
- assert_attribute( attr ) {|a|
227
- assert_equal a.name, "LineNumberTable"
228
- assert_equal a.line_numbers, lns
229
- assert_equal a.line_number(8), LineNumber.new( @java_class, 8, 9 )
230
- assert_equal a.line_number(1000), nil
231
- assert_equal a.dump, "000E0000 000E0003 00020005 00080009\n000C000F"
232
- assert_equal a.to_bytes, [0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0C, 0x00, 0x0F]
233
- }
234
-
235
- attr.line_numbers = []
236
- assert_attribute( attr ) {|a|
237
- assert_equal a.name, "LineNumberTable"
238
- assert_equal a.line_numbers, []
239
- assert_equal a.line_number(8), nil
240
- assert_equal a.line_number(1000), nil
241
- assert_equal a.dump, "000E0000 00020000"
242
- assert_equal a.to_bytes, [0x00, 0x0E, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00]
243
- }
244
- end
245
-
246
- #
247
- #=== LineNumberのテスト
248
- #
249
- def test_LineNumber
250
-
251
- ln = LineNumber.new( @java_class, 12, 15 )
252
- assert_line_number( ln ) {|a|
253
- assert_equal a.to_s, "line : 15"
254
- assert_equal a.start_pc, 12
255
- assert_equal a.line_number, 15
256
- assert_equal a.dump, "000C000F"
257
- assert_equal a.to_bytes, [0x00, 0x0C, 0x00, 0x0F]
258
- }
259
-
260
- ln.start_pc = 8
261
- ln.line_number = 5
262
- assert_line_number( ln ) {|a|
263
- assert_equal a.to_s, "line : 5"
264
- assert_equal a.start_pc, 8
265
- assert_equal a.line_number, 5
266
- assert_equal a.dump, "00080005"
267
- assert_equal a.to_bytes, [0x00, 0x08, 0x00, 0x05]
268
- }
269
- end
270
-
271
- #
272
- #=== CodeAttributeのテスト
273
- #
274
- def test_CodeAttribute
275
-
276
- exceptions = [Excpetion.new( @java_class, 1, 10, 16, 103 )]
277
- attr = CodeAttribute.new( @java_class, 13, 10, 8, [0x05, 0x06], exceptions, {} )
278
- assert_attribute( attr ) {|a|
279
- assert_equal a.name, "Code"
280
- assert_equal a.max_stack, 10
281
- assert_equal a.max_locals, 8
282
- assert_equal a.codes, [0x05, 0x06]
283
- assert_equal a.exception_table, exceptions
284
- assert_equal a.attributes, {}
285
- assert_equal a.dump, "000D0000 0016000A 00080000 00020506\n00010001 000A0010 00670000"
286
- assert_equal a.to_bytes, [0x00, 0x0D, 0x00, 0x00, 0x00, 0x16, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x05, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x67, 0x00, 0x00]
287
- }
288
-
289
- exceptions = [
290
- Excpetion.new( @java_class, 1, 10, 16, 103 ),
291
- Excpetion.new( @java_class, 5, 20, 16, 104 )
292
- ]
293
- attr.exception_table = exceptions
294
- attr.max_stack = 20
295
- attr.max_locals = 11
296
- attr.codes = []
297
- attr.attributes["RuntimeVisibleAnnotations"] = AnnotationsAttribute.new( @java_class, 10, [Annotation.new( @java_class, 48 )] )
298
- assert_attribute( attr ) {|a|
299
- assert_equal a.name, "Code"
300
- assert_equal a.max_stack, 20
301
- assert_equal a.max_locals, 11
302
- assert_equal a.codes, []
303
- assert_equal a.exception_table, exceptions
304
- assert_equal a.attributes, {
305
- "RuntimeVisibleAnnotations"=> AnnotationsAttribute.new( @java_class, 10, [Annotation.new( @java_class, 48 )] )
306
- }
307
- assert_equal a.dump, "000D0000 00280014 000B0000 00000002\n0001000A 00100067 00050014 00100068\n0001000A 00000006 00010030 0000"
308
- assert_equal a.to_bytes, [0x00, 0x0D, 0x00, 0x00, 0x00, 0x28, 0x00, 0x14, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x67, 0x00, 0x05, 0x00, 0x14, 0x00, 0x10, 0x00, 0x68, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00]
309
- }
310
- end
311
-
312
- #
313
- #=== Excpetionのテスト
314
- #
315
- def test_Excpetion
316
-
317
- ex = Excpetion.new( @java_class, 1, 10, 16, 103 )
318
- assert_exception( ex ) {|a|
319
- assert_equal a.catch_type, @java_class.constant_pool[103]
320
- assert_equal a.start_pc, 1
321
- assert_equal a.end_pc, 10
322
- assert_equal a.handler_pc, 16
323
- assert_equal a.catch_type_index, 103
324
- assert_equal a.dump, "0001000A 00100067"
325
- assert_equal a.to_bytes, [0x00, 0x01, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x67]
326
- }
327
-
328
- ex.start_pc = 3
329
- ex.end_pc = 5
330
- ex.handler_pc = 15
331
- ex.catch_type_index = 0
332
- assert_exception( ex ) {|a|
333
- assert_equal a.catch_type, nil
334
- assert_equal a.start_pc, 3
335
- assert_equal a.end_pc, 5
336
- assert_equal a.handler_pc, 15
337
- assert_equal a.catch_type_index, 0
338
- assert_equal a.dump, "00030005 000F0000"
339
- assert_equal a.to_bytes, [0x00, 0x03, 0x00, 0x05, 0x00, 0x0F, 0x00, 0x00]
340
- }
341
- end
342
-
343
- #
344
- #=== AnnotationDefaultAttributeのテスト
345
- #
346
- def test_AnnotationDefaultAttribute
347
-
348
- value = ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )
349
- attr = AnnotationDefaultAttribute.new( @java_class, 12, value )
350
- assert_attribute( attr ) {|a|
351
- assert_equal a.name, "AnnotationDefault"
352
- assert_equal a.to_s, "default \"aaa\""
353
- assert_equal a.element_value, value
354
- assert_equal a.dump, "000C0000 00037300 1E"
355
- assert_equal a.to_bytes, [0x00, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x73, 0x00, 0x1E]
356
- }
357
-
358
- value = ConstAnnotationElementValue.new( @java_class, 's'[0], 31 )
359
- attr.element_value = value
360
- assert_attribute( attr ) {|a|
361
- assert_equal a.name, "AnnotationDefault"
362
- assert_equal a.to_s, "default \"bbb\""
363
- assert_equal a.element_value, value
364
- assert_equal a.dump, "000C0000 00037300 1F"
365
- assert_equal a.to_bytes, [0x00, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x73, 0x00, 0x1F] }
366
- end
367
-
368
- #
369
- #=== ParameterAnnotationsAttributeのテスト
370
- #
371
- def test_ParameterAnnotationsAttribute
372
-
373
- annotationsA = [
374
- Annotation.new( @java_class, 48 ),
375
- Annotation.new( @java_class, 49 )
376
- ]
377
- annotationsB = [
378
- Annotation.new( @java_class, 48 )
379
- ]
380
-
381
- attr = ParameterAnnotationsAttribute.new( @java_class, 11, [
382
- annotationsA, [], annotationsB
383
- ] )
384
- assert_attribute( attr ) {|a|
385
- assert_equal a.name, "RuntimeInvisibleParameterAnnotations"
386
- assert_equal a[0], annotationsA
387
- assert_equal a[1], []
388
- assert_equal a[2], annotationsB
389
- assert_equal a.dump, "000B0000 00130300 02003000 00003100\n00000000 01003000 00"
390
- assert_equal a.to_bytes, [0x00, 0x0B, 0x00, 0x00, 0x00, 0x13, 0x03, 0x00, 0x02, 0x00, 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00]
391
- }
392
-
393
- attr[1] << Annotation.new( @java_class, 48 )
394
- attr[0] = []
395
- assert_attribute( attr ) {|a|
396
- assert_equal a.name, "RuntimeInvisibleParameterAnnotations"
397
- assert_equal a[0], []
398
- assert_equal a[1], [Annotation.new( @java_class, 48 )]
399
- assert_equal a[2], annotationsB
400
- assert_equal a.dump, "000B0000 000F0300 00000100 30000000\n01003000 00"
401
- assert_equal a.to_bytes, [0x00, 0x0B, 0x00, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00]
402
- }
403
- end
404
-
405
- #
406
- #=== AnnotationAttributeのテスト
407
- #
408
- def test_AnnotationsAttribute
409
-
410
- annotations = [
411
- Annotation.new( @java_class, 48, {
412
- "aaa"=> AnnotationElement.new( @java_class, 30, ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )),
413
- "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
414
- } ),
415
- Annotation.new( @java_class, 49, {
416
- "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
417
- } )
418
- ]
419
-
420
- attr = AnnotationsAttribute.new( @java_class, 10, annotations )
421
- assert_attribute( attr ) {|a|
422
- assert_equal a.name, "RuntimeVisibleAnnotations"
423
- assert_equal a.to_s, "@com.foo.Hoge(\n aaa = \"aaa\",\n bbb = 10\n)\n@com.foo.Var(\n bbb = 10\n)"
424
- assert_equal a.annotations, annotations
425
- assert_equal a.dump, "000A0000 00190002 00300002 001E7300\n1E001F49 00330031 0001001F 490033"
426
- assert_equal a.to_bytes, [0x00, 0x0A, 0x00, 0x00, 0x00, 0x19, 0x00, 0x02, 0x00, 0x30, 0x00, 0x02, 0x00, 0x1E, 0x73, 0x00, 0x1E, 0x00, 0x1F, 0x49, 0x00, 0x33, 0x00, 0x31, 0x00, 0x01, 0x00, 0x1F, 0x49, 0x00, 0x33]
427
- }
428
-
429
- annotations = [
430
- Annotation.new( @java_class, 49, {
431
- "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
432
- } )
433
- ]
434
- attr.annotations = annotations
435
- assert_attribute( attr ) {|a|
436
- assert_equal a.name, "RuntimeVisibleAnnotations"
437
- assert_equal a.to_s, "@com.foo.Var(\n bbb = 10\n)"
438
- assert_equal a.annotations, annotations
439
- assert_equal a.dump, "000A0000 000B0001 00310001 001F4900\n33"
440
- assert_equal a.to_bytes, [0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x31, 0x00, 0x01, 0x00, 0x1F, 0x49, 0x00, 0x33]
441
- }
442
- end
443
-
444
- #
445
- #=== Annotationのテスト
446
- #
447
- def test_Annotation
448
-
449
- elements = {
450
- "aaa"=> AnnotationElement.new( @java_class, 30, ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )),
451
- "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
452
- }
453
- annotation = Annotation.new( @java_class, 48, elements )
454
- assert_annotation( annotation ) {|a|
455
- assert_equal a.to_s, "@com.foo.Hoge(\n aaa = \"aaa\",\n bbb = 10\n)"
456
- assert_equal a.type, "Lcom/foo/Hoge;"
457
- assert_equal a.type_index, 48
458
- assert_equal a.elements, elements
459
- assert_equal a.dump, "00300002 001E7300 1E001F49 0033"
460
- assert_equal a.to_bytes, [0x00, 0x30, 0x00, 0x02, 0x00, 0x1E, 0x73, 0x00, 0x1E, 0x00, 0x1F, 0x49, 0x00, 0x33]
461
- }
462
- elements = {
463
- "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 ))
464
- }
465
- annotation.type_index = 49
466
- annotation.elements = elements
467
- assert_annotation( annotation ) {|a|
468
- assert_equal a.to_s, "@com.foo.Var(\n bbb = 10\n)"
469
- assert_equal a.type, "Lcom/foo/Var;"
470
- assert_equal a.type_index, 49
471
- assert_equal a.dump, "00310001 001F4900 33"
472
- assert_equal a.to_bytes, [0x00, 0x31, 0x00, 0x01, 0x00, 0x1F, 0x49, 0x00, 0x33]
473
- }
474
- end
475
-
476
- #
477
- #=== AnnotationElementのテスト
478
- #
479
- def test_AnnotationElement
480
-
481
- value = ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )
482
- element = AnnotationElement.new( @java_class, 30, value )
483
- assert_annotation_element( element ) {|a|
484
- assert_equal a.to_s, "aaa = \"aaa\""
485
- assert_equal a.name, "aaa"
486
- assert_equal a.name_index, 30
487
- assert_equal a.value, value
488
- assert_equal a.dump, "001E7300 1E"
489
- assert_equal a.to_bytes, [0x00, 0x1E, 0x73, 0x00, 0x1E]
490
- }
491
- value = ConstAnnotationElementValue.new( @java_class, 's'[0], 31 )
492
- element.value = value
493
- element.name_index = 31
494
- assert_annotation_element( element ) {|a|
495
- assert_equal a.to_s, "bbb = \"bbb\""
496
- assert_equal a.name, "bbb"
497
- assert_equal a.name_index, 31
498
- assert_equal a.value, value
499
- assert_equal a.dump, "001F7300 1F"
500
- assert_equal a.to_bytes, [0x00, 0x1F, 0x73, 0x00, 0x1F]
501
- }
502
- end
503
-
504
- #
505
- #=== ArrayAnnotationElementValueのテスト
506
- #
507
- def test_ArrayAnnotationElementValue
508
-
509
- annotations = [
510
- ConstAnnotationElementValue.new( @java_class, 's'[0], 30 ),
511
- ConstAnnotationElementValue.new( @java_class, 's'[0], 31 )
512
- ]
513
-
514
- attr = ArrayAnnotationElementValue.new( @java_class, '['[0], annotations )
515
- assert_annotation_element_value( attr ) {|a|
516
- assert_equal a.to_s, "[\"aaa\",\"bbb\"]"
517
- assert_equal a.array, annotations
518
- assert_equal a.tag, '['[0]
519
- assert_equal a.dump, "5B000273 001E7300 1F"
520
- assert_equal a.to_bytes, [0x5B, 0x00, 0x02, 0x73, 0x00, 0x1E, 0x73, 0x00, 0x1F]
521
- }
522
- annotations = [
523
- ConstAnnotationElementValue.new( @java_class, 's'[0], 32 )
524
- ]
525
- attr.array = annotations
526
- assert_annotation_element_value( attr ) {|a|
527
- assert_equal a.to_s, "[\"ccc\"]"
528
- assert_equal a.array, annotations
529
- assert_equal a.tag, '['[0]
530
- assert_equal a.dump, "5B000173 0020"
531
- assert_equal a.to_bytes, [0x5B, 0x00, 0x01, 0x73, 0x00, 0x20]
532
- }
533
- end
534
-
535
- #
536
- #=== AnnotationAnnotationElementValueのテスト
537
- #
538
- def test_AnnotationAnnotationElementValue
539
-
540
- annotation = Annotation.new( @java_class, 48, {
541
- "aaa"=> AnnotationElement.new( @java_class, 30, ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )),
542
- "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
543
- } )
544
- attr = AnnotationAnnotationElementValue.new( @java_class, '@'[0], annotation )
545
- assert_annotation_element_value( attr ) {|a|
546
- assert_equal a.to_s, "@com.foo.Hoge(\n aaa = \"aaa\",\n bbb = 10\n)"
547
- assert_equal a.annotation, annotation
548
- assert_equal a.tag, '@'[0]
549
- assert_equal a.dump, "40003000 02001E73 001E001F 490033"
550
- assert_equal a.to_bytes, [0x40] + annotation.to_bytes
551
- }
552
- annotation = Annotation.new( @java_class, 49, {
553
- "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
554
- } )
555
- attr.annotation = annotation
556
- assert_annotation_element_value( attr ) {|a|
557
- assert_equal a.to_s, "@com.foo.Var(\n bbb = 10\n)"
558
- assert_equal a.annotation, annotation
559
- assert_equal a.tag, '@'[0]
560
- assert_equal a.dump, "40003100 01001F49 0033"
561
- assert_equal a.to_bytes, [0x40] + annotation.to_bytes
562
- }
563
- end
564
-
565
- #
566
- #=== ClassAnnotationElementValueのテスト
567
- #
568
- def test_ClassAnnotationElementValue
569
-
570
- attr = ClassAnnotationElementValue.new( @java_class, 'c'[0], 48 )
571
- assert_annotation_element_value( attr ) {|a|
572
- assert_equal a.to_s, "com.foo.Hoge.class"
573
- assert_equal a.class_info, "Lcom/foo/Hoge;"
574
- assert_equal a.class_info_index, 48
575
- assert_equal a.tag, 'c'[0]
576
- assert_equal a.dump, "630030"
577
- assert_equal a.to_bytes, [0x63, 0x00, 0x30]
578
- }
579
- attr.class_info_index = 49
580
- assert_annotation_element_value( attr ) {|a|
581
- assert_equal a.to_s, "com.foo.Var.class"
582
- assert_equal a.class_info, "Lcom/foo/Var;"
583
- assert_equal a.class_info_index, 49
584
- assert_equal a.tag, 'c'[0]
585
- assert_equal a.dump, "630031"
586
- assert_equal a.to_bytes, [0x63, 0x00, 0x31]
587
- }
588
- end
589
-
590
- #
591
- #=== EnumAnnotationElementValueのテスト
592
- #
593
- def test_EnumAnnotationElementValue
594
-
595
- attr = EnumAnnotationElementValue.new( @java_class, 'e'[0], 48, 46 )
596
- assert_annotation_element_value( attr ) {|a|
597
- assert_equal a.to_s, "com.foo.Hoge.FOO"
598
- assert_equal a.type_name, "Lcom/foo/Hoge;"
599
- assert_equal a.const_name, "FOO"
600
- assert_equal a.type_name_index, 48
601
- assert_equal a.const_name_index, 46
602
- assert_equal a.tag, 'e'[0]
603
- assert_equal a.dump, "65003000 2E"
604
- assert_equal a.to_bytes, [0x65, 0x00, 0x30, 0x00, 0x2E]
605
- }
606
- attr.type_name_index = 49
607
- attr.const_name_index = 47
608
- assert_annotation_element_value( attr ) {|a|
609
- assert_equal a.to_s, "com.foo.Var.VAR"
610
- assert_equal a.type_name, "Lcom/foo/Var;"
611
- assert_equal a.const_name, "VAR"
612
- assert_equal a.type_name_index, 49
613
- assert_equal a.const_name_index, 47
614
- assert_equal a.tag, 'e'[0]
615
- assert_equal a.dump, "65003100 2F"
616
- assert_equal a.to_bytes, [0x65, 0x00, 0x31, 0x00, 0x2F]
617
- }
618
- end
619
-
620
- #
621
- #=== ConstAnnotationElementValueのテスト
622
- #
623
- def test_ConstAnnotationElementValue
624
-
625
- attr = ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )
626
- assert_annotation_element_value( attr ) {|a|
627
- assert_equal a.to_s, "\"aaa\""
628
- assert_equal a.value, "aaa"
629
- assert_equal a.const_value_index, 30
630
- assert_equal a.tag, 's'[0]
631
- assert_equal a.dump, "73001E"
632
- assert_equal a.to_bytes, [0x73, 0x00, 0x1E]
633
- }
634
- attr.tag = 'I'[0]
635
- attr.const_value_index = 51
636
- assert_annotation_element_value( attr ) {|a|
637
- assert_equal a.to_s, "10"
638
- assert_equal a.value, 10
639
- assert_equal a.const_value_index, 51
640
- assert_equal a.tag, 'I'[0]
641
- assert_equal a.dump, "490033"
642
- assert_equal a.to_bytes, [0x49, 0x00, 0x33]
643
- }
644
- end
645
-
646
- #
647
- #=== SignatureAttributeのテスト
648
- #
649
- def test_SignatureAttribute
650
-
651
- attr = SignatureAttribute.new( @java_class, 9, 40 )
652
- assert_attribute( attr ) {|a|
653
- assert_equal a.name, "Signature"
654
- assert_equal a.to_s, "// signature com/foo/Hoge"
655
- assert_equal a.signature, "com/foo/Hoge"
656
- assert_equal a.signature_index, 40
657
- assert_equal a.dump, "00090000 00020028"
658
- assert_equal a.to_bytes, [0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28]
659
- }
660
- attr.signature_index = 41
661
- assert_attribute( attr ) {|a|
662
- assert_equal a.name, "Signature"
663
- assert_equal a.to_s, "// signature com/foo/Var"
664
- assert_equal a.signature, "com/foo/Var"
665
- assert_equal a.signature_index, 41
666
- assert_equal a.dump, "00090000 00020029"
667
- assert_equal a.to_bytes, [0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29]
668
- }
669
- end
670
-
671
- #
672
- #=== SignatureAttributeのテスト
673
- #
674
- def test_SignatureAttribute
675
-
676
- attr = SignatureAttribute.new( @java_class, 9, 40 )
677
- assert_attribute( attr ) {|a|
678
- assert_equal a.name, "Signature"
679
- assert_equal a.to_s, "// signature com/foo/Hoge"
680
- assert_equal a.signature, "com/foo/Hoge"
681
- assert_equal a.signature_index, 40
682
- assert_equal a.dump, "00090000 00020028"
683
- assert_equal a.to_bytes, [0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28]
684
- }
685
- attr.signature_index = 41
686
- assert_attribute( attr ) {|a|
687
- assert_equal a.name, "Signature"
688
- assert_equal a.to_s, "// signature com/foo/Var"
689
- assert_equal a.signature, "com/foo/Var"
690
- assert_equal a.signature_index, 41
691
- assert_equal a.dump, "00090000 00020029"
692
- assert_equal a.to_bytes, [0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29]
693
- }
694
- end
695
-
696
- #
697
- #=== SourceFileAttributeのテスト
698
- #
699
- def test_SourceFileAttribute
700
-
701
- attr = SourceFileAttribute.new( @java_class, 7, 30 )
702
- assert_attribute( attr ) {|a|
703
- assert_equal a.name, "SourceFile"
704
- assert_equal a.to_s, "// source aaa"
705
- assert_equal a.source_file, "aaa"
706
- assert_equal a.source_file_index, 30
707
- assert_equal a.dump, "00070000 0002001E"
708
- assert_equal a.to_bytes, [0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E]
709
- }
710
- attr.source_file_index = 31
711
- assert_attribute( attr ) {|a|
712
- assert_equal a.name, "SourceFile"
713
- assert_equal a.to_s, "// source bbb"
714
- assert_equal a.source_file, "bbb"
715
- assert_equal a.source_file_index, 31
716
- assert_equal a.dump, "00070000 0002001F"
717
- assert_equal a.to_bytes, [0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F]
718
- }
719
- end
720
-
721
- #
722
- #=== SyntheticAttributeのテスト
723
- #
724
- def test_SyntheticAttribute
725
-
726
- attr = SyntheticAttribute.new( @java_class, 6 )
727
- assert_attribute( attr ) {|a|
728
- assert_equal a.name, "Synthetic"
729
- assert_equal a.dump, "00060000 0000"
730
- assert_equal a.to_bytes, [0x00, 0x06, 0x00, 0x00, 0x00, 0x00]
731
- }
732
-
733
- end
734
-
735
- #
736
- #=== DeprecatedAttributeのテスト
737
- #
738
- def test_DeprecatedAttribute
739
-
740
- attr = DeprecatedAttribute.new( @java_class, 5 )
741
- assert_attribute( attr ) {|a|
742
- assert_equal a.name, "Deprecated"
743
- assert_equal a.to_s, "// !!Deprecated!!"
744
- assert_equal a.dump, "00050000 0000"
745
- assert_equal a.to_bytes, [0x00, 0x05, 0x00, 0x00, 0x00, 0x00]
746
- }
747
-
748
- end
749
-
750
- #
751
- #=== EnclosingMethodAttributeのテスト
752
- #
753
- def test_EnclosingMethodAttribute
754
-
755
- attr = EnclosingMethodAttribute.new( @java_class, 4, 100, 120 )
756
- assert_attribute( attr ) {|a|
757
- assert_equal a.name, "EnclosingMethod"
758
- assert_equal a.to_s, "// enclosed by com.foo.Hoge#aaa"
759
- assert_equal a.enclosing_class, @java_class.constant_pool[100]
760
- assert_equal a.enclosing_method, @java_class.constant_pool[120]
761
- assert_equal a.enclosing_class_index, 100
762
- assert_equal a.enclosing_method_index, 120
763
- assert_equal a.dump, "00040000 00040064 0078"
764
- assert_equal a.to_bytes, [0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x64, 0x00, 0x78]
765
- }
766
- attr.enclosing_class_index = 101
767
- attr.enclosing_method_index = 121
768
- assert_attribute( attr ) {|a|
769
- assert_equal a.name, "EnclosingMethod"
770
- assert_equal a.to_s, "// enclosed by com.foo.Var#bbb"
771
- assert_equal a.enclosing_class, @java_class.constant_pool[101]
772
- assert_equal a.enclosing_method, @java_class.constant_pool[121]
773
- assert_equal a.enclosing_class_index, 101
774
- assert_equal a.enclosing_method_index, 121
775
- assert_equal a.dump, "00040000 00040065 0079"
776
- assert_equal a.to_bytes, [0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0x00, 0x79]
777
- }
778
- end
779
-
780
- #
781
- #=== ConstantValueAttributesのテスト
782
- #
783
- def test_ConstantValueAttributes
784
-
785
- attr = ConstantValueAttribute.new( @java_class, 1, 30)
786
- assert_attribute( attr ) {|a|
787
- assert_equal a.to_s, "\"aaa\""
788
- assert_equal a.value, "aaa"
789
- assert_equal a.name, "ConstantValue"
790
- assert_equal a.constant_value_index, 30
791
- assert_equal a.dump, "00010000 0002001E"
792
- assert_equal a.to_bytes, [0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E]
793
- }
794
-
795
- attr.constant_value_index = 50
796
- assert_attribute( attr ) {|a|
797
- assert_equal a.to_s, "0"
798
- assert_equal a.value, 0
799
- assert_equal a.name, "ConstantValue"
800
- assert_equal a.constant_value_index, 50
801
- assert_equal a.dump, "00010000 00020032"
802
- assert_equal a.to_bytes, [0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32]
803
- }
804
- end
805
-
806
- #
807
- #=== ExceptionsAttributesのテスト
808
- #
809
- def test_ExceptionsAttributes
810
- attr = ExceptionsAttribute.new( @java_class, 2, [103,104])
811
- assert_attribute( attr ) {|a|
812
- assert_equal a.name, "Exceptions"
813
- assert_equal a.to_s, "throws java.lang.Exception, java.lang.Throwable"
814
- assert_equal a.exception_index_table, [103,104]
815
- assert_equal a.exceptions, [@java_class.constant_pool[103],@java_class.constant_pool[104]]
816
- assert_equal a.dump, "00020000 00060002 00670068"
817
- assert_equal a.to_bytes, [0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x67, 0x00, 0x68]
818
- }
819
-
820
- attr.exception_index_table = [105]
821
- assert_attribute( attr ) {|a|
822
- assert_equal a.name, "Exceptions"
823
- assert_equal a.to_s, "throws com.foo.HogeException"
824
- assert_equal a.exception_index_table, [105]
825
- assert_equal a.exceptions, [@java_class.constant_pool[105]]
826
- assert_equal a.dump, "00020000 00040001 0069"
827
- assert_equal a.to_bytes, [0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x69]
828
- }
829
- end
830
-
831
-
832
- #
833
- #=== InnerClassesAttributesのテスト
834
- #
835
- def test_InnerClassesAttributes
836
-
837
- access_flag = JavaClass::InnerClassAccessFlag.new( 0x0001 )
838
- classes = [
839
- InnerClass.new( @java_class, 100, 101, 30, access_flag),
840
- InnerClass.new( @java_class, 101, 102, 31, access_flag)
841
- ]
842
- attr = InnerClassesAttribute.new( @java_class, 3, classes )
843
- assert_attribute( attr ) {|a|
844
- assert_equal a.to_s, "// use inner public class com.foo.Hoge\n// use inner public class com.foo.Var"
845
- assert_equal a.classes, classes
846
- assert_equal a.name, "InnerClasses"
847
- assert_equal a.dump, "00030000 00120002 " \
848
- << classes[0].dump << "\n" << classes[1].dump
849
- assert_equal a.to_bytes, [0x00, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x02 ] \
850
- + classes[0].to_bytes + classes[1].to_bytes
851
- }
852
-
853
- classes = [InnerClass.new( @java_class, 102, 102, 32, access_flag)]
854
- attr.classes = classes
855
- assert_attribute( attr ) {|a|
856
- assert_equal a.to_s, "// use inner public class com.foo.Piyo"
857
- assert_equal a.classes, classes
858
- assert_equal a.name, "InnerClasses"
859
- assert_equal a.dump, "00030000 000A0001 " << classes[0].dump
860
- assert_equal a.to_bytes, [0x00, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x01 ] + classes[0].to_bytes
861
- }
862
- end
863
-
864
- #
865
- #=== InnerClassのテスト
866
- #
867
- def test_InnerClass
868
- access_flag = JavaClass::InnerClassAccessFlag.new( 0x0001 )
869
- inner_class = InnerClass.new( @java_class, 100, 101, 30, access_flag)
870
- assert_inner_class( inner_class ) {|a|
871
- assert_equal a.to_s, "// use inner public class com.foo.Hoge"
872
- assert_equal a.inner_class, @java_class.constant_pool[100]
873
- assert_equal a.outer_class, @java_class.constant_pool[101]
874
- assert_equal a.name, "aaa"
875
- assert_equal a.inner_class_index, 100
876
- assert_equal a.outer_class_index, 101
877
- assert_equal a.name_index, 30
878
- assert_equal a.access_flag, access_flag
879
- assert_equal a.dump, "00640065 001E0001"
880
- assert_equal a.to_bytes, [0x00, 0x64, 0x00, 0x65, 0x00, 0x1E, 0x00, 0x01]
881
- }
882
-
883
- inner_class.inner_class_index = 102
884
- inner_class.name_index = 31
885
- inner_class.access_flag.on( JavaClass::InnerClassAccessFlag::ACC_INTERFACE )
886
- assert_inner_class( inner_class) {|a|
887
- assert_equal a.to_s, "// use inner public interface com.foo.Piyo"
888
- assert_equal a.inner_class, @java_class.constant_pool[102]
889
- assert_equal a.outer_class, @java_class.constant_pool[101]
890
- assert_equal a.name, "bbb"
891
- assert_equal a.inner_class_index, 102
892
- assert_equal a.outer_class_index, 101
893
- assert_equal a.name_index, 31
894
- assert_equal a.access_flag, access_flag
895
- assert_equal a.dump, "00660065 001F0201"
896
- assert_equal a.to_bytes, [0x00, 0x66, 0x00, 0x65, 0x00, 0x1F, 0x02, 0x01]
897
- }
898
- end
899
-
900
- def assert_attribute( a, &block )
901
- assert_to_byte_and_read a, block, proc {|io|
902
- JavaClass.read_attribute( io, @java_class )
903
- }
904
- end
905
-
906
- def assert_inner_class( a, &block )
907
- assert_to_byte_and_read a, block, proc {|io|
908
- JavaClass.read_inner_class( io, @java_class )
909
- }
910
- end
911
-
912
- def assert_annotation_element_value( a, &block )
913
- assert_to_byte_and_read a, block, proc {|io|
914
- JavaClass.read_annotation_element_value( io, @java_class )
915
- }
916
- end
917
-
918
- def assert_annotation_element( a, &block )
919
- assert_to_byte_and_read a, block, proc {|io|
920
- JavaClass.read_annotation_element( io, @java_class )
921
- }
922
- end
923
-
924
- def assert_annotation( a, &block )
925
- assert_to_byte_and_read a, block, proc {|io|
926
- JavaClass.read_annotation( io, @java_class )
927
- }
928
- end
929
-
930
- def assert_exception( a, &block )
931
- assert_to_byte_and_read a, block, proc {|io|
932
- JavaClass.read_exception( io, @java_class )
933
- }
934
- end
935
-
936
- def assert_line_number( a, &block )
937
- assert_to_byte_and_read a, block, proc {|io|
938
- JavaClass.read_line_number( io, @java_class )
939
- }
940
- end
941
-
942
- def assert_local_variable( a, &block )
943
- assert_to_byte_and_read a, block, proc {|io|
944
- JavaClass.read_local_variable( io, @java_class )
945
- }
946
- end
947
-
948
- def assert_local_variable_type( a, &block )
949
- assert_to_byte_and_read a, block, proc {|io|
950
- JavaClass.read_local_variable_type( io, @java_class )
951
- }
952
- end
953
- end
954
-
955
- end
1
+ #!/usr/bin/ruby
2
+
3
+ $: << "../lib"
4
+
5
+ require "test/unit"
6
+ require "javaclass"
7
+ require "test_util"
8
+
9
+ require "javaclass"
10
+
11
+ module JavaClass
12
+
13
+ #
14
+ #=== Attributesのテスト
15
+ #
16
+ class AttributeTest < Test::Unit::TestCase
17
+
18
+ include TestUtil
19
+
20
+ def setup
21
+ @java_class = JavaClass::Class.new
22
+
23
+ @java_class.constant_pool[1] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "ConstantValue" )
24
+ @java_class.constant_pool[2] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Exceptions" )
25
+ @java_class.constant_pool[3] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "InnerClasses" )
26
+ @java_class.constant_pool[4] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "EnclosingMethod" )
27
+ @java_class.constant_pool[5] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Deprecated" )
28
+ @java_class.constant_pool[6] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Synthetic" )
29
+ @java_class.constant_pool[7] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "SourceFile" )
30
+ @java_class.constant_pool[8] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "SourceDebugExtension" )
31
+ @java_class.constant_pool[9] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Signature" )
32
+ @java_class.constant_pool[10] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "RuntimeVisibleAnnotations" )
33
+ @java_class.constant_pool[11] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "RuntimeInvisibleParameterAnnotations" )
34
+ @java_class.constant_pool[12] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "AnnotationDefault" )
35
+ @java_class.constant_pool[13] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Code" )
36
+ @java_class.constant_pool[14] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "LineNumberTable" )
37
+ @java_class.constant_pool[15] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "LocalVariableTable" )
38
+ @java_class.constant_pool[16] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "LocalVariableTypeTable" )
39
+
40
+ @java_class.constant_pool[30] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "aaa" )
41
+ @java_class.constant_pool[31] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "bbb" )
42
+ @java_class.constant_pool[32] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "ccc" )
43
+
44
+ @java_class.constant_pool[40] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "com/foo/Hoge" )
45
+ @java_class.constant_pool[41] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "com/foo/Var" )
46
+ @java_class.constant_pool[42] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "com/foo/Piyo" )
47
+ @java_class.constant_pool[43] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "java/lang/Exception" )
48
+ @java_class.constant_pool[44] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "java/lang/Throwable" )
49
+ @java_class.constant_pool[45] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "com/foo/HogeException" )
50
+ @java_class.constant_pool[46] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "FOO" )
51
+ @java_class.constant_pool[47] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "VAR" )
52
+ @java_class.constant_pool[48] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Lcom/foo/Hoge;" )
53
+ @java_class.constant_pool[49] = UTF8Constant.new( @java_class, Constant::CONSTANT_Utf8, "Lcom/foo/Var;" )
54
+
55
+ @java_class.constant_pool[50] = IntegerConstant.new( @java_class, Constant::CONSTANT_Integer, 0 )
56
+ @java_class.constant_pool[51] = IntegerConstant.new( @java_class, Constant::CONSTANT_Integer, 10 )
57
+ @java_class.constant_pool[52] = IntegerConstant.new( @java_class, Constant::CONSTANT_Integer, 100 )
58
+
59
+ @java_class.constant_pool[100] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 40 )
60
+ @java_class.constant_pool[101] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 41 )
61
+ @java_class.constant_pool[102] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 42 )
62
+ @java_class.constant_pool[103] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 43 )
63
+ @java_class.constant_pool[104] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 44 )
64
+ @java_class.constant_pool[105] = ClassConstant.new( @java_class, Constant::CONSTANT_Class, 45 )
65
+
66
+ @java_class.constant_pool[120] = NameAndTypeConstant.new( @java_class, Constant::CONSTANT_NameAndType, 30, 40 )
67
+ @java_class.constant_pool[121] = NameAndTypeConstant.new( @java_class, Constant::CONSTANT_NameAndType, 31, 41 )
68
+ end
69
+
70
+ def teardown
71
+ end
72
+
73
+ #
74
+ #=== LocalVariableTypeTableAttributeのテスト
75
+ #
76
+ def test_LocalVariableTypeTableAttribute
77
+
78
+ lvs = [
79
+ LocalVariableType.new( @java_class, 2, 12, 30, 48, 1 ),
80
+ LocalVariableType.new( @java_class, 5, 8, 31, 49, 3 )
81
+ ]
82
+ attr = LocalVariableTypeTableAttribute.new( @java_class, 16, lvs )
83
+ assert_attribute( attr ) {|a|
84
+ assert_equal a.name, "LocalVariableTypeTable"
85
+ assert_equal a.local_variable_type_table, lvs
86
+ assert_equal a.find_by_index(1), lvs[0]
87
+ assert_equal a.find_by_index(3), lvs[1]
88
+ assert_equal a.find_by_index(100), nil
89
+ assert_equal a.dump, "00100000 00160002 0002000C 001E0030\n00010005 0008001F 00310003"
90
+ assert_equal a.to_bytes, [0x00, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
91
+ }
92
+
93
+ lvs = [LocalVariableType.new( @java_class, 5, 8, 31, 49, 3 )]
94
+ attr.local_variable_type_table = lvs
95
+ assert_attribute( attr ) {|a|
96
+ assert_equal a.name, "LocalVariableTypeTable"
97
+ assert_equal a.local_variable_type_table, lvs
98
+ assert_equal a.find_by_index(1), nil
99
+ assert_equal a.find_by_index(3), lvs[0]
100
+ assert_equal a.find_by_index(100), nil
101
+ assert_equal a.dump, "00100000 000C0001 00050008 001F0031\n0003"
102
+ assert_equal a.to_bytes, [0x00, 0x10, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
103
+ }
104
+ end
105
+
106
+ #
107
+ #=== LocalVariableTypeのテスト
108
+ #
109
+ def test_LocalVariableType
110
+
111
+ lv = LocalVariableType.new( @java_class, 2, 12, 30, 48, 1 )
112
+ assert_local_variable_type( lv ) {|a|
113
+ #assert_equal a.to_s, "com.foo.Hoge aaa"
114
+ assert_equal a.start_pc, 2
115
+ assert_equal a.length, 12
116
+ assert_equal a.name, "aaa"
117
+ assert_equal a.name_index, 30
118
+ assert_equal a.signature, "Lcom/foo/Hoge;"
119
+ assert_equal a.signature_index, 48
120
+ assert_equal a.index, 1
121
+ assert_equal a.dump, "0002000C 001E0030 0001"
122
+ assert_equal a.to_bytes, [0x00, 0x02, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x01]
123
+ }
124
+
125
+ lv.start_pc = 8
126
+ lv.length = 5
127
+ lv.name_index = 31
128
+ lv.signature_index = 49
129
+ lv.index = 3
130
+ assert_local_variable_type( lv ) {|a|
131
+ #assert_equal a.to_s, "com.foo.Var bbb"
132
+ assert_equal a.start_pc, 8
133
+ assert_equal a.length, 5
134
+ assert_equal a.name, "bbb"
135
+ assert_equal a.name_index, 31
136
+ assert_equal a.signature, "Lcom/foo/Var;"
137
+ assert_equal a.signature_index, 49
138
+ assert_equal a.index, 3
139
+ assert_equal a.dump, "00080005 001F0031 0003"
140
+ assert_equal a.to_bytes, [0x00, 0x08, 0x00, 0x05, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
141
+ }
142
+ end
143
+
144
+ #
145
+ #=== LocalVariableTableAttributeのテスト
146
+ #
147
+ def test_LocalVariableTableAttribute
148
+
149
+ lvs = [
150
+ LocalVariable.new( @java_class, 2, 12, 30, 48, 1 ),
151
+ LocalVariable.new( @java_class, 5, 8, 31, 49, 3 )
152
+ ]
153
+ attr = LocalVariableTableAttribute.new( @java_class, 15, lvs )
154
+ assert_attribute( attr ) {|a|
155
+ assert_equal a.name, "LocalVariableTable"
156
+ assert_equal a.local_variable_table, lvs
157
+ assert_equal a.find_by_index(1), lvs[0]
158
+ assert_equal a.find_by_index(3), lvs[1]
159
+ assert_equal a.find_by_index(100), nil
160
+ assert_equal a.dump, "000F0000 00160002 0002000C 001E0030\n00010005 0008001F 00310003"
161
+ assert_equal a.to_bytes, [0x00, 0x0F, 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
162
+ }
163
+
164
+ lvs = [LocalVariable.new( @java_class, 5, 8, 31, 49, 3 )]
165
+ attr.local_variable_table = lvs
166
+ assert_attribute( attr ) {|a|
167
+ assert_equal a.name, "LocalVariableTable"
168
+ assert_equal a.local_variable_table, lvs
169
+ assert_equal a.find_by_index(1), nil
170
+ assert_equal a.find_by_index(3), lvs[0]
171
+ assert_equal a.find_by_index(100), nil
172
+ assert_equal a.dump, "000F0000 000C0001 00050008 001F0031\n0003"
173
+ assert_equal a.to_bytes, [0x00, 0x0F, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
174
+ }
175
+ end
176
+
177
+ #
178
+ #=== LocalVariableのテスト
179
+ #
180
+ def test_LocalVariable
181
+
182
+ lv = LocalVariable.new( @java_class, 2, 12, 30, 48, 1 )
183
+ assert_local_variable( lv ) {|a|
184
+ assert_equal a.to_s, "com.foo.Hoge aaa"
185
+ assert_equal a.start_pc, 2
186
+ assert_equal a.length, 12
187
+ assert_equal a.name, "aaa"
188
+ assert_equal a.name_index, 30
189
+ assert_equal a.descriptor, "Lcom/foo/Hoge;"
190
+ assert_equal a.descriptor_index, 48
191
+ assert_equal a.index, 1
192
+ assert_equal a.dump, "0002000C 001E0030 0001"
193
+ assert_equal a.to_bytes, [0x00, 0x02, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x01]
194
+ }
195
+
196
+ lv.start_pc = 8
197
+ lv.length = 5
198
+ lv.name_index = 31
199
+ lv.descriptor_index = 49
200
+ lv.index = 3
201
+ assert_local_variable( lv ) {|a|
202
+ assert_equal a.to_s, "com.foo.Var bbb"
203
+ assert_equal a.start_pc, 8
204
+ assert_equal a.length, 5
205
+ assert_equal a.name, "bbb"
206
+ assert_equal a.name_index, 31
207
+ assert_equal a.descriptor, "Lcom/foo/Var;"
208
+ assert_equal a.descriptor_index, 49
209
+ assert_equal a.index, 3
210
+ assert_equal a.dump, "00080005 001F0031 0003"
211
+ assert_equal a.to_bytes, [0x00, 0x08, 0x00, 0x05, 0x00, 0x1F, 0x00, 0x31, 0x00, 0x03]
212
+ }
213
+ end
214
+
215
+ #
216
+ #=== LineNumberTableAttributeのテスト
217
+ #
218
+ def test_LineNumberTableAttribute
219
+
220
+ lns = [
221
+ LineNumber.new( @java_class, 2, 5 ),
222
+ LineNumber.new( @java_class, 8, 9 ),
223
+ LineNumber.new( @java_class, 12, 15 )
224
+ ]
225
+ attr = LineNumberTableAttribute.new( @java_class, 14, lns )
226
+ assert_attribute( attr ) {|a|
227
+ assert_equal a.name, "LineNumberTable"
228
+ assert_equal a.line_numbers, lns
229
+ assert_equal a.line_number(8), LineNumber.new( @java_class, 8, 9 )
230
+ assert_equal a.line_number(1000), nil
231
+ assert_equal a.dump, "000E0000 000E0003 00020005 00080009\n000C000F"
232
+ assert_equal a.to_bytes, [0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0C, 0x00, 0x0F]
233
+ }
234
+
235
+ attr.line_numbers = []
236
+ assert_attribute( attr ) {|a|
237
+ assert_equal a.name, "LineNumberTable"
238
+ assert_equal a.line_numbers, []
239
+ assert_equal a.line_number(8), nil
240
+ assert_equal a.line_number(1000), nil
241
+ assert_equal a.dump, "000E0000 00020000"
242
+ assert_equal a.to_bytes, [0x00, 0x0E, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00]
243
+ }
244
+ end
245
+
246
+ #
247
+ #=== LineNumberのテスト
248
+ #
249
+ def test_LineNumber
250
+
251
+ ln = LineNumber.new( @java_class, 12, 15 )
252
+ assert_line_number( ln ) {|a|
253
+ assert_equal a.to_s, "line : 15"
254
+ assert_equal a.start_pc, 12
255
+ assert_equal a.line_number, 15
256
+ assert_equal a.dump, "000C000F"
257
+ assert_equal a.to_bytes, [0x00, 0x0C, 0x00, 0x0F]
258
+ }
259
+
260
+ ln.start_pc = 8
261
+ ln.line_number = 5
262
+ assert_line_number( ln ) {|a|
263
+ assert_equal a.to_s, "line : 5"
264
+ assert_equal a.start_pc, 8
265
+ assert_equal a.line_number, 5
266
+ assert_equal a.dump, "00080005"
267
+ assert_equal a.to_bytes, [0x00, 0x08, 0x00, 0x05]
268
+ }
269
+ end
270
+
271
+ #
272
+ #=== CodeAttributeのテスト
273
+ #
274
+ def test_CodeAttribute
275
+
276
+ exceptions = [Excpetion.new( @java_class, 1, 10, 16, 103 )]
277
+ attr = CodeAttribute.new( @java_class, 13, 10, 8, [0x05, 0x06], exceptions, {} )
278
+ assert_attribute( attr ) {|a|
279
+ assert_equal a.name, "Code"
280
+ assert_equal a.max_stack, 10
281
+ assert_equal a.max_locals, 8
282
+ assert_equal a.codes, [0x05, 0x06]
283
+ assert_equal a.exception_table, exceptions
284
+ assert_equal a.attributes, {}
285
+ assert_equal a.dump, "000D0000 0016000A 00080000 00020506\n00010001 000A0010 00670000"
286
+ assert_equal a.to_bytes, [0x00, 0x0D, 0x00, 0x00, 0x00, 0x16, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x05, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x67, 0x00, 0x00]
287
+ }
288
+
289
+ exceptions = [
290
+ Excpetion.new( @java_class, 1, 10, 16, 103 ),
291
+ Excpetion.new( @java_class, 5, 20, 16, 104 )
292
+ ]
293
+ attr.exception_table = exceptions
294
+ attr.max_stack = 20
295
+ attr.max_locals = 11
296
+ attr.codes = []
297
+ attr.attributes["RuntimeVisibleAnnotations"] = AnnotationsAttribute.new( @java_class, 10, [Annotation.new( @java_class, 48 )] )
298
+ assert_attribute( attr ) {|a|
299
+ assert_equal a.name, "Code"
300
+ assert_equal a.max_stack, 20
301
+ assert_equal a.max_locals, 11
302
+ assert_equal a.codes, []
303
+ assert_equal a.exception_table, exceptions
304
+ assert_equal a.attributes, {
305
+ "RuntimeVisibleAnnotations"=> AnnotationsAttribute.new( @java_class, 10, [Annotation.new( @java_class, 48 )] )
306
+ }
307
+ assert_equal a.dump, "000D0000 00280014 000B0000 00000002\n0001000A 00100067 00050014 00100068\n0001000A 00000006 00010030 0000"
308
+ assert_equal a.to_bytes, [0x00, 0x0D, 0x00, 0x00, 0x00, 0x28, 0x00, 0x14, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x67, 0x00, 0x05, 0x00, 0x14, 0x00, 0x10, 0x00, 0x68, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00]
309
+ }
310
+ end
311
+
312
+ #
313
+ #=== Excpetionのテスト
314
+ #
315
+ def test_Excpetion
316
+
317
+ ex = Excpetion.new( @java_class, 1, 10, 16, 103 )
318
+ assert_exception( ex ) {|a|
319
+ assert_equal a.catch_type, @java_class.constant_pool[103]
320
+ assert_equal a.start_pc, 1
321
+ assert_equal a.end_pc, 10
322
+ assert_equal a.handler_pc, 16
323
+ assert_equal a.catch_type_index, 103
324
+ assert_equal a.dump, "0001000A 00100067"
325
+ assert_equal a.to_bytes, [0x00, 0x01, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x67]
326
+ }
327
+
328
+ ex.start_pc = 3
329
+ ex.end_pc = 5
330
+ ex.handler_pc = 15
331
+ ex.catch_type_index = 0
332
+ assert_exception( ex ) {|a|
333
+ assert_equal a.catch_type, nil
334
+ assert_equal a.start_pc, 3
335
+ assert_equal a.end_pc, 5
336
+ assert_equal a.handler_pc, 15
337
+ assert_equal a.catch_type_index, 0
338
+ assert_equal a.dump, "00030005 000F0000"
339
+ assert_equal a.to_bytes, [0x00, 0x03, 0x00, 0x05, 0x00, 0x0F, 0x00, 0x00]
340
+ }
341
+ end
342
+
343
+ #
344
+ #=== AnnotationDefaultAttributeのテスト
345
+ #
346
+ def test_AnnotationDefaultAttribute
347
+
348
+ value = ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )
349
+ attr = AnnotationDefaultAttribute.new( @java_class, 12, value )
350
+ assert_attribute( attr ) {|a|
351
+ assert_equal a.name, "AnnotationDefault"
352
+ assert_equal a.to_s, "default \"aaa\""
353
+ assert_equal a.element_value, value
354
+ assert_equal a.dump, "000C0000 00037300 1E"
355
+ assert_equal a.to_bytes, [0x00, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x73, 0x00, 0x1E]
356
+ }
357
+
358
+ value = ConstAnnotationElementValue.new( @java_class, 's'[0], 31 )
359
+ attr.element_value = value
360
+ assert_attribute( attr ) {|a|
361
+ assert_equal a.name, "AnnotationDefault"
362
+ assert_equal a.to_s, "default \"bbb\""
363
+ assert_equal a.element_value, value
364
+ assert_equal a.dump, "000C0000 00037300 1F"
365
+ assert_equal a.to_bytes, [0x00, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x73, 0x00, 0x1F] }
366
+ end
367
+
368
+ #
369
+ #=== ParameterAnnotationsAttributeのテスト
370
+ #
371
+ def test_ParameterAnnotationsAttribute
372
+
373
+ annotationsA = [
374
+ Annotation.new( @java_class, 48 ),
375
+ Annotation.new( @java_class, 49 )
376
+ ]
377
+ annotationsB = [
378
+ Annotation.new( @java_class, 48 )
379
+ ]
380
+
381
+ attr = ParameterAnnotationsAttribute.new( @java_class, 11, [
382
+ annotationsA, [], annotationsB
383
+ ] )
384
+ assert_attribute( attr ) {|a|
385
+ assert_equal a.name, "RuntimeInvisibleParameterAnnotations"
386
+ assert_equal a[0], annotationsA
387
+ assert_equal a[1], []
388
+ assert_equal a[2], annotationsB
389
+ assert_equal a.dump, "000B0000 00130300 02003000 00003100\n00000000 01003000 00"
390
+ assert_equal a.to_bytes, [0x00, 0x0B, 0x00, 0x00, 0x00, 0x13, 0x03, 0x00, 0x02, 0x00, 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00]
391
+ }
392
+
393
+ attr[1] << Annotation.new( @java_class, 48 )
394
+ attr[0] = []
395
+ assert_attribute( attr ) {|a|
396
+ assert_equal a.name, "RuntimeInvisibleParameterAnnotations"
397
+ assert_equal a[0], []
398
+ assert_equal a[1], [Annotation.new( @java_class, 48 )]
399
+ assert_equal a[2], annotationsB
400
+ assert_equal a.dump, "000B0000 000F0300 00000100 30000000\n01003000 00"
401
+ assert_equal a.to_bytes, [0x00, 0x0B, 0x00, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00]
402
+ }
403
+ end
404
+
405
+ #
406
+ #=== AnnotationAttributeのテスト
407
+ #
408
+ def test_AnnotationsAttribute
409
+
410
+ annotations = [
411
+ Annotation.new( @java_class, 48, {
412
+ "aaa"=> AnnotationElement.new( @java_class, 30, ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )),
413
+ "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
414
+ } ),
415
+ Annotation.new( @java_class, 49, {
416
+ "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
417
+ } )
418
+ ]
419
+
420
+ attr = AnnotationsAttribute.new( @java_class, 10, annotations )
421
+ assert_attribute( attr ) {|a|
422
+ assert_equal a.name, "RuntimeVisibleAnnotations"
423
+ assert_equal a.to_s, "@com.foo.Hoge(\n aaa = \"aaa\",\n bbb = 10\n)\n@com.foo.Var(\n bbb = 10\n)"
424
+ assert_equal a.annotations, annotations
425
+ assert_equal a.dump, "000A0000 00190002 00300002 001E7300\n1E001F49 00330031 0001001F 490033"
426
+ assert_equal a.to_bytes, [0x00, 0x0A, 0x00, 0x00, 0x00, 0x19, 0x00, 0x02, 0x00, 0x30, 0x00, 0x02, 0x00, 0x1E, 0x73, 0x00, 0x1E, 0x00, 0x1F, 0x49, 0x00, 0x33, 0x00, 0x31, 0x00, 0x01, 0x00, 0x1F, 0x49, 0x00, 0x33]
427
+ }
428
+
429
+ annotations = [
430
+ Annotation.new( @java_class, 49, {
431
+ "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
432
+ } )
433
+ ]
434
+ attr.annotations = annotations
435
+ assert_attribute( attr ) {|a|
436
+ assert_equal a.name, "RuntimeVisibleAnnotations"
437
+ assert_equal a.to_s, "@com.foo.Var(\n bbb = 10\n)"
438
+ assert_equal a.annotations, annotations
439
+ assert_equal a.dump, "000A0000 000B0001 00310001 001F4900\n33"
440
+ assert_equal a.to_bytes, [0x00, 0x0A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x31, 0x00, 0x01, 0x00, 0x1F, 0x49, 0x00, 0x33]
441
+ }
442
+ end
443
+
444
+ #
445
+ #=== Annotationのテスト
446
+ #
447
+ def test_Annotation
448
+
449
+ elements = {
450
+ "aaa"=> AnnotationElement.new( @java_class, 30, ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )),
451
+ "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
452
+ }
453
+ annotation = Annotation.new( @java_class, 48, elements )
454
+ assert_annotation( annotation ) {|a|
455
+ assert_equal a.to_s, "@com.foo.Hoge(\n aaa = \"aaa\",\n bbb = 10\n)"
456
+ assert_equal a.type, "Lcom/foo/Hoge;"
457
+ assert_equal a.type_index, 48
458
+ assert_equal a.elements, elements
459
+ assert_equal a.dump, "00300002 001E7300 1E001F49 0033"
460
+ assert_equal a.to_bytes, [0x00, 0x30, 0x00, 0x02, 0x00, 0x1E, 0x73, 0x00, 0x1E, 0x00, 0x1F, 0x49, 0x00, 0x33]
461
+ }
462
+ elements = {
463
+ "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 ))
464
+ }
465
+ annotation.type_index = 49
466
+ annotation.elements = elements
467
+ assert_annotation( annotation ) {|a|
468
+ assert_equal a.to_s, "@com.foo.Var(\n bbb = 10\n)"
469
+ assert_equal a.type, "Lcom/foo/Var;"
470
+ assert_equal a.type_index, 49
471
+ assert_equal a.dump, "00310001 001F4900 33"
472
+ assert_equal a.to_bytes, [0x00, 0x31, 0x00, 0x01, 0x00, 0x1F, 0x49, 0x00, 0x33]
473
+ }
474
+ end
475
+
476
+ #
477
+ #=== AnnotationElementのテスト
478
+ #
479
+ def test_AnnotationElement
480
+
481
+ value = ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )
482
+ element = AnnotationElement.new( @java_class, 30, value )
483
+ assert_annotation_element( element ) {|a|
484
+ assert_equal a.to_s, "aaa = \"aaa\""
485
+ assert_equal a.name, "aaa"
486
+ assert_equal a.name_index, 30
487
+ assert_equal a.value, value
488
+ assert_equal a.dump, "001E7300 1E"
489
+ assert_equal a.to_bytes, [0x00, 0x1E, 0x73, 0x00, 0x1E]
490
+ }
491
+ value = ConstAnnotationElementValue.new( @java_class, 's'[0], 31 )
492
+ element.value = value
493
+ element.name_index = 31
494
+ assert_annotation_element( element ) {|a|
495
+ assert_equal a.to_s, "bbb = \"bbb\""
496
+ assert_equal a.name, "bbb"
497
+ assert_equal a.name_index, 31
498
+ assert_equal a.value, value
499
+ assert_equal a.dump, "001F7300 1F"
500
+ assert_equal a.to_bytes, [0x00, 0x1F, 0x73, 0x00, 0x1F]
501
+ }
502
+ end
503
+
504
+ #
505
+ #=== ArrayAnnotationElementValueのテスト
506
+ #
507
+ def test_ArrayAnnotationElementValue
508
+
509
+ annotations = [
510
+ ConstAnnotationElementValue.new( @java_class, 's'[0], 30 ),
511
+ ConstAnnotationElementValue.new( @java_class, 's'[0], 31 )
512
+ ]
513
+
514
+ attr = ArrayAnnotationElementValue.new( @java_class, '['[0], annotations )
515
+ assert_annotation_element_value( attr ) {|a|
516
+ assert_equal a.to_s, "[\"aaa\",\"bbb\"]"
517
+ assert_equal a.array, annotations
518
+ assert_equal a.tag, '['[0]
519
+ assert_equal a.dump, "5B000273 001E7300 1F"
520
+ assert_equal a.to_bytes, [0x5B, 0x00, 0x02, 0x73, 0x00, 0x1E, 0x73, 0x00, 0x1F]
521
+ }
522
+ annotations = [
523
+ ConstAnnotationElementValue.new( @java_class, 's'[0], 32 )
524
+ ]
525
+ attr.array = annotations
526
+ assert_annotation_element_value( attr ) {|a|
527
+ assert_equal a.to_s, "[\"ccc\"]"
528
+ assert_equal a.array, annotations
529
+ assert_equal a.tag, '['[0]
530
+ assert_equal a.dump, "5B000173 0020"
531
+ assert_equal a.to_bytes, [0x5B, 0x00, 0x01, 0x73, 0x00, 0x20]
532
+ }
533
+ end
534
+
535
+ #
536
+ #=== AnnotationAnnotationElementValueのテスト
537
+ #
538
+ def test_AnnotationAnnotationElementValue
539
+
540
+ annotation = Annotation.new( @java_class, 48, {
541
+ "aaa"=> AnnotationElement.new( @java_class, 30, ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )),
542
+ "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
543
+ } )
544
+ attr = AnnotationAnnotationElementValue.new( @java_class, '@'[0], annotation )
545
+ assert_annotation_element_value( attr ) {|a|
546
+ assert_equal a.to_s, "@com.foo.Hoge(\n aaa = \"aaa\",\n bbb = 10\n)"
547
+ assert_equal a.annotation, annotation
548
+ assert_equal a.tag, '@'[0]
549
+ assert_equal a.dump, "40003000 02001E73 001E001F 490033"
550
+ assert_equal a.to_bytes, [0x40] + annotation.to_bytes
551
+ }
552
+ annotation = Annotation.new( @java_class, 49, {
553
+ "bbb"=> AnnotationElement.new( @java_class, 31, ConstAnnotationElementValue.new( @java_class, 'I'[0], 51 )),
554
+ } )
555
+ attr.annotation = annotation
556
+ assert_annotation_element_value( attr ) {|a|
557
+ assert_equal a.to_s, "@com.foo.Var(\n bbb = 10\n)"
558
+ assert_equal a.annotation, annotation
559
+ assert_equal a.tag, '@'[0]
560
+ assert_equal a.dump, "40003100 01001F49 0033"
561
+ assert_equal a.to_bytes, [0x40] + annotation.to_bytes
562
+ }
563
+ end
564
+
565
+ #
566
+ #=== ClassAnnotationElementValueのテスト
567
+ #
568
+ def test_ClassAnnotationElementValue
569
+
570
+ attr = ClassAnnotationElementValue.new( @java_class, 'c'[0], 48 )
571
+ assert_annotation_element_value( attr ) {|a|
572
+ assert_equal a.to_s, "com.foo.Hoge.class"
573
+ assert_equal a.class_info, "Lcom/foo/Hoge;"
574
+ assert_equal a.class_info_index, 48
575
+ assert_equal a.tag, 'c'[0]
576
+ assert_equal a.dump, "630030"
577
+ assert_equal a.to_bytes, [0x63, 0x00, 0x30]
578
+ }
579
+ attr.class_info_index = 49
580
+ assert_annotation_element_value( attr ) {|a|
581
+ assert_equal a.to_s, "com.foo.Var.class"
582
+ assert_equal a.class_info, "Lcom/foo/Var;"
583
+ assert_equal a.class_info_index, 49
584
+ assert_equal a.tag, 'c'[0]
585
+ assert_equal a.dump, "630031"
586
+ assert_equal a.to_bytes, [0x63, 0x00, 0x31]
587
+ }
588
+ end
589
+
590
+ #
591
+ #=== EnumAnnotationElementValueのテスト
592
+ #
593
+ def test_EnumAnnotationElementValue
594
+
595
+ attr = EnumAnnotationElementValue.new( @java_class, 'e'[0], 48, 46 )
596
+ assert_annotation_element_value( attr ) {|a|
597
+ assert_equal a.to_s, "com.foo.Hoge.FOO"
598
+ assert_equal a.type_name, "Lcom/foo/Hoge;"
599
+ assert_equal a.const_name, "FOO"
600
+ assert_equal a.type_name_index, 48
601
+ assert_equal a.const_name_index, 46
602
+ assert_equal a.tag, 'e'[0]
603
+ assert_equal a.dump, "65003000 2E"
604
+ assert_equal a.to_bytes, [0x65, 0x00, 0x30, 0x00, 0x2E]
605
+ }
606
+ attr.type_name_index = 49
607
+ attr.const_name_index = 47
608
+ assert_annotation_element_value( attr ) {|a|
609
+ assert_equal a.to_s, "com.foo.Var.VAR"
610
+ assert_equal a.type_name, "Lcom/foo/Var;"
611
+ assert_equal a.const_name, "VAR"
612
+ assert_equal a.type_name_index, 49
613
+ assert_equal a.const_name_index, 47
614
+ assert_equal a.tag, 'e'[0]
615
+ assert_equal a.dump, "65003100 2F"
616
+ assert_equal a.to_bytes, [0x65, 0x00, 0x31, 0x00, 0x2F]
617
+ }
618
+ end
619
+
620
+ #
621
+ #=== ConstAnnotationElementValueのテスト
622
+ #
623
+ def test_ConstAnnotationElementValue
624
+
625
+ attr = ConstAnnotationElementValue.new( @java_class, 's'[0], 30 )
626
+ assert_annotation_element_value( attr ) {|a|
627
+ assert_equal a.to_s, "\"aaa\""
628
+ assert_equal a.value, "aaa"
629
+ assert_equal a.const_value_index, 30
630
+ assert_equal a.tag, 's'[0]
631
+ assert_equal a.dump, "73001E"
632
+ assert_equal a.to_bytes, [0x73, 0x00, 0x1E]
633
+ }
634
+ attr.tag = 'I'[0]
635
+ attr.const_value_index = 51
636
+ assert_annotation_element_value( attr ) {|a|
637
+ assert_equal a.to_s, "10"
638
+ assert_equal a.value, 10
639
+ assert_equal a.const_value_index, 51
640
+ assert_equal a.tag, 'I'[0]
641
+ assert_equal a.dump, "490033"
642
+ assert_equal a.to_bytes, [0x49, 0x00, 0x33]
643
+ }
644
+ end
645
+
646
+ #
647
+ #=== SignatureAttributeのテスト
648
+ #
649
+ def test_SignatureAttribute
650
+
651
+ attr = SignatureAttribute.new( @java_class, 9, 40 )
652
+ assert_attribute( attr ) {|a|
653
+ assert_equal a.name, "Signature"
654
+ assert_equal a.to_s, "// signature com/foo/Hoge"
655
+ assert_equal a.signature, "com/foo/Hoge"
656
+ assert_equal a.signature_index, 40
657
+ assert_equal a.dump, "00090000 00020028"
658
+ assert_equal a.to_bytes, [0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28]
659
+ }
660
+ attr.signature_index = 41
661
+ assert_attribute( attr ) {|a|
662
+ assert_equal a.name, "Signature"
663
+ assert_equal a.to_s, "// signature com/foo/Var"
664
+ assert_equal a.signature, "com/foo/Var"
665
+ assert_equal a.signature_index, 41
666
+ assert_equal a.dump, "00090000 00020029"
667
+ assert_equal a.to_bytes, [0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29]
668
+ }
669
+ end
670
+
671
+ #
672
+ #=== SignatureAttributeのテスト
673
+ #
674
+ def test_SignatureAttribute
675
+
676
+ attr = SignatureAttribute.new( @java_class, 9, 40 )
677
+ assert_attribute( attr ) {|a|
678
+ assert_equal a.name, "Signature"
679
+ assert_equal a.to_s, "// signature com/foo/Hoge"
680
+ assert_equal a.signature, "com/foo/Hoge"
681
+ assert_equal a.signature_index, 40
682
+ assert_equal a.dump, "00090000 00020028"
683
+ assert_equal a.to_bytes, [0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28]
684
+ }
685
+ attr.signature_index = 41
686
+ assert_attribute( attr ) {|a|
687
+ assert_equal a.name, "Signature"
688
+ assert_equal a.to_s, "// signature com/foo/Var"
689
+ assert_equal a.signature, "com/foo/Var"
690
+ assert_equal a.signature_index, 41
691
+ assert_equal a.dump, "00090000 00020029"
692
+ assert_equal a.to_bytes, [0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x29]
693
+ }
694
+ end
695
+
696
+ #
697
+ #=== SourceFileAttributeのテスト
698
+ #
699
+ def test_SourceFileAttribute
700
+
701
+ attr = SourceFileAttribute.new( @java_class, 7, 30 )
702
+ assert_attribute( attr ) {|a|
703
+ assert_equal a.name, "SourceFile"
704
+ assert_equal a.to_s, "// source aaa"
705
+ assert_equal a.source_file, "aaa"
706
+ assert_equal a.source_file_index, 30
707
+ assert_equal a.dump, "00070000 0002001E"
708
+ assert_equal a.to_bytes, [0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E]
709
+ }
710
+ attr.source_file_index = 31
711
+ assert_attribute( attr ) {|a|
712
+ assert_equal a.name, "SourceFile"
713
+ assert_equal a.to_s, "// source bbb"
714
+ assert_equal a.source_file, "bbb"
715
+ assert_equal a.source_file_index, 31
716
+ assert_equal a.dump, "00070000 0002001F"
717
+ assert_equal a.to_bytes, [0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F]
718
+ }
719
+ end
720
+
721
+ #
722
+ #=== SyntheticAttributeのテスト
723
+ #
724
+ def test_SyntheticAttribute
725
+
726
+ attr = SyntheticAttribute.new( @java_class, 6 )
727
+ assert_attribute( attr ) {|a|
728
+ assert_equal a.name, "Synthetic"
729
+ assert_equal a.dump, "00060000 0000"
730
+ assert_equal a.to_bytes, [0x00, 0x06, 0x00, 0x00, 0x00, 0x00]
731
+ }
732
+
733
+ end
734
+
735
+ #
736
+ #=== DeprecatedAttributeのテスト
737
+ #
738
+ def test_DeprecatedAttribute
739
+
740
+ attr = DeprecatedAttribute.new( @java_class, 5 )
741
+ assert_attribute( attr ) {|a|
742
+ assert_equal a.name, "Deprecated"
743
+ assert_equal a.to_s, "// !!Deprecated!!"
744
+ assert_equal a.dump, "00050000 0000"
745
+ assert_equal a.to_bytes, [0x00, 0x05, 0x00, 0x00, 0x00, 0x00]
746
+ }
747
+
748
+ end
749
+
750
+ #
751
+ #=== EnclosingMethodAttributeのテスト
752
+ #
753
+ def test_EnclosingMethodAttribute
754
+
755
+ attr = EnclosingMethodAttribute.new( @java_class, 4, 100, 120 )
756
+ assert_attribute( attr ) {|a|
757
+ assert_equal a.name, "EnclosingMethod"
758
+ assert_equal a.to_s, "// enclosed by com.foo.Hoge#aaa"
759
+ assert_equal a.enclosing_class, @java_class.constant_pool[100]
760
+ assert_equal a.enclosing_method, @java_class.constant_pool[120]
761
+ assert_equal a.enclosing_class_index, 100
762
+ assert_equal a.enclosing_method_index, 120
763
+ assert_equal a.dump, "00040000 00040064 0078"
764
+ assert_equal a.to_bytes, [0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x64, 0x00, 0x78]
765
+ }
766
+ attr.enclosing_class_index = 101
767
+ attr.enclosing_method_index = 121
768
+ assert_attribute( attr ) {|a|
769
+ assert_equal a.name, "EnclosingMethod"
770
+ assert_equal a.to_s, "// enclosed by com.foo.Var#bbb"
771
+ assert_equal a.enclosing_class, @java_class.constant_pool[101]
772
+ assert_equal a.enclosing_method, @java_class.constant_pool[121]
773
+ assert_equal a.enclosing_class_index, 101
774
+ assert_equal a.enclosing_method_index, 121
775
+ assert_equal a.dump, "00040000 00040065 0079"
776
+ assert_equal a.to_bytes, [0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0x00, 0x79]
777
+ }
778
+ end
779
+
780
+ #
781
+ #=== ConstantValueAttributesのテスト
782
+ #
783
+ def test_ConstantValueAttributes
784
+
785
+ attr = ConstantValueAttribute.new( @java_class, 1, 30)
786
+ assert_attribute( attr ) {|a|
787
+ assert_equal a.to_s, "\"aaa\""
788
+ assert_equal a.value, "aaa"
789
+ assert_equal a.name, "ConstantValue"
790
+ assert_equal a.constant_value_index, 30
791
+ assert_equal a.dump, "00010000 0002001E"
792
+ assert_equal a.to_bytes, [0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E]
793
+ }
794
+
795
+ attr.constant_value_index = 50
796
+ assert_attribute( attr ) {|a|
797
+ assert_equal a.to_s, "0"
798
+ assert_equal a.value, 0
799
+ assert_equal a.name, "ConstantValue"
800
+ assert_equal a.constant_value_index, 50
801
+ assert_equal a.dump, "00010000 00020032"
802
+ assert_equal a.to_bytes, [0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32]
803
+ }
804
+ end
805
+
806
+ #
807
+ #=== ExceptionsAttributesのテスト
808
+ #
809
+ def test_ExceptionsAttributes
810
+ attr = ExceptionsAttribute.new( @java_class, 2, [103,104])
811
+ assert_attribute( attr ) {|a|
812
+ assert_equal a.name, "Exceptions"
813
+ assert_equal a.to_s, "throws java.lang.Exception, java.lang.Throwable"
814
+ assert_equal a.exception_index_table, [103,104]
815
+ assert_equal a.exceptions, [@java_class.constant_pool[103],@java_class.constant_pool[104]]
816
+ assert_equal a.dump, "00020000 00060002 00670068"
817
+ assert_equal a.to_bytes, [0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x67, 0x00, 0x68]
818
+ }
819
+
820
+ attr.exception_index_table = [105]
821
+ assert_attribute( attr ) {|a|
822
+ assert_equal a.name, "Exceptions"
823
+ assert_equal a.to_s, "throws com.foo.HogeException"
824
+ assert_equal a.exception_index_table, [105]
825
+ assert_equal a.exceptions, [@java_class.constant_pool[105]]
826
+ assert_equal a.dump, "00020000 00040001 0069"
827
+ assert_equal a.to_bytes, [0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x69]
828
+ }
829
+ end
830
+
831
+
832
+ #
833
+ #=== InnerClassesAttributesのテスト
834
+ #
835
+ def test_InnerClassesAttributes
836
+
837
+ access_flag = JavaClass::InnerClassAccessFlag.new( 0x0001 )
838
+ classes = [
839
+ InnerClass.new( @java_class, 100, 101, 30, access_flag),
840
+ InnerClass.new( @java_class, 101, 102, 31, access_flag)
841
+ ]
842
+ attr = InnerClassesAttribute.new( @java_class, 3, classes )
843
+ assert_attribute( attr ) {|a|
844
+ assert_equal a.to_s, "// use inner public class com.foo.Hoge\n// use inner public class com.foo.Var"
845
+ assert_equal a.classes, classes
846
+ assert_equal a.name, "InnerClasses"
847
+ assert_equal a.dump, "00030000 00120002 " \
848
+ << classes[0].dump << "\n" << classes[1].dump
849
+ assert_equal a.to_bytes, [0x00, 0x03, 0x00, 0x00, 0x00, 0x12, 0x00, 0x02 ] \
850
+ + classes[0].to_bytes + classes[1].to_bytes
851
+ }
852
+
853
+ classes = [InnerClass.new( @java_class, 102, 102, 32, access_flag)]
854
+ attr.classes = classes
855
+ assert_attribute( attr ) {|a|
856
+ assert_equal a.to_s, "// use inner public class com.foo.Piyo"
857
+ assert_equal a.classes, classes
858
+ assert_equal a.name, "InnerClasses"
859
+ assert_equal a.dump, "00030000 000A0001 " << classes[0].dump
860
+ assert_equal a.to_bytes, [0x00, 0x03, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x01 ] + classes[0].to_bytes
861
+ }
862
+ end
863
+
864
+ #
865
+ #=== InnerClassのテスト
866
+ #
867
+ def test_InnerClass
868
+ access_flag = JavaClass::InnerClassAccessFlag.new( 0x0001 )
869
+ inner_class = InnerClass.new( @java_class, 100, 101, 30, access_flag)
870
+ assert_inner_class( inner_class ) {|a|
871
+ assert_equal a.to_s, "// use inner public class com.foo.Hoge"
872
+ assert_equal a.inner_class, @java_class.constant_pool[100]
873
+ assert_equal a.outer_class, @java_class.constant_pool[101]
874
+ assert_equal a.name, "aaa"
875
+ assert_equal a.inner_class_index, 100
876
+ assert_equal a.outer_class_index, 101
877
+ assert_equal a.name_index, 30
878
+ assert_equal a.access_flag, access_flag
879
+ assert_equal a.dump, "00640065 001E0001"
880
+ assert_equal a.to_bytes, [0x00, 0x64, 0x00, 0x65, 0x00, 0x1E, 0x00, 0x01]
881
+ }
882
+
883
+ inner_class.inner_class_index = 102
884
+ inner_class.name_index = 31
885
+ inner_class.access_flag.on( JavaClass::InnerClassAccessFlag::ACC_INTERFACE )
886
+ assert_inner_class( inner_class) {|a|
887
+ assert_equal a.to_s, "// use inner public interface com.foo.Piyo"
888
+ assert_equal a.inner_class, @java_class.constant_pool[102]
889
+ assert_equal a.outer_class, @java_class.constant_pool[101]
890
+ assert_equal a.name, "bbb"
891
+ assert_equal a.inner_class_index, 102
892
+ assert_equal a.outer_class_index, 101
893
+ assert_equal a.name_index, 31
894
+ assert_equal a.access_flag, access_flag
895
+ assert_equal a.dump, "00660065 001F0201"
896
+ assert_equal a.to_bytes, [0x00, 0x66, 0x00, 0x65, 0x00, 0x1F, 0x02, 0x01]
897
+ }
898
+ end
899
+
900
+ def assert_attribute( a, &block )
901
+ assert_to_byte_and_read a, block, proc {|io|
902
+ JavaClass.read_attribute( io, @java_class )
903
+ }
904
+ end
905
+
906
+ def assert_inner_class( a, &block )
907
+ assert_to_byte_and_read a, block, proc {|io|
908
+ JavaClass.read_inner_class( io, @java_class )
909
+ }
910
+ end
911
+
912
+ def assert_annotation_element_value( a, &block )
913
+ assert_to_byte_and_read a, block, proc {|io|
914
+ JavaClass.read_annotation_element_value( io, @java_class )
915
+ }
916
+ end
917
+
918
+ def assert_annotation_element( a, &block )
919
+ assert_to_byte_and_read a, block, proc {|io|
920
+ JavaClass.read_annotation_element( io, @java_class )
921
+ }
922
+ end
923
+
924
+ def assert_annotation( a, &block )
925
+ assert_to_byte_and_read a, block, proc {|io|
926
+ JavaClass.read_annotation( io, @java_class )
927
+ }
928
+ end
929
+
930
+ def assert_exception( a, &block )
931
+ assert_to_byte_and_read a, block, proc {|io|
932
+ JavaClass.read_exception( io, @java_class )
933
+ }
934
+ end
935
+
936
+ def assert_line_number( a, &block )
937
+ assert_to_byte_and_read a, block, proc {|io|
938
+ JavaClass.read_line_number( io, @java_class )
939
+ }
940
+ end
941
+
942
+ def assert_local_variable( a, &block )
943
+ assert_to_byte_and_read a, block, proc {|io|
944
+ JavaClass.read_local_variable( io, @java_class )
945
+ }
946
+ end
947
+
948
+ def assert_local_variable_type( a, &block )
949
+ assert_to_byte_and_read a, block, proc {|io|
950
+ JavaClass.read_local_variable_type( io, @java_class )
951
+ }
952
+ end
953
+ end
954
+
955
+ end