mirah 0.0.12-java → 0.1.0-java

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.
Files changed (171) hide show
  1. data/History.txt +372 -0
  2. data/README.txt +4 -5
  3. data/Rakefile +178 -55
  4. data/examples/appengine/Readme +3 -3
  5. data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
  6. data/examples/appengine/src/org/mirah/list.dhtml +1 -1
  7. data/examples/bintrees.mirah +1 -1
  8. data/examples/edb.mirah +1 -1
  9. data/examples/fib.mirah +1 -1
  10. data/examples/interfaces.mirah +1 -1
  11. data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
  12. data/examples/maven/README.txt +1 -1
  13. data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
  14. data/examples/plugins/appengine/Rakefile +1 -1
  15. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
  16. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
  17. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
  18. data/examples/rosettacode/100-doors.mirah +6 -6
  19. data/examples/rosettacode/README.txt +3 -3
  20. data/examples/rosettacode/boolean-values.mirah +1 -1
  21. data/examples/rosettacode/comments.mirah +1 -1
  22. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
  23. data/examples/rosettacode/factorial.mirah +1 -1
  24. data/examples/rosettacode/fibonacci.mirah +1 -1
  25. data/examples/rosettacode/fizz-buzz.mirah +2 -2
  26. data/examples/rosettacode/flatten-a-list.mirah +4 -4
  27. data/examples/rosettacode/guess-the-number.mirah +2 -2
  28. data/examples/rosettacode/hamming-numbers.mirah +4 -4
  29. data/examples/rosettacode/is-string-numeric.mirah +22 -22
  30. data/examples/rosettacode/palindrome.mirah +2 -2
  31. data/examples/rosettacode/random-numbers.mirah +1 -1
  32. data/examples/rosettacode/repeat-a-string.mirah +1 -1
  33. data/examples/rosettacode/reverse-a-string.mirah +1 -1
  34. data/examples/rosettacode/rot-13.mirah +5 -5
  35. data/examples/rosettacode/secure-temporary-file.mirah +2 -2
  36. data/examples/rosettacode/sleep.mirah +1 -1
  37. data/examples/rosettacode/string-length.mirah +5 -5
  38. data/examples/swing.mirah +1 -1
  39. data/examples/test.edb +1 -1
  40. data/javalib/mirah-bootstrap.jar +0 -0
  41. data/javalib/mirah-builtins.jar +0 -0
  42. data/javalib/mirah-parser.jar +0 -0
  43. data/javalib/mirah-util.jar +0 -0
  44. data/lib/duby.rb +1 -1
  45. data/lib/mirah.rb +50 -28
  46. data/lib/mirah/ast.rb +15 -605
  47. data/lib/mirah/ast/scope.rb +98 -69
  48. data/lib/mirah/commands.rb +1 -1
  49. data/lib/mirah/commands/base.rb +7 -7
  50. data/lib/mirah/commands/compile.rb +3 -3
  51. data/lib/mirah/commands/parse.rb +7 -5
  52. data/lib/mirah/commands/run.rb +12 -19
  53. data/lib/mirah/compiler.rb +15 -23
  54. data/lib/mirah/errors.rb +16 -1
  55. data/lib/mirah/generator.rb +79 -39
  56. data/lib/mirah/jvm/compiler.rb +1 -19
  57. data/lib/mirah/jvm/compiler/base.rb +233 -90
  58. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
  59. data/lib/mirah/jvm/method_lookup.rb +134 -65
  60. data/lib/mirah/jvm/typer.rb +10 -5
  61. data/lib/mirah/jvm/types.rb +10 -2
  62. data/lib/mirah/jvm/types/array_type.rb +10 -12
  63. data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
  64. data/lib/mirah/jvm/types/basic_types.rb +26 -33
  65. data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
  66. data/lib/mirah/jvm/types/block_type.rb +15 -0
  67. data/lib/mirah/jvm/types/boolean.rb +8 -4
  68. data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
  69. data/lib/mirah/jvm/types/enumerable.rb +7 -7
  70. data/lib/mirah/jvm/types/extensions.rb +11 -6
  71. data/lib/mirah/jvm/types/factory.rb +624 -94
  72. data/lib/mirah/jvm/types/floats.rb +21 -15
  73. data/lib/mirah/jvm/types/generic_type.rb +72 -0
  74. data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
  75. data/lib/mirah/jvm/types/integers.rb +26 -71
  76. data/lib/mirah/jvm/types/interface_definition.rb +3 -3
  77. data/lib/mirah/jvm/types/intrinsics.rb +203 -168
  78. data/lib/mirah/jvm/types/literals.rb +6 -6
  79. data/lib/mirah/jvm/types/meta_type.rb +13 -4
  80. data/lib/mirah/jvm/types/methods.rb +281 -93
  81. data/lib/mirah/jvm/types/null_type.rb +17 -5
  82. data/lib/mirah/jvm/types/number.rb +10 -7
  83. data/lib/mirah/jvm/types/primitive_type.rb +17 -6
  84. data/lib/mirah/jvm/types/source_mirror.rb +12 -7
  85. data/lib/mirah/jvm/types/type.rb +107 -23
  86. data/lib/mirah/jvm/types/type_definition.rb +25 -10
  87. data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
  88. data/lib/mirah/jvm/types/void_type.rb +3 -3
  89. data/lib/mirah/parser.rb +154 -16
  90. data/lib/mirah/plugin/edb.rb +1 -1
  91. data/lib/mirah/transform.rb +1 -2
  92. data/lib/mirah/transform/ast_ext.rb +24 -43
  93. data/lib/mirah/transform/transformer.rb +29 -224
  94. data/lib/mirah/typer.rb +2 -16
  95. data/lib/mirah/util/argument_processor.rb +25 -10
  96. data/lib/mirah/util/class_loader.rb +1 -1
  97. data/lib/mirah/util/compilation_state.rb +16 -17
  98. data/lib/mirah/util/delegate.rb +2 -2
  99. data/lib/mirah/util/logging.rb +110 -0
  100. data/lib/mirah/util/process_errors.rb +69 -11
  101. data/lib/mirah/version.rb +1 -1
  102. data/test/core/commands_test.rb +6 -24
  103. data/test/core/env_test.rb +5 -5
  104. data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
  105. data/test/core/typer_test.rb +196 -158
  106. data/test/core/util/argument_processor_test.rb +10 -10
  107. data/test/core/util/class_loader_test.rb +6 -5
  108. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  109. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  110. data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
  111. data/test/jvm/annotations_test.rb +5 -5
  112. data/test/jvm/blocks_test.rb +140 -88
  113. data/test/jvm/bytecode_test_helper.rb +112 -94
  114. data/test/jvm/cast_test.rb +162 -0
  115. data/test/jvm/constructors_test.rb +18 -8
  116. data/test/jvm/enumerable_test.rb +77 -44
  117. data/test/jvm/example_test.rb +53 -0
  118. data/test/jvm/factory_test.rb +7 -1
  119. data/test/jvm/generics_test.rb +57 -0
  120. data/test/jvm/hash_test.rb +106 -0
  121. data/test/jvm/import_test.rb +81 -0
  122. data/test/jvm/interface_test.rb +73 -0
  123. data/test/jvm/java_typer_test.rb +92 -66
  124. data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
  125. data/test/jvm/jvm_compiler_test.rb +170 -604
  126. data/test/jvm/list_extensions_test.rb +23 -0
  127. data/test/jvm/macros_test.rb +197 -32
  128. data/test/jvm/main_method_test.rb +4 -4
  129. data/test/jvm/numeric_extensions_test.rb +13 -0
  130. data/test/jvm/rescue_test.rb +73 -16
  131. data/test/jvm/varargs_test.rb +65 -0
  132. data/test/test_helper.rb +1 -2
  133. metadata +234 -251
  134. data/examples/SortClosure$__xform_tmp_1.class +0 -0
  135. data/examples/SortClosure$__xform_tmp_2.class +0 -0
  136. data/examples/SortClosure.class +0 -0
  137. data/examples/macros/StringEachChar$Extension1.class +0 -0
  138. data/lib/mirah/ast/call.rb +0 -345
  139. data/lib/mirah/ast/class.rb +0 -359
  140. data/lib/mirah/ast/flow.rb +0 -381
  141. data/lib/mirah/ast/intrinsics.rb +0 -563
  142. data/lib/mirah/ast/literal.rb +0 -178
  143. data/lib/mirah/ast/local.rb +0 -112
  144. data/lib/mirah/ast/method.rb +0 -408
  145. data/lib/mirah/ast/structure.rb +0 -387
  146. data/lib/mirah/ast/type.rb +0 -146
  147. data/lib/mirah/commands/base.rb~ +0 -57
  148. data/lib/mirah/compiler/call.rb +0 -45
  149. data/lib/mirah/compiler/class.rb +0 -81
  150. data/lib/mirah/compiler/flow.rb +0 -109
  151. data/lib/mirah/compiler/literal.rb +0 -130
  152. data/lib/mirah/compiler/local.rb +0 -59
  153. data/lib/mirah/compiler/method.rb +0 -44
  154. data/lib/mirah/compiler/structure.rb +0 -65
  155. data/lib/mirah/jvm/compiler/java_source.rb +0 -787
  156. data/lib/mirah/jvm/method_lookup.rb~ +0 -247
  157. data/lib/mirah/jvm/source_generator/builder.rb +0 -468
  158. data/lib/mirah/jvm/source_generator/loops.rb +0 -131
  159. data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
  160. data/lib/mirah/plugin/gwt.rb +0 -189
  161. data/lib/mirah/plugin/java.rb +0 -70
  162. data/lib/mirah/transform/error.rb +0 -13
  163. data/lib/mirah/transform/helper.rb +0 -765
  164. data/lib/mirah/typer/simple.rb +0 -384
  165. data/lib/mirah/version.rb~ +0 -18
  166. data/test/core/ast_test.rb +0 -382
  167. data/test/core/compilation_test.rb +0 -130
  168. data/test/core/macros_test.rb +0 -61
  169. data/test/jvm/javac_test_helper.rb +0 -89
  170. data/test/jvm/jvm_compiler_test.rb~ +0 -2181
  171. data/test/plugins/gwt_test.rb +0 -69
