mirah 0.1.0.pre-java → 0.1.1-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.
- data/History.txt +736 -0
- data/README.md +71 -0
- data/Rakefile +227 -73
- data/examples/Fib.class +0 -0
- data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +2 -3
- data/examples/simple_class.mirah +3 -3
- data/examples/{dynamic.mirah → simple_class.mirah~} +7 -12
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-builtins.jar +0 -0
- data/javalib/mirah-compiler.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/javalib/mirah-util.jar +0 -0
- data/lib/mirah.rb +8 -1
- data/lib/mirah/ast.rb +1 -1
- data/lib/mirah/ast/scope.rb +16 -0
- data/lib/mirah/commands/base.rb +1 -3
- data/lib/mirah/compiler.rb +17 -3
- data/lib/mirah/errors.rb +10 -10
- data/lib/mirah/generator.rb +21 -9
- data/lib/mirah/jvm/compiler.rb +17 -0
- data/lib/mirah/jvm/compiler/base.rb +24 -5
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +83 -20
- data/lib/mirah/jvm/method_lookup.rb +43 -22
- data/lib/mirah/jvm/types.rb +1 -2
- data/lib/mirah/jvm/types/array_type.rb +1 -6
- data/lib/mirah/jvm/types/ast_ext.rb +31 -0
- data/lib/mirah/jvm/types/basic_types.rb +1 -2
- data/lib/mirah/jvm/types/boolean.rb +11 -10
- data/lib/mirah/jvm/types/extensions.rb +14 -5
- data/lib/mirah/jvm/types/factory.rb +128 -43
- data/lib/mirah/jvm/types/floats.rb +8 -10
- data/lib/mirah/jvm/types/integers.rb +16 -9
- data/lib/mirah/jvm/types/intrinsics.rb +17 -69
- data/lib/mirah/jvm/types/meta_type.rb +5 -0
- data/lib/mirah/jvm/types/methods.rb +317 -151
- data/lib/mirah/jvm/types/methods.rb~ +973 -0
- data/lib/mirah/jvm/types/number.rb +29 -6
- data/lib/mirah/jvm/types/primitive_type.rb +35 -7
- data/lib/mirah/jvm/types/source_mirror.rb +11 -6
- data/lib/mirah/jvm/types/type.rb +52 -0
- data/lib/mirah/jvm/types/type_definition.rb +8 -2
- data/lib/mirah/transform/ast_ext.rb +9 -31
- data/lib/mirah/transform/transformer.rb +1 -1
- data/lib/mirah/typer.rb +2 -1
- data/lib/mirah/util/argument_processor.rb +10 -14
- data/lib/mirah/util/argument_processor.rb~ +146 -0
- data/lib/mirah/util/compilation_state.rb +15 -9
- data/lib/mirah/util/process_errors.rb +8 -2
- data/lib/mirah/version.rb +2 -2
- data/lib/mirah_task.rb +0 -7
- data/test/core/typer_test.rb +21 -13
- data/test/core/util/argument_processor_test.rb +19 -19
- data/test/core/util/class_loader_test.rb +19 -4
- data/test/core/util/compilation_state_test.rb +38 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
- data/test/jvm/blocks_test.rb +50 -29
- data/test/jvm/bytecode_test_helper.rb +71 -57
- data/test/jvm/cast_test.rb +162 -0
- data/test/jvm/constructors_test.rb +48 -0
- data/test/jvm/enumerable_test.rb +136 -7
- data/test/jvm/example_test.rb +39 -0
- data/test/jvm/factory_test.rb +6 -0
- data/test/jvm/generics_test.rb +0 -5
- data/test/jvm/import_test.rb +81 -0
- data/test/jvm/interface_test.rb +113 -0
- data/test/jvm/java_typer_test.rb +57 -11
- data/test/jvm/jvm_commands_test.rb +24 -0
- data/test/jvm/jvm_compiler_test.rb +186 -370
- data/test/jvm/macros_test.rb +67 -6
- data/test/jvm/main_method_test.rb +1 -1
- data/test/jvm/mirror_compilation_test_helper.rb +24 -0
- data/test/jvm/new_backend_test_helper.rb +25 -0
- data/test/jvm/rescue_test.rb +153 -18
- data/test/jvm/string_test.rb +41 -0
- data/test/jvm/varargs_test.rb +65 -0
- data/test/mirrors/base_type_test.rb +96 -0
- data/test/mirrors/bytecode_mirror_test.rb +86 -0
- data/test/mirrors/generics_test.rb +776 -0
- data/test/mirrors/member_test.rb +69 -0
- data/test/mirrors/method_lookup_test.rb +574 -0
- data/test/mirrors/mirrors_test.rb +562 -0
- data/test/mirrors/simple_async_mirror_loader_test.rb +110 -0
- data/test/mirrors/simple_mirror_loader_test.rb +104 -0
- data/test/test_helper.rb +2 -1
- metadata +244 -217
- data/README.txt +0 -59
- data/javalib/dynalink-0.2.jar +0 -0
- data/lib/mirah/jvm/typer.rb +0 -177
- data/lib/mirah/jvm/types/dynamic_type.rb +0 -45
- data/lib/mirah/jvm/types/unreachable_type.rb +0 -27
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Copyright (c) 2013 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
|
+
|
|
16
|
+
# these are here to make sure the examples still run.
|
|
17
|
+
#
|
|
18
|
+
class ExampleTest < Test::Unit::TestCase
|
|
19
|
+
def compile_ex name
|
|
20
|
+
filename = File.dirname(__FILE__) + "/../../examples/#{name}.mirah"
|
|
21
|
+
compile(open(filename).read).first
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def example_test name, output
|
|
25
|
+
cls = compile_ex name
|
|
26
|
+
assert_output(output) { cls.main nil }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
{
|
|
30
|
+
'simple_class' => "constructor\nHello, \nMirah\n",
|
|
31
|
+
'macros/square' => "2.0\n8.0\n",
|
|
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"
|
|
34
|
+
}.each do |example,output|
|
|
35
|
+
define_method "test_#{example}" do
|
|
36
|
+
example_test example, output
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
data/test/jvm/factory_test.rb
CHANGED
|
@@ -19,4 +19,10 @@ class FactoryTest < Test::Unit::TestCase
|
|
|
19
19
|
factory.bootclasspath = File.expand_path("#{__FILE__}/../../fixtures/") +"/"
|
|
20
20
|
assert factory.bootstrap_loader.get_resource 'org/foo/A.class'
|
|
21
21
|
end
|
|
22
|
+
|
|
23
|
+
def test_nil_classpath_is_ok
|
|
24
|
+
factory = Mirah::JVM::Types::TypeFactory.new
|
|
25
|
+
factory.classpath = nil
|
|
26
|
+
end
|
|
27
|
+
|
|
22
28
|
end
|
data/test/jvm/generics_test.rb
CHANGED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Copyright (c) 2013 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
|
+
|
|
16
|
+
class ImportTest < Test::Unit::TestCase
|
|
17
|
+
|
|
18
|
+
def test_quote_import
|
|
19
|
+
cls, = compile("import 'java.util.ArrayList'; def foo; ArrayList.new; end; foo")
|
|
20
|
+
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_no_quote_import
|
|
24
|
+
cls, = compile("import java.util.ArrayList; def foo; ArrayList.new; end; foo")
|
|
25
|
+
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_alias_import_as_syntax
|
|
29
|
+
cls, = compile("import java.util.ArrayList as AL; def foo; AL.new; end; foo")
|
|
30
|
+
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_alias_import_comma_syntax
|
|
34
|
+
cls, = compile("import 'AL', 'java.util.ArrayList'; def foo; AL.new; end; foo")
|
|
35
|
+
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_imported_decl
|
|
39
|
+
cls, = compile("import 'java.util.ArrayList'; def foo(a:ArrayList); a.size; end")
|
|
40
|
+
assert_equal 0, cls.foo(java.util.ArrayList.new)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_import_package_star
|
|
44
|
+
cls, = compile(<<-EOF)
|
|
45
|
+
import java.util.*
|
|
46
|
+
def foo
|
|
47
|
+
ArrayList.new
|
|
48
|
+
end
|
|
49
|
+
EOF
|
|
50
|
+
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_static_import
|
|
54
|
+
cls, = compile(<<-EOF)
|
|
55
|
+
import static java.util.Arrays.*
|
|
56
|
+
def list(x:Object[])
|
|
57
|
+
asList(x)
|
|
58
|
+
end
|
|
59
|
+
EOF
|
|
60
|
+
|
|
61
|
+
o = ["1", "2", "3"].to_java(:object)
|
|
62
|
+
list = cls.list(o)
|
|
63
|
+
assert_kind_of(Java::JavaUtil::List, list)
|
|
64
|
+
assert_equal(["1", "2", "3"], list.to_a)
|
|
65
|
+
|
|
66
|
+
cls, = compile(<<-EOF)
|
|
67
|
+
import java.util.Arrays
|
|
68
|
+
class StaticImports
|
|
69
|
+
import static Arrays.*
|
|
70
|
+
def list(x:Object[])
|
|
71
|
+
asList(x)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
EOF
|
|
75
|
+
|
|
76
|
+
list = cls.new.list(o)
|
|
77
|
+
assert_kind_of(Java::JavaUtil::List, list)
|
|
78
|
+
assert_equal(["1", "2", "3"], list.to_a)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Copyright (c) 2010-2013 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
|
+
|
|
16
|
+
class InterfaceTest < Test::Unit::TestCase
|
|
17
|
+
def test_interface
|
|
18
|
+
cls, = compile(<<-EOF)
|
|
19
|
+
import 'java.util.concurrent.Callable'
|
|
20
|
+
def foo(a:Callable)
|
|
21
|
+
a.call
|
|
22
|
+
end
|
|
23
|
+
EOF
|
|
24
|
+
result = cls.foo {0}
|
|
25
|
+
assert_equal 0, result
|
|
26
|
+
m = cls.java_class.java_method 'foo', java.util.concurrent.Callable
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test_interface_declaration
|
|
30
|
+
interface = compile('interface A; end').first
|
|
31
|
+
assert(interface.java_class.interface?)
|
|
32
|
+
assert_equal('A', interface.java_class.name)
|
|
33
|
+
|
|
34
|
+
a, b = compile('interface A; end; interface B < A; end')
|
|
35
|
+
assert_include(a, b.ancestors)
|
|
36
|
+
assert_equal('A', a.java_class.name)
|
|
37
|
+
assert_equal('B', b.java_class.name)
|
|
38
|
+
|
|
39
|
+
a, b, c = compile(<<-EOF)
|
|
40
|
+
interface A
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
interface B
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
interface C < A, B
|
|
47
|
+
end
|
|
48
|
+
EOF
|
|
49
|
+
|
|
50
|
+
assert_include(a, c.ancestors)
|
|
51
|
+
assert_include(b, c.ancestors)
|
|
52
|
+
assert_equal('A', a.java_class.name)
|
|
53
|
+
assert_equal('B', b.java_class.name)
|
|
54
|
+
assert_equal('C', c.java_class.name)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_interface_override_return_type
|
|
58
|
+
assert_raise_kind_of Mirah::MirahError do
|
|
59
|
+
compile(<<-EOF)
|
|
60
|
+
interface AnInterface
|
|
61
|
+
def a:int; end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
class AImpl implements AnInterface
|
|
65
|
+
def a
|
|
66
|
+
"foo"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
EOF
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def test_interface_implementation_with_non_array_params_doesnt_require_type_information
|
|
74
|
+
interface, a_impl = compile(<<-EOF)
|
|
75
|
+
interface InterfaceWithStrings
|
|
76
|
+
def arr(message:String):int; end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
class StringImpl implements InterfaceWithStrings
|
|
80
|
+
def blah(s:String) s.length ; end
|
|
81
|
+
def arr(message) blah message ; end
|
|
82
|
+
end
|
|
83
|
+
EOF
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def test_interface_implementation_with_array_params_requires_type_information
|
|
87
|
+
interface, a_impl = compile(<<-EOF)
|
|
88
|
+
interface InterfaceWithArrays
|
|
89
|
+
def arr(messages:String[]):int; end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
class ExplicitArrImpl implements InterfaceWithArrays
|
|
93
|
+
def blah(s:String[]) s.length ; end
|
|
94
|
+
def arr(messages:String[]) blah messages ; end
|
|
95
|
+
end
|
|
96
|
+
EOF
|
|
97
|
+
|
|
98
|
+
# this is the current behavior. I think we should fix it. nh
|
|
99
|
+
error = assert_raises Mirah::MirahError do
|
|
100
|
+
interface, a_impl = compile(<<-EOF)
|
|
101
|
+
interface InterfaceWithArrays
|
|
102
|
+
def arr(messages:String[]):int; end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
class ImplicitArrImpl implements InterfaceWithArrays
|
|
106
|
+
def blah(s:String[]) s.length ; end
|
|
107
|
+
def arr(messages) blah messages ; end
|
|
108
|
+
end
|
|
109
|
+
EOF
|
|
110
|
+
end
|
|
111
|
+
assert_equal "Cannot find instance method blah(java.lang.String) on ImplicitArrImpl", error.message
|
|
112
|
+
end
|
|
113
|
+
end
|
data/test/jvm/java_typer_test.rb
CHANGED
|
@@ -28,12 +28,15 @@ class JavaTyperTest < Test::Unit::TestCase
|
|
|
28
28
|
def setup
|
|
29
29
|
@types = Mirah::JVM::Types::TypeFactory.new
|
|
30
30
|
@scopes = SimpleScoper.new {|scoper, node| Mirah::AST::StaticScope.new(node, scoper)}
|
|
31
|
-
@typer = Mirah::Typer::Typer.new(@types, @scopes, nil)
|
|
31
|
+
@typer = Mirah::Typer::Typer.new(@types, @scopes, nil, nil)
|
|
32
32
|
@mirah = Mirah::Transform::Transformer.new(Mirah::Util::CompilationState.new, @typer)
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
def inferred_type(node)
|
|
36
|
-
|
|
35
|
+
def inferred_type(node, expression=false)
|
|
36
|
+
if node.kind_of? Java::MirahLangAst::Script
|
|
37
|
+
node = node.body
|
|
38
|
+
end
|
|
39
|
+
type = @typer.infer(node, expression).resolve
|
|
37
40
|
if type.name == ':error'
|
|
38
41
|
catch(:exit) do
|
|
39
42
|
process_errors([type])
|
|
@@ -42,10 +45,21 @@ class JavaTyperTest < Test::Unit::TestCase
|
|
|
42
45
|
type
|
|
43
46
|
end
|
|
44
47
|
|
|
48
|
+
def assert_errors_including(message, ast)
|
|
49
|
+
@typer.infer(ast, false)
|
|
50
|
+
actual_errors = []
|
|
51
|
+
process_inference_errors(@typer, [ast]) do |errors|
|
|
52
|
+
actual_errors += errors.map {|e| e.message.map{|m| m[0]}.join("\n")}
|
|
53
|
+
end
|
|
54
|
+
fail("no errors") if actual_errors.empty?
|
|
55
|
+
assert actual_errors.any?{|error| error =~ message },
|
|
56
|
+
"no errors with message \"#{message}\" in #{actual_errors}"
|
|
57
|
+
end
|
|
58
|
+
|
|
45
59
|
def method_type(target, name, args)
|
|
46
60
|
target = @types.cache_and_wrap(target)
|
|
47
61
|
args = args.map {|arg| @types.cache_and_wrap(arg) }
|
|
48
|
-
call = CallFuture.new(@types, nil, target, name, args, nil, nil)
|
|
62
|
+
call = CallFuture.new(@types, nil, target, true, name, args, nil, nil)
|
|
49
63
|
@types.getMethodType(call).return_type
|
|
50
64
|
end
|
|
51
65
|
|
|
@@ -212,6 +226,14 @@ class JavaTyperTest < Test::Unit::TestCase
|
|
|
212
226
|
assert_equal(@types.type(nil, 'byte'), method_type(ary, "[]", [int]).resolve)
|
|
213
227
|
end
|
|
214
228
|
|
|
229
|
+
|
|
230
|
+
def test_primitive_not_convertible_to_array_with_same_component_type
|
|
231
|
+
ary = @types.type(nil, 'byte', true)
|
|
232
|
+
byte = @types.type(nil, 'byte')
|
|
233
|
+
|
|
234
|
+
assert !primitive_convertible?(byte, ary)
|
|
235
|
+
end
|
|
236
|
+
|
|
215
237
|
def test_int
|
|
216
238
|
ast = parse("#{1 << 16}")
|
|
217
239
|
assert_equal(@types.type(nil, 'int'), inferred_type(ast))
|
|
@@ -221,17 +243,41 @@ class JavaTyperTest < Test::Unit::TestCase
|
|
|
221
243
|
ast = parse("#{1 << 33}")
|
|
222
244
|
assert_equal(@types.type(nil, 'long'), inferred_type(ast))
|
|
223
245
|
end
|
|
224
|
-
|
|
225
|
-
def
|
|
226
|
-
ast = parse("a
|
|
227
|
-
assert_equal
|
|
228
|
-
|
|
229
|
-
ast = parse("a = Object.new; a = dynamic('foo')")
|
|
230
|
-
assert_equal 'java.lang.Object', inferred_type(ast).name
|
|
246
|
+
|
|
247
|
+
def test_char
|
|
248
|
+
ast = parse("?a")
|
|
249
|
+
assert_equal(@types.type(nil, 'char'), inferred_type(ast))
|
|
231
250
|
end
|
|
232
251
|
|
|
233
252
|
def test_static_method
|
|
234
253
|
ast = parse("class Foo;def self.bar; 1; end; end; Foo.bar")
|
|
235
254
|
assert_equal(@types.type(nil, 'int'), inferred_type(ast))
|
|
236
255
|
end
|
|
256
|
+
|
|
257
|
+
def test_if_with_raise_has_non_raise_type
|
|
258
|
+
ast = parse("if true; 1; else; raise 'error'; end")
|
|
259
|
+
assert_equal(@types.type(nil, 'int'), inferred_type(ast))
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def test_rescue_with_raise_in_rescue_has_body_type
|
|
263
|
+
ast = parse("1 + begin; 1; rescue; raise 'error'; end")
|
|
264
|
+
assert_equal(@types.type(nil, 'int'), inferred_type(ast))
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def test_rescue_with_else_and_raise_in_rescue_has_else_type
|
|
268
|
+
ast = parse("1 + begin; ''; rescue; raise 'error'; else 1 end")
|
|
269
|
+
assert_equal(@types.type(nil, 'int'), inferred_type(ast))
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def test_type_cycle
|
|
273
|
+
ast = parse(<<-EOF)
|
|
274
|
+
def foo(a:String):Object
|
|
275
|
+
nil
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
a = "x"
|
|
279
|
+
a = foo(a)
|
|
280
|
+
EOF
|
|
281
|
+
assert_errors_including(/Cannot assign .*Object.* to .*String/, ast)
|
|
282
|
+
end
|
|
237
283
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Copyright (c) 2010 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
|
+
|
|
18
|
+
class JVMCommandsTest < Test::Unit::TestCase
|
|
19
|
+
def test_dash_e_eval
|
|
20
|
+
assert_output "1\n" do
|
|
21
|
+
Mirah::Commands::Run.new(['-e','puts 1']).execute
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
|
|
1
|
+
# Copyright (c) 2010-2013 The Mirah project authors. All Rights Reserved.
|
|
2
2
|
# All contributing project authors may be found in the NOTICE file.
|
|
3
3
|
#
|
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -14,13 +14,6 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
16
|
class JVMCompilerTest < Test::Unit::TestCase
|
|
17
|
-
def assert_raise_java(type, message="")
|
|
18
|
-
ex = assert_raise(NativeException) do
|
|
19
|
-
yield
|
|
20
|
-
end
|
|
21
|
-
assert_equal type, ex.cause.class
|
|
22
|
-
assert_equal message, ex.cause.message.to_s
|
|
23
|
-
end
|
|
24
17
|
|
|
25
18
|
def test_local
|
|
26
19
|
cls, = compile("def foo; a = 1; a; end")
|
|
@@ -147,10 +140,9 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
147
140
|
cls, = compile("def foo; a = char[2]; a; end")
|
|
148
141
|
assert_equal(Java::char[].java_class, cls.foo.class.java_class)
|
|
149
142
|
assert_equal([0,0], cls.foo.to_a)
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
# assert_equal(1, cls.foo)
|
|
143
|
+
|
|
144
|
+
cls, = compile("def foo; a = char[2]; a[0] = ?x; a[0]; end")
|
|
145
|
+
assert_equal(?x.ord, cls.foo)
|
|
154
146
|
|
|
155
147
|
cls, = compile("def foo; a = int[2]; a; end")
|
|
156
148
|
assert_equal(Java::int[].java_class, cls.foo.class.java_class)
|
|
@@ -206,29 +198,6 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
206
198
|
assert_equal([nil, nil], cls.foo.to_a)
|
|
207
199
|
end
|
|
208
200
|
|
|
209
|
-
def test_string_concat
|
|
210
|
-
cls, = compile("
|
|
211
|
-
def str_str; a = 'a'; b = 'b'; a + b; end
|
|
212
|
-
def str_boolean; a = 'a'; b = false; a + b; end
|
|
213
|
-
def str_float; a = 'a'; b = float(1.0); a + b; end
|
|
214
|
-
def str_double; a = 'a'; b = 1.0; a + b; end
|
|
215
|
-
def str_byte; a = 'a'; b = byte(1); a + b; end
|
|
216
|
-
def str_short; a = 'a'; b = short(1); a + b; end
|
|
217
|
-
def str_char; a = 'a'; b = char(123); a + b; end
|
|
218
|
-
def str_int; a = 'a'; b = 1; a + b; end
|
|
219
|
-
def str_long; a = 'a'; b = long(1); a + b; end
|
|
220
|
-
")
|
|
221
|
-
assert_equal("ab", cls.str_str)
|
|
222
|
-
assert_equal("afalse", cls.str_boolean)
|
|
223
|
-
assert_equal("a1.0", cls.str_float)
|
|
224
|
-
assert_equal("a1.0", cls.str_double)
|
|
225
|
-
assert_equal("a1", cls.str_byte)
|
|
226
|
-
assert_equal("a1", cls.str_short)
|
|
227
|
-
assert_equal("a{", cls.str_char)
|
|
228
|
-
assert_equal("a1", cls.str_int)
|
|
229
|
-
assert_equal("a1", cls.str_long)
|
|
230
|
-
end
|
|
231
|
-
|
|
232
201
|
def test_void_selfcall
|
|
233
202
|
cls, = compile("import 'System', 'java.lang.System'; def foo; System.gc; end; foo")
|
|
234
203
|
assert_nothing_raised {cls.foo}
|
|
@@ -266,61 +235,18 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
266
235
|
|
|
267
236
|
end
|
|
268
237
|
|
|
269
|
-
def test_import
|
|
270
|
-
cls, = compile("import 'java.util.ArrayList'; def foo; ArrayList.new; end; foo")
|
|
271
|
-
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
272
|
-
|
|
273
|
-
cls, = compile("import 'AL', 'java.util.ArrayList'; def foo; AL.new; end; foo")
|
|
274
|
-
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
def test_no_quote_import
|
|
278
|
-
cls, = compile("import java.util.ArrayList as AL; def foo; AL.new; end; foo")
|
|
279
|
-
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
280
|
-
|
|
281
|
-
cls, = compile("import java.util.ArrayList; def foo; ArrayList.new; end; foo")
|
|
282
|
-
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
283
|
-
end
|
|
284
|
-
|
|
285
|
-
def test_imported_decl
|
|
286
|
-
cls, = compile("import 'java.util.ArrayList'; def foo(a:ArrayList); a.size; end")
|
|
287
|
-
assert_equal 0, cls.foo(java.util.ArrayList.new)
|
|
288
|
-
end
|
|
289
|
-
|
|
290
|
-
def test_import_package
|
|
291
|
-
cls, = compile(<<-EOF)
|
|
292
|
-
import java.util.*
|
|
293
|
-
def foo
|
|
294
|
-
ArrayList.new
|
|
295
|
-
end
|
|
296
|
-
EOF
|
|
297
|
-
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
def test_interface
|
|
301
|
-
cls, = compile(<<-EOF)
|
|
302
|
-
import 'java.util.concurrent.Callable'
|
|
303
|
-
def foo(a:Callable)
|
|
304
|
-
a.call
|
|
305
|
-
end
|
|
306
|
-
EOF
|
|
307
|
-
result = cls.foo {0}
|
|
308
|
-
assert_equal 0, result
|
|
309
|
-
m = cls.java_class.java_method 'foo', java.util.concurrent.Callable
|
|
310
|
-
end
|
|
311
|
-
|
|
312
238
|
def test_class_decl
|
|
313
239
|
foo, = compile("class ClassDeclTest;end")
|
|
314
240
|
assert_equal('ClassDeclTest', foo.java_class.name)
|
|
315
241
|
end
|
|
316
242
|
|
|
317
243
|
def test_class_name_from_file_with_underscore
|
|
318
|
-
foo, = compile("System.out.println 'blah'", 'class_name_test.mirah')
|
|
244
|
+
foo, = compile("System.out.println 'blah'", :name => 'class_name_test.mirah')
|
|
319
245
|
assert_equal('ClassNameTest', foo.java_class.name)
|
|
320
246
|
end
|
|
321
247
|
|
|
322
248
|
def test_class_name_from_file_with_dash
|
|
323
|
-
foo, = compile("System.out.println 'blah'", 'class-dash-test.mirah')
|
|
249
|
+
foo, = compile("System.out.println 'blah'", :name => 'class-dash-test.mirah')
|
|
324
250
|
assert_equal('ClassDashTest', foo.java_class.name)
|
|
325
251
|
end
|
|
326
252
|
|
|
@@ -351,7 +277,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
351
277
|
|
|
352
278
|
def test_unless_fixnum
|
|
353
279
|
cls, = compile(<<-EOF)
|
|
354
|
-
def foo(a:
|
|
280
|
+
def foo(a:int)
|
|
355
281
|
values = boolean[5]
|
|
356
282
|
values[0] = true unless a < 0
|
|
357
283
|
values[1] = true unless a <= 0
|
|
@@ -385,7 +311,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
385
311
|
|
|
386
312
|
def test_if_fixnum
|
|
387
313
|
cls, = compile(<<-EOF)
|
|
388
|
-
def foo(a:
|
|
314
|
+
def foo(a:int)
|
|
389
315
|
if a < -5
|
|
390
316
|
-6
|
|
391
317
|
elsif a <= 0
|
|
@@ -462,7 +388,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
462
388
|
|
|
463
389
|
def test_trailing_conditions
|
|
464
390
|
cls, = compile(<<-EOF)
|
|
465
|
-
def foo(a:
|
|
391
|
+
def foo(a:int)
|
|
466
392
|
return '+' if a > 0
|
|
467
393
|
return '0' unless a < 0
|
|
468
394
|
'-'
|
|
@@ -489,25 +415,25 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
489
415
|
|
|
490
416
|
def test_loop
|
|
491
417
|
cls, = compile(
|
|
492
|
-
'def foo(a:
|
|
418
|
+
'def foo(a:int);while a > 0; a -= 1; System.out.println ".";end;end')
|
|
493
419
|
assert_equal('', capture_output{cls.foo(0)})
|
|
494
420
|
assert_equal(".\n", capture_output{cls.foo(1)})
|
|
495
421
|
assert_equal(".\n.\n", capture_output{cls.foo(2)})
|
|
496
422
|
|
|
497
423
|
cls, = compile(
|
|
498
|
-
'def foo(a:
|
|
424
|
+
'def foo(a:int);begin;a -= 1; System.out.println ".";end while a > 0;end')
|
|
499
425
|
assert_equal(".\n", capture_output{cls.foo(0)})
|
|
500
426
|
assert_equal(".\n", capture_output{cls.foo(1)})
|
|
501
427
|
assert_equal(".\n.\n", capture_output{cls.foo(2)})
|
|
502
428
|
|
|
503
429
|
cls, = compile(
|
|
504
|
-
'def foo(a:
|
|
430
|
+
'def foo(a:int);until a <= 0; a -= 1; System.out.println ".";end;end')
|
|
505
431
|
assert_equal('', capture_output{cls.foo(0)})
|
|
506
432
|
assert_equal(".\n", capture_output{cls.foo(1)})
|
|
507
433
|
assert_equal(".\n.\n", capture_output{cls.foo(2)})
|
|
508
434
|
|
|
509
435
|
cls, = compile(
|
|
510
|
-
'def foo(a:
|
|
436
|
+
'def foo(a:int);begin;a -= 1; System.out.println ".";end until a <= 0;end')
|
|
511
437
|
assert_equal(".\n", capture_output{cls.foo(0)})
|
|
512
438
|
assert_equal(".\n", capture_output{cls.foo(1)})
|
|
513
439
|
assert_equal(".\n.\n", capture_output{cls.foo(2)})
|
|
@@ -518,7 +444,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
518
444
|
|
|
519
445
|
# TODO: loop doesn't work unless you're explicitly in a class
|
|
520
446
|
# cls, = compile(<<-EOF)
|
|
521
|
-
# def bar(a:
|
|
447
|
+
# def bar(a:int)
|
|
522
448
|
# loop do
|
|
523
449
|
# a += 1
|
|
524
450
|
# break if a > 2
|
|
@@ -530,7 +456,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
530
456
|
|
|
531
457
|
loopy, = compile(<<-EOF)
|
|
532
458
|
class Loopy
|
|
533
|
-
def bar(a:
|
|
459
|
+
def bar(a:int)
|
|
534
460
|
loop do
|
|
535
461
|
a += 1
|
|
536
462
|
break if a > 2
|
|
@@ -701,7 +627,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
701
627
|
def test_fields
|
|
702
628
|
cls, = compile(<<-EOF)
|
|
703
629
|
class FieldTest
|
|
704
|
-
def initialize(a:
|
|
630
|
+
def initialize(a:int)
|
|
705
631
|
@a = a
|
|
706
632
|
end
|
|
707
633
|
|
|
@@ -709,7 +635,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
709
635
|
@a
|
|
710
636
|
end
|
|
711
637
|
|
|
712
|
-
def self.set_b(b:
|
|
638
|
+
def self.set_b(b:int)
|
|
713
639
|
@@b = b
|
|
714
640
|
end
|
|
715
641
|
|
|
@@ -791,58 +717,52 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
791
717
|
def _Double(a:double)
|
|
792
718
|
a
|
|
793
719
|
end
|
|
794
|
-
|
|
720
|
+
EOF
|
|
795
721
|
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
722
|
+
assert_equal(1.0, cls._Byte(1))
|
|
723
|
+
assert_equal(127.0, cls._Byte(127))
|
|
724
|
+
assert_equal(128.0, cls._Short(128))
|
|
725
|
+
assert_equal(32767.0, cls._Short(32767))
|
|
726
|
+
assert_equal(32768.0, cls._Int(32768))
|
|
727
|
+
assert_equal(2147483648.0, cls._Long(2147483648))
|
|
802
728
|
end
|
|
803
729
|
|
|
804
|
-
def
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
730
|
+
def test_argument_boxing
|
|
731
|
+
[ [:short], [:int,:integer], [:long], [:byte]].each do |types|
|
|
732
|
+
primitive, full = types.first, types.last
|
|
733
|
+
begin
|
|
734
|
+
cls, = compile(<<-EOF)
|
|
735
|
+
def to_#{primitive}(a:#{full.to_s.capitalize}):void
|
|
736
|
+
puts a
|
|
737
|
+
end
|
|
738
|
+
to_#{primitive} #{primitive}(1)
|
|
739
|
+
EOF
|
|
740
|
+
assert_output("1\n") { cls.main nil}
|
|
741
|
+
rescue => e
|
|
742
|
+
raise "#{primitive} #{e.message}"
|
|
816
743
|
end
|
|
817
|
-
|
|
818
|
-
|
|
744
|
+
end
|
|
745
|
+
%w[float double].each do |type|
|
|
746
|
+
begin
|
|
747
|
+
cls, = compile(<<-EOF)
|
|
748
|
+
def to_#{type}(a:#{type.to_s.capitalize}):void
|
|
749
|
+
puts a
|
|
750
|
+
end
|
|
751
|
+
to_#{type} #{type}(1)
|
|
752
|
+
EOF
|
|
753
|
+
assert_output("1.0\n") { cls.main nil}
|
|
754
|
+
rescue => e
|
|
755
|
+
raise "#{type} #{e.message}"
|
|
819
756
|
end
|
|
757
|
+
end
|
|
820
758
|
|
|
821
|
-
|
|
759
|
+
cls, = compile(<<-EOF)
|
|
760
|
+
def to_character(a:Character):void
|
|
761
|
+
puts a
|
|
822
762
|
end
|
|
763
|
+
to_character char(65)
|
|
823
764
|
EOF
|
|
824
|
-
|
|
825
|
-
assert_include(a, c.ancestors)
|
|
826
|
-
assert_include(b, c.ancestors)
|
|
827
|
-
assert_equal('A', a.java_class.name)
|
|
828
|
-
assert_equal('B', b.java_class.name)
|
|
829
|
-
assert_equal('C', c.java_class.name)
|
|
830
|
-
end
|
|
831
|
-
|
|
832
|
-
def test_interface_override_return_type
|
|
833
|
-
assert_raise Mirah::MirahError do
|
|
834
|
-
compile(<<-EOF)
|
|
835
|
-
interface A
|
|
836
|
-
def a:int; end
|
|
837
|
-
end
|
|
838
|
-
|
|
839
|
-
class Impl implements A
|
|
840
|
-
def a
|
|
841
|
-
"foo"
|
|
842
|
-
end
|
|
843
|
-
end
|
|
844
|
-
EOF
|
|
845
|
-
end
|
|
765
|
+
assert_output("A\n") { cls.main nil}
|
|
846
766
|
end
|
|
847
767
|
|
|
848
768
|
def test_raise
|
|
@@ -895,153 +815,6 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
895
815
|
end
|
|
896
816
|
end
|
|
897
817
|
|
|
898
|
-
def test_ensure
|
|
899
|
-
cls, = compile(<<-EOF)
|
|
900
|
-
def foo
|
|
901
|
-
1
|
|
902
|
-
ensure
|
|
903
|
-
System.out.println "Hi"
|
|
904
|
-
end
|
|
905
|
-
EOF
|
|
906
|
-
output = capture_output do
|
|
907
|
-
assert_equal(1, cls.foo)
|
|
908
|
-
end
|
|
909
|
-
assert_equal "Hi\n", output
|
|
910
|
-
|
|
911
|
-
cls, = compile(<<-EOF)
|
|
912
|
-
def foo
|
|
913
|
-
return 1
|
|
914
|
-
ensure
|
|
915
|
-
System.out.println "Hi"
|
|
916
|
-
end
|
|
917
|
-
EOF
|
|
918
|
-
output = capture_output do
|
|
919
|
-
assert_equal(1, cls.foo)
|
|
920
|
-
end
|
|
921
|
-
assert_equal "Hi\n", output
|
|
922
|
-
|
|
923
|
-
cls, = compile(<<-EOF)
|
|
924
|
-
def foo
|
|
925
|
-
begin
|
|
926
|
-
break
|
|
927
|
-
ensure
|
|
928
|
-
System.out.println "Hi"
|
|
929
|
-
end while false
|
|
930
|
-
end
|
|
931
|
-
EOF
|
|
932
|
-
output = capture_output do
|
|
933
|
-
cls.foo
|
|
934
|
-
end
|
|
935
|
-
assert_equal "Hi\n", output
|
|
936
|
-
end
|
|
937
|
-
|
|
938
|
-
def test_cast
|
|
939
|
-
cls, = compile(<<-EOF)
|
|
940
|
-
def f2b; byte(1.0); end
|
|
941
|
-
def f2s; short(1.0); end
|
|
942
|
-
def f2c; char(1.0); end
|
|
943
|
-
def f2i; int(1.0); end
|
|
944
|
-
def f2l; long(1.0); end
|
|
945
|
-
def f2d; int(1.0); end
|
|
946
|
-
|
|
947
|
-
def i2b; byte(1); end
|
|
948
|
-
def i2s; short(1); end
|
|
949
|
-
def i2c; char(1); end
|
|
950
|
-
def i2l; long(1); end
|
|
951
|
-
def i2f; float(1); end
|
|
952
|
-
def i2d; int(1); end
|
|
953
|
-
|
|
954
|
-
def b2s; short(byte(1)); end
|
|
955
|
-
def b2c; char(byte(1)); end
|
|
956
|
-
def b2i; int(byte(1)); end
|
|
957
|
-
def b2l; long(byte(1)); end
|
|
958
|
-
def b2f; float(byte(1)); end
|
|
959
|
-
def b2d; double(byte(1)); end
|
|
960
|
-
|
|
961
|
-
def s2b; byte(short(1)); end
|
|
962
|
-
def s2c; char(short(1)); end
|
|
963
|
-
def s2i; int(short(1)); end
|
|
964
|
-
def s2l; long(short(1)); end
|
|
965
|
-
def s2f; float(short(1)); end
|
|
966
|
-
def s2d; double(short(1)); end
|
|
967
|
-
|
|
968
|
-
def c2b; byte(char(1)); end
|
|
969
|
-
def c2s; short(char(1)); end
|
|
970
|
-
def c2i; int(char(1)); end
|
|
971
|
-
def c2l; long(char(1)); end
|
|
972
|
-
def c2f; float(char(1)); end
|
|
973
|
-
def c2d; double(char(1)); end
|
|
974
|
-
|
|
975
|
-
def l2b; byte(long(1)); end
|
|
976
|
-
def l2c; char(long(1)); end
|
|
977
|
-
def l2i; int(long(1)); end
|
|
978
|
-
def l2l; long(long(1)); end
|
|
979
|
-
def l2f; float(long(1)); end
|
|
980
|
-
def l2d; double(long(1)); end
|
|
981
|
-
|
|
982
|
-
def d2b; byte(1.0); end
|
|
983
|
-
def d2s; short(1.0); end
|
|
984
|
-
def d2c; char(1.0); end
|
|
985
|
-
def d2i; int(1.0); end
|
|
986
|
-
def d2l; long(1.0); end
|
|
987
|
-
def d2f; float(1.0); end
|
|
988
|
-
|
|
989
|
-
def hard_i2f(a:int)
|
|
990
|
-
float(if a < 0
|
|
991
|
-
a *= -1
|
|
992
|
-
a * 2
|
|
993
|
-
else
|
|
994
|
-
a * 2
|
|
995
|
-
end)
|
|
996
|
-
end
|
|
997
|
-
EOF
|
|
998
|
-
|
|
999
|
-
assert_equal 1, cls.b2s
|
|
1000
|
-
assert_equal 1, cls.b2c
|
|
1001
|
-
assert_equal 1, cls.b2i
|
|
1002
|
-
assert_equal 1, cls.b2l
|
|
1003
|
-
assert_equal 1.0, cls.b2f
|
|
1004
|
-
assert_equal 1.0, cls.b2d
|
|
1005
|
-
|
|
1006
|
-
assert_equal 1, cls.s2b
|
|
1007
|
-
assert_equal 1, cls.s2c
|
|
1008
|
-
assert_equal 1, cls.s2i
|
|
1009
|
-
assert_equal 1, cls.s2l
|
|
1010
|
-
assert_equal 1.0, cls.s2f
|
|
1011
|
-
assert_equal 1.0, cls.s2d
|
|
1012
|
-
|
|
1013
|
-
assert_equal 1, cls.c2b
|
|
1014
|
-
assert_equal 1, cls.c2s
|
|
1015
|
-
assert_equal 1, cls.c2i
|
|
1016
|
-
assert_equal 1, cls.c2l
|
|
1017
|
-
assert_equal 1.0, cls.c2f
|
|
1018
|
-
assert_equal 1.0, cls.c2d
|
|
1019
|
-
|
|
1020
|
-
assert_equal 1, cls.i2b
|
|
1021
|
-
assert_equal 1, cls.i2s
|
|
1022
|
-
assert_equal 1, cls.i2c
|
|
1023
|
-
assert_equal 1, cls.i2l
|
|
1024
|
-
assert_equal 1.0, cls.i2f
|
|
1025
|
-
assert_equal 1.0, cls.i2d
|
|
1026
|
-
|
|
1027
|
-
assert_equal 1, cls.f2b
|
|
1028
|
-
assert_equal 1, cls.f2s
|
|
1029
|
-
assert_equal 1, cls.f2c
|
|
1030
|
-
assert_equal 1, cls.f2i
|
|
1031
|
-
assert_equal 1, cls.f2l
|
|
1032
|
-
assert_equal 1.0, cls.f2d
|
|
1033
|
-
|
|
1034
|
-
assert_equal 1, cls.d2b
|
|
1035
|
-
assert_equal 1, cls.d2s
|
|
1036
|
-
assert_equal 1, cls.d2c
|
|
1037
|
-
assert_equal 1, cls.d2i
|
|
1038
|
-
assert_equal 1, cls.d2l
|
|
1039
|
-
assert_equal 1.0, cls.d2f
|
|
1040
|
-
|
|
1041
|
-
assert_equal 2.0, cls.hard_i2f(1)
|
|
1042
|
-
assert_equal 4.0, cls.hard_i2f(-2)
|
|
1043
|
-
end
|
|
1044
|
-
|
|
1045
818
|
def test_set
|
|
1046
819
|
cls, = compile(<<-EOF)
|
|
1047
820
|
def foo
|
|
@@ -1440,7 +1213,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1440
1213
|
|
|
1441
1214
|
def test_super
|
|
1442
1215
|
cls, = compile(<<-EOF)
|
|
1443
|
-
class
|
|
1216
|
+
class SuperEqual
|
|
1444
1217
|
def equals(other:Object); super(other); end
|
|
1445
1218
|
end
|
|
1446
1219
|
EOF
|
|
@@ -1501,43 +1274,6 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1501
1274
|
cls.make_one(nil)
|
|
1502
1275
|
end
|
|
1503
1276
|
|
|
1504
|
-
def test_java_lang_cast
|
|
1505
|
-
cls, = compile(<<-EOF)
|
|
1506
|
-
def foo(a:Object)
|
|
1507
|
-
Integer(a).intValue
|
|
1508
|
-
end
|
|
1509
|
-
EOF
|
|
1510
|
-
|
|
1511
|
-
assert_equal(2, cls.foo(java.lang.Integer.new(2)))
|
|
1512
|
-
end
|
|
1513
|
-
|
|
1514
|
-
def test_array_cast
|
|
1515
|
-
cls, = compile(<<-EOF)
|
|
1516
|
-
def foo(a:Object)
|
|
1517
|
-
bar(String[].cast(a))
|
|
1518
|
-
end
|
|
1519
|
-
|
|
1520
|
-
def bar(a:String[])
|
|
1521
|
-
a[0]
|
|
1522
|
-
end
|
|
1523
|
-
EOF
|
|
1524
|
-
|
|
1525
|
-
assert_equal("foo", cls.foo(["foo", "bar"].to_java(:string)))
|
|
1526
|
-
|
|
1527
|
-
cls, = compile(<<-EOF)
|
|
1528
|
-
def foo(a:Object)
|
|
1529
|
-
bar(int[].cast(a))
|
|
1530
|
-
end
|
|
1531
|
-
|
|
1532
|
-
def bar(a:int[])
|
|
1533
|
-
a[0]
|
|
1534
|
-
end
|
|
1535
|
-
EOF
|
|
1536
|
-
|
|
1537
|
-
assert_equal(2, cls.foo([2, 3].to_java(:int)))
|
|
1538
|
-
|
|
1539
|
-
end
|
|
1540
|
-
|
|
1541
1277
|
def test_string_interpolation
|
|
1542
1278
|
cls, = compile(<<-EOF)
|
|
1543
1279
|
def foo(name:String)
|
|
@@ -1628,6 +1364,18 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1628
1364
|
assert_equal("java.lang.Character$UnicodeBlock", subset.java_class.name)
|
|
1629
1365
|
end
|
|
1630
1366
|
|
|
1367
|
+
def test_lowercase_inner_class
|
|
1368
|
+
cls, = compile(<<-EOF)
|
|
1369
|
+
import org.foo.LowerCaseInnerClass
|
|
1370
|
+
|
|
1371
|
+
def foo
|
|
1372
|
+
LowerCaseInnerClass.inner.field
|
|
1373
|
+
end
|
|
1374
|
+
EOF
|
|
1375
|
+
|
|
1376
|
+
assert_equal(1234, cls.foo)
|
|
1377
|
+
end
|
|
1378
|
+
|
|
1631
1379
|
def test_class_literal
|
|
1632
1380
|
cls, = compile(<<-EOF)
|
|
1633
1381
|
def foo
|
|
@@ -1649,35 +1397,6 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1649
1397
|
assert_equal(false, cls.string(2))
|
|
1650
1398
|
end
|
|
1651
1399
|
|
|
1652
|
-
def test_static_import
|
|
1653
|
-
cls, = compile(<<-EOF)
|
|
1654
|
-
import java.util.Arrays
|
|
1655
|
-
include Arrays
|
|
1656
|
-
def list(x:Object[])
|
|
1657
|
-
asList(x)
|
|
1658
|
-
end
|
|
1659
|
-
EOF
|
|
1660
|
-
|
|
1661
|
-
o = ["1", "2", "3"].to_java(:object)
|
|
1662
|
-
list = cls.list(o)
|
|
1663
|
-
assert_kind_of(Java::JavaUtil::List, list)
|
|
1664
|
-
assert_equal(["1", "2", "3"], list.to_a)
|
|
1665
|
-
|
|
1666
|
-
cls, = compile(<<-EOF)
|
|
1667
|
-
import java.util.Arrays
|
|
1668
|
-
class StaticImports
|
|
1669
|
-
include Arrays
|
|
1670
|
-
def list(x:Object[])
|
|
1671
|
-
asList(x)
|
|
1672
|
-
end
|
|
1673
|
-
end
|
|
1674
|
-
EOF
|
|
1675
|
-
|
|
1676
|
-
list = cls.new.list(o)
|
|
1677
|
-
assert_kind_of(Java::JavaUtil::List, list)
|
|
1678
|
-
assert_equal(["1", "2", "3"], list.to_a)
|
|
1679
|
-
end
|
|
1680
|
-
|
|
1681
1400
|
# TODO: need a writable field somewhere...
|
|
1682
1401
|
# def test_field_write
|
|
1683
1402
|
# cls, = compile(<<-EOF)
|
|
@@ -1712,25 +1431,8 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1712
1431
|
assert_equal('Static Hello', output)
|
|
1713
1432
|
end
|
|
1714
1433
|
|
|
1715
|
-
def test_loop_in_ensure
|
|
1716
|
-
cls, = compile(<<-EOF)
|
|
1717
|
-
begin
|
|
1718
|
-
System.out.println "a"
|
|
1719
|
-
begin
|
|
1720
|
-
System.out.println "b"
|
|
1721
|
-
break
|
|
1722
|
-
end while false
|
|
1723
|
-
System.out.println "c"
|
|
1724
|
-
ensure
|
|
1725
|
-
System.out.println "ensure"
|
|
1726
|
-
end
|
|
1727
|
-
EOF
|
|
1728
|
-
|
|
1729
|
-
assert_output("a\nb\nc\nensure\n") { cls.main(nil) }
|
|
1730
|
-
end
|
|
1731
|
-
|
|
1732
1434
|
def test_return_type
|
|
1733
|
-
|
|
1435
|
+
assert_raise_kind_of Mirah::MirahError do
|
|
1734
1436
|
compile(<<-EOF)
|
|
1735
1437
|
class ReturnsA
|
|
1736
1438
|
def a:int
|
|
@@ -1740,7 +1442,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1740
1442
|
EOF
|
|
1741
1443
|
end
|
|
1742
1444
|
|
|
1743
|
-
|
|
1445
|
+
assert_raise_kind_of Mirah::MirahError do
|
|
1744
1446
|
compile(<<-EOF)
|
|
1745
1447
|
class ReturnsB
|
|
1746
1448
|
def self.a:String
|
|
@@ -1923,7 +1625,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1923
1625
|
|
|
1924
1626
|
cls, = compile(<<-EOF)
|
|
1925
1627
|
a = nil
|
|
1926
|
-
System.out.println a
|
|
1628
|
+
System.out.println Object(a)
|
|
1927
1629
|
EOF
|
|
1928
1630
|
|
|
1929
1631
|
assert_output("null\n") do
|
|
@@ -1960,7 +1662,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1960
1662
|
end
|
|
1961
1663
|
end
|
|
1962
1664
|
|
|
1963
|
-
def
|
|
1665
|
+
def test_field_setter_with_nil
|
|
1964
1666
|
cls, = compile(<<-EOF)
|
|
1965
1667
|
import mirah.lang.ast.*
|
|
1966
1668
|
a = Arguments.new
|
|
@@ -1971,4 +1673,118 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1971
1673
|
assert_output("OK") { cls.main(nil) }
|
|
1972
1674
|
end
|
|
1973
1675
|
|
|
1676
|
+
def test_assign_int_to_double
|
|
1677
|
+
cls, = compile(<<-EOF)
|
|
1678
|
+
def foo
|
|
1679
|
+
a = 1.0
|
|
1680
|
+
a = 0
|
|
1681
|
+
end
|
|
1682
|
+
EOF
|
|
1683
|
+
|
|
1684
|
+
assert_equal(0.0, cls.foo)
|
|
1685
|
+
end
|
|
1686
|
+
|
|
1687
|
+
def test_assign_int_to_double_with_additional_assign_is_int
|
|
1688
|
+
cls, = compile(<<-EOF)
|
|
1689
|
+
def foo
|
|
1690
|
+
a = 1.0
|
|
1691
|
+
b = a = 0
|
|
1692
|
+
end
|
|
1693
|
+
EOF
|
|
1694
|
+
assert(cls.foo.is_a? Fixnum)
|
|
1695
|
+
assert_equal(0, cls.foo)
|
|
1696
|
+
end
|
|
1697
|
+
|
|
1698
|
+
def test_assign_int_to_double_with_additional_assign_and_specified_return_as_double_is_double
|
|
1699
|
+
cls, = compile(<<-EOF)
|
|
1700
|
+
def foo : double
|
|
1701
|
+
a = 1.0
|
|
1702
|
+
b = a = 0
|
|
1703
|
+
end
|
|
1704
|
+
EOF
|
|
1705
|
+
assert(cls.foo.is_a? Float)
|
|
1706
|
+
assert_equal(0, cls.foo)
|
|
1707
|
+
end
|
|
1708
|
+
|
|
1709
|
+
def test_return_int_when_specified_return_as_double_is_double
|
|
1710
|
+
cls, = compile(<<-EOF)
|
|
1711
|
+
def foo : double
|
|
1712
|
+
0
|
|
1713
|
+
end
|
|
1714
|
+
EOF
|
|
1715
|
+
assert(cls.foo.is_a? Float)
|
|
1716
|
+
assert_equal(0, cls.foo)
|
|
1717
|
+
end
|
|
1718
|
+
|
|
1719
|
+
def test_assign_int_to_double_in_closure
|
|
1720
|
+
cls, = compile(<<-EOF)
|
|
1721
|
+
def bar(r:Runnable); r.run; end
|
|
1722
|
+
|
|
1723
|
+
def foo
|
|
1724
|
+
a = 1.0
|
|
1725
|
+
bar do
|
|
1726
|
+
a = 0
|
|
1727
|
+
end
|
|
1728
|
+
a
|
|
1729
|
+
end
|
|
1730
|
+
EOF
|
|
1731
|
+
|
|
1732
|
+
assert_equal(0.0, cls.foo)
|
|
1733
|
+
end
|
|
1734
|
+
|
|
1735
|
+
def test_array_literals_are_modifiable
|
|
1736
|
+
cls, = compile(<<-EOF)
|
|
1737
|
+
def foo
|
|
1738
|
+
arr = [1,2]
|
|
1739
|
+
arr.add(3)
|
|
1740
|
+
arr[2]
|
|
1741
|
+
end
|
|
1742
|
+
EOF
|
|
1743
|
+
|
|
1744
|
+
assert_equal(3, cls.foo)
|
|
1745
|
+
end
|
|
1746
|
+
|
|
1747
|
+
def test_static_method_inheritance
|
|
1748
|
+
cls, = compile(<<-EOF)
|
|
1749
|
+
class Parent
|
|
1750
|
+
def self.my_method
|
|
1751
|
+
'ran my method'
|
|
1752
|
+
end
|
|
1753
|
+
end
|
|
1754
|
+
|
|
1755
|
+
class Child < Parent
|
|
1756
|
+
end
|
|
1757
|
+
|
|
1758
|
+
puts Child.my_method
|
|
1759
|
+
EOF
|
|
1760
|
+
|
|
1761
|
+
assert_output "ran my method\n" do
|
|
1762
|
+
cls.main(nil)
|
|
1763
|
+
end
|
|
1764
|
+
end
|
|
1765
|
+
|
|
1766
|
+
def test_static_field_inheritance_lookup_with_dot
|
|
1767
|
+
cls, = compile(<<-EOF)
|
|
1768
|
+
import java.util.GregorianCalendar
|
|
1769
|
+
puts GregorianCalendar.AM
|
|
1770
|
+
EOF
|
|
1771
|
+
|
|
1772
|
+
assert_output "0\n" do
|
|
1773
|
+
cls.main(nil)
|
|
1774
|
+
end
|
|
1775
|
+
end
|
|
1776
|
+
|
|
1777
|
+
def test_static_field_inheritance_lookup_with_double_colon
|
|
1778
|
+
pend("double colon is treated special for lookup") {
|
|
1779
|
+
cls, = compile(<<-EOF)
|
|
1780
|
+
import java.util.GregorianCalendar
|
|
1781
|
+
puts GregorianCalendar::AM
|
|
1782
|
+
EOF
|
|
1783
|
+
|
|
1784
|
+
assert_output "0\n" do
|
|
1785
|
+
cls.main(nil)
|
|
1786
|
+
end
|
|
1787
|
+
}
|
|
1788
|
+
end
|
|
1789
|
+
|
|
1974
1790
|
end
|