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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +0 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/History.txt +531 -0
- data/README.md +23 -10
- data/Rakefile +239 -156
- data/TODO.md +71 -10
- data/bin/mirah +1 -1
- data/bin/mirahc +1 -1
- data/dist/mirahc.jar +0 -0
- data/examples/bintrees.mirah +2 -2
- data/examples/construction.mirah +2 -2
- data/examples/fields.mirah +1 -1
- data/examples/fractal.mirah +1 -1
- data/examples/fractal.rb +70 -0
- data/examples/interfaces.mirah +1 -1
- data/examples/java_thing.mirah +1 -1
- data/examples/macros/square.mirah +3 -3
- data/examples/macros/square_int.mirah +3 -3
- data/examples/macros/string_each_char.mirah +6 -6
- data/examples/rosettacode/100-doors.mirah +0 -2
- data/examples/rosettacode/count-occurrences-of-a-substring.mirah +3 -3
- data/examples/rosettacode/empty-string.mirah +1 -1
- data/examples/rosettacode/fizz-buzz.mirah +4 -4
- data/examples/rosettacode/is-string-numeric.mirah +7 -7
- data/examples/rosettacode/palindrome.mirah +2 -2
- data/examples/rosettacode/reverse-a-string.mirah +1 -1
- data/examples/rosettacode/rot-13.mirah +1 -1
- data/examples/{edb.mirah → rosettacode/simple_character_math.mirah} +13 -4
- data/examples/rosettacode/string-case.mirah +2 -2
- data/examples/rosettacode/string-length.mirah +1 -1
- data/examples/swing.mirah +9 -14
- data/extensions_and_macros.md +117 -0
- data/lib/mirah.rb +1 -1
- data/lib/mirah/errors.rb +3 -1
- data/lib/mirah/transform/ast_ext.rb +3 -2
- data/lib/mirah/util/process_errors.rb +1 -2
- data/lib/mirah/version.rb +1 -1
- data/test/A.class +0 -0
- data/test/core/util/jvm_version_test.rb +10 -0
- data/test/core/util/mirah_arguments_test.rb +51 -4
- data/test/fixtures/cp1251_test.mirah +7 -0
- data/test/fixtures/org/foo/AbstractExecutorJava8.java +30 -0
- data/test/fixtures/org/foo/ClassWithSelfReferencingTypeParameter.java +24 -0
- data/test/fixtures/org/foo/InnerInterfaceClass.java +12 -0
- data/test/fixtures/org/foo/IntAnno.class +0 -0
- data/test/fixtures/org/foo/TypeFixtureJava8.java +10 -0
- data/test/fixtures/utf8_test.mirah +7 -0
- data/test/jvm/access_levels_test.rb +31 -0
- data/test/jvm/annotations_test.rb +3 -6
- data/test/jvm/blocks_test.rb +303 -120
- data/test/jvm/cast_test.rb +123 -50
- data/test/jvm/closure_test.rb +242 -0
- data/test/jvm/constructors_test.rb +1 -3
- data/test/jvm/example_test.rb +6 -2
- data/test/jvm/extensions/array_extensions_test.rb +181 -0
- data/test/jvm/extensions/collection_extensions_test.rb +195 -0
- data/test/jvm/{enumerable_test.rb → extensions/enumerable_test.rb} +81 -13
- data/test/jvm/extensions/hash_extensions_test.rb +56 -0
- data/test/jvm/extensions/list_extensions_test.rb +143 -0
- data/test/jvm/extensions/lock_extensions_test.rb +43 -0
- data/test/jvm/{numeric_extensions_test.rb → extensions/numeric_extensions_test.rb} +0 -0
- data/test/jvm/extensions/numeric_operators_test.rb +86 -0
- data/test/jvm/extensions/object_extensions_test.rb +122 -0
- data/test/jvm/{string_builder_extensions_test.rb → extensions/string_builder_extensions_test.rb} +0 -0
- data/test/jvm/{string_extensions_test.rb → extensions/string_extensions_test.rb} +57 -4
- data/test/jvm/generics_test.rb +14 -6
- data/test/jvm/import_test.rb +38 -1
- data/test/jvm/interface_test.rb +17 -0
- data/test/jvm/jvm_commands_test.rb +9 -0
- data/test/jvm/jvm_compiler_test.rb +568 -43
- data/test/jvm/macros_test.rb +343 -19
- data/test/jvm/main_method_test.rb +1 -3
- data/test/jvm/new_backend_test_helper.rb +54 -7
- data/test/jvm/rescue_test.rb +20 -5
- data/test/jvm/static_fields_test.rb +52 -10
- data/test/jvm/{mirror_compilation_test_helper.rb → string_test.rb} +10 -9
- data/test/jvm/varargs_test.rb +6 -16
- data/test/mirrors/base_type_test.rb +20 -7
- data/test/mirrors/bytecode_mirror_test.rb +8 -3
- data/test/mirrors/generics_test.rb +89 -10
- data/test/mirrors/member_test.rb +1 -1
- data/test/mirrors/method_lookup_test.rb +10 -3
- data/test/mirrors/mirrors_test.rb +20 -20
- data/test/mirrors/simple_async_mirror_loader_test.rb +1 -1
- data/test/mirrors/simple_mirror_loader_test.rb +1 -1
- data/test/newMirahClass$Closure2.class +0 -0
- data/test/newMirahClass.class +0 -0
- data/test/test_helper.rb +8 -1
- metadata +31 -16
- data/bin/bundler +0 -16
- data/bin/rake +0 -16
- data/examples/ant/example-build.xml~ +0 -7
- data/examples/test.edb +0 -9
- data/lib/mirah/compiler.rb +0 -67
- data/lib/mirah/parser.rb +0 -224
- data/lib/mirah/util/delegate.rb +0 -65
- data/test/jvm/list_extensions_test.rb +0 -23
data/test/jvm/{string_builder_extensions_test.rb → extensions/string_builder_extensions_test.rb}
RENAMED
File without changes
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
1
3
|
# Copyright (c) 2013 The Mirah project authors. All Rights Reserved.
|
2
4
|
# All contributing project authors may be found in the NOTICE file.
|
3
5
|
#
|
@@ -55,18 +57,69 @@ class StringExtensionsTest < Test::Unit::TestCase
|
|
55
57
|
end
|
56
58
|
|
57
59
|
def test_string_match
|
60
|
+
cls, = compile(%q{puts 'byeby'.match(/b(.*)y/)[1]})
|
61
|
+
assert_run_output("yeb\n", cls)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_string_matches
|
58
65
|
cls, = compile("def match; 'abcdef' =~ /d/; end")
|
59
66
|
assert cls.match, 'failed to match string'
|
60
67
|
end
|
61
68
|
|
62
|
-
def
|
63
|
-
cls, = compile("def
|
64
|
-
refute cls.
|
69
|
+
def test_string_doesnt_match
|
70
|
+
cls, = compile("def doesnt_match; 'abcdef' =~ /g/; end")
|
71
|
+
refute cls.doesnt_match, 'mistakenly matched string'
|
65
72
|
end
|
66
73
|
|
67
|
-
def
|
74
|
+
def test_string_matches_wrong_type
|
68
75
|
assert_raises Mirah::MirahError do
|
69
76
|
compile("def match_wrong_type; 'abcdef' =~ 'd'; end")
|
70
77
|
end
|
71
78
|
end
|
79
|
+
|
80
|
+
def test_string_to_int_invalid_number
|
81
|
+
cls, = compile(<<-EOF)
|
82
|
+
puts 'abc'.to_int
|
83
|
+
EOF
|
84
|
+
assert_raise_java Java::JavaLang::NumberFormatException do
|
85
|
+
cls.main nil
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_string_to_int_valid_number
|
90
|
+
cls, = compile(<<-EOF)
|
91
|
+
puts '-987654321'.to_int
|
92
|
+
EOF
|
93
|
+
assert_run_output("-987654321\n", cls)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_string_to_int_too_big_number
|
97
|
+
cls, = compile(<<-EOF)
|
98
|
+
puts '-9876543210'.to_int
|
99
|
+
EOF
|
100
|
+
assert_raise_java Java::JavaLang::NumberFormatException do
|
101
|
+
cls.main nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_string_each_codepoint_1_block_argument
|
106
|
+
cls, = compile(%q{
|
107
|
+
"abc\u1234\U0010FFFF\u5678de𠀘f".each_codepoint do |codepoint|
|
108
|
+
puts codepoint
|
109
|
+
end
|
110
|
+
})
|
111
|
+
assert_run_output("97\n98\n99\n4660\n1114111\n22136\n100\n101\n131096\n102\n", cls)
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_string_each_codepoint_0_block_arguments
|
115
|
+
cls, = compile(%q{
|
116
|
+
count = 0
|
117
|
+
"abc\u1234\U0010FFFF\u5678de𠀘f".each_codepoint do
|
118
|
+
count+=1
|
119
|
+
end
|
120
|
+
puts count
|
121
|
+
})
|
122
|
+
assert_run_output("10\n", cls)
|
123
|
+
end
|
72
124
|
end
|
125
|
+
|
data/test/jvm/generics_test.rb
CHANGED
@@ -27,9 +27,7 @@ class GenericsTest < Test::Unit::TestCase
|
|
27
27
|
puts(foo.get(1).substring(2))
|
28
28
|
EOF
|
29
29
|
|
30
|
-
|
31
|
-
cls.main(nil)
|
32
|
-
end
|
30
|
+
assert_run_output("cond string\n", cls)
|
33
31
|
end
|
34
32
|
|
35
33
|
def test_generics_generic_payload
|
@@ -44,10 +42,20 @@ class GenericsTest < Test::Unit::TestCase
|
|
44
42
|
puts(bar.get(0).get(1).substring(2))
|
45
43
|
EOF
|
46
44
|
|
47
|
-
|
48
|
-
cls.main(nil)
|
49
|
-
end
|
45
|
+
assert_run_output("cond string\n", cls)
|
50
46
|
end
|
51
47
|
|
48
|
+
def test_generics_recursion
|
49
|
+
omit_if JVMCompiler::JVM_VERSION.to_f < 1.8
|
50
|
+
|
51
|
+
# Class signature for java.util.stream.Stream is recursive
|
52
|
+
#<T:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/stream/BaseStream<TT;Ljava/util/stream/Stream<TT;>;>;
|
53
|
+
cls, = compile(<<-EOF)
|
54
|
+
[10,5,8].stream.sorted.forEach { |i| puts i}
|
55
|
+
EOF
|
56
|
+
assert_run_output("5\n8\n10\n", cls)
|
57
|
+
end
|
58
|
+
|
59
|
+
|
52
60
|
end
|
53
61
|
|
data/test/jvm/import_test.rb
CHANGED
@@ -64,6 +64,21 @@ class ImportTest < Test::Unit::TestCase
|
|
64
64
|
assert_equal(["1", "2", "3"], list.to_a)
|
65
65
|
end
|
66
66
|
|
67
|
+
def test_static_import_constants
|
68
|
+
cls, = compile(<<-EOF)
|
69
|
+
import java.awt.Color
|
70
|
+
import static java.awt.Color.*
|
71
|
+
def _red:Color
|
72
|
+
red
|
73
|
+
end
|
74
|
+
def _RED:Color
|
75
|
+
RED
|
76
|
+
end
|
77
|
+
puts _RED === _red
|
78
|
+
EOF
|
79
|
+
assert_run_output("true\n", cls)
|
80
|
+
end
|
81
|
+
|
67
82
|
def test_static_import_nested_in_class
|
68
83
|
cls, = compile(<<-EOF)
|
69
84
|
import java.util.Arrays
|
@@ -92,7 +107,29 @@ class ImportTest < Test::Unit::TestCase
|
|
92
107
|
end
|
93
108
|
end
|
94
109
|
EOF
|
95
|
-
|
110
|
+
assert_run_output("hi\n", cls)
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_static_import_in_closure
|
114
|
+
cls, = compile(%q[
|
115
|
+
class StaticImportInClosure
|
116
|
+
def baz
|
117
|
+
b = 3
|
118
|
+
perform do
|
119
|
+
import static java.lang.Math.*
|
120
|
+
b = max(-9,-8)
|
121
|
+
end
|
122
|
+
b
|
123
|
+
end
|
124
|
+
|
125
|
+
def perform(runnable:Runnable)
|
126
|
+
runnable.run
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
puts StaticImportInClosure.new.baz
|
131
|
+
])
|
132
|
+
assert_run_output("-8\n", cls)
|
96
133
|
end
|
97
134
|
|
98
135
|
end
|
data/test/jvm/interface_test.rb
CHANGED
@@ -109,4 +109,21 @@ class InterfaceTest < Test::Unit::TestCase
|
|
109
109
|
end
|
110
110
|
EOF
|
111
111
|
end
|
112
|
+
|
113
|
+
def test_interface_with_default_method_compiles_on_java_8
|
114
|
+
omit_if JVMCompiler::JVM_VERSION.to_f < 1.8
|
115
|
+
|
116
|
+
cls, = compile(<<-'EOF', java_version: '1.8')
|
117
|
+
interface DefaultMe
|
118
|
+
def act(messages:String):void
|
119
|
+
puts "#{messages} all the things!"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
class WithDefault implements DefaultMe
|
124
|
+
end
|
125
|
+
WithDefault.new.act("default")
|
126
|
+
EOF
|
127
|
+
assert_run_output "default all the things!\n", cls
|
128
|
+
end
|
112
129
|
end
|
@@ -49,4 +49,13 @@ class JVMCommandsTest < Test::Unit::TestCase
|
|
49
49
|
)
|
50
50
|
end
|
51
51
|
end
|
52
|
+
|
53
|
+
def test_encoding
|
54
|
+
assert_output "default utf8 encoding test\n" do
|
55
|
+
Mirah.run(File.dirname(__FILE__)+"/../fixtures/utf8_test.mirah")
|
56
|
+
end
|
57
|
+
assert_output "cp1251 encoding test\n" do
|
58
|
+
Mirah.run('-encoding','cp1251',File.dirname(__FILE__)+"/../fixtures/cp1251_test.mirah")
|
59
|
+
end
|
60
|
+
end
|
52
61
|
end
|
@@ -271,12 +271,68 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
271
271
|
|
272
272
|
def test_class_name_from_file_with_underscore
|
273
273
|
foo, = compile("puts 'blah'", :name => 'class_name_test.mirah')
|
274
|
-
assert_equal('
|
274
|
+
assert_equal('ClassNameTestTopLevel', foo.java_class.name)
|
275
275
|
end
|
276
276
|
|
277
277
|
def test_class_name_from_file_with_dash
|
278
278
|
foo, = compile("puts 'blah'", :name => 'class-dash-test.mirah')
|
279
|
-
assert_equal('
|
279
|
+
assert_equal('ClassDashTestTopLevel', foo.java_class.name)
|
280
|
+
end
|
281
|
+
|
282
|
+
def test_class_name_from_file_used_within_source_match
|
283
|
+
cls, = compile(%q{
|
284
|
+
|
285
|
+
package array_subclass_test
|
286
|
+
|
287
|
+
class Subclass < Superclass2
|
288
|
+
def self.run
|
289
|
+
ArraySubclassTest.new.baz
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
class ArraySubclassTest
|
294
|
+
|
295
|
+
def baz()
|
296
|
+
bar(Subclass[3])
|
297
|
+
end
|
298
|
+
|
299
|
+
def bar(foo:Superclass2[])
|
300
|
+
"Success"
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
class Superclass2
|
305
|
+
end
|
306
|
+
}, :name => 'Superclass2.mirah')
|
307
|
+
assert_equal('Success', cls.run)
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_class_name_from_file_used_within_source_mismatch
|
311
|
+
cls, = compile(%q{
|
312
|
+
|
313
|
+
package array_subclass_test
|
314
|
+
|
315
|
+
class Subclass < Superclass2
|
316
|
+
def self.run
|
317
|
+
ArraySubclassTest.new.baz
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
class ArraySubclassTest
|
322
|
+
|
323
|
+
def baz()
|
324
|
+
bar(Subclass[3])
|
325
|
+
end
|
326
|
+
|
327
|
+
def bar(foo:Superclass2[])
|
328
|
+
"Success"
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
class Superclass2
|
333
|
+
end
|
334
|
+
}, :name => 'Superclass3.mirah')
|
335
|
+
assert_equal('Success', cls.run)
|
280
336
|
end
|
281
337
|
|
282
338
|
def test_puts
|
@@ -287,6 +343,35 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
287
343
|
assert_equal("Hello World!\n", output)
|
288
344
|
end
|
289
345
|
|
346
|
+
def test_puts_classmethod_no_args
|
347
|
+
cls, = compile(%q{
|
348
|
+
def foo
|
349
|
+
puts
|
350
|
+
puts
|
351
|
+
end
|
352
|
+
})
|
353
|
+
output = capture_output do
|
354
|
+
cls.foo
|
355
|
+
end
|
356
|
+
assert_equal("\n\n", output)
|
357
|
+
end
|
358
|
+
|
359
|
+
def test_puts_instancemethod_no_args
|
360
|
+
cls, = compile(%q{
|
361
|
+
class Foo
|
362
|
+
def foo
|
363
|
+
puts
|
364
|
+
puts
|
365
|
+
puts
|
366
|
+
end
|
367
|
+
end
|
368
|
+
})
|
369
|
+
output = capture_output do
|
370
|
+
cls.new.foo
|
371
|
+
end
|
372
|
+
assert_equal("\n\n\n", output)
|
373
|
+
end
|
374
|
+
|
290
375
|
def test_print
|
291
376
|
cls, = compile("def foo;print 'Hello World!';end")
|
292
377
|
output = capture_output do
|
@@ -766,7 +851,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
766
851
|
end
|
767
852
|
to_#{primitive} #{primitive}(1)
|
768
853
|
EOF
|
769
|
-
|
854
|
+
assert_run_output("1\n", cls)
|
770
855
|
rescue => e
|
771
856
|
raise "#{primitive} #{e.message}"
|
772
857
|
end
|
@@ -779,7 +864,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
779
864
|
end
|
780
865
|
to_#{type} #{type}(1)
|
781
866
|
EOF
|
782
|
-
|
867
|
+
assert_run_output("1.0\n", cls)
|
783
868
|
rescue => e
|
784
869
|
raise "#{type} #{e.message}"
|
785
870
|
end
|
@@ -791,7 +876,22 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
791
876
|
end
|
792
877
|
to_character char(65)
|
793
878
|
EOF
|
794
|
-
|
879
|
+
assert_run_output("A\n", cls)
|
880
|
+
end
|
881
|
+
|
882
|
+
def test_return_boxing_and_unboxing
|
883
|
+
cls, = compile(<<-EOF)
|
884
|
+
def box:Boolean
|
885
|
+
return true
|
886
|
+
end
|
887
|
+
|
888
|
+
def unbox:boolean
|
889
|
+
return Boolean.new(false)
|
890
|
+
end
|
891
|
+
|
892
|
+
EOF
|
893
|
+
assert_equal(true, cls.box)
|
894
|
+
assert_equal(false, cls.unbox)
|
795
895
|
end
|
796
896
|
|
797
897
|
def test_raise
|
@@ -859,11 +959,42 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
859
959
|
assert_equal(2, cls.foo_set(2))
|
860
960
|
assert_equal(2, cls.foo)
|
861
961
|
end
|
862
|
-
|
863
|
-
def
|
864
|
-
|
865
|
-
|
866
|
-
|
962
|
+
|
963
|
+
def test_promotion_to_boolean
|
964
|
+
cases = [
|
965
|
+
[ "String", "a" => true, nil => false ],
|
966
|
+
[ "boolean", true => true, false => false ],
|
967
|
+
[ "byte", 1 => true, 0 => true ],
|
968
|
+
[ "short", 1 => true, 0 => true ],
|
969
|
+
[ "int", 1 => true, 0 => true ],
|
970
|
+
[ "long", 1 => true, 0 => true ],
|
971
|
+
[ "char", 1 => true, 0 => true ],
|
972
|
+
[ "float", 1.0 => true, 0.0 => true ],
|
973
|
+
[ "double", 1.0 => true, 0.0 => true ],
|
974
|
+
].each do |type, cases|
|
975
|
+
cls, = compile(%Q[
|
976
|
+
class Foo
|
977
|
+
def self.foo(a:#{type})
|
978
|
+
if a
|
979
|
+
true
|
980
|
+
else
|
981
|
+
false
|
982
|
+
end
|
983
|
+
end
|
984
|
+
def self.foo_inverted(a:#{type})
|
985
|
+
unless a
|
986
|
+
true
|
987
|
+
else
|
988
|
+
false
|
989
|
+
end
|
990
|
+
end
|
991
|
+
end
|
992
|
+
])
|
993
|
+
cases.each do |input,boolean_value|
|
994
|
+
assert_equal( boolean_value, cls.foo(input))
|
995
|
+
assert_equal(!boolean_value, cls.foo_inverted(input))
|
996
|
+
end
|
997
|
+
end
|
867
998
|
end
|
868
999
|
|
869
1000
|
def test_if_expr
|
@@ -1238,9 +1369,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1238
1369
|
puts B1.new.foo("There")
|
1239
1370
|
EOF
|
1240
1371
|
|
1241
|
-
|
1242
|
-
cls.main(nil)
|
1243
|
-
end
|
1372
|
+
assert_run_output("Hi\nThere\n", cls)
|
1244
1373
|
end
|
1245
1374
|
|
1246
1375
|
def test_super
|
@@ -1279,18 +1408,14 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1279
1408
|
foo(0,0)
|
1280
1409
|
foo(0,0,0)
|
1281
1410
|
EOF
|
1282
|
-
|
1283
|
-
cls.main([].to_java :string)
|
1284
|
-
end
|
1411
|
+
assert_run_output("0\n1\n2\n0\n0\n2\n0\n0\n0\n", cls)
|
1285
1412
|
end
|
1286
1413
|
|
1287
1414
|
def test_field_read
|
1288
1415
|
cls, = compile(<<-EOF)
|
1289
1416
|
puts System.out.getClass.getName
|
1290
1417
|
EOF
|
1291
|
-
|
1292
|
-
cls.main([].to_java :String)
|
1293
|
-
end
|
1418
|
+
assert_run_output("java.io.PrintStream\n", cls)
|
1294
1419
|
end
|
1295
1420
|
|
1296
1421
|
def test_array_arguments
|
@@ -1341,9 +1466,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1341
1466
|
cls, = compile <<-CODE
|
1342
1467
|
print "apples \#{'oranges'}".replace('apples', 'oranges')
|
1343
1468
|
CODE
|
1344
|
-
|
1345
|
-
cls.main nil
|
1346
|
-
end
|
1469
|
+
assert_run_output("oranges oranges", cls)
|
1347
1470
|
end
|
1348
1471
|
|
1349
1472
|
def test_self_dot_static_methods
|
@@ -1440,9 +1563,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1440
1563
|
# EOF
|
1441
1564
|
# raise
|
1442
1565
|
# cls.main([].to_java :string)
|
1443
|
-
#
|
1444
|
-
# cls.main([].to_java :string)
|
1445
|
-
# end
|
1566
|
+
# assert_run_output("3.0\n", cls)
|
1446
1567
|
# end
|
1447
1568
|
|
1448
1569
|
def test_class_append_self
|
@@ -1485,6 +1606,19 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1485
1606
|
end
|
1486
1607
|
end
|
1487
1608
|
|
1609
|
+
def test_native
|
1610
|
+
cls, = compile(<<-EOF)
|
1611
|
+
class Foo
|
1612
|
+
native def foo; end
|
1613
|
+
end
|
1614
|
+
EOF
|
1615
|
+
|
1616
|
+
assert_raise_java java.lang.UnsatisfiedLinkError do
|
1617
|
+
a = cls.new
|
1618
|
+
a.foo
|
1619
|
+
end
|
1620
|
+
end
|
1621
|
+
|
1488
1622
|
def test_abstract
|
1489
1623
|
abstract_class, concrete_class = compile(<<-EOF)
|
1490
1624
|
abstract class Abstract
|
@@ -1506,6 +1640,54 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1506
1640
|
end
|
1507
1641
|
end
|
1508
1642
|
|
1643
|
+
def test_synchronized
|
1644
|
+
cls, = compile(<<-EOF)
|
1645
|
+
class Synchronized
|
1646
|
+
attr_accessor locked:boolean
|
1647
|
+
|
1648
|
+
synchronized def lock_and_unlock:void
|
1649
|
+
puts "Locking."
|
1650
|
+
Thread.sleep(100)
|
1651
|
+
self.locked = true
|
1652
|
+
puts "Waiting."
|
1653
|
+
self.wait
|
1654
|
+
puts "Unlocking."
|
1655
|
+
self.locked = false
|
1656
|
+
end
|
1657
|
+
|
1658
|
+
synchronized def locked?
|
1659
|
+
self.locked
|
1660
|
+
end
|
1661
|
+
|
1662
|
+
synchronized def notify_synchronized:void
|
1663
|
+
puts "Notifying."
|
1664
|
+
self.notify
|
1665
|
+
puts "Notified."
|
1666
|
+
end
|
1667
|
+
|
1668
|
+
def trigger:void
|
1669
|
+
while ! locked?
|
1670
|
+
Thread.sleep(10)
|
1671
|
+
end
|
1672
|
+
self.notify_synchronized
|
1673
|
+
end
|
1674
|
+
|
1675
|
+
def start_trigger
|
1676
|
+
s = self
|
1677
|
+
Thread.new do
|
1678
|
+
s.trigger
|
1679
|
+
end.start
|
1680
|
+
end
|
1681
|
+
end
|
1682
|
+
EOF
|
1683
|
+
|
1684
|
+
assert_output("Locking.\nWaiting.\nNotifying.\nNotified.\nUnlocking.\n") do
|
1685
|
+
a = cls.new
|
1686
|
+
a.start_trigger
|
1687
|
+
a.lock_and_unlock
|
1688
|
+
end
|
1689
|
+
end
|
1690
|
+
|
1509
1691
|
def test_return_void
|
1510
1692
|
script, = compile(<<-EOF)
|
1511
1693
|
def foo:void
|
@@ -1629,9 +1811,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1629
1811
|
puts java::util::Arrays.toString(String[5])
|
1630
1812
|
EOF
|
1631
1813
|
|
1632
|
-
|
1633
|
-
cls.main(nil)
|
1634
|
-
end
|
1814
|
+
assert_run_output("[null, null, null, null, null]\n", cls)
|
1635
1815
|
end
|
1636
1816
|
|
1637
1817
|
def test_getClass_on_object_array
|
@@ -1639,9 +1819,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1639
1819
|
puts Object[0].getClass.getName
|
1640
1820
|
EOF
|
1641
1821
|
|
1642
|
-
|
1643
|
-
cls.main(nil)
|
1644
|
-
end
|
1822
|
+
assert_run_output("[Ljava.lang.Object;\n", cls)
|
1645
1823
|
end
|
1646
1824
|
|
1647
1825
|
def test_nil_assign
|
@@ -1660,9 +1838,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1660
1838
|
puts Object(a)
|
1661
1839
|
EOF
|
1662
1840
|
|
1663
|
-
|
1664
|
-
cls.main(nil)
|
1665
|
-
end
|
1841
|
+
assert_run_output("null\n", cls)
|
1666
1842
|
end
|
1667
1843
|
|
1668
1844
|
def test_long_generation
|
@@ -1672,6 +1848,41 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1672
1848
|
EOF
|
1673
1849
|
end
|
1674
1850
|
|
1851
|
+
|
1852
|
+
def test_inconvertible_classes_cause_cast_error
|
1853
|
+
pend "waiting on better error picking" do
|
1854
|
+
ex = assert_raise Mirah::MirahError do
|
1855
|
+
compile(<<-EOF)
|
1856
|
+
class A;end
|
1857
|
+
class B;end
|
1858
|
+
def f(a:A): B
|
1859
|
+
B(a)
|
1860
|
+
end
|
1861
|
+
EOF
|
1862
|
+
end
|
1863
|
+
assert_equal("Cannot cast A to B.", ex.message)
|
1864
|
+
end
|
1865
|
+
end
|
1866
|
+
|
1867
|
+
def test_inconvertible_default_classes_cause_cast_error
|
1868
|
+
pend "waiting on better error picking" do
|
1869
|
+
ex = assert_raise Mirah::MirahError do
|
1870
|
+
compile(<<-EOF)
|
1871
|
+
import java.lang.Integer
|
1872
|
+
java.lang.Integer("a string")
|
1873
|
+
EOF
|
1874
|
+
end
|
1875
|
+
assert_equal("Cannot cast java.lang.Integer to java.lang.String.", ex.message)
|
1876
|
+
end
|
1877
|
+
end
|
1878
|
+
|
1879
|
+
def test_casting_up_should_work
|
1880
|
+
cls, = compile(<<-EOF)
|
1881
|
+
puts Object("a string")
|
1882
|
+
EOF
|
1883
|
+
assert_run_output("a string\n", cls)
|
1884
|
+
end
|
1885
|
+
|
1675
1886
|
def test_missing_class_with_block_raises_inference_error
|
1676
1887
|
# TODO(ribrdb): What is this test for?
|
1677
1888
|
ex = assert_raise Mirah::MirahError do
|
@@ -1682,15 +1893,165 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1682
1893
|
|
1683
1894
|
def test_bool_equality
|
1684
1895
|
cls, = compile("puts true == false")
|
1685
|
-
|
1686
|
-
cls.main(nil)
|
1687
|
-
end
|
1896
|
+
assert_run_output("false\n", cls)
|
1688
1897
|
end
|
1689
1898
|
|
1690
1899
|
def test_bool_inequality
|
1691
1900
|
cls, = compile("puts true != false")
|
1692
|
-
|
1693
|
-
|
1901
|
+
assert_run_output("true\n", cls)
|
1902
|
+
end
|
1903
|
+
|
1904
|
+
def test_double_equals_calls_equals_when_first_arg_not_nil
|
1905
|
+
cls, = compile(<<-EOF)
|
1906
|
+
class DoubleEqualsCalling
|
1907
|
+
def equals(other)
|
1908
|
+
puts "called"
|
1909
|
+
true
|
1910
|
+
end
|
1911
|
+
end
|
1912
|
+
DoubleEqualsCalling.new == nil
|
1913
|
+
EOF
|
1914
|
+
assert_run_output("called\n", cls)
|
1915
|
+
end
|
1916
|
+
|
1917
|
+
def test_double_equals_does_not_call_equals_when_first_arg_nil
|
1918
|
+
cls, = compile(<<-EOF)
|
1919
|
+
class DoubleEqualsCalling2
|
1920
|
+
def equals(other)
|
1921
|
+
puts "called"
|
1922
|
+
true
|
1923
|
+
end
|
1924
|
+
end
|
1925
|
+
nil == DoubleEqualsCalling2.new
|
1926
|
+
EOF
|
1927
|
+
assert_run_output("", cls)
|
1928
|
+
end
|
1929
|
+
|
1930
|
+
def test_double_equals_nil_literal_equals_nil_literal
|
1931
|
+
cls, = compile(<<-EOF)
|
1932
|
+
puts nil == nil
|
1933
|
+
EOF
|
1934
|
+
assert_run_output("true\n", cls)
|
1935
|
+
end
|
1936
|
+
|
1937
|
+
def test_double_equals_nil_ref_equals_nil_literal
|
1938
|
+
cls, = compile(<<-EOF)
|
1939
|
+
a = nil
|
1940
|
+
puts a == nil
|
1941
|
+
EOF
|
1942
|
+
assert_run_output("true\n", cls)
|
1943
|
+
end
|
1944
|
+
|
1945
|
+
def test_double_equals_cast_nil_ref_equals_nil_literal
|
1946
|
+
cls, = compile(<<-EOF)
|
1947
|
+
a = Object(nil)
|
1948
|
+
puts a == nil
|
1949
|
+
EOF
|
1950
|
+
assert_run_output("true\n", cls)
|
1951
|
+
end
|
1952
|
+
|
1953
|
+
def test_double_equals_compare_to_self_in_a_equals_method_def_has_warning
|
1954
|
+
cls = nil
|
1955
|
+
output = capture_output do
|
1956
|
+
cls, = compile(<<-EOF)
|
1957
|
+
class DoubleEqualsSelf
|
1958
|
+
def equals(other)
|
1959
|
+
other == self
|
1960
|
+
end
|
1961
|
+
end
|
1962
|
+
puts DoubleEqualsSelf.new == nil
|
1963
|
+
EOF
|
1964
|
+
end
|
1965
|
+
assert_include(
|
1966
|
+
"WARNING: == is now an alias for Object#equals(), === is now used for identity.\n" +
|
1967
|
+
"This use of == with self in equals() definition may cause a stack overflow in next release!",
|
1968
|
+
output)
|
1969
|
+
assert_run_output("false\n", cls)
|
1970
|
+
end
|
1971
|
+
|
1972
|
+
def test_double_equals_compare_to_self_in_a_equals_method_def_warning_includes_source
|
1973
|
+
cls = nil
|
1974
|
+
output = capture_output do
|
1975
|
+
cls, = compile(<<-EOF)
|
1976
|
+
class DoubleEqualsSelf
|
1977
|
+
def equals(other)
|
1978
|
+
other == self
|
1979
|
+
end
|
1980
|
+
end
|
1981
|
+
puts DoubleEqualsSelf.new == nil
|
1982
|
+
EOF
|
1983
|
+
end
|
1984
|
+
assert_include(
|
1985
|
+
" def equals(other)
|
1986
|
+
other == self
|
1987
|
+
end", output)
|
1988
|
+
assert_run_output("false\n", cls)
|
1989
|
+
end
|
1990
|
+
|
1991
|
+
def test_double_equals_self_compare_to_other_in_a_equals_method_def_has_warning
|
1992
|
+
cls = nil
|
1993
|
+
output = capture_output do
|
1994
|
+
cls, = compile(<<-EOF)
|
1995
|
+
class SelfDoubleEqualsOther
|
1996
|
+
def equals(other)
|
1997
|
+
self == other
|
1998
|
+
end
|
1999
|
+
end
|
2000
|
+
puts SelfDoubleEqualsOther.new == nil
|
2001
|
+
EOF
|
2002
|
+
end
|
2003
|
+
assert_include(
|
2004
|
+
"WARNING: == is now an alias for Object#equals(), === is now used for identity.\n" +
|
2005
|
+
"This use of == with self in equals() definition may cause a stack overflow in next release!",
|
2006
|
+
output)
|
2007
|
+
assert_run_output("false\n", cls)
|
2008
|
+
end
|
2009
|
+
|
2010
|
+
def test_triple_equals_with_ints
|
2011
|
+
cls, = compile(<<-EOF)
|
2012
|
+
puts 1 === 1
|
2013
|
+
puts 1 === 2
|
2014
|
+
puts 1 !== 2
|
2015
|
+
puts 1 !== 1
|
2016
|
+
EOF
|
2017
|
+
assert_run_output("true\nfalse\ntrue\nfalse\n", cls)
|
2018
|
+
end
|
2019
|
+
|
2020
|
+
def test_triple_equals_with_objects
|
2021
|
+
cls, = compile(<<-EOF)
|
2022
|
+
a = Object.new
|
2023
|
+
b = Object.new
|
2024
|
+
puts a === a
|
2025
|
+
puts a === b
|
2026
|
+
puts a !== b
|
2027
|
+
puts a !== a
|
2028
|
+
EOF
|
2029
|
+
assert_run_output("true\nfalse\ntrue\nfalse\n", cls)
|
2030
|
+
end
|
2031
|
+
|
2032
|
+
def test_triple_equals_with_arrays
|
2033
|
+
cls, = compile(<<-EOF)
|
2034
|
+
a = Object[1]
|
2035
|
+
b = Object[1]
|
2036
|
+
puts a === a
|
2037
|
+
puts a === b
|
2038
|
+
puts a !== b
|
2039
|
+
puts a !== a
|
2040
|
+
EOF
|
2041
|
+
assert_run_output("true\nfalse\ntrue\nfalse\n", cls)
|
2042
|
+
end
|
2043
|
+
|
2044
|
+
def test_double_equals_with_arrays
|
2045
|
+
pend "arrays are tricky" do
|
2046
|
+
cls, = compile(<<-EOF)
|
2047
|
+
a = Object[1]
|
2048
|
+
b = Object[1]
|
2049
|
+
puts a == a
|
2050
|
+
puts a == b
|
2051
|
+
puts a != b
|
2052
|
+
puts a != a
|
2053
|
+
EOF
|
2054
|
+
assert_run_output("true\true\nfalse\nfalse\n", cls)
|
1694
2055
|
end
|
1695
2056
|
end
|
1696
2057
|
|
@@ -1704,7 +2065,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1704
2065
|
print "OK"
|
1705
2066
|
EOF
|
1706
2067
|
|
1707
|
-
|
2068
|
+
assert_run_output("OK", cls)
|
1708
2069
|
end
|
1709
2070
|
|
1710
2071
|
def test_assign_int_to_double
|
@@ -1792,9 +2153,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1792
2153
|
puts Child.my_method
|
1793
2154
|
EOF
|
1794
2155
|
|
1795
|
-
|
1796
|
-
cls.main(nil)
|
1797
|
-
end
|
2156
|
+
assert_run_output("ran my method\n", cls)
|
1798
2157
|
end
|
1799
2158
|
|
1800
2159
|
def test_incompatible_meta_change
|
@@ -1831,6 +2190,44 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1831
2190
|
assert_output("0\n") { cls.foo(nil)}
|
1832
2191
|
assert_output("2\n") { cls.foo(arg.new)}
|
1833
2192
|
end
|
2193
|
+
|
2194
|
+
def test_local_method_conflict2
|
2195
|
+
cls, arg = compile(%q{
|
2196
|
+
|
2197
|
+
class Foo1
|
2198
|
+
|
2199
|
+
def equals(o:Foo1)
|
2200
|
+
self===o
|
2201
|
+
end
|
2202
|
+
end
|
2203
|
+
|
2204
|
+
class Bar
|
2205
|
+
attr_reader foo1:Foo1
|
2206
|
+
attr_reader foo2:Foo2
|
2207
|
+
|
2208
|
+
def foo1method(foo1:Foo1)
|
2209
|
+
puts (@foo1==foo1)
|
2210
|
+
@foo1 = foo1
|
2211
|
+
end
|
2212
|
+
|
2213
|
+
def foo2method(foo2:Foo2)
|
2214
|
+
puts (@foo2==foo2)
|
2215
|
+
@foo2 = foo2
|
2216
|
+
end
|
2217
|
+
end
|
2218
|
+
|
2219
|
+
class Foo2
|
2220
|
+
|
2221
|
+
def equals(o:Foo2)
|
2222
|
+
self===o
|
2223
|
+
end
|
2224
|
+
end
|
2225
|
+
|
2226
|
+
Bar.new.foo1method(Foo1.new)
|
2227
|
+
Bar.new.foo2method(Foo2.new)
|
2228
|
+
})
|
2229
|
+
assert_run_output("false\nfalse\n", cls)
|
2230
|
+
end
|
1834
2231
|
|
1835
2232
|
def test_incompatible_return_type_error_message
|
1836
2233
|
e = assert_raise_kind_of Mirah::MirahError do
|
@@ -1843,4 +2240,132 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
1843
2240
|
end
|
1844
2241
|
assert_equal "Invalid return type double, expected int",e.message
|
1845
2242
|
end
|
2243
|
+
|
2244
|
+
def test_inner_interface
|
2245
|
+
cls, arg = compile(%q{
|
2246
|
+
|
2247
|
+
class Foo1
|
2248
|
+
|
2249
|
+
interface Bar
|
2250
|
+
def baz:String; end
|
2251
|
+
end
|
2252
|
+
|
2253
|
+
class Foo2 implements Bar
|
2254
|
+
def baz
|
2255
|
+
"BAZ"
|
2256
|
+
end
|
2257
|
+
end
|
2258
|
+
end
|
2259
|
+
|
2260
|
+
|
2261
|
+
puts Foo2.new.baz
|
2262
|
+
})
|
2263
|
+
assert_run_output("BAZ\n", cls)
|
2264
|
+
end
|
2265
|
+
|
2266
|
+
def test_line_number_increase_by_multiline_sstring_literal
|
2267
|
+
e = assert_raise_kind_of Mirah::MirahError do
|
2268
|
+
cls, arg = compile(%q{
|
2269
|
+
class Foo
|
2270
|
+
CONST = 'a
|
2271
|
+
|
2272
|
+
|
2273
|
+
|
2274
|
+
b'
|
2275
|
+
end
|
2276
|
+
|
2277
|
+
|
2278
|
+
ERROR_SHOULD_BE_HERE
|
2279
|
+
})
|
2280
|
+
end
|
2281
|
+
assert_equal 11,e.diagnostic.getLineNumber
|
2282
|
+
end
|
2283
|
+
|
2284
|
+
def test_line_number_increase_by_multiline_dstring_literal
|
2285
|
+
e = assert_raise_kind_of Mirah::MirahError do
|
2286
|
+
cls, arg = compile(%q{
|
2287
|
+
class Foo
|
2288
|
+
CONST = "a
|
2289
|
+
|
2290
|
+
|
2291
|
+
|
2292
|
+
b"
|
2293
|
+
end
|
2294
|
+
|
2295
|
+
|
2296
|
+
ERROR_SHOULD_BE_HERE
|
2297
|
+
})
|
2298
|
+
end
|
2299
|
+
assert_equal 11,e.diagnostic.getLineNumber
|
2300
|
+
end
|
2301
|
+
|
2302
|
+
def test_late_superclass
|
2303
|
+
cls, arg = compile(%q{
|
2304
|
+
package subclass_test
|
2305
|
+
|
2306
|
+
class TestSubclassAsMethodParameter
|
2307
|
+
def bar(b:SuperClass)
|
2308
|
+
"baz"
|
2309
|
+
end
|
2310
|
+
|
2311
|
+
def foo
|
2312
|
+
a = SubClass.new
|
2313
|
+
bar(a)
|
2314
|
+
end
|
2315
|
+
end
|
2316
|
+
|
2317
|
+
class SubClass < SuperClass
|
2318
|
+
end
|
2319
|
+
|
2320
|
+
class SuperClass
|
2321
|
+
end
|
2322
|
+
|
2323
|
+
puts TestSubclassAsMethodParameter.new.foo
|
2324
|
+
})
|
2325
|
+
assert_run_output("baz\n", cls)
|
2326
|
+
end
|
2327
|
+
|
2328
|
+
def test_late_superinterface
|
2329
|
+
cls, arg = compile(%q{
|
2330
|
+
package late_superinterface
|
2331
|
+
|
2332
|
+
interface Interface2 < Interface1
|
2333
|
+
end
|
2334
|
+
|
2335
|
+
interface Interface3 < Interface2
|
2336
|
+
end
|
2337
|
+
|
2338
|
+
interface Interface1
|
2339
|
+
end
|
2340
|
+
})
|
2341
|
+
end
|
2342
|
+
|
2343
|
+
def test_init_before_use_in_loop
|
2344
|
+
cls, arg = compile(%q{
|
2345
|
+
macro def loop_with_init(block:Block)
|
2346
|
+
i = block.arguments.required(0).name.identifier
|
2347
|
+
last = gensym
|
2348
|
+
quote do
|
2349
|
+
while `i` < `last`
|
2350
|
+
init { `i` = 0; `last` = 4}
|
2351
|
+
post { `i` = `i` + 1 }
|
2352
|
+
`block.body`
|
2353
|
+
end
|
2354
|
+
end
|
2355
|
+
end
|
2356
|
+
loop_with_init do |i|
|
2357
|
+
print i
|
2358
|
+
end
|
2359
|
+
})
|
2360
|
+
assert_run_output("0123", cls)
|
2361
|
+
end
|
2362
|
+
|
2363
|
+
def test_filename_shows_up_in_exception_upon_syntax_error
|
2364
|
+
begin
|
2365
|
+
foo, = compile("puts('foo',)", name: 'somespecificfilename.mirah')
|
2366
|
+
assert false
|
2367
|
+
rescue => e
|
2368
|
+
assert e.message.match(/somespecificfilename/)
|
2369
|
+
end
|
2370
|
+
end
|
1846
2371
|
end
|