@@ -0,0 +1,23 @@
1
+ class ListExtensionsTest < Test::Unit::TestCase
2
+ def test_bracket_getter
3
+ cls, = compile(<<-EOF)
4
+ x = [1,2]
5
+ puts x[0]
6
+ EOF
7
+ assert_output("1\n") do
8
+ cls.main(nil)
9
+ end
10
+ end
11
+
12
+ def test_bracket_assignment
13
+ cls, = compile(<<-EOF)
14
+ import java.util.ArrayList # literals are immutable
15
+ x = ArrayList.new
16
+ x[0]= "2"
17
+ puts x
18
+ EOF
19
+ assert_output("[2]\n") do
20
+ cls.main(nil)
21
+ end
22
+ end
23
+ end
@@ -14,12 +14,66 @@
14
14
  # limitations under the License.
15
15
 
16
16
  class MacrosTest < Test::Unit::TestCase
17
- def test_defmacro
17
+ def test_vcall_macro
18
18
  cls, = compile(<<-EOF)
19
- defmacro bar(x) do
19
+ macro def foo
20
+ mirah::lang::ast::Null.new
21
+ end
22
+
23
+ System.out.println(foo)
24
+ EOF
25
+
26
+ assert_output("null\n") {cls.main(nil)}
27
+ assert(!cls.respond_to?(:foo))
28
+ end
29
+
30
+ def test_imported_constants_available_in_macros
31
+ cls, = compile(<<-EOF)
32
+ import java.util.LinkedList
33
+ macro def foo
34
+ LinkedList.new
35
+ Node(nil)
36
+ end
37
+
38
+ foo
39
+ EOF
40
+
41
+ assert_output("") {cls.main(nil)}
42
+ assert(!cls.respond_to?(:foo))
43
+ end
44
+
45
+ def test_fcall_macro
46
+ cls, = compile(<<-EOF)
47
+ macro def foo
48
+ mirah::lang::ast::Null.new
49
+ end
50
+
51
+ System.out.println(foo())
52
+ EOF
53
+
54
+ assert_output("null\n") {cls.main(nil)}
55
+ assert(!cls.respond_to?(:foo))
56
+ end
57
+
58
+ def test_quote
59
+ cls, = compile(<<-EOF)
60
+ macro def foo
61
+ quote { nil }
62
+ end
63
+
64
+ System.out.println(foo)
65
+ EOF
66
+
67
+ assert_output("null\n") {cls.main(nil)}
68
+ assert(!cls.respond_to?(:foo))
69
+ end
70
+
71
+ def test_macro_def_with_arg
72
+ cls, = compile(<<-EOF)
73
+ macro def bar(x)
20
74
  x
