comparison src/tests/gov/nasa/jpf/test/vm/basic/MethodTest.java @ 0:61d41facf527

initial v8 import (history reset)
author Peter Mehlitz <Peter.C.Mehlitz@nasa.gov>
date Fri, 23 Jan 2015 10:14:01 -0800
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:61d41facf527
1 /*
2 * Copyright (C) 2014, United States Government, as represented by the
3 * Administrator of the National Aeronautics and Space Administration.
4 * All rights reserved.
5 *
6 * The Java Pathfinder core (jpf-core) platform is licensed under the
7 * Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0.
11 *
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.
17 */
18 package gov.nasa.jpf.test.vm.basic;
19
20 import gov.nasa.jpf.util.test.TestJPF;
21
22 import org.junit.Test;
23
24
25 /**
26 * basic method invocation test
27 */
28
29
30 interface TMI {
31 void gna();
32 }
33
34 class TestMethodBase extends TestJPF implements TMI {
35
36 int baseData;
37
38 static int sData;
39
40 static {
41 sData = -1;
42 }
43
44 static void taz () {
45 sData = 24;
46 }
47
48 TestMethodBase (int a) {
49 assert a == 42;
50 baseData = 42;
51 }
52
53 boolean baz (boolean p, byte b, char c, short s, int i, long l, float f, double d, Object o) {
54 assert p;
55 assert b == 4;
56 assert c == '?';
57 assert s == 42;
58 assert i == 4242;
59 assert l == 424242;
60 assert f == 4.2f;
61 assert d == 4.242;
62 assert o.equals(new Integer(42));
63
64 baseData = 44;
65
66 return p;
67 }
68
69 void faz () {
70 gna();
71 }
72
73 @Override
74 public void gna () {
75 baseData = 0;
76 }
77
78 int har () {
79 return priv();
80 }
81
82 private int priv () {
83 return 7;
84 }
85 }
86
87 public class MethodTest extends TestMethodBase {
88
89 int data;
90
91 static void taz () {
92 sData = 9;
93 }
94
95 public MethodTest () {
96 super(42);
97
98 data = 42;
99 }
100
101 MethodTest (int a) {
102 super(a);
103
104 data = a;
105 }
106
107 double foo (boolean p, byte b, char c, short s, int i, long l, float f, double d, Object o) {
108 assert p;
109 assert b == 4;
110 assert c == '?';
111 assert s == 42;
112 assert i == 4242;
113 assert l == 424242;
114 assert f == 4.2f;
115 assert d == 4.242;
116 assert o.equals(new Integer(42));
117
118 data = 43;
119
120 return d;
121 }
122
123 @Override
124 public void gna () {
125 baseData = 45;
126 }
127
128 int priv () {
129 return 8;
130 }
131
132 @Test
133 public void testCtor() {
134 if (verifyNoPropertyViolation()) {
135 MethodTest o1 = new MethodTest();
136 assert o1.data == 42;
137 assert o1.baseData == 42;
138
139 MethodTest o2 = new MethodTest(42);
140 assert o2.data == 42;
141 assert o2.baseData == 42;
142 }
143 }
144
145 @Test
146 public void testCall() {
147 if (verifyNoPropertyViolation()) {
148 MethodTest o = new MethodTest();
149 assert o.foo(true, (byte) 4, '?', (short) 42, 4242, 424242, 4.2f, 4.242, new Integer(42)) == 4.242;
150 assert o.data == 43;
151 }
152 }
153
154 @Test
155 public void testInheritedCall() {
156 if (verifyNoPropertyViolation()) {
157 MethodTest o = new MethodTest();
158 assert o.baz(true, (byte) 4, '?', (short) 42, 4242, 424242, 4.2f, 4.242, new Integer(42));
159 assert o.baseData == 44;
160 }
161 }
162
163 @Test
164 public void testVirtualCall() {
165 if (verifyNoPropertyViolation()) {
166 MethodTest o = new MethodTest();
167 TestMethodBase b = o;
168
169 b.faz();
170 assert o.baseData == 45;
171 }
172 }
173
174 @Test
175 public void testSpecialCall() {
176 if (verifyNoPropertyViolation()) {
177 MethodTest o = new MethodTest();
178 assert o.har() == 7;
179 }
180 }
181
182 @Test
183 public void testStaticCall() {
184 if (verifyNoPropertyViolation()) {
185 assert TestMethodBase.sData == -1;
186
187 MethodTest.taz();
188 assert TestMethodBase.sData == 9;
189
190 TestMethodBase.taz();
191 assert TestMethodBase.sData == 24;
192
193 // used to be:
194 //TestMethod o = new TestMethod();
195 //o.taz();
196 // statically equiv. to this: (no warnings) - pcd
197 new MethodTest();
198 MethodTest.taz();
199
200 assert TestMethodBase.sData == 9;
201 }
202 }
203
204 @Test
205 public void testInterfaceCall() {
206 if (verifyNoPropertyViolation()) {
207 MethodTest o = new MethodTest();
208 TMI ifc = o;
209
210 ifc.gna();
211 assert o.baseData == 45;
212 }
213 }
214
215 static class A {
216 public int foo () {
217 assert false : "should bever be invoked";
218 return -1;
219 }
220 }
221
222 static class A0 extends A {
223 @Override
224 public int foo () {
225 return 0;
226 }
227 }
228
229 static class A1 extends A {
230 @Override
231 public int foo () {
232 return 1;
233 }
234 }
235
236 /**
237 * this is tricky - both the allocations and the foo() calls have to be
238 * the same instructions, and we have to remove all 'a' references before
239 * forcing a GC. Otherwise we don't allocate 'a's with the same reference values
240 *
241 */
242 @Test public void testCallAcrossGC () {
243
244 if (verifyNoPropertyViolation()){
245 System.out.println("testing virtual calls on GC boundaries");
246 A a;
247
248 a = new A0();
249 assert a.foo() == 0 : "wrong A.foo() called for A0";
250
251 // do a GC
252 Runtime.getRuntime().gc(); // this should recycle 'a'
253
254 a = new A1();
255 assert a.foo() == 1 : "wrong A.foo() called for A1";
256 }
257 }
258 }