mirah 0.1.4-java → 0.2.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +0 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/History.txt +531 -0
  5. data/README.md +23 -10
  6. data/Rakefile +239 -156
  7. data/TODO.md +71 -10
  8. data/bin/mirah +1 -1
  9. data/bin/mirahc +1 -1
  10. data/dist/mirahc.jar +0 -0
  11. data/examples/bintrees.mirah +2 -2
  12. data/examples/construction.mirah +2 -2
  13. data/examples/fields.mirah +1 -1
  14. data/examples/fractal.mirah +1 -1
  15. data/examples/fractal.rb +70 -0
  16. data/examples/interfaces.mirah +1 -1
  17. data/examples/java_thing.mirah +1 -1
  18. data/examples/macros/square.mirah +3 -3
  19. data/examples/macros/square_int.mirah +3 -3
  20. data/examples/macros/string_each_char.mirah +6 -6
  21. data/examples/rosettacode/100-doors.mirah +0 -2
  22. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +3 -3
  23. data/examples/rosettacode/empty-string.mirah +1 -1
  24. data/examples/rosettacode/fizz-buzz.mirah +4 -4
  25. data/examples/rosettacode/is-string-numeric.mirah +7 -7
  26. data/examples/rosettacode/palindrome.mirah +2 -2
  27. data/examples/rosettacode/reverse-a-string.mirah +1 -1
  28. data/examples/rosettacode/rot-13.mirah +1 -1
  29. data/examples/{edb.mirah → rosettacode/simple_character_math.mirah} +13 -4
  30. data/examples/rosettacode/string-case.mirah +2 -2
  31. data/examples/rosettacode/string-length.mirah +1 -1
  32. data/examples/swing.mirah +9 -14
  33. data/extensions_and_macros.md +117 -0
  34. data/lib/mirah.rb +1 -1
  35. data/lib/mirah/errors.rb +3 -1
  36. data/lib/mirah/transform/ast_ext.rb +3 -2
  37. data/lib/mirah/util/process_errors.rb +1 -2
  38. data/lib/mirah/version.rb +1 -1
  39. data/test/A.class +0 -0
  40. data/test/core/util/jvm_version_test.rb +10 -0
  41. data/test/core/util/mirah_arguments_test.rb +51 -4
  42. data/test/fixtures/cp1251_test.mirah +7 -0
  43. data/test/fixtures/org/foo/AbstractExecutorJava8.java +30 -0
  44. data/test/fixtures/org/foo/ClassWithSelfReferencingTypeParameter.java +24 -0
  45. data/test/fixtures/org/foo/InnerInterfaceClass.java +12 -0
  46. data/test/fixtures/org/foo/IntAnno.class +0 -0
  47. data/test/fixtures/org/foo/TypeFixtureJava8.java +10 -0
  48. data/test/fixtures/utf8_test.mirah +7 -0
  49. data/test/jvm/access_levels_test.rb +31 -0
  50. data/test/jvm/annotations_test.rb +3 -6
  51. data/test/jvm/blocks_test.rb +303 -120
  52. data/test/jvm/cast_test.rb +123 -50
  53. data/test/jvm/closure_test.rb +242 -0
  54. data/test/jvm/constructors_test.rb +1 -3
  55. data/test/jvm/example_test.rb +6 -2
  56. data/test/jvm/extensions/array_extensions_test.rb +181 -0
  57. data/test/jvm/extensions/collection_extensions_test.rb +195 -0
  58. data/test/jvm/{enumerable_test.rb → extensions/enumerable_test.rb} +81 -13
  59. data/test/jvm/extensions/hash_extensions_test.rb +56 -0
  60. data/test/jvm/extensions/list_extensions_test.rb +143 -0
  61. data/test/jvm/extensions/lock_extensions_test.rb +43 -0
  62. data/test/jvm/{numeric_extensions_test.rb → extensions/numeric_extensions_test.rb} +0 -0
  63. data/test/jvm/extensions/numeric_operators_test.rb +86 -0
  64. data/test/jvm/extensions/object_extensions_test.rb +122 -0
  65. data/test/jvm/{string_builder_extensions_test.rb → extensions/string_builder_extensions_test.rb} +0 -0
  66. data/test/jvm/{string_extensions_test.rb → extensions/string_extensions_test.rb} +57 -4
  67. data/test/jvm/generics_test.rb +14 -6
  68. data/test/jvm/import_test.rb +38 -1
  69. data/test/jvm/interface_test.rb +17 -0
  70. data/test/jvm/jvm_commands_test.rb +9 -0
  71. data/test/jvm/jvm_compiler_test.rb +568 -43
  72. data/test/jvm/macros_test.rb +343 -19
  73. data/test/jvm/main_method_test.rb +1 -3
  74. data/test/jvm/new_backend_test_helper.rb +54 -7
  75. data/test/jvm/rescue_test.rb +20 -5
  76. data/test/jvm/static_fields_test.rb +52 -10
  77. data/test/jvm/{mirror_compilation_test_helper.rb → string_test.rb} +10 -9
  78. data/test/jvm/varargs_test.rb +6 -16
  79. data/test/mirrors/base_type_test.rb +20 -7
  80. data/test/mirrors/bytecode_mirror_test.rb +8 -3
  81. data/test/mirrors/generics_test.rb +89 -10
  82. data/test/mirrors/member_test.rb +1 -1
  83. data/test/mirrors/method_lookup_test.rb +10 -3
  84. data/test/mirrors/mirrors_test.rb +20 -20
  85. data/test/mirrors/simple_async_mirror_loader_test.rb +1 -1
  86. data/test/mirrors/simple_mirror_loader_test.rb +1 -1
  87. data/test/newMirahClass$Closure2.class +0 -0
  88. data/test/newMirahClass.class +0 -0
  89. data/test/test_helper.rb +8 -1
  90. metadata +31 -16
  91. data/bin/bundler +0 -16
  92. data/bin/rake +0 -16
  93. data/examples/ant/example-build.xml~ +0 -7
  94. data/examples/test.edb +0 -9
  95. data/lib/mirah/compiler.rb +0 -67
  96. data/lib/mirah/parser.rb +0 -224
  97. data/lib/mirah/util/delegate.rb +0 -65
  98. data/test/jvm/list_extensions_test.rb +0 -23