21
75
  end
22
-
76
+
23
77
  def foo
24
78
  bar("bar")
25
79
  end
@@ -28,10 +82,8 @@ class MacrosTest < Test::Unit::TestCase
28
82
  assert_equal("bar", cls.foo)
29
83
  assert(!cls.respond_to?(:bar))
30
84
  end
31
-
32
-
33
- def test_instance_macro
34
- # TODO fix annotation output and create a duby.anno.Extensions annotation.
85
+
86
+ def test_instance_macro_call
35
87
  script, cls = compile(<<-EOF)
36
88
  class InstanceMacros
37
89
  def foobar
@@ -39,39 +91,98 @@ class MacrosTest < Test::Unit::TestCase
39
91
  end
40
92
 
41
93
  macro def macro_foobar
42
- quote {foobar}
94
+ quote {`@call.target`.foobar}
95
+ end
96
+ end
97
+
98
+ def macro
99
+ InstanceMacros.new.macro_foobar
100
+ end
101
+ EOF
102
+
103
+ assert_equal("foobar", script.macro)
104
+ end
105
+
106
+ def test_instance_macro_vcall
107
+ script, cls = compile(<<-EOF)
108
+ class InstanceMacros2
109
+ def foobar
110
+ "foobar"
111
+ end
112
+
113
+ macro def macro_foobar
114
+ quote {`@call.target`.foobar}
43
115
  end
