ArrayConversionTest.java revision 1512:d827dd6e0139
1272343Sngie/* 2272343Sngie * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 3272343Sngie * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4272343Sngie * 5272343Sngie * This code is free software; you can redistribute it and/or modify it 6272343Sngie * under the terms of the GNU General Public License version 2 only, as 7272343Sngie * published by the Free Software Foundation. Oracle designates this 8272343Sngie * particular file as subject to the "Classpath" exception as provided 9272343Sngie * by Oracle in the LICENSE file that accompanied this code. 10272343Sngie * 11272343Sngie * This code is distributed in the hope that it will be useful, but WITHOUT 12272343Sngie * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13272343Sngie * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14272343Sngie * version 2 for more details (a copy is included in the LICENSE file that 15272343Sngie * accompanied this code). 16272343Sngie * 17272343Sngie * You should have received a copy of the GNU General Public License version 18272343Sngie * 2 along with this work; if not, write to the Free Software Foundation, 19272343Sngie * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20272343Sngie * 21272343Sngie * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22272343Sngie * or visit www.oracle.com if you need additional information or have any 23272343Sngie * questions. 24272343Sngie */ 25272343Sngie 26272343Sngiepackage jdk.nashorn.api.javaaccess.test; 27272343Sngie 28272343Sngieimport static org.testng.AssertJUnit.assertEquals; 29272343Sngieimport static org.testng.AssertJUnit.assertFalse; 30272343Sngieimport static org.testng.AssertJUnit.assertNull; 31272343Sngieimport static org.testng.AssertJUnit.assertTrue; 32272343Sngieimport java.util.Arrays; 33272343Sngieimport java.util.List; 34272343Sngieimport javax.script.ScriptContext; 35272343Sngieimport javax.script.ScriptEngine; 36272343Sngieimport javax.script.ScriptEngineManager; 37272343Sngieimport javax.script.ScriptException; 38272343Sngieimport org.testng.TestNG; 39272343Sngieimport org.testng.annotations.AfterClass; 40272343Sngieimport org.testng.annotations.BeforeClass; 41272343Sngieimport org.testng.annotations.Test; 42272343Sngie 43272343Sngie/** 44272343Sngie * @test 45272343Sngie * @run testng/othervm jdk.nashorn.api.javaaccess.test.ArrayConversionTest 46272343Sngie */ 47272343Sngie@SuppressWarnings("javadoc") 48272343Sngiepublic class ArrayConversionTest { 49272343Sngie private static ScriptEngine e = null; 50272343Sngie 51272343Sngie public static void main(final String[] args) { 52272343Sngie TestNG.main(args); 53272343Sngie } 54272343Sngie 55272343Sngie @BeforeClass 56272343Sngie public static void setUpClass() { 57272343Sngie e = new ScriptEngineManager().getEngineByName("nashorn"); 58272343Sngie } 59272343Sngie 60272343Sngie @AfterClass 61272343Sngie public static void tearDownClass() { 62272343Sngie e = null; 63272343Sngie } 64272343Sngie 65272343Sngie @Test 66272343Sngie public void testIntArrays() throws ScriptException { 67272343Sngie runTest("assertNullIntArray", "null"); 68272343Sngie runTest("assertEmptyIntArray", "[]"); 69272343Sngie runTest("assertSingle42IntArray", "[42]"); 70272343Sngie runTest("assertSingle42IntArray", "['42']"); 71272343Sngie runTest("assertIntArrayConversions", "[false, true, NaN, Infinity, -Infinity, 0.4, 0.6, null, undefined, [], {}, [1], [1, 2]]"); 72272343Sngie } 73272343Sngie 74272343Sngie @Test 75272343Sngie public void testIntIntArrays() throws ScriptException { 76272343Sngie runTest("assertNullIntIntArray", "null"); 77272343Sngie runTest("assertEmptyIntIntArray", "[]"); 78272343Sngie runTest("assertSingleEmptyIntIntArray", "[[]]"); 79272343Sngie runTest("assertSingleNullIntIntArray", "[null]"); 80272343Sngie runTest("assertLargeIntIntArray", "[[false], [1], [2, 3], [4, 5, 6], ['7', {valueOf: function() { return 8 }}]]"); 81272343Sngie } 82272343Sngie 83272343Sngie @Test 84272343Sngie public void testObjectObjectArrays() throws ScriptException { 85272343Sngie runTest("assertLargeObjectObjectArray", "[[false], [1], ['foo', 42.3], [{x: 17}]]"); 86272343Sngie } 87272343Sngie 88272343Sngie @Test 89272343Sngie public void testBooleanArrays() throws ScriptException { 90272343Sngie runTest("assertBooleanArrayConversions", "[false, true, '', 'false', 0, 1, 0.4, 0.6, {}, [], [false], [true], NaN, Infinity, null, undefined]"); 91272343Sngie } 92272343Sngie 93272343Sngie @Test 94272343Sngie public void testArrayAmbiguity() throws ScriptException { 95272343Sngie runTest("x", "'abc'"); 96272343Sngie runTest("x", "['foo', 'bar']"); 97272343Sngie } 98272343Sngie 99272343Sngie @Test 100272343Sngie public void testListArrays() throws ScriptException { 101272343Sngie runTest("assertListArray", "[['foo', 'bar'], ['apple', 'orange']]"); 102272343Sngie } 103272343Sngie 104272343Sngie @Test 105272343Sngie public void testVarArgs() throws ScriptException { 106272343Sngie // Sole NativeArray in vararg position becomes vararg array itself 107272343Sngie runTest("assertVarArg_42_17", "[42, 17]"); 108272343Sngie // NativeArray in vararg position becomes an argument if there are more arguments 109272343Sngie runTest("assertVarArg_array_17", "[42], 18"); 110272343Sngie // Only NativeArray is converted to vararg array, other objects (e.g. a function) aren't 111272343Sngie runTest("assertVarArg_function", "function() { return 'Hello' }"); 112272343Sngie } 113272343Sngie 114272343Sngie private static void runTest(final String testMethodName, final String argument) throws ScriptException { 115272343Sngie e.eval("Java.type('" + ArrayConversionTest.class.getName() + "')." + testMethodName + "(" + argument + ")"); 116272343Sngie } 117272343Sngie 118272343Sngie public static void assertNullIntArray(final int[] array) { 119272343Sngie assertNull(array); 120272343Sngie } 121272343Sngie 122272343Sngie public static void assertNullIntIntArray(final int[][] array) { 123272343Sngie assertNull(array); 124272343Sngie } 125272343Sngie 126272343Sngie public static void assertEmptyIntArray(final int[] array) { 127272343Sngie assertEquals(0, array.length); 128272343Sngie } 129272343Sngie 130272343Sngie public static void assertSingle42IntArray(final int[] array) { 131272343Sngie assertEquals(1, array.length); 132272343Sngie assertEquals(42, array[0]); 133272343Sngie } 134272343Sngie 135272343Sngie 136272343Sngie public static void assertIntArrayConversions(final int[] array) { 137272343Sngie assertEquals(13, array.length); 138272343Sngie assertEquals(0, array[0]); // false 139272343Sngie assertEquals(1, array[1]); // true 140272343Sngie assertEquals(0, array[2]); // NaN 141272343Sngie assertEquals(0, array[3]); // Infinity 142272343Sngie assertEquals(0, array[4]); // -Infinity 143272343Sngie assertEquals(0, array[5]); // 0.4 144272343Sngie assertEquals(0, array[6]); // 0.6 - floor, not round 145272343Sngie assertEquals(0, array[7]); // null 146272343Sngie assertEquals(0, array[8]); // undefined 147272343Sngie assertEquals(0, array[9]); // [] 148272343Sngie assertEquals(0, array[10]); // {} 149272343Sngie assertEquals(1, array[11]); // [1] 150272343Sngie assertEquals(0, array[12]); // [1, 2] 151272343Sngie } 152272343Sngie 153272343Sngie public static void assertEmptyIntIntArray(final int[][] array) { 154272343Sngie assertEquals(0, array.length); 155272343Sngie } 156272343Sngie 157272343Sngie public static void assertSingleEmptyIntIntArray(final int[][] array) { 158272343Sngie assertEquals(1, array.length); 159272343Sngie assertTrue(Arrays.equals(new int[0], array[0])); 160272343Sngie } 161272343Sngie 162272343Sngie public static void assertSingleNullIntIntArray(final int[][] array) { 163272343Sngie assertEquals(1, array.length); 164272343Sngie assertNull(null, array[0]); 165272343Sngie } 166272343Sngie 167272343Sngie public static void assertLargeIntIntArray(final int[][] array) { 168272343Sngie assertEquals(5, array.length); 169272343Sngie assertTrue(Arrays.equals(new int[] { 0 }, array[0])); 170272343Sngie assertTrue(Arrays.equals(new int[] { 1 }, array[1])); 171272343Sngie assertTrue(Arrays.equals(new int[] { 2, 3 }, array[2])); 172272343Sngie assertTrue(Arrays.equals(new int[] { 4, 5, 6 }, array[3])); 173272343Sngie assertTrue(Arrays.equals(new int[] { 7, 8 }, array[4])); 174272343Sngie } 175272343Sngie 176272343Sngie public static void assertLargeObjectObjectArray(final Object[][] array) throws ScriptException { 177272343Sngie assertEquals(4, array.length); 178272343Sngie assertTrue(Arrays.equals(new Object[] { Boolean.FALSE }, array[0])); 179272343Sngie assertTrue(Arrays.equals(new Object[] { 1 }, array[1])); 180272343Sngie assertTrue(Arrays.equals(new Object[] { "foo", 42.3d }, array[2])); 181272343Sngie assertEquals(1, array[3].length); 182272343Sngie e.getBindings(ScriptContext.ENGINE_SCOPE).put("obj", array[3][0]); 183272343Sngie assertEquals(17, e.eval("obj.x")); 184272343Sngie } 185272343Sngie 186272343Sngie public static void assertBooleanArrayConversions(final boolean[] array) { 187272343Sngie assertEquals(16, array.length); 188272343Sngie assertFalse(array[0]); // false 189272343Sngie assertTrue(array[1]); // true 190272343Sngie assertFalse(array[2]); // '' 191272343Sngie assertTrue(array[3]); // 'false' (yep, every non-empty string converts to true) 192272343Sngie assertFalse(array[4]); // 0 193272343Sngie assertTrue(array[5]); // 1 194272343Sngie assertTrue(array[6]); // 0.4 195272343Sngie assertTrue(array[7]); // 0.6 196272343Sngie assertTrue(array[8]); // {} 197272343Sngie assertTrue(array[9]); // [] 198272343Sngie assertTrue(array[10]); // [false] 199272343Sngie assertTrue(array[11]); // [true] 200272343Sngie assertFalse(array[12]); // NaN 201272343Sngie assertTrue(array[13]); // Infinity 202272343Sngie assertFalse(array[14]); // null 203272343Sngie assertFalse(array[15]); // undefined 204272343Sngie } 205272343Sngie 206272343Sngie public static void assertListArray(final List<?>[] array) { 207272343Sngie assertEquals(2, array.length); 208272343Sngie assertEquals(Arrays.asList("foo", "bar"), array[0]); 209272343Sngie assertEquals(Arrays.asList("apple", "orange"), array[1]); 210272343Sngie } 211272343Sngie 212272343Sngie public static void assertVarArg_42_17(final Object... args) { 213272343Sngie assertEquals(2, args.length); 214272343Sngie assertEquals(42, ((Number)args[0]).intValue()); 215272343Sngie assertEquals(17, ((Number)args[1]).intValue()); 216272343Sngie } 217272343Sngie 218272343Sngie public static void assertVarArg_array_17(final Object... args) throws ScriptException { 219272343Sngie assertEquals(2, args.length); 220272343Sngie e.getBindings(ScriptContext.ENGINE_SCOPE).put("arr", args[0]); 221272343Sngie assertTrue((Boolean)e.eval("arr instanceof Array && arr.length == 1 && arr[0] == 42")); 222272343Sngie assertEquals(18, ((Number)args[1]).intValue()); 223272343Sngie } 224272343Sngie 225272343Sngie public static void assertVarArg_function(final Object... args) throws ScriptException { 226272343Sngie assertEquals(1, args.length); 227272343Sngie e.getBindings(ScriptContext.ENGINE_SCOPE).put("fn", args[0]); 228272343Sngie assertEquals("Hello", e.eval("fn()")); 229272343Sngie } 230272343Sngie 231272343Sngie 232272343Sngie 233272343Sngie public static void x(final String y) { 234272343Sngie assertEquals("abc", y); 235272343Sngie } 236272343Sngie public static void x(final String[] y) { 237272343Sngie assertTrue(Arrays.equals(new String[] { "foo", "bar"}, y)); 238272343Sngie } 239272343Sngie} 240272343Sngie