@@ -23,14 +23,18 @@ class ExampleTest < Test::Unit::TestCase
23
23
 
24
24
  def example_test name, output
25
25
  cls = compile_ex name
26
- assert_output(output) { cls.main nil }
26
+ assert_run_output(output, cls)
27
27
  end
28
28
 
29
29
  {
30
30
  'simple_class' => "constructor\nHello, \nMirah\n",
31
31
  'macros/square' => "2.0\n8.0\n",
32
32
  'macros/square_int' => "2.0\n8.0\n",
33
- 'macros/string_each_char' => "l\na\na\nt\n \nd\ne\n \nl\ne\ne\ne\nu\nw\n \nn\ni\ne\nt\n \ni\nn\n \nz\ni\nj\nn\n \nh\ne\nm\np\ni\ne\n \ns\nt\na\na\nn\n"
33
+ 'macros/string_each_char' => "l\na\na\nt\n \nd\ne\n \nl\ne\ne\ne\nu\nw\n \nn\ni\ne\nt\n \ni\nn\n \nz\ni\nj\nn\n \nh\ne\nm\np\ni\ne\n \ns\nt\na\na\nn\n",
34
+ 'sort_closure' =>
35
+ "unsorted: [9, 5, 2, 6, 8, 5, 0, 3, 6, 1, 8, 3, 6, 4, 7, 5, 0, 8, 5, 6, 7, 2, 3]\n" +
36
+ "sorted: [0, 0, 1, 2, 2, 3, 3, 3, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 8, 8, 8, 9]\n",
37
+ 'rosettacode/fizz-buzz' => "1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n17\nFizz\n19\nBuzz\nFizz\n22\n23\nFizz\nBuzz\n26\nFizz\n28\n29\nFizzBuzz\n31\n32\nFizz\n34\nBuzz\nFizz\n37\n38\nFizz\nBuzz\n41\nFizz\n43\n44\nFizzBuzz\n46\n47\nFizz\n49\nBuzz\nFizz\n52\n53\nFizz\nBuzz\n56\nFizz\n58\n59\nFizzBuzz\n61\n62\nFizz\n64\nBuzz\nFizz\n67\n68\nFizz\nBuzz\n71\nFizz\n73\n74\nFizzBuzz\n76\n77\nFizz\n79\nBuzz\nFizz\n82\n83\nFizz\nBuzz\n86\nFizz\n88\n89\nFizzBuzz\n91\n92\nFizz\n94\nBuzz\nFizz\n97\n98\nFizz\nBuzz\n1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n17\nFizz\n19\nBuzz\nFizz\n22\n23\nFizz\nBuzz\n26\nFizz\n28\n29\nFizzBuzz\n31\n32\nFizz\n34\nBuzz\nFizz\n37\n38\nFizz\nBuzz\n41\nFizz\n43\n44\nFizzBuzz\n46\n47\nFizz\n49\nBuzz\nFizz\n52\n53\nFizz\nBuzz\n56\nFizz\n58\n59\nFizzBuzz\n61\n62\nFizz\n64\nBuzz\nFizz\n67\n68\nFizz\nBuzz\n71\nFizz\n73\n74\nFizzBuzz\n76\n77\nFizz\n79\nBuzz\nFizz\n82\n83\nFizz\nBuzz\n86\nFizz\n88\n89\nFizzBuzz\n91\n92\nFizz\n94\nBuzz\nFizz\n97\n98\nFizz\nBuzz\n",
34
38
  }.each do |example,output|