44
-
116
+
45
117
  def call_foobar
46
118
  macro_foobar
47
119
  end
48
120
  end
49
121
 
122
+ def function
123
+ InstanceMacros2.new.call_foobar
124
+ end
125
+ EOF
126
+
127
+ assert_equal("foobar", script.function)
128
+ end
129
+
130
+
131
+ def test_static_macro_call
132
+ script, cls = compile(<<-EOF)
133
+ class StaticMacros
134
+ def self.foobar
135
+ "foobar"
136
+ end
137
+
138
+ macro def self.macro_foobar
139
+ quote {`@call.target`.foobar}
140
+ end
141
+ end
142
+
50
143
  def macro
51
- InstanceMacros.new.macro_foobar
144
+ StaticMacros.macro_foobar
145
+ end
146
+ EOF
147
+
148
+ assert_equal("foobar", script.macro)
149
+ end
150
+
151
+ def test_static_macro_vcall
152
+ script, cls = compile(<<-EOF)
153
+ class StaticMacros2
154
+ def foobar
155
+ "foobar"
156
+ end
157
+
158
+ macro def self.macro_foobar
159
+ quote {`@call.target`.new.foobar}
160
+ end
161
+
162
+ def self.call_foobar
163
+ macro_foobar
164
+ end
52
165
  end
53
166
 
54
167
  def function
55
- InstanceMacros.new.call_foobar
168
+ StaticMacros2.call_foobar
56
169
  end
57
170
  EOF
58
171
 
59
172
  assert_equal("foobar", script.function)
