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