35
39
  define_method "test_#{example}" do
36
40
  example_test example, output
@@ -0,0 +1,181 @@
1
+ class ArrayExtensionsTest < Test::Unit::TestCase
2
+ def test_empty_q
3
+ cls, = compile(<<-EOF)
4
+ x = int[0]
5
+ puts x.empty?
6
+ EOF
7
+ assert_run_output("true\n", cls)
8
+ end
9
+
10
+ def test_bracket_getter
11
+ cls, = compile(<<-EOF)
12
+ x = int[2]
13
+ x[0] = 1
14
+ x[1] = 2
15
+ puts x[0]
16
+ EOF
17
+ assert_run_output("1\n", cls)
18
+ end
19
+
20
+ def test_bracket_assignment
21
+ cls, = compile(<<-EOF)
22
+ x = String[1]
23
+ x[0]= "2"
24
+ puts java::util::Arrays.toString(x)
25
+ EOF
26
+ assert_run_output("[2]\n", cls)
27
+ end
28
+
29
+ def test_size
30
+ cls, = compile(%q{
31
+ puts int[4].size
32
+ })
33
+ assert_run_output("4\n", cls)
34
+ end
35
+
36
+ def test_each_with_index
37
+ cls, = compile(%q{
38
+ x = int[3]
39
+ x[0] = 9
40
+ x[1] = 7
41
+ x[2] = 5
42
+ x.each_with_index do |value,index|
43
+ puts "#{value} #{index}"
44
+ end
45
+ })
46
+ assert_run_output("9 0\n7 1\n5 2\n", cls)
47
+ end
48
+
49
+ def test_sort_with_comparator_block # comparators are only support for non-primitive types
50
+ cls, = compile(%q{
51
+ x = Integer[3]
52
+ x[0] = 3
53
+ x[1] = 1
54
+ x[2] = 2
55
+ y = x.sort do |a:Integer,b:Integer|
56
+ -(a.intValue-b.intValue)
57
+ end
58
+ puts java::util::Arrays.toString(y)
59
+ })
60
+ assert_run_output("[3, 2, 1]\n", cls)
61
+ end
62
+
63
+ def test_sort_without_comparator
64
+ cls, = compile(<<-EOF)
65
+ x = int[3]
66
+ x[0] = 5
67
+ x[1] = 1
68
+ x[2] = 3
69
+ puts java::util::Arrays.toString(x.sort)
70
+ EOF
71
+ assert_run_output("[1, 3, 5]\n", cls)
72
+ end
73
+
74
+ def test_first!
75
+ cls, = compile(<<-EOF)
76
+ x = int[3]
77
+ x[0] = 5
78
+ x[1] = 1
79
+ x[2] = 3
80
+ puts x.first!
81
+ EOF
82
+ assert_run_output("5\n", cls)
83
+ end
84
+
85
+ def test_empty_array_first!
86
+ cls, = compile(<<-EOF)
87
+ x = int[0]
88
+ puts x.first!
89
+ EOF
90
+ assert_raise_java(java.lang.ArrayIndexOutOfBoundsException) do
91
+ cls.main nil
92
+ end
93
+ end
94
+
95
+ def test_last!
96
+ cls, = compile(<<-EOF)
97
+ x = int[3]
98
+ x[0] = 5
99
+ x[1] = 1
100
+ x[2] = 3
101
+ puts x.last!
102
+ EOF
103
+ assert_run_output("3\n", cls)
104
+ end
105
+
106
+ def test_empty_array_last!
107
+ cls, = compile(<<-EOF)
108
+ x = int[0]
109
+ puts x.last!
110
+ EOF
111
+ assert_raise_java(java.lang.ArrayIndexOutOfBoundsException) do
112
+ cls.main nil
113
+ end
114
+ end
115
+
116
+ def test_array_join
117
+ cls, = compile(<<-EOF)
118
+ x = int[3]
119
+ x[0] = 5
120
+ x[1] = 1
121
+ x[2] = 3
122
+ puts x.join(':')
123
+ EOF
124
+ assert_run_output("5:1:3\n", cls)
125
+ end
126
+
127
+ def test_array_join_empty
128
+ cls, = compile(<<-EOF)
129
+ x = int[0]
130
+ puts x.join(':')
131
+ EOF
132
+ assert_run_output("\n", cls)
133
+ end
134
+
135
+ def test_array_join_single
136
+ cls, = compile(<<-EOF)
137
+ x = int[1]
138
+ x[0] = 4
139
+ puts x.join(':')
140
+ EOF
141
+ assert_run_output("4\n", cls)
142
+ end
143
+
144
+ def test_array_join_direct
145
+ cls, = compile(<<-EOF)
146
+ x = int[3]
147
+ x[0] = 5
148
+ x[1] = 1
149
+ x[2] = 3
150
+ puts x.join
151
+ EOF
152
+ assert_run_output("513\n", cls)
153
+ end
154
+
155
+ def test_array_join_direct_empty
156
+ cls, = compile(<<-EOF)
157
+ x = int[0]
158
+ puts x.join
159
+ EOF
160
+ assert_run_output("\n", cls)
161
+ end
162
+
163
+ def test_array_join_direct_single
164
+ cls, = compile(<<-EOF)
165
+ x = int[1]
166
+ x[0] = 4
167
+ puts x.join
168
+ EOF
169
+ assert_run_output("4\n", cls)
170
+ end
171
+
172
+ def test_array_new
173
+ cls, = compile(<<-EOF)
174
+ x = int[].new(5) do |i|
175
+ i*2+1
176
+ end
177
+ puts x.join(",")
178
+ EOF
179
+ assert_run_output("1,3,5,7,9\n", cls)
180
+ end
181
+ end
@@ -0,0 +1,195 @@
1
+ class CollectionExtensionsTest < Test::Unit::TestCase
2
+ def test_mirah_array_join_empty
3
+ cls, = compile(<<-EOF)
4
+ x = [].join
5
+ puts x
6
+ EOF
7
+ assert_run_output("\n", cls)
8
+ end
9
+
10
+ def test_mirah_array_join_single
11
+ cls, = compile(<<-EOF)
12
+ x = ["a"].join
13
+ puts x
14
+ EOF
15
+ assert_run_output("a\n", cls)
16
+ end
17
+
18
+ def test_mirah_array_join_multiple
19
+ cls, = compile(<<-EOF)
20
+ x = ["a",1,"c"].join
21
+ puts x
22
+ EOF
23
+ assert_run_output("a1c\n", cls)
24
+ end
25
+
26
+ def test_java_array_join_empty
27
+ cls, = compile(<<-EOF)
28
+ x = int[0].join
29
+ puts x
30
+ EOF
31
+ assert_run_output("\n", cls)
32
+ end
33
+
34
+ def test_java_array_join_single
35
+ cls, = compile(<<-EOF)
36
+ x = ["a"].to_array(String).join
37
+ puts x
38
+ EOF
39
+ assert_run_output("a\n", cls)
40
+ end
41
+
42
+ def test_java_array_join_multiple
43
+ cls, = compile(<<-EOF)
44
+ x = ["a",1,"c"].to_array(Object).join
45
+ puts x
46
+ EOF
47
+ assert_run_output("a1c\n", cls)
48
+ end
49
+
50
+ def test_primitve_java_array_join_multiple
51
+ cls, = compile(<<-EOF)
52
+ x = int[4].join
53
+ puts x
54
+ EOF
55
+ assert_run_output("0000\n", cls)
56
+ end
57
+
58
+ def test_mirah_array_join_separator_empty
59
+ cls, = compile(<<-EOF)
60
+ x = [].join(",")
61
+ puts x
62
+ EOF
63
+ assert_run_output("\n", cls)
64
+ end
65
+
66
+ def test_mirah_array_join_separator_single
67
+ cls, = compile(<<-EOF)
68
+ x = ["a"].join(",")
69
+ puts x
70
+ EOF
71
+ assert_run_output("a\n", cls)
72
+ end
73
+
74
+ def test_mirah_array_join_separator_multiple
75
+ cls, = compile(<<-EOF)
76
+ x = ["a",1,"c"].join(",")
77
+ puts x
78
+ EOF
79
+ assert_run_output("a,1,c\n", cls)
80
+ end
81
+
82
+ def test_java_array_join_separator_empty
83
+ cls, = compile(<<-EOF)
84
+ x = int[0].join(",")
85
+ puts x
86
+ EOF
87
+ assert_run_output("\n", cls)
88
+ end
89
+
90
+ def test_java_array_join_separator_single
91
+ cls, = compile(<<-EOF)
92
+ x = ["a"].to_array(String).join(",")
93
+ puts x
94
+ EOF
95
+ assert_run_output("a\n", cls)
96
+ end
97
+
98
+ def test_java_array_join_separator_multiple
99
+ cls, = compile(<<-EOF)
100
+ x = ["a",1,"c"].to_array(Object).join(",")
101
+ puts x
102
+ EOF
103
+ assert_run_output("a,1,c\n", cls)
104
+ end
105
+
106
+ def test_primitve_java_array_join_separator_multiple
107
+ cls, = compile(<<-EOF)
108
+ x = int[4].join(",")
109
+ puts x
110
+ EOF
111
+ assert_run_output("0,0,0,0\n", cls)
112
+ end
113
+
114
+ # implicitly tests each_with_index
115
+ def test_mapa_on_list
116
+ cls, = compile(%q[
117
+ x = ["a","b","c","d"].mapa do |s|
118
+ "#{s}x"
119
+ end
120
+ puts x[2]
121
+ puts x.getClass.getName
122
+ ])
123
+ assert_run_output("cx\n[Ljava.lang.String;\n", cls)
124
+ end
125
+
126
+ # implicitly tests each_with_index
127
+ def test_mapa_on_java_array_with_complex_basetype
128
+ cls, = compile(%q[
129
+ x = ["a","b","c","d"].to_array(String).mapa do |s|
130
+ "#{s}x"
131
+ end
132
+ puts x[2]
133
+ puts x.getClass.getName
134
+ ])
135
+ assert_run_output("cx\n[Ljava.lang.String;\n", cls)
136
+ end
137
+
138
+ # implicitly tests each_with_index
139
+ def test_mapa_on_java_array_with_primitive_basetype
140
+ cls, = compile(%q[
141
+ x = [1,2,3,4].to_array(int).mapa do |s|
142
+ "#{s}x"
143
+ end
144
+ puts x[2]
145
+ puts x.getClass.getName
146
+ ])
147
+ assert_run_output("3x\n[Ljava.lang.String;\n", cls)
148
+ end
149
+
150
+ def test_map
151
+ cls, = compile(%q[
152
+ x = ["a","b","c","d"].map do |s|
153
+ "#{s}x"
154
+ end
155
+ puts x[2]
156
+ puts x.getClass.getName
157
+ ])
158
+ assert_run_output("cx\njava.util.ArrayList\n", cls)
159
+ end
160
+
161
+ def test_operator_append
162
+ cls, = compile(%q{
163
+ x = ["a"]
164
+ x << "b"
165
+ x << "c" << "d"
166
+ x << "e"
167
+ puts x
168
+ })
169
+ assert_run_output("[a, b, c, d, e]\n", cls)
170
+ end
171
+
172
+ def test_mapa_on_java_array_with_complex_basetype_returning_type_defined_later
173
+ cls, = compile(%q[
174
+ x = ["a","b","c","d"].mapa do |s|
175
+ TypeDefinedLater.new(s)
176
+ end
177
+ puts x[2]
178
+ puts x.getClass.getName
179
+
180
+ class TypeDefinedLater
181
+ attr_accessor foo:Object
182
+
183
+ def initialize(foo:Object)
184
+ self.foo = foo
185
+ end
186
+
187
+ def toString
188
+ "TypeDefinedLater(#{foo})"
189
+ end
190
+ end
191
+ ])
192
+ assert_run_output("TypeDefinedLater(c)\n[LTypeDefinedLater;\n", cls)
193
+ end
194
+ end
195
+
@@ -309,36 +309,104 @@ class EnumerableTest < Test::Unit::TestCase
309
309
  cls, = compile(<<-EOF)