60
- assert_equal("foobar", script.macro)
61
173
  end
62
174
 
63
- def test_unquote_method_definitions_with_main
64
- # TODO fix annotation output and create a duby.anno.Extensions annotation.
65
175
 
176
+ def test_unquote_method_definitions_with_main
66
177
  script, cls = compile(<<-'EOF')
67
178
  class UnquoteMacros
68
- macro def make_attr(name_node, type)
69
- name = name_node.string_value
179
+ macro def self.make_attr(name_node:Identifier, type:TypeName)
180
+ name = name_node.identifier
70
181
  quote do
71
182
  def `name`
72
183
  @`name`
73
184
  end
74
- def `"#{name}_set"`(`name`:`type`)
185
+ def `"#{name}_set"`(`name`: `type`)
75
186
  @`name` = `name`
76
187
  end
77
188
  end
@@ -81,14 +192,16 @@ class MacrosTest < Test::Unit::TestCase
81
192
  end
82
193
 
83
194
  x = UnquoteMacros.new
84
- puts x.foo
195
+ System.out.println x.foo
85
196
  x.foo = 3
86
- puts x.foo
197
+ System.out.println x.foo
87
198
  EOF
88
199
  assert_output("0\n3\n") {script.main(nil)}
89
200
  end
90
201
 
91
202
  def test_macro_hygene
203
+ # TODO hygenic macros?
204
+ return
92
205
  cls, = compile(<<-EOF)
93
206
  macro def doubleIt(arg)
94
207
  quote do
@@ -100,24 +213,45 @@ class MacrosTest < Test::Unit::TestCase
100
213
 
101
214
  def foo
102
215
  x = "1"
103
- puts doubleIt(x)
104
- puts x
216
+ System.out.println doubleIt(x)
217
+ System.out.println x
105
218
  end
106
219
  EOF
107
220
 
108
221
  assert_output("11\n1\n") {cls.foo}
109
222
  end
110
223
 
224
+ def test_gensym
225
+ # TODO hygenic macros?
226
+ return
227
+ cls, = compile(<<-EOF)
228
+ macro def doubleIt(arg)
229
+ x = gensym
230
+ quote do
231
+ `x` = `arg`
232
+ `x` = `x` + `x`
233
+ `x`
234
+ end
235
+ end
236
+
237
+ def foo
238
+ x = 1
239
+ System.out.println doubleIt(x)
240
+ System.out.println x
241
+ end
242
+ EOF
243
+
244
+ assert_output("2\n1\n") {cls.foo}
245
+ end
111
246
 
112
247
  def test_add_args_in_macro
113
248
  cls, = compile(<<-EOF)
114
- macro def foo(a)
115
- import duby.lang.compiler.Node
116
- quote { bar "1", `Node(a.child_nodes.get(0)).child_nodes`, "2"}
249
+ macro def foo(a:Array)
250
+ quote { bar "1", `a.values`, "2"}
117
251
  end
118
252
 
119
253
  def bar(a:String, b:String, c:String, d:String)
120
- puts "\#{a} \#{b} \#{c} \#{d}"
254
+ System.out.println "\#{a} \#{b} \#{c} \#{d}"
121
255
  end
122
256
 
123
257
  foo(["a", "b"])
@@ -127,11 +261,11 @@ class MacrosTest < Test::Unit::TestCase
127
261
  cls.main(nil)
128
262
  end
129
263
  end
130
-
264
+
131
265
  def test_block_parameter_uses_outer_scope
132
266
  cls, = compile(<<-EOF)
133
- macro def foo(&block)
134
- quote { z = `block.body`; puts z }
267
+ macro def foo(block:Block)
268
+ quote { z = `block.body`; System.out.println z }
135
269
  end
136
270
  apple = 1
137
271
  foo do
@@ -145,14 +279,15 @@ class MacrosTest < Test::Unit::TestCase
145
279
  end
146
280
 
147
281
  def test_method_def_after_macro_def_with_same_name_raises_error
