test/script/basic/javaarrayconversion.js

Thu, 24 May 2018 16:39:31 +0800

author
aoqi
date
Thu, 24 May 2018 16:39:31 +0800
changeset 1959
61ffdd1b89f2
parent 1533
8edb98264b4f
parent 1205
4112748288bb
permissions
-rw-r--r--

Merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
attila@962 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
attila@962 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
attila@962 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
attila@962 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 */
aoqi@0 23
aoqi@0 24 /**
aoqi@0 25 * Tests for conversion of JavaScript arrays to Java arrays and the other
attila@962 26 * way round. Also generally useful as a JavaScript-to-Java type conversion
aoqi@0 27 * test.
aoqi@0 28 *
aoqi@0 29 * @test
aoqi@0 30 * @run
aoqi@0 31 */
aoqi@0 32
aoqi@0 33 var x; // used for undefined
aoqi@0 34 var testCount = 0;
aoqi@0 35
aoqi@0 36 function testF(inputValue, type, testFn) {
aoqi@0 37 var x = Java.to([inputValue], type + "[]")[0];
aoqi@0 38 if(!testFn(x)) {
aoqi@0 39 throw ("unexpected value: " + x)
aoqi@0 40 }
aoqi@0 41 ++testCount;
aoqi@0 42 }
aoqi@0 43
aoqi@0 44 function test(inputValue, type, expectedValue) {
aoqi@0 45 testF(inputValue, type, function(x) { return x === expectedValue })
aoqi@0 46 }
aoqi@0 47
aoqi@0 48 function testNaN(inputValue, type) {
aoqi@0 49 testF(inputValue, type, isNaN)
aoqi@0 50 }
aoqi@0 51
attila@962 52 // Those labeled "Correct?" are not clearly correct conversions. Those
attila@962 53 // labeled "TypeError maybe?" could actually throw a TypeError, or only
attila@962 54 // throw a TypeError when in strict mode.
aoqi@0 55 // The case of ("false", "boolean") => true is particularly amusing.
aoqi@0 56
aoqi@0 57 test(x, "int", 0) // Correct? TypeError maybe?
aoqi@0 58 test(null, "int", 0) // Correct? TypeError maybe?
aoqi@0 59 test(1234, "int", 1234)
aoqi@0 60 test("1234", "int", 1234)
aoqi@0 61 test("1234.49", "int", 1234)
aoqi@0 62 test("1234.51", "int", 1234) // truncates, not rounds
aoqi@0 63 test(true, "int", 1)
aoqi@0 64 test(false, "int", 0)
aoqi@0 65 test("foo", "int", 0) // Correct? TypeError maybe?
aoqi@0 66
aoqi@0 67 test(x, "boolean", false) // Correct? TypeError maybe?
aoqi@0 68 test(null, "boolean", false) // Correct? TypeError maybe?
aoqi@0 69 test(0, "boolean", false)
aoqi@0 70 test(1234, "boolean", true)
aoqi@0 71 test("foo", "boolean", true)
aoqi@0 72 test("", "boolean", false)
aoqi@0 73 test("false", "boolean", true) // Correct? false maybe?
aoqi@0 74
aoqi@0 75 test(x, "java.lang.String", "undefined") // Correct? TypeError maybe?
aoqi@0 76 test(null, "java.lang.String", null)
aoqi@0 77 test(1234, "java.lang.String", "1234")
aoqi@0 78 test(1234.5, "java.lang.String", "1234.5")
aoqi@0 79 test(true, "java.lang.String", "true")
aoqi@0 80 test(false, "java.lang.String", "false")
aoqi@0 81
aoqi@0 82 test(x, "java.lang.Integer", null) // Correct? TypeError maybe?
aoqi@0 83 test(null, "java.lang.Integer", null)
aoqi@0 84 test(1234, "java.lang.Integer", 1234)
aoqi@0 85 test("1234", "java.lang.Integer", 1234)
aoqi@0 86 test("1234.49", "java.lang.Integer", 1234)
aoqi@0 87 test("1234.51", "java.lang.Integer", 1234) // truncates, not rounds
aoqi@0 88 test(true, "java.lang.Integer", 1)
aoqi@0 89 test(false, "java.lang.Integer", 0)
aoqi@0 90 test("foo", "java.lang.Integer", 0) // Correct? TypeError maybe?
aoqi@0 91
aoqi@0 92 test(x, "java.lang.Boolean", null) // Correct? TypeError maybe?
aoqi@0 93 test(null, "java.lang.Boolean", null)
aoqi@0 94 test(0, "java.lang.Boolean", false)
aoqi@0 95 test(1234, "java.lang.Boolean", true)
aoqi@0 96 test("foo", "java.lang.Boolean", true)
aoqi@0 97 test("", "java.lang.Boolean", false)
aoqi@0 98 test("false", "java.lang.Boolean", true) // Correct? false maybe?
aoqi@0 99
aoqi@0 100 testNaN(x, "double")
aoqi@0 101 test(null, "double", 0)
aoqi@0 102 test(1234, "double", 1234)
aoqi@0 103 test("1234", "double", 1234)
aoqi@0 104 test("1234.5", "double", 1234.5)
aoqi@0 105 test(true, "double", 1)
aoqi@0 106 test(false, "double", 0)
aoqi@0 107 testNaN("foo", "double")
aoqi@0 108
aoqi@0 109 testNaN(x, "java.lang.Double")
aoqi@0 110 test(null, "java.lang.Double", null)
aoqi@0 111 test(1234, "java.lang.Double", 1234)
aoqi@0 112 test("1234", "java.lang.Double", 1234)
aoqi@0 113 test("1234.5", "java.lang.Double", 1234.5)
aoqi@0 114 test(true, "java.lang.Double", 1)
aoqi@0 115 test(false, "java.lang.Double", 0)
aoqi@0 116 testNaN("foo", "java.lang.Double")
aoqi@0 117
aoqi@0 118 test({ valueOf: function() { return 42; } }, "int", 42)
aoqi@0 119 test({ valueOf: function() { return "42"; } }, "int", 42)
aoqi@0 120 // If there's no valueOf, toString is used
aoqi@0 121 test({ toString: function() { return "42"; } }, "int", 42)
aoqi@0 122 // For numbers, valueOf takes precedence over toString
aoqi@0 123 test({ valueOf: function() { return "42"; }, toString: function() { return "43"; } }, "int", 42)
aoqi@0 124
aoqi@0 125 test({ toString: function() { return "foo"; } }, "java.lang.String", "foo")
aoqi@0 126 // Yep, even if we have valueOf, toString from prototype takes precedence
aoqi@0 127 test({ valueOf: function() { return 42; } }, "java.lang.String", "[object Object]")
aoqi@0 128 // Converting to string, toString takes precedence over valueOf
aoqi@0 129 test({ valueOf: function() { return "42"; }, toString: function() { return "43"; } }, "java.lang.String", "43")
aoqi@0 130
sundar@1533 131 function assertCanConvert(sourceType, targetType) {
sundar@1533 132 Java.to([new (Java.type(sourceType))()], targetType + "[]")
sundar@1533 133 ++testCount;
sundar@1533 134 }
sundar@1533 135
aoqi@0 136 function assertCantConvert(sourceType, targetType) {
aoqi@0 137 try {
sundar@1533 138 Java.to([new (Java.type(sourceType))()], targetType + "[]")
aoqi@0 139 throw "no TypeError encountered"
aoqi@0 140 } catch(e) {
sundar@1533 141 if(!(e instanceof TypeError) ||
sundar@1533 142 !e.message.startsWith("Java.to conversion to array type")) {
aoqi@0 143 throw e;
aoqi@0 144 }
aoqi@0 145 ++testCount;
aoqi@0 146 }
aoqi@0 147 }
aoqi@0 148
sundar@1533 149 // Arbitrary POJOs to JS Primitive type should work
sundar@1533 150 assertCanConvert("java.util.BitSet", "int")
sundar@1533 151 assertCanConvert("java.util.BitSet", "double")
sundar@1533 152 assertCanConvert("java.util.BitSet", "long")
sundar@1533 153 assertCanConvert("java.util.BitSet", "boolean")
sundar@1533 154 assertCanConvert("java.util.BitSet", "java.lang.String")
sundar@1533 155
aoqi@0 156 // Arbitrary POJOs can't be converted to Java values
aoqi@0 157 assertCantConvert("java.util.BitSet", "java.lang.Double")
aoqi@0 158 assertCantConvert("java.util.BitSet", "java.lang.Long")
aoqi@0 159
aoqi@0 160 /***************************************************************************
aoqi@0 161 * Now testing the other way round - Java arrays & collections to JavaScript
aoqi@0 162 **************************************************************************/
aoqi@0 163
aoqi@0 164 function assert(x) {
aoqi@0 165 if(!x) {
aoqi@0 166 throw "Assertion failed"
aoqi@0 167 }
aoqi@0 168 ++testCount;
aoqi@0 169 }
aoqi@0 170
aoqi@0 171 var intArray = new (Java.type("int[]"))(3)
aoqi@0 172 intArray[0] = 1234;
aoqi@0 173 intArray[1] = 42;
aoqi@0 174 intArray[2] = 5;
aoqi@0 175 var jsIntArray = Java.from(intArray)
aoqi@0 176 assert(jsIntArray instanceof Array);
aoqi@0 177 assert(jsIntArray[0] === 1234);
aoqi@0 178 assert(jsIntArray[1] === 42);
aoqi@0 179 assert(jsIntArray[2] === 5);
aoqi@0 180
aoqi@0 181 // The arrays are copies, they don't reflect each other
aoqi@0 182 intArray[2] = 6;
aoqi@0 183 assert(jsIntArray[2] === 5);
aoqi@0 184 jsIntArray[2] = 7;
aoqi@0 185 assert(intArray[2] === 6);
aoqi@0 186
aoqi@0 187 var byteArray = new (Java.type("byte[]"))(2)
aoqi@0 188 byteArray[0] = -128;
aoqi@0 189 byteArray[1] = 127;
aoqi@0 190 var jsByteArray = Java.from(byteArray)
aoqi@0 191 assert(jsByteArray instanceof Array);
aoqi@0 192 assert(jsByteArray[0] === -128);
aoqi@0 193 assert(jsByteArray[1] === 127);
aoqi@0 194
aoqi@0 195 var shortArray = new (Java.type("short[]"))(2)
aoqi@0 196 shortArray[0] = -32768;
aoqi@0 197 shortArray[1] = 32767;
aoqi@0 198 var jsShortArray = Java.from(shortArray)
aoqi@0 199 assert(jsShortArray instanceof Array);
aoqi@0 200 assert(jsShortArray[0] === -32768);
aoqi@0 201 assert(jsShortArray[1] === 32767);
aoqi@0 202
aoqi@0 203 var floatArray = new (Java.type("float[]"))(2)
aoqi@0 204 floatArray[0] = java.lang.Float.MIN_VALUE;
aoqi@0 205 floatArray[1] = java.lang.Float.MAX_VALUE;
aoqi@0 206 var jsFloatArray = Java.from(floatArray)
aoqi@0 207 assert(jsFloatArray instanceof Array);
aoqi@0 208 assert(jsFloatArray[0] == java.lang.Float.MIN_VALUE);
aoqi@0 209 assert(jsFloatArray[1] == java.lang.Float.MAX_VALUE);
aoqi@0 210
aoqi@0 211 var charArray = new (Java.type("char[]"))(3)
aoqi@0 212 charArray[0] = "a";
aoqi@0 213 charArray[1] = "b";
aoqi@0 214 charArray[2] = "1";
aoqi@0 215 var jsCharArray = Java.from(charArray)
aoqi@0 216 assert(jsCharArray instanceof Array);
aoqi@0 217 assert(jsCharArray[0] === 97);
aoqi@0 218 assert(jsCharArray[1] === 98);
aoqi@0 219 assert(jsCharArray[2] === 49);
aoqi@0 220
aoqi@0 221 var booleanArray = new (Java.type("boolean[]"))(2)
aoqi@0 222 booleanArray[0] = true;
aoqi@0 223 booleanArray[1] = false;
aoqi@0 224 var jsBooleanArray = Java.from(booleanArray)
aoqi@0 225 assert(jsBooleanArray instanceof Array);
aoqi@0 226 assert(jsBooleanArray[0] === true);
aoqi@0 227 assert(jsBooleanArray[1] === false);
aoqi@0 228
aoqi@0 229 print(testCount + " tests completed ok")

mercurial