MethodAccessTest.java revision 1243:df6c3e9c1a0b
1/* 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package jdk.nashorn.api.javaaccess.test; 27 28import static org.testng.AssertJUnit.assertEquals; 29import static org.testng.AssertJUnit.assertTrue; 30import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals; 31import java.util.Arrays; 32import java.util.Calendar; 33import java.util.Locale; 34import javax.script.ScriptEngine; 35import javax.script.ScriptEngineManager; 36import javax.script.ScriptException; 37import org.testng.TestNG; 38import org.testng.annotations.AfterClass; 39import org.testng.annotations.BeforeClass; 40import org.testng.annotations.Test; 41 42/** 43 * @test 44 * @build jdk.nashorn.api.javaaccess.test.SharedObject jdk.nashorn.api.javaaccess.test.Person jdk.nashorn.api.javaaccess.test.MethodAccessTest 45 * @run testng/othervm jdk.nashorn.api.javaaccess.test.MethodAccessTest 46 */ 47@SuppressWarnings("javadoc") 48public class MethodAccessTest { 49 50 private static ScriptEngine e = null; 51 private static SharedObject o = null; 52 53 public static void main(final String[] args) { 54 TestNG.main(args); 55 } 56 57 @BeforeClass 58 public static void setUpClass() throws ScriptException { 59 final ScriptEngineManager m = new ScriptEngineManager(); 60 e = m.getEngineByName("nashorn"); 61 o = new SharedObject(); 62 o.setEngine(e); 63 e.put("o", o); 64 e.eval("var SharedObject = Packages.jdk.nashorn.api.javaaccess.test.SharedObject;"); 65 e.eval("var Person = Packages.jdk.nashorn.api.javaaccess.test.Person;"); 66 } 67 68 @AfterClass 69 public static void tearDownClass() { 70 e = null; 71 o = null; 72 } 73 74 @Test 75 public void accessMethodthrowsCheckedException() throws ScriptException { 76 e.eval("try {" + 77 " var a = java.lang.Long.parseLong('foo');" + 78 "} catch(e) {" + 79 " var isThrown = true;" + 80 " var isNumberException = e instanceof java.lang.NumberFormatException;" + 81 "} finally {" + 82 " var isFinalized = true;" + 83 "}"); 84 assertEquals("Exception thrown", true, e.get("isThrown")); 85 assertEquals("Finally called", true, e.get("isFinalized")); 86 assertEquals("Type is NumberFormatException", true, e.get("isNumberException")); 87 } 88 89 @Test 90 public void accessMethodthrowsUnCheckedException() throws ScriptException { 91 e.eval("try {" + 92 " var a = java.lang.String.valueOf(null);" + 93 "} catch(e) {" + 94 " var isThrown = true;" + 95 " var isNumberException = e instanceof java.lang.NullPointerException;" + 96 "} finally {" + 97 " var isFinalized = true;" + 98 "}"); 99 assertEquals(true, e.get("isThrown")); 100 assertEquals(true, e.get("isFinalized")); 101 assertEquals(true, e.get("isNumberException")); 102 } 103 104 @Test 105 public void accessMethodStartsThread() throws ScriptException { 106 e.eval("o.methodStartsThread();"); 107 assertEquals(false, o.isFinished); 108 } 109 110 @Test 111 public void accessStaticMethod() throws ScriptException { 112 assertEquals(10, e.eval("java.lang.Math.abs(-10);")); 113 } 114 115 @Test 116 public void accessSynchronousMethod() throws ScriptException { 117 e.eval("var v = new java.util.Vector();" + "v.add(10);" + "v.add(20);" + "v.add(30);"); 118 assertEquals(10, e.eval("v[0]")); 119 assertEquals(20, e.eval("v[1]")); 120 assertEquals(30, e.eval("v[2]")); 121 assertEquals(3, e.eval("v.size()")); 122 } 123 124 @Test 125 public void accessStaticSynchronousMethod() throws ScriptException { 126 e.eval("var locales = java.util.Calendar.getAvailableLocales();"); 127 final Locale[] locales = (Locale[])e.get("locales"); 128 assertEquals(locales.length, Calendar.getAvailableLocales().length); 129 } 130 131 @Test 132 public void accessNativeMethod() throws ScriptException { 133 assertEquals(4.0, e.eval("java.lang.StrictMath.log10(10000);")); 134 } 135 136 @Test 137 public void accessConstructorOfAbstractClass() throws ScriptException { 138 e.eval("try {" + 139 " var a = new java.util.AbstractList();" + 140 " print('fail');" + 141 "} catch(e) {" + 142 " var isThrown = true;" + 143 "}"); 144 assertEquals(true, e.get("isThrown")); 145 } 146 147 @Test 148 public void accessMethodVoid() throws ScriptException { 149 o.isAccessed = false; 150 e.eval("o.voidMethod();"); 151 assertTrue(o.isAccessed); 152 } 153 154 @Test 155 public void accessMethodBoolean() throws ScriptException { 156 assertEquals(true, e.eval("o.booleanMethod(false);")); 157 assertEquals(false, e.eval("o.booleanMethod(true);")); 158 assertEquals(false, e.eval("o.booleanMethod('false');")); 159 assertEquals(true, e.eval("o.booleanMethod('');")); 160 assertEquals(true, e.eval("o.booleanMethod(0);")); 161 } 162 163 @Test 164 public void accessMethodInt() throws ScriptException { 165 assertEquals(0, e.eval("o.intMethod(0);")); 166 assertEquals(-200, e.eval("o.intMethod(-100);")); 167 assertEquals(0, e.eval("o.intMethod('0');")); 168 assertEquals(-200, e.eval("o.intMethod('-100');")); 169 } 170 171 @Test 172 public void accessMethodLong() throws ScriptException { 173 assertEquals((long)0, e.eval("o.longMethod(0);")); 174 assertEquals((long)400, e.eval("o.longMethod(200);")); 175 assertEquals((long) 0, e.eval("o.longMethod('0');")); 176 assertEquals((long) 400, e.eval("o.longMethod('200');")); 177 } 178 179 @Test 180 public void accessMethodByte() throws ScriptException { 181 assertEquals((byte) 0, e.eval("o.byteMethod(0);")); 182 assertEquals((byte) 10, e.eval("o.byteMethod(5);")); 183 assertEquals((byte) 0, e.eval("o.byteMethod('0');")); 184 assertEquals((byte) 10, e.eval("o.byteMethod('5');")); 185 } 186 187 @Test 188 public void accessMethodShort() throws ScriptException { 189 assertEquals((short)0, e.eval("o.shortMethod(0);")); 190 assertEquals((short)8000, e.eval("o.shortMethod(4000);")); 191 assertEquals((short) 0, e.eval("o.shortMethod('0');")); 192 assertEquals((short) 8000, e.eval("o.shortMethod('4000');")); 193 } 194 195 @Test 196 public void accessMethodChar() throws ScriptException { 197 assertEquals('A', e.eval("o.charMethod('a');")); 198 assertEquals('Z', e.eval("o.charMethod('z');")); 199 assertEquals(o.charMethod((char)0), e.eval("o.charMethod(0);")); 200 assertEquals(o.charMethod((char)3150), e.eval("o.charMethod(3150);")); 201 } 202 203 @Test 204 public void accessMethodFloat() throws ScriptException { 205 assertEquals(0.0f, e.eval("o.floatMethod(0.0);")); 206 assertEquals(4.2f, e.eval("o.floatMethod(2.1);")); 207 assertEquals(0.0f, e.eval("o.floatMethod('0.0');")); 208 assertEquals(4.2f, e.eval("o.floatMethod('2.1');")); 209 } 210 211 @Test 212 public void accessMethodDouble() throws ScriptException { 213 assertEquals(0.0, e.eval("o.doubleMethod(0.0);")); 214 assertEquals(14.0, e.eval("o.doubleMethod(7.0);")); 215 assertEquals(0.0, e.eval("o.doubleMethod('0.0');")); 216 assertEquals(14.0, e.eval("o.doubleMethod('7.0');")); 217 } 218 219 @Test 220 public void accessMethodBooleanBoxing() throws ScriptException { 221 assertEquals(Boolean.TRUE, e.eval("o.booleanBoxingMethod(java.lang.Boolean.FALSE);")); 222 assertEquals(Boolean.FALSE, e.eval("o.booleanBoxingMethod(java.lang.Boolean.TRUE);")); 223 assertEquals(Boolean.TRUE, e.eval("o.booleanBoxingMethod('');")); 224 assertEquals(Boolean.FALSE, e.eval("o.booleanBoxingMethod('false');")); 225 } 226 227 @Test 228 public void accessMethodIntBoxing() throws ScriptException { 229 assertEquals(0, e.eval("o.intBoxingMethod(0);")); 230 assertEquals(-200, e.eval("o.intBoxingMethod(-100);")); 231 assertTrue((int)e.eval("(new java.lang.Integer(2)).compareTo(10.0)") < 0); 232 } 233 234 @Test 235 public void accessMethodLongBoxing() throws ScriptException { 236 assertEquals((long) 0, e.eval("o.longBoxingMethod(0);")); 237 assertEquals((long) 400, e.eval("o.longBoxingMethod(200);")); 238 assertTrue((int)e.eval("(new java.lang.Long(2)).compareTo(10.0)") < 0); 239 } 240 241 @Test 242 public void accessMethodByteBoxing() throws ScriptException { 243 assertEquals((byte) 0, e.eval("o.byteBoxingMethod(0);")); 244 assertEquals((byte) 10, e.eval("o.byteBoxingMethod(5);")); 245 assertTrue((int)e.eval("(new java.lang.Byte(2)).compareTo(10.0)") < 0); 246 } 247 248 @Test 249 public void accessMethodShortBoxing() throws ScriptException { 250 assertEquals((short) 0, e.eval("o.shortBoxingMethod(0);")); 251 assertEquals((short) 8000, e.eval("o.shortBoxingMethod(4000);")); 252 assertTrue((int)e.eval("(new java.lang.Short(2)).compareTo(10.0)") < 0); 253 } 254 255 @Test 256 public void accessMethodCharBoxing() throws ScriptException { 257 assertEquals('A', e.eval("o.charBoxingMethod('a');")); 258 assertEquals('Z', e.eval("o.charBoxingMethod('z');")); 259 assertTrue((int)e.eval("(new java.lang.Character(2)).compareTo(10)") < 0); 260 } 261 262 @Test 263 public void accessMethodFloatBoxing() throws ScriptException { 264 assertEquals(0.0f, e.eval("o.floatBoxingMethod(0.0);")); 265 assertEquals(4.2f, e.eval("o.floatBoxingMethod(2.1);")); 266 assertTrue((int)e.eval("(new java.lang.Float(2.0)).compareTo(10.0)") < 0); 267 } 268 269 @Test 270 public void accessMethodDoubleBoxing() throws ScriptException { 271 assertEquals(0.0, e.eval("o.doubleBoxingMethod(0.0);")); 272 assertEquals(14.0, e.eval("o.doubleBoxingMethod(7.0);")); 273 assertTrue((int)e.eval("(new java.lang.Double(2)).compareTo(10.0)") < 0); 274 } 275 276 @Test 277 public void accessMethodString() throws ScriptException { 278 assertEquals("", e.eval("o.stringMethod('');")); 279 assertEquals("abcabc", e.eval("o.stringMethod('abc');")); 280 } 281 282 @Test 283 public void accessMethodObject() throws ScriptException { 284 e.put("so", new Person(5)); 285 e.eval("var rso = o.objectMethod(so);"); 286 assertEquals(new Person(10), e.get("rso")); 287 } 288 289 @Test 290 public void accessMethodBooleanArray() throws ScriptException { 291 assertTrue(Arrays.equals(o.booleanArrayMethod(o.publicBooleanArray), (boolean[])e.eval("o.booleanArrayMethod(o.publicBooleanArray);"))); 292 } 293 294 @Test 295 public void accessMethodIntArray() throws ScriptException { 296 assertArrayEquals(o.intArrayMethod(o.publicIntArray), (int[])e.eval("o.intArrayMethod(o.publicIntArray);")); 297 } 298 299 @Test 300 public void accessMethodLongArray() throws ScriptException { 301 assertArrayEquals(o.longArrayMethod(o.publicLongArray), (long[])e.eval("o.longArrayMethod(o.publicLongArray);")); 302 } 303 304 @Test 305 public void accessMethodByteArray() throws ScriptException { 306 assertArrayEquals(o.byteArrayMethod(o.publicByteArray), (byte[])e.eval("o.byteArrayMethod(o.publicByteArray);")); 307 } 308 309 @Test 310 public void accessMethodShortArray() throws ScriptException { 311 assertArrayEquals(o.shortArrayMethod(o.publicShortArray), (short[])e.eval("o.shortArrayMethod(o.publicShortArray);")); 312 } 313 314 @Test 315 public void accessMethodCharArray() throws ScriptException { 316 assertArrayEquals(o.charArrayMethod(o.publicCharArray), (char[])e.eval("o.charArrayMethod(o.publicCharArray);")); 317 } 318 319 @Test 320 public void accessMethodFloatArray() throws ScriptException { 321 assertArrayEquals(o.floatArrayMethod(o.publicFloatArray), (float[])e.eval("o.floatArrayMethod(o.publicFloatArray);"), 1e-10f); 322 } 323 324 @Test 325 public void accessMethodDoubleArray() throws ScriptException { 326 assertArrayEquals(o.doubleArrayMethod(o.publicDoubleArray), (double[])e.eval("o.doubleArrayMethod(o.publicDoubleArray);"), 1e-10); 327 } 328 329 @Test 330 public void accessMethodStringArray() throws ScriptException { 331 assertArrayEquals(o.stringArrayMethod(o.publicStringArray), (String[])e.eval("o.stringArrayMethod(o.publicStringArray);")); 332 } 333 334 @Test 335 public void accessMethodObjectArray() throws ScriptException { 336 assertArrayEquals(o.objectArrayMethod(o.publicObjectArray), (Person[])e.eval("o.objectArrayMethod(o.publicObjectArray);")); 337 } 338 339 @Test 340 public void accessDefaultConstructor() throws ScriptException { 341 e.eval("var dc = new Packages.jdk.nashorn.api.javaaccess.test.Person()"); 342 assertEquals(new Person(), e.get("dc")); 343 } 344 345 @Test 346 public void accessCustomConstructor() throws ScriptException { 347 e.eval("var cc = new Packages.jdk.nashorn.api.javaaccess.test.Person(17)"); 348 assertEquals(new Person(17), e.get("cc")); 349 } 350 351 @Test 352 public void accessMethod2PrimitiveParams() throws ScriptException { 353 assertEquals(o.twoParamMethod(50, 40.0), e.eval("o.twoParamMethod(50,40);")); 354 } 355 356 @Test 357 public void accessMethod3PrimitiveParams() throws ScriptException { 358 assertEquals(o.threeParamMethod((short)10, 20L, 'b'), e.eval("o.threeParamMethod(10,20,'b');")); 359 } 360 361 @Test 362 public void accessMethod2ObjectParams() throws ScriptException { 363 assertArrayEquals(new Person[] { new Person(200), new Person(300) }, (Person[])e.eval("o.twoObjectParamMethod(new Person(300),new Person(200));")); 364 } 365 366 @Test 367 public void accessMethod3ObjectParams() throws ScriptException { 368 assertArrayEquals(new Person[] { new Person(3), new Person(2), new Person(1) }, (Person[])e.eval("o.threeObjectParamMethod(new Person(1),new Person(2),new Person(3));")); 369 } 370 371 @Test 372 public void accessMethod8ObjectParams() throws ScriptException { 373 assertArrayEquals(new Person[] { new Person(8), new Person(7), new Person(6), new Person(5), new Person(4), new Person(3), new Person(2), new Person(1) }, (Person[])e.eval("o.eightObjectParamMethod(new Person(1),new Person(2),new Person(3)," + "new Person(4),new Person(5),new Person(6),new Person(7),new Person(8));")); 374 } 375 376 @Test 377 public void accessMethod9ObjectParams() throws ScriptException { 378 assertArrayEquals(new Person[] { new Person(9), new Person(8), new Person(7), new Person(6), new Person(5), new Person(4), new Person(3), new Person(2), new Person(1) }, (Person[])e.eval("o.nineObjectParamMethod(new Person(1),new Person(2),new Person(3)," + "new Person(4),new Person(5),new Person(6)," + "new Person(7),new Person(8),new Person(9));")); 379 } 380 381 @Test 382 public void accessMethodObjectEllipsis() throws ScriptException { 383 assertArrayEquals(new Person[] { new Person(9), new Person(8), new Person(7), new Person(6), new Person(5), new Person(4), new Person(3), new Person(2), new Person(1) }, (Person[])e.eval("o.methodObjectEllipsis(new Person(1),new Person(2),new Person(3)," + "new Person(4),new Person(5),new Person(6)," + "new Person(7),new Person(8),new Person(9));")); 384 assertArrayEquals(new Person[] {}, (Person[])e.eval("o.methodObjectEllipsis()")); 385 assertArrayEquals(new Person[] { new Person(9) }, (Person[])e.eval("o.methodObjectEllipsis(new Person(9))")); 386 } 387 388 @Test 389 public void accessMethodPrimitiveEllipsis() throws ScriptException { 390 assertArrayEquals(new Person[] { new Person(1), new Person(3), new Person(2) }, (Person[])e.eval("o.methodPrimitiveEllipsis(1,3,2);")); 391 assertArrayEquals(new Person[] {}, (Person[])e.eval("o.methodPrimitiveEllipsis();")); 392 assertArrayEquals(o.methodPrimitiveEllipsis(9, 8, 7, 6, 5, 4, 3, 2, 1), (Person[])e.eval("o.methodPrimitiveEllipsis(9,8,7,6,5,4,3,2,1);")); 393 } 394 395 @Test 396 public void accessMethodMixedEllipsis() throws ScriptException { 397 assertArrayEquals(new Object[] { new Person(1), 12, "hello", true }, (Object[])e.eval("o.methodMixedEllipsis(new Person(1),12,'hello',true);")); 398 assertArrayEquals(new Object[] {}, (Object[])e.eval("o.methodMixedEllipsis();")); 399 } 400 401 @Test 402 public void accessMethodObjectWithEllipsis() throws ScriptException { 403 assertArrayEquals(new Object[] { "hello", 12, 15, 16 }, (Object[])e.eval("o.methodObjectWithEllipsis('hello',12,15,16);")); 404 assertArrayEquals(new Object[] { "hello" }, (Object[])e.eval("o.methodObjectWithEllipsis('hello');")); 405 } 406 407 @Test 408 public void accessMethodPrimitiveWithEllipsis() throws ScriptException { 409 assertArrayEquals(new Object[] { 14, 12L, 15L, 16L }, (Object[])e.eval("o.methodPrimitiveWithEllipsis(14,12,15,16);")); 410 assertArrayEquals(new Object[] { 12 }, (Object[])e.eval("o.methodPrimitiveWithEllipsis(12);")); 411 } 412 413 @Test 414 public void accessMethodMixedWithEllipsis() throws ScriptException { 415 assertArrayEquals(new Object[] { "Hello", 10, true, -100500, 80d }, (Object[])e.eval("o.methodMixedWithEllipsis('Hello', 10, true, -100500,80.0);")); 416 assertArrayEquals(new Object[] { "Nashorn", 15 }, (Object[])e.eval("o.methodMixedWithEllipsis('Nashorn',15);")); 417 } 418 419 @Test 420 public void accessMethodOverloaded() throws ScriptException { 421 assertEquals(0, e.eval("o.overloadedMethod(0);")); 422 assertEquals(2000, e.eval("o.overloadedMethod(1000);")); 423 assertEquals(2, e.eval("o.overloadedMethod('10');")); 424 assertEquals(7, e.eval("o.overloadedMethod('Nashorn');")); 425 assertEquals(4, e.eval("o.overloadedMethod('true');")); 426 assertEquals(1, e.eval("o.overloadedMethod(true);")); 427 assertEquals(0, e.eval("o.overloadedMethod(false);")); 428 assertEquals(44, e.eval("o.overloadedMethod(new Person(22));")); 429 assertEquals(0, e.eval("o.overloadedMethod(new Person());")); 430 } 431 432 @Test 433 public void accessMethodDoubleVSintOverloaded() throws ScriptException { 434 assertEquals("double", e.eval("o.overloadedMethodDoubleVSint(0.0);")); 435 assertEquals("double", e.eval("o.overloadedMethodDoubleVSint(1000.0);")); 436 assertEquals("double", e.eval("o.overloadedMethodDoubleVSint(0.01);")); 437 assertEquals("double", e.eval("o.overloadedMethodDoubleVSint(100.02);")); 438 assertEquals("int", e.eval("o.overloadedMethodDoubleVSint(0);")); 439 assertEquals("int", e.eval("o.overloadedMethodDoubleVSint(1000);")); 440 } 441 442 @Test 443 public void accessJavaMethodIntFromJSFromJavaFromJS() throws ScriptException { 444 e.eval("function secondLevelMethodInt(a) {" 445 + "return o.thirdLevelMethodInt(a);" 446 + "}"); 447 assertEquals(50, e.eval("o.firstLevelMethodInt(10);")); 448 } 449 450 @Test 451 public void accessJavaMethodIntegerFromJSFromJavaFromJS() throws ScriptException { 452 e.eval("function secondLevelMethodInteger(a) {" 453 + "return o.thirdLevelMethodInteger(a);" 454 + "}"); 455 assertEquals(100, e.eval("o.firstLevelMethodInteger(10);")); 456 } 457 458 @Test 459 public void accessJavaMethodObjectFromJSFromJavaFromJS() throws ScriptException { 460 e.eval("function secondLevelMethodObject(p) {" 461 + "return o.thirdLevelMethodObject(p);" 462 + "}"); 463 assertEquals(new Person(100), e.eval("o.firstLevelMethodObject(new Person(10));")); 464 } 465 466} 467