148
- assert_raises Mirah::InferenceError do
282
+ assert_raises Mirah::MirahError do
149
283
  compile(<<-EOF)
150
- macro def foo
151
- quote { puts :z }
284
+ macro def self.foo
285
+ quote { System.out.println :z }
152
286
  end
153
287
  def foo
154
288
  :bar
155
289
  end
290
+ foo
156
291
  EOF
157
292
  end
158
293
  end
@@ -160,7 +295,7 @@ class MacrosTest < Test::Unit::TestCase
160
295
  def test_macro_def_unquote_named_method_without_main
161
296
  cls, = compile <<-EOF
162
297
  class FooHaver
163
- macro def null_method name
298
+ macro def self.null_method(name)
164
299
  quote {
165
300
  def `name`
166
301
  end
@@ -171,4 +306,34 @@ class MacrosTest < Test::Unit::TestCase
171
306
  EOF
172
307
  assert_equal nil, cls.new.testing
173
308
  end
309
+
310
+ def test_attr_accessor
311
+ script, cls = compile(<<-EOF)
312
+ class AttrAccessorTest
313
+ attr_accessor foo: int
314
+ end
315
+
316
+ x = AttrAccessorTest.new
317
+ System.out.println x.foo
318
+ x.foo = 3
319
+ System.out.println x.foo
320
+ EOF
321
+ assert_output("0\n3\n") {script.main(nil)}
322
+ end
323
+
324
+ def test_separate_compilation
325
+ compile(<<-CODE)
326
+ class InlineOneSayer
327
+ macro def say_one
328
+ quote do
329
+ puts "one"
330
+ end
331
+ end
332
+ end
333
+ CODE
334
+ script, _ =compile(<<-CODE)
335
+ InlineOneSayer.new.say_one
336
+ CODE
337
+ assert_output("one\n") {script.main(nil)}
338
+ end
174
339
  end
@@ -3,11 +3,11 @@ class MainMethodTest < Test::Unit::TestCase
3
3
  code = <<-EOC
4
4
  class WithMain
5
5
  end
6
- puts 'bar'
6
+ System.out.println 'bar'
7
7
  EOC
8
-
9
- main_class, = compile code, 'with_main'
10
-
8
+
9
+ main_class, = compile code, :name => 'with_main'
10
+
11
11
  assert_output "bar\n" do
12
12
  main_class.main(nil)
13
13
  end
@@ -0,0 +1,13 @@
1
+ class NumericExtensionsTest < Test::Unit::TestCase
2
+ def test_power_macro
3
+ cls, = compile(<<-EOF)
4
+ def run(n1:int, n2:int)
5
+ puts n1 ** n2
6
+ end
7
+ EOF
8
+
9
+ assert_output("16.0\n") do
10
+ cls.run(4, 2)
11
+ end
12
+ end
13
+ end
@@ -19,9 +19,9 @@ class RescueTest < Test::Unit::TestCase
19
19
  cls, = compile(<<-EOF)
20
20
  def foo
21
21
  begin
22
- puts "body"
22
+ System.out.println "body"
23
23
  rescue
24
- puts "rescue"
24
+ System.out.println "rescue"
25
25
  end
26
26
  end
27
27
  EOF
@@ -34,10 +34,10 @@ class RescueTest < Test::Unit::TestCase
34
34
  cls, = compile(<<-EOF)
35
35
  def foo
36
36
  begin
37
- puts "body"
37
+ System.out.println "body"
38
38
  raise
39
39
  rescue
40
- puts "rescue"
40
+ System.out.println "rescue"
41
41
  end
42
42
  end
43
43
  EOF
@@ -50,16 +50,16 @@ class RescueTest < Test::Unit::TestCase
50
50
  cls, = compile(<<-EOF)
51
51
  def foo(a:int)
52
52
  begin
53
- puts "body"
53
+ System.out.println "body"
54
54
  if a == 0
55
55
  raise IllegalArgumentException
56
56
  else
57
57
  raise
58
58
  end
59
59
  rescue IllegalArgumentException
60
- puts "IllegalArgumentException"
60
+ System.out.println "IllegalArgumentException"
61
61
  rescue
62
- puts "rescue"
62
+ System.out.println "rescue"
63
63
  end
64
64
  end
65
65
  EOF
@@ -73,7 +73,7 @@ class RescueTest < Test::Unit::TestCase
73
73
  cls, = compile(<<-EOF)
74
74
  def foo(a:int)
75
75
  begin
76
- puts "body"
76
+ System.out.println "body"
77
77
  if a == 0
78
78
  raise IllegalArgumentException
79
79
  elsif a == 1
@@ -81,10 +81,10 @@ class RescueTest < Test::Unit::TestCase
81
81
  else
82
82
  raise
83
83
  end
84
- rescue IllegalArgumentException, RuntimeException
85
- puts "multi"
84
+ rescue IllegalArgumentException, Exception
85
+ System.out.println "multi"
86
86
  rescue Throwable
87
- puts "other"
87
+ System.out.println "other"
88
88
  end
89
89
  end
90
90
  EOF
@@ -101,7 +101,7 @@ class RescueTest < Test::Unit::TestCase
101
101
  begin
102
102
  raise "foo"
103
103
  rescue => ex
104
- puts ex.getMessage
104
+ System.out.println ex.getMessage
105
105
  end
106
106
  end
107
107
  EOF
@@ -114,7 +114,7 @@ class RescueTest < Test::Unit::TestCase
114
114
 
115
115
  cls, = compile(<<-EOF)
116
116
  def foo(x:boolean)
117
- throws Exception
117
+ # throws Exception
118
118
  if x
119
119
  raise Exception, "x"
120
120
  end
@@ -126,10 +126,9 @@ class RescueTest < Test::Unit::TestCase
126
126
  EOF
127
127
 
128
128
  assert_equal "x", cls.foo(true)
129
- ex = assert_raise NativeException do
129
+ assert_raise_java java.lang.Exception, "!x" do
130
130
  cls.foo(false)
131
131
  end
132
- assert_equal "java.lang.Exception: !x", ex.message
133
132
 
134
133
  cls, = compile(<<-EOF)
135
134
  def foo:long
@@ -174,10 +173,68 @@ class RescueTest < Test::Unit::TestCase
174
173
  end
175
174
  rescue
176
175
  ensure
177
- puts 'ensuring'
176
+ System.out.println 'ensuring'
178
177
  end
179
178
  ""
180
179
  end
181
180
  EOF
182
181
  end
182
+
183
+
184
+ def test_ensure
185
+ cls, = compile(<<-EOF)
186
+ def foo
187
+ 1
188
+ ensure
189
+ System.out.println "Hi"
190
+ end
191
+ EOF
192
+ output = capture_output do
193
+ assert_equal(1, cls.foo)
194
+ end
195
+ assert_equal "Hi\n", output
196
+
197
+ cls, = compile(<<-EOF)
198
+ def foo
199
+ return 1
200
+ ensure
201
+ System.out.println "Hi"
202
+ end
203
+ EOF
204
+ output = capture_output do
205
+ assert_equal(1, cls.foo)
206
+ end
207
+ assert_equal "Hi\n", output
208
+
209
+ cls, = compile(<<-EOF)
210
+ def foo
211
+ begin
212
+ break
213
+ ensure
214
+ System.out.println "Hi"
215
+ end while false
216
+ end
217
+ EOF
218
+ output = capture_output do
219
+ cls.foo
220
+ end
221
+ assert_equal "Hi\n", output
222
+ end
223
+
224
+ def test_loop_in_ensure
225
+ cls, = compile(<<-EOF)
226
+ begin
227
+ System.out.println "a"
228
+ begin
229
+ System.out.println "b"
230
+ break
231
+ end while false
232
+ System.out.println "c"
233
+ ensure
234
+ System.out.println "ensure"
235
+ end
236
+ EOF
237
+
238
+ assert_output("a\nb\nc\nensure\n") { cls.main(nil) }
239
+ end
183
240
  end