310
310
  puts [].map { 'b' }
311
311
  EOF
312
- assert_output "[]\n" do
313
- cls.main(nil)
314
- end
312
+ assert_run_output("[]\n", cls)
315
313
  end
316
314
 
317
315
  def test_map_to_different_type
318
316
  cls, = compile(<<-EOF)
319
317
  puts [1].map { 'a' }
320
318
  EOF
321
- assert_output "[a]\n" do
322
- cls.main(nil)
323
- end
319
+ assert_run_output("[a]\n", cls)
324
320
  end
325
321
 
326
- def test_map_identity
322
+ def test_map_identity
327
323
  cls, = compile(<<-EOF)
328
324
  puts [1,2,3].map {|x| x}
329
325
  EOF
330
- assert_output("[1, 2, 3]\n") do
331
- cls.main(nil)
332
- end
326
+ assert_run_output("[1, 2, 3]\n", cls)
333
327
  end
334
328
 
335
329
  def test_map_with_type_declaration
336
330
  cls, = compile(<<-EOF)
337
331
  puts [1,2,3].map {|x:Integer| x.intValue + 1}
338
332
  EOF
339
- assert_output("[2, 3, 4]\n") do
340
- cls.main(nil)
341
- end
333
+ assert_run_output("[2, 3, 4]\n", cls)
334
+ end
335
+
336
+ def test_native_array_map_empty_literal
337
+ cls, = compile(<<-EOF)
338
+ puts int[0].map { 'b' }
339
+ EOF
340
+ assert_run_output("[]\n", cls)
341
+ end
342
+
343
+ def test_native_array_map_to_different_type
344
+ cls, = compile(<<-EOF)
345
+ a = int[1]
346
+ a[0] = 1
347
+ puts a.map { 'a' }
348
+ EOF
349
+ assert_run_output("[a]\n", cls)
350
+ end
351
+
352
+ def test_native_array_map_identity
353
+ cls, = compile(<<-EOF)
354
+ a = int[3]
355
+ a[0] = 1
356
+ a[1] = 2
357
+ a[2] = 3
358
+ puts a.map {|x| x}
359
+ EOF
360
+ assert_run_output("[1, 2, 3]\n", cls)
361
+ end
362
+
363
+ def test_native_array_map_with_type_declaration
364
+ cls, = compile(<<-EOF)
365
+ a = int[3]
366
+ a[0] = 1
367
+ a[1] = 2
368
+ a[2] = 3
369
+ puts a.map {|x:int| x + 1}
370
+ EOF
371
+ assert_run_output("[2, 3, 4]\n", cls)
372
+ end
373
+
374
+ def test_select_identity
375
+ cls, = compile(<<-EOF)
376
+ puts [1,2,3].select {|x| true}
377
+ EOF
378
+ assert_run_output("[1, 2, 3]\n", cls)
379
+ end
380
+
381
+ def test_select_odd
382
+ cls, = compile(<<-EOF)
383
+ puts [1,2,3].select {|x| (x.intValue&1)==1}
384
+ EOF
385
+ assert_run_output("[1, 3]\n", cls)
386
+ end
387
+
388
+ def test_select_multistatement_block
389
+ cls, = compile(<<-EOF)
390
+ puts ([1,2,3].select do |x|
391
+ v = x.intValue
392
+ v&1==1
393
+ end)
394
+ EOF
395
+ assert_run_output("[1, 3]\n", cls)
396
+ end
397
+
398
+ def test_join
399
+ cls, = compile(<<-EOF)
400
+ puts [1,23,4].join
401
+ EOF
402
+ assert_run_output("1234\n", cls)
403
+ end
404
+
405
+ def test_join_with_separator
406
+ cls, = compile(<<-EOF)
407
+ puts [1,23,4].join ', '
408
+ EOF
409
+ assert_run_output("1, 23, 4\n", cls)
342
410
  end
343
411
 
344
412
  def test_zip