1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
4 # Copyright 2014 Romain Chanoir <romain.chanoir@courrier.uqam.ca>
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
10 # http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
19 # alt1 sets a wrong classpath and should fail on class loading
20 # alt2 looks for a non existant class
21 # alt3-4 looks for non existant methods
25 redef extern class JniEnv
26 fun print_error
(msg
: String)
29 if "NIT_TESTING".environ
!= "true" then exception_describe
34 print
"Compilation des classes Java ..."
35 assert sys
.system
("javac test_jvm/Queue.java") == 0
36 assert sys
.system
("javac test_jvm/Test2.java") == 0
37 assert sys
.system
("javac test_jvm/TestJvm.java") == 0
39 print
"Initialisation de la JVM ..."
41 var builder
= new JavaVMBuilder
42 builder
.options
.add
"-Djava.class.path=."
43 #alt1#builder.options.clear
44 #alt1#builder.options.add "-Djava.class.path=/tmp/"
45 var jvm
= builder
.create_jvm
49 assert not env
.address_is_null
51 print
"---------------------Test 1----------------------"
53 var queue_c
= env
.find_class
("test_jvm/Queue")
54 #alt2#queue_c = env.find_class("test_jvm/Queue_error_in_name")
55 if queue_c
.address_is_null
then env
.print_error
("Queue class not found")
57 # get the methods of the class
58 var f_init
= env
.get_method_id
(queue_c
, "<init>", "()V")
59 if f_init
.address_is_null
then env
.print_error
("fInit not found")
61 var f_push
= env
.get_method_id
(queue_c
, "push", "(Ljava/lang/String;)V")
62 #alt3#f_push = env.get_method_id(queue_c, "push_error", "(Ljava/lang/String;)V")
63 #alt4#f_push = env.get_method_id(queue_c, "push", "(Ljava/lang/String;ZZZ)V")
64 if f_push
.address_is_null
then env
.print_error
("fPush not found")
66 var f_pop
= env
.get_method_id
(queue_c
, "pop", "()Ljava/lang/String;")
67 if f_pop
.address_is_null
then env
.print_error
("fPop not found")
69 var element1
= "premier"
70 var element2
= "deuxième"
71 var element3
= "troisième"
74 var queue
= env
.new_object
(queue_c
, f_init
)
75 if queue
.address_is_null
then env
.print_error
("object not initialized")
77 var arg_tab
= new Array[Object].with_items
(element1
)
79 # first call to push method
80 env
.call_void_method
(queue
, f_push
, arg_tab
)
81 arg_tab
= new Array[Object].with_items
(element2
)
82 env
.call_void_method
(queue
, f_push
, arg_tab
)
83 arg_tab
= new Array[Object].with_items
(element3
)
84 env
.call_void_method
(queue
, f_push
, arg_tab
)
86 var el
= env
.call_string_method
(queue
, f_pop
, null)
88 el
= env
.call_string_method
(queue
, f_pop
, null)
90 el
= env
.call_string_method
(queue
, f_pop
, null)
93 print
"--------------------Test 2---------------------"
95 var test_c
= env
.find_class
("test_jvm/TestJvm")
96 if test_c
.address_is_null
then env
.print_error
("TestJvm class not found")
98 f_init
= env
.get_method_id
(test_c
, "<init>", "()V")
99 if f_init
.address_is_null
then env
.print_error
("finit not found")
101 # Get the different methods ids
102 var m_bool
= env
.get_method_id
(test_c
, "isBool", "()Z")
103 if m_bool
.address_is_null
then env
.print_error
("mbool not found")
104 var m_char
= env
.get_method_id
(test_c
, "getC", "()C")
105 if m_char
.address_is_null
then env
.print_error
("mchar not found")
106 var m_i
= env
.get_method_id
(test_c
, "getI", "()I")
107 if m_i
.address_is_null
then env
.print_error
("mi not found")
108 var m_f
= env
.get_method_id
(test_c
, "getF", "()F")
109 if m_f
.address_is_null
then env
.print_error
("mf not found")
110 var m_test
= env
.get_method_id
(test_c
, "getTest", "()Ltest_jvm/Test2;")
111 if m_test
.address_is_null
then env
.print_error
("mtest not found")
114 var f_bool
=env
.get_field_id
(test_c
, "bool", "Z")
115 if f_bool
.address_is_null
then env
.print_error
("fbool not found")
116 var f_char
= env
.get_field_id
(test_c
, "c", "C")
117 if f_char
.address_is_null
then env
.print_error
("fchar not found")
118 var f_i
=env
.get_field_id
(test_c
, "i", "I")
119 if f_i
.address_is_null
then env
.print_error
("fi not found")
120 var f_f
= env
.get_field_id
(test_c
, "f", "F")
121 if f_f
.address_is_null
then env
.print_error
("ff not found")
122 var f_test
= env
.get_field_id
(test_c
, "test", "Ltest_jvm/TestJvm;")
125 var test
= env
.new_object
(test_c
, f_init
)
126 if test
.address_is_null
then env
.print_error
("object test not initialized")
128 # Retrieve field value with field ids
129 var v_bool
= env
.get_boolean_field
(test
, f_bool
)
130 var v_char
= env
.get_char_field
(test
, f_char
)
131 var v_i
= env
.get_int_field
(test
, f_i
)
132 var v_f
= env
.get_float_field
(test
, f_f
)
133 var v_test1
= env
.get_object_field
(test
, f_test
)
135 # Set the new values for the fields
136 env
.set_boolean_field
(test
, f_bool
, true)
137 env
.set_char_field
(test
, f_char
, 'D')
138 env
.set_int_field
(test
, f_i
, 10)
139 env
.set_float_field
(test
, f_f
, 15.5)
140 env
.set_object_field
(test
, f_test
, test
)
142 # get the values using getter method
143 v_bool
= env
.call_boolean_method
(test
, m_bool
, null)
144 v_char
= env
.call_char_method
(test
, m_char
, null)
145 v_i
= env
.call_int_method
(test
, m_i
, null)
146 v_f
= env
.call_float_method
(test
, m_f
, null)
147 var v_test2
= env
.call_object_method
(test
, m_test
, null)
149 # assert the values of the fields