mirah 0.1.4-java → 0.2.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 (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
@@ -0,0 +1,12 @@
1
+ package org.foo;
2
+
3
+ public class InnerInterfaceClass {
4
+ public static interface InnerInterface {
5
+ public void foo(Object a);
6
+ }
7
+
8
+ public static void forward(Object param,InnerInterface i) {
9
+ i.foo(param);
10
+ }
11
+ }
12
+
@@ -0,0 +1,10 @@
1
+ package org.foo;
2
+
3
+ import java.util.List;
4
+ import java.util.concurrent.CompletableFuture;
5
+
6
+ public class TypeFixtureJava8 {
7
+ public CompletableFuture<List<Runnable>> load(List filter, int flags){
8
+ return null;
9
+ }
10
+ }
@@ -0,0 +1,7 @@
1
+ class Кирилица
2
+ def тест
3
+ end
4
+ def self.main(args:String[]):void
5
+ puts 'default utf8 encoding test'
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ # Copyright (c) 2015 The Mirah project authors. All Rights Reserved.
2
+ # All contributing project authors may be found in the NOTICE file.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ require 'test_helper'
16
+
17
+ class AccessLevelsTest < Test::Unit::TestCase
18
+ def test_private_method_inaccessible_externally
19
+ cls, = compile("private def foo; a = 1; a; end; def bar; foo; end")
20
+
21
+ assert_raise NoMethodError do
22
+ cls.foo
23
+ end
24
+ end
25
+
26
+ def test_private_method_accessible_internally
27
+ cls, = compile("private def foo; a = 1; a; end; def bar; foo; end")
28
+
29
+ assert_equal 1, cls.bar
30
+ end
31
+ end
@@ -50,10 +50,9 @@ class AnnotationsTest < Test::Unit::TestCase
50
50
  puts anno.value
51
51
  EOF
52
52
 
53
- assert_output "1\n" do
54
- cls.main nil
55
- end
53
+ assert_run_output("1\n", cls)
56
54
  end
55
+
57
56
  def test_annotation_from_constant
58
57
  return
59
58
  cls, = compile(<<-EOF)
@@ -69,9 +68,7 @@ class AnnotationsTest < Test::Unit::TestCase
69
68
  puts anno.value
70
69
  EOF
71
70
 
72
- assert_output "1\n" do
73
- cls.main nil
74
- end
71
+ assert_run_output("1\n", cls)
75
72
  end
76
73
 
77
74
  end
@@ -70,9 +70,7 @@ class BlocksTest < Test::Unit::TestCase
70
70
  puts "Uh Oh!"
71
71
  end
72
72
  EOF
73
- assert_output("Hello\n") do
74
- cls.main([].to_java :string)
75
- end
73
+ assert_run_output("Hello\n", cls)
76
74
  end
77
75
 
78
76
  def test_arg_types_inferred_from_interface
@@ -88,9 +86,7 @@ class BlocksTest < Test::Unit::TestCase
88
86
  o.addObserver {|x, a| puts a}
89
87
  o.notifyObservers("Hello Observer")
90
88
  EOF
91
- assert_output("Hello Observer\n") do
92
- script.main([].to_java :string)
93
- end
89
+ assert_run_output("Hello Observer\n", script)
94
90
  end
95
91
 
96
92
  def test_closure
@@ -159,9 +155,7 @@ class BlocksTest < Test::Unit::TestCase
159
155
  list.each {|x| puts x }
160
156
  EOF
161
157
 
162
- assert_output("a\nABC\nb\nCats\n") do
163
- cls.main(nil)
164
- end
158
+ assert_run_output("a\nABC\nb\nCats\n", cls)
165
159
  end
166
160
 
167
161
  def test_block_with_abstract_from_object
@@ -196,8 +190,82 @@ class BlocksTest < Test::Unit::TestCase
196
190
  puts "never get here"
197
191
  end
198
192
  EOF
199
- assert_output("an object\n") do
200
- cls.main(nil)
193
+ assert_run_output("an object\n", cls)
194
+ end
195
+
196
+ def test_nesting_with_abstract_class
197
+ pend 'test_nesting_with_abstract_class' do
198
+ cls, main = compile(%q{
199
+ abstract class Nestable
200
+ abstract def foo(n: Nestable):void;end
201
+ def create(n: Nestable):void
202
+ puts "create #{n}"
203
+ n.foo(n)
204
+ end
205
+
206
+ def toString:String
207
+ "nestable"
208
+ end
209
+ end
210
+
211
+ class Main
212
+ def self.create(b: Nestable):void
213
+ b.foo(b)
214
+ end
215
+
216
+ def self.main(args: String[]):void
217
+ create do |x:Nestable|
218
+ puts "outer foo"
219
+ create do |m: Nestable|
220
+ puts "in foo #{m}"
221
+ end
222
+ end
223
+ end
224
+ end
225
+ })
226
+ assert_output "outer foo\ncreate nestable\nin foo nestable\n" do
227
+ main.main([])
228
+ end
229
+ end
230
+ end
231
+
232
+ def test_use_abstract_inplace
233
+ pend "test_use_abstract_inplace" do
234
+ #with_finest_logging {
235
+ cls, main, parent = compile(%q{
236
+ abstract class A < P
237
+
238
+ def self.empty:A
239
+ create do
240
+ puts "empty"
241
+ end
242
+ end
243
+
244
+ def self.create(n: A):void
245
+ puts "create #{n}"
246
+ n.execute
247
+ end
248
+
249
+ end
250
+
251
+ class Main
252
+ def self.create(b: Nestable = A.empty):void
253
+ b.execute
254
+ end
255
+
256
+ def self.main(args: String[]):void
257
+ create
258
+ create { puts "not empty"}
259
+ end
260
+ end
261
+
262
+ abstract class P
263
+ abstract def execute:void;end
264
+ end
265
+ })
266
+ assert_output "outer foo\ncreate nestable\nin foo nestable\n" do
267
+ main.main([])
268
+ end
201
269
  end
202
270
  end
203
271
 
@@ -212,9 +280,7 @@ class BlocksTest < Test::Unit::TestCase
212
280
 
213
281
  foo('there')
214
282
  EOF
215
- assert_output("Hello there\n") do
216
- cls.main(nil)
217
- end
283
+ assert_run_output("Hello there\n", cls)
218
284
  end
219
285
 
220
286
  def test_block_with_mirah_interface
@@ -273,9 +339,7 @@ class BlocksTest < Test::Unit::TestCase
273
339
  puts "hi"
274
340
  end
275
341
  CODE
276
- assert_output "hi\n" do
277
- cls.main(nil)
278
- end
342
+ assert_run_output("hi\n", cls)
279
343
  end
280
344
 
281
345
  def test_block_with_too_many_params
@@ -300,7 +364,6 @@ class BlocksTest < Test::Unit::TestCase
300
364
  end
301
365
 
302
366
  def test_call_with_block_assigned_to_macro
303
- #cls, = with_finest_logging{compile(<<-CODE)}
304
367
  cls, = compile(<<-CODE)
305
368
  class S
306
369
  def initialize(run: Runnable)
@@ -317,9 +380,7 @@ class BlocksTest < Test::Unit::TestCase
317
380
  puts b
318
381
  end
319
382
  CODE
320
- assert_output "hey\n{wut=1}\n1\n" do
321
- cls.main(nil)
322
- end
383
+ assert_run_output("hey\n{wut=1}\n1\n", cls)
323
384
  end
324
385
 
325
386
  def test_nested_closure_in_closure_doesnt_raise_error
@@ -338,36 +399,121 @@ class BlocksTest < Test::Unit::TestCase
338
399
  end
339
400
  end
340
401
  CODE
341
- assert_output "first closure\nsecond closure\n" do
342
- cls.main(nil)
343
- end
402
+ assert_run_output("first closure\nsecond closure\n", cls)
344
403
  end
345
404
 
346
405
  def test_nested_closure_with_var_from_outer_closure
347
- pend "bindings in nested closures are incorrectly generated" do
348
- #cls, = with_finest_logging{compile(<<-'CODE')}
349
- cls, = compile(<<-'CODE')
350
- interface BarRunner do;def run:void;end;end
406
+ cls, = compile(<<-'CODE')
407
+ interface BarRunner do;def run:void;end;end
351
408
 
352
- class Nestable
353
- def foo(a:BarRunner)
354
- a.run
355
- end
409
+ class Nestable
410
+ def foo(a:BarRunner)
411
+ a.run
356
412
  end
413
+ end
414
+ Nestable.new.foo do
415
+ c = "closure"
416
+ puts "first #{c}"
357
417
  Nestable.new.foo do
358
- c = "closure"
359
- puts "first #{c}"
360
- Nestable.new.foo do
361
- puts "second #{c}"
418
+ puts "second #{c}"
419
+ end
420
+ end
421
+ CODE
422
+ assert_run_output("first closure\nsecond closure\n", cls)
423
+ end
424
+
425
+ def test_nested_closure_with_nested_closed_over_args
426
+ cls, = compile(<<-'CODE')
427
+ interface Jogger do;def jog(pace:int):void;end;end
428
+
429
+ class Nestable
430
+ def foo(pace: int, a: Jogger)
431
+ a.jog(pace)
432
+ end
433
+ end
434
+ Nestable.new.foo 10 do |pace|
435
+ puts "first #{pace}"
436
+ Nestable.new.foo 20 do |inner_pace|
437
+ puts "second #{pace} #{inner_pace}"
438
+ end
439
+ end
440
+ CODE
441
+ assert_run_output("first 10\nsecond 10 20\n", cls)
442
+ end
443
+
444
+ def test_nested_closure_with_nested_closed_over_args2
445
+ cls, = compile(%q[
446
+ interface Jogger do;def jog(param:int):void;end;end
447
+
448
+ class Nestable
449
+ def operate(blub: int, a: Jogger):void
450
+ a.jog(blub)
451
+ end
452
+ end
453
+
454
+ class Bar
455
+ def baz(foo:int):void
456
+ puts "bazstart"
457
+ Nestable.new.operate(10) do |arg1|
458
+ puts "first #{arg1} #{foo}"
459
+ Nestable.new.operate 20 do |inner_pace|
460
+ puts "second #{arg1} #{inner_pace} #{foo}"
461
+ end
462
+ Nestable.new.operate 30 do |inner_pace2|
463
+ puts "third #{arg1} #{inner_pace2} #{foo}"
464
+ end
362
465
  end
363
466
  end
364
- CODE
365
- assert_output "first closure\nsecond closure\n" do
366
- cls.main(nil)
367
467
  end
368
- end
468
+
469
+ Bar.new.baz(4)
470
+ ])
471
+ assert_run_output("bazstart\nfirst 10 4\nsecond 10 20 4\nthird 10 30 4\n", cls)
369
472
  end
370
473
 
474
+ def test_two_closures_capture_different_variables
475
+ cls, = compile(%q[
476
+ interface Jogger do;def jog(param:int):void;end;end
477
+
478
+ class Nestable
479
+ def operate(blub: int, a: Jogger):void
480
+ a.jog(blub)
481
+ end
482
+ end
483
+
484
+ class Bar
485
+ def baz(foo:int):void
486
+ puts "bazstart"
487
+ bar = 7
488
+ Nestable.new.operate(40) do |arg1|
489
+ puts bar
490
+ end
491
+ Nestable.new.operate(10) do |arg1|
492
+ puts "first #{arg1} #{foo}"
493
+ end
494
+ end
495
+ end
496
+
497
+ Bar.new.baz(4)
498
+ ])
499
+ assert_run_output("bazstart\n7\nfirst 10 4\n", cls)
500
+ end
501
+
502
+ def test_uncastable_block_arg_type_fails
503
+ error = assert_raises Mirah::MirahError do
504
+ compile(<<-EOF)
505
+ import java.io.OutputStream
506
+ def foo x:OutputStream
507
+ x.write byte(1)
508
+ rescue
509
+ end
510
+ foo do |b:String|
511
+ puts "writing"
512
+ end
513
+ EOF
514
+ end
515
+ assert_equal "Cannot cast java.lang.String to int.", error.message
516
+ end
371
517
 
372
518
  def test_method_requiring_subclass_of_abstract_class_finds_abstract_method
373
519
  cls, = compile(<<-EOF)
@@ -380,9 +526,7 @@ class BlocksTest < Test::Unit::TestCase
380
526
  puts "writing"
381
527
  end
382
528
  EOF
383
- assert_output "writing\n" do
384
- cls.main(nil)
385
- end
529
+ assert_run_output("writing\n", cls)
386
530
  end
387
531
 
388
532
  def test_block_with_interface_method_with_2_arguments_with_types
@@ -401,9 +545,7 @@ class BlocksTest < Test::Unit::TestCase
401
545
  puts b
402
546
  end
403
547
  EOF
404
- assert_output "hello\n1243\n" do
405
- cls.main(nil)
406
- end
548
+ assert_run_output("hello\n1243\n", cls)
407
549
  end
408
550
 
409
551
  def test_block_with_interface_method_with_2_arguments_without_types
@@ -422,11 +564,23 @@ class BlocksTest < Test::Unit::TestCase
422
564
  puts b
423
565
  end
424
566
  EOF
425
- assert_output "hello\n1243\n" do
426
- cls.main(nil)
427
- end
567
+ assert_run_output("hello\n1243\n", cls)
428
568
  end
429
569
 
570
+ def test_closures_with_static_imports
571
+ cls, = compile(<<-EOF)
572
+ def foo a:Runnable
573
+ a.run
574
+ end
575
+ foo do
576
+ x = [2,1]
577
+ import static java.util.Collections.*
578
+ sort x
579
+ puts x
580
+ end
581
+ EOF
582
+ assert_run_output("[1, 2]\n", cls)
583
+ end
430
584
 
431
585
  def test_closures_support_non_local_return
432
586
  pend "nlr doesnt work right now" do
@@ -443,9 +597,7 @@ class BlocksTest < Test::Unit::TestCase
443
597
  end
444
598
  puts nlr
445
599
  EOF
446
- assert_output "NLR!\n" do
447
- cls.main(nil)
448
- end
600
+ assert_run_output("NLR!\n", cls)
449
601
  end
450
602
  end
451
603
 
@@ -464,9 +616,7 @@ class BlocksTest < Test::Unit::TestCase
464
616
  end
465
617
  puts nlr
466
618
  EOF
467
- assert_output "1234\n" do
468
- cls.main(nil)
469
- end
619
+ assert_run_output("1234\n", cls)
470
620
  end
471
621
  end
472
622
 
@@ -503,9 +653,7 @@ class BlocksTest < Test::Unit::TestCase
503
653
  foo { return }
504
654
  puts "or here"
505
655
  EOF
506
- assert_output "before\n" do
507
- cls.main(nil)
508
- end
656
+ assert_run_output("before\n", cls)
509
657
  end
510
658
  end
511
659
 
@@ -526,9 +674,7 @@ class BlocksTest < Test::Unit::TestCase
526
674
  end
527
675
  puts ClosureInMethodInClass.new.nlr
528
676
  EOF
529
- assert_output "before\n1234\n" do
530
- cls.main(nil)
531
- end
677
+ assert_run_output("before\n1234\n", cls)
532
678
  end
533
679
  end
534
680
 
@@ -548,9 +694,7 @@ class BlocksTest < Test::Unit::TestCase
548
694
  end
549
695
  ClosureInVoidMethodInClass.new.nlr
550
696
  EOF
551
- assert_output "before\n" do
552
- cls.main(nil)
553
- end
697
+ assert_run_output("before\n", cls)
554
698
  end
555
699
  end
556
700
 
@@ -570,9 +714,7 @@ class BlocksTest < Test::Unit::TestCase
570
714
  puts nlr true
571
715
  puts nlr false
572
716
  EOF
573
- assert_output "NLR!\nNLArrrr\n" do
574
- cls.main(nil)
575
- end
717
+ assert_run_output("NLR!\nNLArrrr\n", cls)
576
718
  end
577
719
  end
578
720
 
@@ -596,9 +738,7 @@ class BlocksTest < Test::Unit::TestCase
596
738
  puts nlr true
597
739
  puts nlr false
598
740
  EOF
599
- assert_output "NLR!\nNLArrrr\n" do
600
- cls.main(nil)
601
- end
741
+ assert_run_output("NLR!\nNLArrrr\n", cls)
602
742
  end
603
743
  end
604
744
 
@@ -620,9 +760,7 @@ class BlocksTest < Test::Unit::TestCase
620
760
  puts nlr true
621
761
  puts nlr false
622
762
  EOF
623
- assert_output "NLR!\nmay get here\nNLArrrr\n" do
624
- cls.main(nil)
625
- end
763
+ assert_run_output("NLR!\nmay get here\nNLArrrr\n", cls)
626
764
  end
627
765
  end
628
766
 
@@ -648,33 +786,27 @@ class BlocksTest < Test::Unit::TestCase
648
786
  Huh.new.wut(Huh.new.regular)
649
787
  EOF
650
788
 
651
- assert_output "Closure!\nfinish\n" do
652
- cls.main(nil)
653
- end
789
+ assert_run_output("Closure!\nfinish\n", cls)
654
790
  end
655
791
 
656
792
 
657
793
  def test_closure_with_or
658
- cls, = with_finest_logging{compile(<<-EOF)}
659
- def r(run: Runnable) run.run; end
794
+ cls, = compile(<<-EOF)
795
+ def r(run: java.lang.Runnable) run.run; end
660
796
  r { puts "a" || "b"}
661
797
  EOF
662
798
 
663
- assert_output "a\n" do
664
- cls.main(nil)
665
- end
799
+ assert_run_output("a\n", cls)
666
800
  end
667
801
 
668
802
  def test_closure_with_or_ii
669
- cls, = with_finest_logging{compile(<<-EOF)}
803
+ cls, = compile(<<-EOF)
670
804
  interface C; def c(): String;end;end
671
805
  def r(cee: C) puts cee.c; end
672
806
  r { "a" || "b"}
673
807
  EOF
674
808
 
675
- assert_output "a\n" do
676
- cls.main(nil)
677
- end
809
+ assert_run_output("a\n", cls)
678
810
  end
679
811
 
680
812
  def test_two_closures_in_the_same_method
@@ -689,9 +821,7 @@ class BlocksTest < Test::Unit::TestCase
689
821
  end
690
822
  regular
691
823
  EOF
692
- assert_output "Closure!\nWe Want it\n" do
693
- cls.main(nil)
694
- end
824
+ assert_run_output("Closure!\nWe Want it\n", cls)
695
825
  end
696
826
 
697
827
  def test_closures_in_a_rescue
@@ -710,9 +840,7 @@ class BlocksTest < Test::Unit::TestCase
710
840
  end
711
841
  regular
712
842
  EOF
713
- assert_output "Closure!\nWe Want it\n" do
714
- cls.main(nil)
715
- end
843
+ assert_run_output("Closure!\nWe Want it\n", cls)
716
844
  end
717
845
 
718
846
  def test_lambda_with_type_defined_before
@@ -723,24 +851,18 @@ class BlocksTest < Test::Unit::TestCase
723
851
  x = lambda(Fooable) { puts "hey you" }
724
852
  x.foo
725
853
  EOF
726
- assert_output "hey you\n" do
727
- cls.main(nil)
728
- end
854
+ assert_run_output("hey you\n", cls)
729
855
  end
730
856
 
731
857
  def test_lambda_with_type_defined_later
732
- pend "I think it'd be nice if this worked" do
733
- cls, = compile(<<-EOF)
734
- x = lambda(Fooable) { puts "hey you" }
735
- interface Fooable
736
- def foo: void; end
737
- end
738
- x.foo
739
- EOF
740
- assert_output "hey you\n" do
741
- cls.main(nil)
858
+ cls, = compile(<<-EOF)
859
+ x = lambda(Fooable) { puts "hey you" }
860
+ interface Fooable
861
+ def foo: void; end
742
862
  end
743
- end
863
+ x.foo
864
+ EOF
865
+ assert_run_output("hey you\n", cls)
744
866
  end
745
867
 
746
868
  def test_closure_with_primitive_array_param
@@ -753,28 +875,89 @@ class BlocksTest < Test::Unit::TestCase
753
875
  end
754
876
  r {|b| puts String.new(b) }
755
877
  EOF
756
- assert_output "yay\n" do
757
- cls.main(nil)
758
- end
878
+ assert_run_output("yay\n", cls)
759
879
  end
760
880
 
761
881
 
882
+ def test_block_syntax_for_anonymous_class_implementing_inner_interface
883
+ cls, = compile('
884
+ import org.foo.InnerInterfaceClass
885
+
886
+ InnerInterfaceClass.forward("foo") do |param|
887
+ puts param
888
+ end
889
+ ')
890
+ assert_run_output("foo\n", cls)
891
+ end
892
+
893
+ def test_block_syntax_for_abstract_class_invoke_self
894
+ omit_if JVMCompiler::JVM_VERSION.to_f < 1.8
895
+ cls, = compile('
896
+ import org.foo.AbstractExecutorJava8
897
+
898
+ AbstractExecutorJava8.execute do
899
+ puts "foo"
900
+ end
901
+ ')
902
+ assert_run_output("foo\n", cls)
903
+ end
904
+
762
905
  def test_lambda_closure
763
- pend "not working yet" do
764
- cls, = compile(<<-EOF)
765
- def r b: Runnable
766
- b.run
767
- end
768
- msg = "yay"
769
- l = lambda(Runnable) { puts msg }
770
- r l
771
- EOF
772
- assert_output "yay\n" do
773
- cls.main(nil)
906
+ cls, = compile(<<-EOF)
907
+ def r b: Runnable
908
+ b.run
774
909
  end
775
- end
910
+ msg = "yay"
911
+ l = lambda(Runnable) { puts msg }
912
+ r l
913
+ EOF
914
+ assert_run_output("yay\n", cls)
776
915
  end
777
916
 
917
+
918
+ def test_binding_in_class_definition_has_right_namespace
919
+ classes = compile(<<-'EOF')
920
+ package test
921
+ class Something
922
+ def create(a: Runnable):void
923
+ a.run
924
+ end
925
+ def with_binding
926
+ loc = 1
927
+ create do
928
+ puts "test #{loc}"
929
+ end
930
+ end
931
+ end
932
+ EOF
933
+ class_names = classes.map(&:java_class).map(&:name)
934
+ pattern = /test\.Something\$.*?Binding\d*/
935
+ assert class_names.find{|c| c.match pattern },
936
+ "generated classes: #{class_names} didn't contain #{pattern}."
937
+ end
938
+
939
+
940
+ def test_binding_in_script_has_right_namespace
941
+ classes = compile(<<-'EOF', name: 'MyScript')
942
+ def create(a: Runnable):void
943
+ a.run
944
+ end
945
+ def with_binding
946
+ loc = 1
947
+ create do
948
+ puts "test #{loc}"
949
+ end
950
+ end
951
+ EOF
952
+ class_names = classes.map(&:java_class).map(&:name)
953
+ pattern = /MyScriptTopLevel\$.*?Binding\d*/
954
+
955
+ assert class_names.find{|c| c.match pattern },
956
+ "generated classes: #{class_names} didn't contain #{pattern}."
957
+ end
958
+
959
+
960
+
778
961
  # nested nlr scopes
779
962
 
780
963
  # works with script as end