Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / content / public / android / javatests / src / org / chromium / content / browser / JavaBridgeArrayCoercionTest.java
1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.chromium.content.browser;
6
7 import android.test.suitebuilder.annotation.SmallTest;
8
9 import org.chromium.base.test.util.Feature;
10
11 /**
12  * Part of the test suite for the Java Bridge. This class tests that we correctly convert
13  * JavaScript arrays to Java arrays when passing them to the methods of injected Java objects.
14  *
15  * The conversions should follow
16  * http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_CONVERSIONS. Places in
17  * which the implementation differs from the spec are marked with
18  * LIVECONNECT_COMPLIANCE.
19  * FIXME: Consider making our implementation more compliant, if it will not
20  * break backwards-compatibility. See b/4408210.
21  */
22 public class JavaBridgeArrayCoercionTest extends JavaBridgeTestBase {
23     private class TestObject extends Controller {
24         private final Object mObjectInstance;
25         private final CustomType mCustomTypeInstance;
26
27         private boolean[] mBooleanArray;
28         private byte[] mByteArray;
29         private char[] mCharArray;
30         private short[] mShortArray;
31         private int[] mIntArray;
32         private long[] mLongArray;
33         private float[] mFloatArray;
34         private double[] mDoubleArray;
35         private String[] mStringArray;
36         private Object[] mObjectArray;
37         private CustomType[] mCustomTypeArray;
38
39         public TestObject() {
40             mObjectInstance = new Object();
41             mCustomTypeInstance = new CustomType();
42         }
43
44         public Object getObjectInstance() {
45             return mObjectInstance;
46         }
47         public CustomType getCustomTypeInstance() {
48             return mCustomTypeInstance;
49         }
50
51         public synchronized void setBooleanArray(boolean[] x) {
52             mBooleanArray = x;
53             notifyResultIsReady();
54         }
55         public synchronized void setByteArray(byte[] x) {
56             mByteArray = x;
57             notifyResultIsReady();
58         }
59         public synchronized void setCharArray(char[] x) {
60             mCharArray = x;
61             notifyResultIsReady();
62         }
63         public synchronized void setShortArray(short[] x) {
64             mShortArray = x;
65             notifyResultIsReady();
66         }
67         public synchronized void setIntArray(int[] x) {
68             mIntArray = x;
69             notifyResultIsReady();
70         }
71         public synchronized void setLongArray(long[] x) {
72             mLongArray = x;
73             notifyResultIsReady();
74         }
75         public synchronized void setFloatArray(float[] x) {
76             mFloatArray = x;
77             notifyResultIsReady();
78         }
79         public synchronized void setDoubleArray(double[] x) {
80             mDoubleArray = x;
81             notifyResultIsReady();
82         }
83         public synchronized void setStringArray(String[] x) {
84             mStringArray = x;
85             notifyResultIsReady();
86         }
87         public synchronized void setObjectArray(Object[] x) {
88             mObjectArray = x;
89             notifyResultIsReady();
90         }
91         public synchronized void setCustomTypeArray(CustomType[] x) {
92             mCustomTypeArray = x;
93             notifyResultIsReady();
94         }
95
96         public synchronized boolean[] waitForBooleanArray() {
97             waitForResult();
98             return mBooleanArray;
99         }
100         public synchronized byte[] waitForByteArray() {
101             waitForResult();
102             return mByteArray;
103         }
104         public synchronized char[] waitForCharArray() {
105             waitForResult();
106             return mCharArray;
107         }
108         public synchronized short[] waitForShortArray() {
109             waitForResult();
110             return mShortArray;
111         }
112         public synchronized int[] waitForIntArray() {
113             waitForResult();
114             return mIntArray;
115         }
116         public synchronized long[] waitForLongArray() {
117             waitForResult();
118             return mLongArray;
119         }
120         public synchronized float[] waitForFloatArray() {
121             waitForResult();
122             return mFloatArray;
123         }
124         public synchronized double[] waitForDoubleArray() {
125             waitForResult();
126             return mDoubleArray;
127         }
128         public synchronized String[] waitForStringArray() {
129             waitForResult();
130             return mStringArray;
131         }
132         public synchronized Object[] waitForObjectArray() {
133             waitForResult();
134             return mObjectArray;
135         }
136         public synchronized CustomType[] waitForCustomTypeArray() {
137             waitForResult();
138             return mCustomTypeArray;
139         }
140     }
141
142     // Two custom types used when testing passing objects.
143     private static class CustomType {
144     }
145
146     private TestObject mTestObject;
147
148     @Override
149     protected void setUp() throws Exception {
150         super.setUp();
151         mTestObject = new TestObject();
152         setUpContentView(mTestObject, "testObject");
153     }
154
155     // Note that all tests use a single element array for simplicity. We test
156     // multiple elements elsewhere.
157
158     // Test passing an array of JavaScript numbers in the int32 range to a
159     // method which takes a Java array.
160     @SmallTest
161     @Feature({"AndroidWebView", "Android-JavaBridge"})
162     public void testPassNumberInt32() throws Throwable {
163         executeJavaScript("testObject.setBooleanArray([0]);");
164         assertFalse(mTestObject.waitForBooleanArray()[0]);
165         // LIVECONNECT_COMPLIANCE: Should convert to boolean.
166         executeJavaScript("testObject.setBooleanArray([42]);");
167         assertFalse(mTestObject.waitForBooleanArray()[0]);
168
169         executeJavaScript("testObject.setByteArray([42]);");
170         assertEquals(42, mTestObject.waitForByteArray()[0]);
171
172         // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
173         executeJavaScript("testObject.setCharArray([42]);");
174         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
175
176         executeJavaScript("testObject.setShortArray([42]);");
177         assertEquals(42, mTestObject.waitForShortArray()[0]);
178
179         executeJavaScript("testObject.setIntArray([42]);");
180         assertEquals(42, mTestObject.waitForIntArray()[0]);
181
182         executeJavaScript("testObject.setLongArray([42]);");
183         assertEquals(42L, mTestObject.waitForLongArray()[0]);
184
185         executeJavaScript("testObject.setFloatArray([42]);");
186         assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
187
188         executeJavaScript("testObject.setDoubleArray([42]);");
189         assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
190
191         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
192         executeJavaScript("testObject.setObjectArray([42]);");
193         assertNull(mTestObject.waitForObjectArray());
194
195         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
196         executeJavaScript("testObject.setStringArray([42]);");
197         assertNull(mTestObject.waitForStringArray()[0]);
198
199         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
200         executeJavaScript("testObject.setCustomTypeArray([42]);");
201         assertNull(mTestObject.waitForCustomTypeArray());
202     }
203
204     // Test passing an array of JavaScript numbers in the double range to a
205     // method which takes a Java array.
206     @SmallTest
207     @Feature({"AndroidWebView", "Android-JavaBridge"})
208     public void testPassNumberDouble() throws Throwable {
209         // LIVECONNECT_COMPLIANCE: Should convert to boolean.
210         executeJavaScript("testObject.setBooleanArray([42.1]);");
211         assertFalse(mTestObject.waitForBooleanArray()[0]);
212
213         executeJavaScript("testObject.setByteArray([42.1]);");
214         assertEquals(42, mTestObject.waitForByteArray()[0]);
215
216         // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
217         executeJavaScript("testObject.setCharArray([42.1]);");
218         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
219
220         executeJavaScript("testObject.setShortArray([42.1]);");
221         assertEquals(42, mTestObject.waitForShortArray()[0]);
222
223         executeJavaScript("testObject.setIntArray([42.1]);");
224         assertEquals(42, mTestObject.waitForIntArray()[0]);
225
226         executeJavaScript("testObject.setLongArray([42.1]);");
227         assertEquals(42L, mTestObject.waitForLongArray()[0]);
228
229         executeJavaScript("testObject.setFloatArray([42.1]);");
230         assertEquals(42.1f, mTestObject.waitForFloatArray()[0]);
231
232         executeJavaScript("testObject.setDoubleArray([42.1]);");
233         assertEquals(42.1, mTestObject.waitForDoubleArray()[0]);
234
235         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
236         executeJavaScript("testObject.setObjectArray([42.1]);");
237         assertNull(mTestObject.waitForObjectArray());
238
239         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
240         executeJavaScript("testObject.setStringArray([42.1]);");
241         assertNull(mTestObject.waitForStringArray()[0]);
242
243         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
244         executeJavaScript("testObject.setCustomTypeArray([42.1]);");
245         assertNull(mTestObject.waitForCustomTypeArray());
246     }
247
248     // Test passing an array of JavaScript NaN values to a method which takes a
249     // Java array.
250     @SmallTest
251     @Feature({"AndroidWebView", "Android-JavaBridge"})
252     public void testPassNumberNaN() throws Throwable {
253         executeJavaScript("testObject.setBooleanArray([Number.NaN]);");
254         assertFalse(mTestObject.waitForBooleanArray()[0]);
255
256         executeJavaScript("testObject.setByteArray([Number.NaN]);");
257         assertEquals(0, mTestObject.waitForByteArray()[0]);
258
259         executeJavaScript("testObject.setCharArray([Number.NaN]);");
260         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
261
262         executeJavaScript("testObject.setShortArray([Number.NaN]);");
263         assertEquals(0, mTestObject.waitForShortArray()[0]);
264
265         executeJavaScript("testObject.setIntArray([Number.NaN]);");
266         assertEquals(0, mTestObject.waitForIntArray()[0]);
267
268         executeJavaScript("testObject.setLongArray([Number.NaN]);");
269         assertEquals(0L, mTestObject.waitForLongArray()[0]);
270
271         executeJavaScript("testObject.setFloatArray([Number.NaN]);");
272         assertEquals(Float.NaN, mTestObject.waitForFloatArray()[0]);
273
274         executeJavaScript("testObject.setDoubleArray([Number.NaN]);");
275         assertEquals(Double.NaN, mTestObject.waitForDoubleArray()[0]);
276
277         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
278         executeJavaScript("testObject.setObjectArray([Number.NaN]);");
279         assertNull(mTestObject.waitForObjectArray());
280
281         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
282         executeJavaScript("testObject.setStringArray([Number.NaN]);");
283         assertNull(mTestObject.waitForStringArray()[0]);
284
285         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
286         executeJavaScript("testObject.setCustomTypeArray([Number.NaN]);");
287         assertNull(mTestObject.waitForCustomTypeArray());
288     }
289
290     // Test passing an array of JavaScript infinity values to a method which
291     // takes a Java array.
292     @SmallTest
293     @Feature({"AndroidWebView", "Android-JavaBridge"})
294     public void testPassNumberInfinity() throws Throwable {
295         executeJavaScript("testObject.setBooleanArray([Infinity]);");
296         assertFalse(mTestObject.waitForBooleanArray()[0]);
297
298         executeJavaScript("testObject.setByteArray([Infinity]);");
299         assertEquals(-1, mTestObject.waitForByteArray()[0]);
300
301         // LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value.
302         executeJavaScript("testObject.setCharArray([Infinity]);");
303         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
304
305         executeJavaScript("testObject.setShortArray([Infinity]);");
306         assertEquals(-1, mTestObject.waitForShortArray()[0]);
307
308         executeJavaScript("testObject.setIntArray([Infinity]);");
309         assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntArray()[0]);
310
311         executeJavaScript("testObject.setLongArray([Infinity]);");
312         assertEquals(Long.MAX_VALUE, mTestObject.waitForLongArray()[0]);
313
314         executeJavaScript("testObject.setFloatArray([Infinity]);");
315         assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatArray()[0]);
316
317         executeJavaScript("testObject.setDoubleArray([Infinity]);");
318         assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleArray()[0]);
319
320         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
321         executeJavaScript("testObject.setObjectArray([Infinity]);");
322         assertNull(mTestObject.waitForObjectArray());
323
324         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
325         executeJavaScript("testObject.setStringArray([Infinity]);");
326         assertNull(mTestObject.waitForStringArray()[0]);
327
328         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
329         executeJavaScript("testObject.setCustomTypeArray([Infinity]);");
330         assertNull(mTestObject.waitForCustomTypeArray());
331     }
332
333     // Test passing an array of JavaScript boolean values to a method which
334     // takes a Java array.
335     @SmallTest
336     @Feature({"AndroidWebView", "Android-JavaBridge"})
337     public void testPassBoolean() throws Throwable {
338         executeJavaScript("testObject.setBooleanArray([true]);");
339         assertTrue(mTestObject.waitForBooleanArray()[0]);
340         executeJavaScript("testObject.setBooleanArray([false]);");
341         assertFalse(mTestObject.waitForBooleanArray()[0]);
342
343         // LIVECONNECT_COMPLIANCE: Should be 1.
344         executeJavaScript("testObject.setByteArray([true]);");
345         assertEquals(0, mTestObject.waitForByteArray()[0]);
346         executeJavaScript("testObject.setByteArray([false]);");
347         assertEquals(0, mTestObject.waitForByteArray()[0]);
348
349         // LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1.
350         executeJavaScript("testObject.setCharArray([true]);");
351         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
352         executeJavaScript("testObject.setCharArray([false]);");
353         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
354
355         // LIVECONNECT_COMPLIANCE: Should be 1.
356         executeJavaScript("testObject.setShortArray([true]);");
357         assertEquals(0, mTestObject.waitForShortArray()[0]);
358         executeJavaScript("testObject.setShortArray([false]);");
359         assertEquals(0, mTestObject.waitForShortArray()[0]);
360
361         // LIVECONNECT_COMPLIANCE: Should be 1.
362         executeJavaScript("testObject.setIntArray([true]);");
363         assertEquals(0, mTestObject.waitForIntArray()[0]);
364         executeJavaScript("testObject.setIntArray([false]);");
365         assertEquals(0, mTestObject.waitForIntArray()[0]);
366
367         // LIVECONNECT_COMPLIANCE: Should be 1.
368         executeJavaScript("testObject.setLongArray([true]);");
369         assertEquals(0L, mTestObject.waitForLongArray()[0]);
370         executeJavaScript("testObject.setLongArray([false]);");
371         assertEquals(0L, mTestObject.waitForLongArray()[0]);
372
373         // LIVECONNECT_COMPLIANCE: Should be 1.0.
374         executeJavaScript("testObject.setFloatArray([true]);");
375         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
376         executeJavaScript("testObject.setFloatArray([false]);");
377         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
378
379         // LIVECONNECT_COMPLIANCE: Should be 1.0.
380         executeJavaScript("testObject.setDoubleArray([true]);");
381         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
382         executeJavaScript("testObject.setDoubleArray([false]);");
383         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
384
385         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
386         executeJavaScript("testObject.setObjectArray([true]);");
387         assertNull(mTestObject.waitForObjectArray());
388
389         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
390         executeJavaScript("testObject.setStringArray([true]);");
391         assertNull(mTestObject.waitForStringArray()[0]);
392
393         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
394         executeJavaScript("testObject.setCustomTypeArray([true]);");
395         assertNull(mTestObject.waitForCustomTypeArray());
396     }
397
398     // Test passing an array of JavaScript strings to a method which takes a
399     // Java array.
400     @SmallTest
401     @Feature({"AndroidWebView", "Android-JavaBridge"})
402     public void testPassString() throws Throwable {
403         // LIVECONNECT_COMPLIANCE: Non-empty string should convert to true.
404         executeJavaScript("testObject.setBooleanArray([\"+042.10\"]);");
405         assertFalse(mTestObject.waitForBooleanArray()[0]);
406
407         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
408         executeJavaScript("testObject.setByteArray([\"+042.10\"]);");
409         assertEquals(0, mTestObject.waitForByteArray()[0]);
410
411         // LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value.
412         executeJavaScript("testObject.setCharArray([\"+042.10\"]);");
413         assertEquals(0, mTestObject.waitForCharArray()[0]);
414
415         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
416         executeJavaScript("testObject.setShortArray([\"+042.10\"]);");
417         assertEquals(0, mTestObject.waitForShortArray()[0]);
418
419         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
420         executeJavaScript("testObject.setIntArray([\"+042.10\"]);");
421         assertEquals(0, mTestObject.waitForIntArray()[0]);
422
423         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
424         executeJavaScript("testObject.setLongArray([\"+042.10\"]);");
425         assertEquals(0L, mTestObject.waitForLongArray()[0]);
426
427         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
428         executeJavaScript("testObject.setFloatArray([\"+042.10\"]);");
429         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
430
431         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
432         executeJavaScript("testObject.setDoubleArray([\"+042.10\"]);");
433         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
434
435         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
436         executeJavaScript("testObject.setObjectArray([\"+042.10\"]);");
437         assertNull(mTestObject.waitForObjectArray());
438
439         executeJavaScript("testObject.setStringArray([\"+042.10\"]);");
440         assertEquals("+042.10", mTestObject.waitForStringArray()[0]);
441
442         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
443         executeJavaScript("testObject.setCustomTypeArray([\"+042.10\"]);");
444         assertNull(mTestObject.waitForCustomTypeArray());
445     }
446
447     // Test passing an array of JavaScript objects to a method which takes a
448     // Java array.
449     @SmallTest
450     @Feature({"AndroidWebView", "Android-JavaBridge"})
451     public void testPassJavaScriptObject() throws Throwable {
452         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
453         executeJavaScript("testObject.setBooleanArray([{foo: 42}]);");
454         assertFalse(mTestObject.waitForBooleanArray()[0]);
455
456         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
457         executeJavaScript("testObject.setByteArray([{foo: 42}]);");
458         assertEquals(0, mTestObject.waitForByteArray()[0]);
459
460         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
461         executeJavaScript("testObject.setCharArray([{foo: 42}]);");
462         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
463
464         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
465         executeJavaScript("testObject.setShortArray([{foo: 42}]);");
466         assertEquals(0, mTestObject.waitForShortArray()[0]);
467
468         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
469         executeJavaScript("testObject.setIntArray([{foo: 42}]);");
470         assertEquals(0, mTestObject.waitForIntArray()[0]);
471
472         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
473         executeJavaScript("testObject.setLongArray([{foo: 42}]);");
474         assertEquals(0L, mTestObject.waitForLongArray()[0]);
475
476         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
477         executeJavaScript("testObject.setFloatArray([{foo: 42}]);");
478         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
479
480         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
481         executeJavaScript("testObject.setDoubleArray([{foo: 42}]);");
482         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
483
484         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
485         executeJavaScript("testObject.setObjectArray([{foo: 42}]);");
486         assertNull(mTestObject.waitForObjectArray());
487
488         // LIVECONNECT_COMPLIANCE: Should call toString() on object.
489         executeJavaScript("testObject.setStringArray([{foo: 42}]);");
490         assertNull(mTestObject.waitForStringArray()[0]);
491
492         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
493         executeJavaScript("testObject.setCustomTypeArray([{foo: 42}]);");
494         assertNull(mTestObject.waitForCustomTypeArray());
495     }
496
497     // Test passing an array of Java objects to a method which takes a Java
498     // array.
499     @SmallTest
500     @Feature({"AndroidWebView", "Android-JavaBridge"})
501     public void testPassJavaObject() throws Throwable {
502         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
503         executeJavaScript("testObject.setBooleanArray([testObject.getObjectInstance()]);");
504         assertFalse(mTestObject.waitForBooleanArray()[0]);
505
506         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
507         executeJavaScript("testObject.setByteArray([testObject.getObjectInstance()]);");
508         assertEquals(0, mTestObject.waitForByteArray()[0]);
509
510         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
511         executeJavaScript("testObject.setCharArray([testObject.getObjectInstance()]);");
512         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
513
514         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
515         executeJavaScript("testObject.setShortArray([testObject.getObjectInstance()]);");
516         assertEquals(0, mTestObject.waitForShortArray()[0]);
517
518         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
519         executeJavaScript("testObject.setIntArray([testObject.getObjectInstance()]);");
520         assertEquals(0, mTestObject.waitForIntArray()[0]);
521
522         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
523         executeJavaScript("testObject.setLongArray([testObject.getObjectInstance()]);");
524         assertEquals(0L, mTestObject.waitForLongArray()[0]);
525
526         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
527         executeJavaScript("testObject.setFloatArray([testObject.getObjectInstance()]);");
528         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
529
530         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
531         executeJavaScript("testObject.setDoubleArray([testObject.getObjectInstance()]);");
532         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
533
534         // LIVECONNECT_COMPLIANCE: Should create an array and pass Java object.
535         executeJavaScript("testObject.setObjectArray([testObject.getObjectInstance()]);");
536         assertNull(mTestObject.waitForObjectArray());
537
538         // LIVECONNECT_COMPLIANCE: Should call toString() on object.
539         executeJavaScript("testObject.setStringArray([testObject.getObjectInstance()]);");
540         assertNull(mTestObject.waitForStringArray()[0]);
541
542         // LIVECONNECT_COMPLIANCE: Should create array and pass Java object.
543         executeJavaScript("testObject.setCustomTypeArray([testObject.getObjectInstance()]);");
544         assertNull(mTestObject.waitForCustomTypeArray());
545         executeJavaScript("testObject.setCustomTypeArray([testObject.getCustomTypeInstance()]);");
546         assertNull(mTestObject.waitForCustomTypeArray());
547     }
548
549     // Test passing an array of JavaScript null values to a method which takes
550     // a Java array.
551     @SmallTest
552     @Feature({"AndroidWebView", "Android-JavaBridge"})
553     public void testPassNull() throws Throwable {
554         executeJavaScript("testObject.setByteArray([null]);");
555         assertEquals(0, mTestObject.waitForByteArray()[0]);
556
557         executeJavaScript("testObject.setCharArray([null]);");
558         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
559
560         executeJavaScript("testObject.setShortArray([null]);");
561         assertEquals(0, mTestObject.waitForShortArray()[0]);
562
563         executeJavaScript("testObject.setIntArray([null]);");
564         assertEquals(0, mTestObject.waitForIntArray()[0]);
565
566         executeJavaScript("testObject.setLongArray([null]);");
567         assertEquals(0L, mTestObject.waitForLongArray()[0]);
568
569         executeJavaScript("testObject.setFloatArray([null]);");
570         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
571
572         executeJavaScript("testObject.setDoubleArray([null]);");
573         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
574
575         executeJavaScript("testObject.setBooleanArray([null]);");
576         assertFalse(mTestObject.waitForBooleanArray()[0]);
577
578         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
579         executeJavaScript("testObject.setObjectArray([null]);");
580         assertNull(mTestObject.waitForObjectArray());
581
582         executeJavaScript("testObject.setStringArray([null]);");
583         assertNull(mTestObject.waitForStringArray()[0]);
584
585         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
586         executeJavaScript("testObject.setCustomTypeArray([null]);");
587         assertNull(mTestObject.waitForCustomTypeArray());
588     }
589
590     // Test passing an array of JavaScript undefined values to a method which
591     // takes a Java array.
592     @SmallTest
593     @Feature({"AndroidWebView", "Android-JavaBridge"})
594     public void testPassUndefined() throws Throwable {
595         executeJavaScript("testObject.setByteArray([undefined]);");
596         assertEquals(0, mTestObject.waitForByteArray()[0]);
597
598         executeJavaScript("testObject.setCharArray([undefined]);");
599         assertEquals(0, mTestObject.waitForCharArray()[0]);
600
601         executeJavaScript("testObject.setShortArray([undefined]);");
602         assertEquals(0, mTestObject.waitForShortArray()[0]);
603
604         executeJavaScript("testObject.setIntArray([undefined]);");
605         assertEquals(0, mTestObject.waitForIntArray()[0]);
606
607         executeJavaScript("testObject.setLongArray([undefined]);");
608         assertEquals(0L, mTestObject.waitForLongArray()[0]);
609
610         executeJavaScript("testObject.setFloatArray([undefined]);");
611         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
612
613         executeJavaScript("testObject.setDoubleArray([undefined]);");
614         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
615
616         executeJavaScript("testObject.setBooleanArray([undefined]);");
617         assertEquals(false, mTestObject.waitForBooleanArray()[0]);
618
619         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
620         executeJavaScript("testObject.setObjectArray([undefined]);");
621         assertNull(mTestObject.waitForObjectArray());
622
623         executeJavaScript("testObject.setStringArray([undefined]);");
624         assertNull(mTestObject.waitForStringArray()[0]);
625
626         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
627         executeJavaScript("testObject.setCustomTypeArray([undefined]);");
628         assertNull(mTestObject.waitForCustomTypeArray());
629     }
630
631     // Test passing a typed Int8Array to a method which takes a Java array.
632     @SmallTest
633     @Feature({"AndroidWebView", "Android-JavaBridge"})
634     public void testPassInt8Array() throws Throwable {
635         executeJavaScript("buffer = new ArrayBuffer(1);");
636         executeJavaScript("int8_array = new Int8Array(buffer);");
637         executeJavaScript("int8_array[0] = 42;");
638
639         executeJavaScript("testObject.setBooleanArray(int8_array);");
640         assertFalse(mTestObject.waitForBooleanArray()[0]);
641
642         executeJavaScript("testObject.setByteArray(int8_array);");
643         assertEquals(42, mTestObject.waitForByteArray()[0]);
644
645         executeJavaScript("testObject.setCharArray(int8_array);");
646         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
647
648         executeJavaScript("testObject.setShortArray(int8_array);");
649         assertEquals(42, mTestObject.waitForShortArray()[0]);
650
651         executeJavaScript("testObject.setIntArray(int8_array);");
652         assertEquals(42, mTestObject.waitForIntArray()[0]);
653
654         executeJavaScript("testObject.setLongArray(int8_array);");
655         assertEquals(42L, mTestObject.waitForLongArray()[0]);
656
657         executeJavaScript("testObject.setFloatArray(int8_array);");
658         assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
659
660         executeJavaScript("testObject.setDoubleArray(int8_array);");
661         assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
662
663         executeJavaScript("testObject.setObjectArray(int8_array);");
664         assertNull(mTestObject.waitForObjectArray());
665
666         executeJavaScript("testObject.setStringArray(int8_array);");
667         assertNull(mTestObject.waitForStringArray()[0]);
668
669         executeJavaScript("testObject.setCustomTypeArray(int8_array);");
670         assertNull(mTestObject.waitForCustomTypeArray());
671     }
672
673     // Test passing a typed Uint8Array to a method which takes a Java array.
674     @SmallTest
675     @Feature({"AndroidWebView", "Android-JavaBridge"})
676     public void testPassUint8Array() throws Throwable {
677         executeJavaScript("buffer = new ArrayBuffer(1);");
678         executeJavaScript("uint8_array = new Uint8Array(buffer);");
679         executeJavaScript("uint8_array[0] = 42;");
680
681         executeJavaScript("testObject.setBooleanArray(uint8_array);");
682         assertFalse(mTestObject.waitForBooleanArray()[0]);
683
684         executeJavaScript("testObject.setByteArray(uint8_array);");
685         assertEquals(42, mTestObject.waitForByteArray()[0]);
686
687         executeJavaScript("testObject.setCharArray(uint8_array);");
688         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
689
690         executeJavaScript("testObject.setShortArray(uint8_array);");
691         assertEquals(42, mTestObject.waitForShortArray()[0]);
692
693         executeJavaScript("testObject.setIntArray(uint8_array);");
694         assertEquals(42, mTestObject.waitForIntArray()[0]);
695
696         executeJavaScript("testObject.setLongArray(uint8_array);");
697         assertEquals(42L, mTestObject.waitForLongArray()[0]);
698
699         executeJavaScript("testObject.setFloatArray(uint8_array);");
700         assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
701
702         executeJavaScript("testObject.setDoubleArray(uint8_array);");
703         assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
704
705         executeJavaScript("testObject.setObjectArray(uint8_array);");
706         assertNull(mTestObject.waitForObjectArray());
707
708         executeJavaScript("testObject.setStringArray(uint8_array);");
709         assertNull(mTestObject.waitForStringArray()[0]);
710
711         executeJavaScript("testObject.setCustomTypeArray(uint8_array);");
712         assertNull(mTestObject.waitForCustomTypeArray());
713     }
714
715     // Test passing a typed Int16Array to a method which takes a Java array.
716     @SmallTest
717     @Feature({"AndroidWebView", "Android-JavaBridge"})
718     public void testPassInt16Array() throws Throwable {
719         executeJavaScript("buffer = new ArrayBuffer(2);");
720         executeJavaScript("int16_array = new Int16Array(buffer);");
721         executeJavaScript("int16_array[0] = 42;");
722
723         executeJavaScript("testObject.setBooleanArray(int16_array);");
724         assertFalse(mTestObject.waitForBooleanArray()[0]);
725
726         executeJavaScript("testObject.setByteArray(int16_array);");
727         assertEquals(42, mTestObject.waitForByteArray()[0]);
728
729         executeJavaScript("testObject.setCharArray(int16_array);");
730         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
731
732         executeJavaScript("testObject.setShortArray(int16_array);");
733         assertEquals(42, mTestObject.waitForShortArray()[0]);
734
735         executeJavaScript("testObject.setIntArray(int16_array);");
736         assertEquals(42, mTestObject.waitForIntArray()[0]);
737
738         executeJavaScript("testObject.setLongArray(int16_array);");
739         assertEquals(42L, mTestObject.waitForLongArray()[0]);
740
741         executeJavaScript("testObject.setFloatArray(int16_array);");
742         assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
743
744         executeJavaScript("testObject.setDoubleArray(int16_array);");
745         assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
746
747         executeJavaScript("testObject.setObjectArray(int16_array);");
748         assertNull(mTestObject.waitForObjectArray());
749
750         executeJavaScript("testObject.setStringArray(int16_array);");
751         assertNull(mTestObject.waitForStringArray()[0]);
752
753         executeJavaScript("testObject.setCustomTypeArray(int16_array);");
754         assertNull(mTestObject.waitForCustomTypeArray());
755     }
756
757     // Test passing a typed Uint16Array to a method which takes a Java array.
758     @SmallTest
759     @Feature({"AndroidWebView", "Android-JavaBridge"})
760     public void testPassUint16Array() throws Throwable {
761         executeJavaScript("buffer = new ArrayBuffer(2);");
762         executeJavaScript("uint16_array = new Uint16Array(buffer);");
763         executeJavaScript("uint16_array[0] = 42;");
764
765         executeJavaScript("testObject.setBooleanArray(uint16_array);");
766         assertFalse(mTestObject.waitForBooleanArray()[0]);
767
768         executeJavaScript("testObject.setByteArray(uint16_array);");
769         assertEquals(42, mTestObject.waitForByteArray()[0]);
770
771         executeJavaScript("testObject.setCharArray(uint16_array);");
772         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
773
774         executeJavaScript("testObject.setShortArray(uint16_array);");
775         assertEquals(42, mTestObject.waitForShortArray()[0]);
776
777         executeJavaScript("testObject.setIntArray(uint16_array);");
778         assertEquals(42, mTestObject.waitForIntArray()[0]);
779
780         executeJavaScript("testObject.setLongArray(uint16_array);");
781         assertEquals(42L, mTestObject.waitForLongArray()[0]);
782
783         executeJavaScript("testObject.setFloatArray(uint16_array);");
784         assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
785
786         executeJavaScript("testObject.setDoubleArray(uint16_array);");
787         assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
788
789         executeJavaScript("testObject.setObjectArray(uint16_array);");
790         assertNull(mTestObject.waitForObjectArray());
791
792         executeJavaScript("testObject.setStringArray(uint16_array);");
793         assertNull(mTestObject.waitForStringArray()[0]);
794
795         executeJavaScript("testObject.setCustomTypeArray(uint16_array);");
796         assertNull(mTestObject.waitForCustomTypeArray());
797     }
798
799     // Test passing a typed Int32Array to a method which takes a Java array.
800     @SmallTest
801     @Feature({"AndroidWebView", "Android-JavaBridge"})
802     public void testPassInt32Array() throws Throwable {
803         executeJavaScript("buffer = new ArrayBuffer(4);");
804         executeJavaScript("int32_array = new Int32Array(buffer);");
805         executeJavaScript("int32_array[0] = 42;");
806
807         executeJavaScript("testObject.setBooleanArray(int32_array);");
808         assertFalse(mTestObject.waitForBooleanArray()[0]);
809
810         executeJavaScript("testObject.setByteArray(int32_array);");
811         assertEquals(42, mTestObject.waitForByteArray()[0]);
812
813         executeJavaScript("testObject.setCharArray(int32_array);");
814         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
815
816         executeJavaScript("testObject.setShortArray(int32_array);");
817         assertEquals(42, mTestObject.waitForShortArray()[0]);
818
819         executeJavaScript("testObject.setIntArray(int32_array);");
820         assertEquals(42, mTestObject.waitForIntArray()[0]);
821
822         executeJavaScript("testObject.setLongArray(int32_array);");
823         assertEquals(42L, mTestObject.waitForLongArray()[0]);
824
825         executeJavaScript("testObject.setFloatArray(int32_array);");
826         assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
827
828         executeJavaScript("testObject.setDoubleArray(int32_array);");
829         assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
830
831         executeJavaScript("testObject.setObjectArray(int32_array);");
832         assertNull(mTestObject.waitForObjectArray());
833
834         executeJavaScript("testObject.setStringArray(int32_array);");
835         assertNull(mTestObject.waitForStringArray()[0]);
836
837         executeJavaScript("testObject.setCustomTypeArray(int32_array);");
838         assertNull(mTestObject.waitForCustomTypeArray());
839     }
840
841     // Test passing a typed Uint32Array to a method which takes a Java array.
842     @SmallTest
843     @Feature({"AndroidWebView", "Android-JavaBridge"})
844     public void testPassUint32Array() throws Throwable {
845         executeJavaScript("buffer = new ArrayBuffer(4);");
846         executeJavaScript("uint32_array = new Uint32Array(buffer);");
847         executeJavaScript("uint32_array[0] = 42;");
848
849         executeJavaScript("testObject.setBooleanArray(uint32_array);");
850         assertFalse(mTestObject.waitForBooleanArray()[0]);
851
852         executeJavaScript("testObject.setByteArray(uint32_array);");
853         assertEquals(42, mTestObject.waitForByteArray()[0]);
854
855         executeJavaScript("testObject.setCharArray(uint32_array);");
856         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
857
858         executeJavaScript("testObject.setShortArray(uint32_array);");
859         assertEquals(42, mTestObject.waitForShortArray()[0]);
860
861         executeJavaScript("testObject.setIntArray(uint32_array);");
862         assertEquals(42, mTestObject.waitForIntArray()[0]);
863
864         executeJavaScript("testObject.setLongArray(uint32_array);");
865         assertEquals(42L, mTestObject.waitForLongArray()[0]);
866
867         executeJavaScript("testObject.setFloatArray(uint32_array);");
868         assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
869
870         executeJavaScript("testObject.setDoubleArray(uint32_array);");
871         assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
872
873         executeJavaScript("testObject.setObjectArray(uint32_array);");
874         assertNull(mTestObject.waitForObjectArray());
875
876         executeJavaScript("testObject.setStringArray(uint32_array);");
877         assertNull(mTestObject.waitForStringArray()[0]);
878
879         executeJavaScript("testObject.setCustomTypeArray(uint32_array);");
880         assertNull(mTestObject.waitForCustomTypeArray());
881     }
882
883     // Test passing a typed Float32Array to a method which takes a Java array.
884     @SmallTest
885     @Feature({"AndroidWebView", "Android-JavaBridge"})
886     public void testPassFloat32Array() throws Throwable {
887         executeJavaScript("buffer = new ArrayBuffer(4);");
888         executeJavaScript("float32_array = new Float32Array(buffer);");
889         executeJavaScript("float32_array[0] = 42.0;");
890
891         executeJavaScript("testObject.setBooleanArray(float32_array);");
892         assertFalse(mTestObject.waitForBooleanArray()[0]);
893
894         executeJavaScript("testObject.setByteArray(float32_array);");
895         assertEquals(42, mTestObject.waitForByteArray()[0]);
896
897         executeJavaScript("testObject.setCharArray(float32_array);");
898         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
899
900         executeJavaScript("testObject.setShortArray(float32_array);");
901         assertEquals(42, mTestObject.waitForShortArray()[0]);
902
903         executeJavaScript("testObject.setIntArray(float32_array);");
904         assertEquals(42, mTestObject.waitForIntArray()[0]);
905
906         executeJavaScript("testObject.setLongArray(float32_array);");
907         assertEquals(42L, mTestObject.waitForLongArray()[0]);
908
909         executeJavaScript("testObject.setFloatArray(float32_array);");
910         assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
911
912         executeJavaScript("testObject.setDoubleArray(float32_array);");
913         assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
914
915         executeJavaScript("testObject.setObjectArray(float32_array);");
916         assertNull(mTestObject.waitForObjectArray());
917
918         executeJavaScript("testObject.setStringArray(float32_array);");
919         assertNull(mTestObject.waitForStringArray()[0]);
920
921         executeJavaScript("testObject.setCustomTypeArray(float32_array);");
922         assertNull(mTestObject.waitForCustomTypeArray());
923     }
924
925     // Test passing a typed Float64Array to a method which takes a Java array.
926     @SmallTest
927     @Feature({"AndroidWebView", "Android-JavaBridge"})
928     public void testPassFloat64Array() throws Throwable {
929         executeJavaScript("buffer = new ArrayBuffer(8);");
930         executeJavaScript("float64_array = new Float64Array(buffer);");
931         executeJavaScript("float64_array[0] = 42.0;");
932
933         executeJavaScript("testObject.setBooleanArray(float64_array);");
934         assertFalse(mTestObject.waitForBooleanArray()[0]);
935
936         executeJavaScript("testObject.setByteArray(float64_array);");
937         assertEquals(42, mTestObject.waitForByteArray()[0]);
938
939         executeJavaScript("testObject.setCharArray(float64_array);");
940         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
941
942         executeJavaScript("testObject.setShortArray(float64_array);");
943         assertEquals(42, mTestObject.waitForShortArray()[0]);
944
945         executeJavaScript("testObject.setIntArray(float64_array);");
946         assertEquals(42, mTestObject.waitForIntArray()[0]);
947
948         executeJavaScript("testObject.setLongArray(float64_array);");
949         assertEquals(42L, mTestObject.waitForLongArray()[0]);
950
951         executeJavaScript("testObject.setFloatArray(float64_array);");
952         assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
953
954         executeJavaScript("testObject.setDoubleArray(float64_array);");
955         assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
956
957         executeJavaScript("testObject.setObjectArray(float64_array);");
958         assertNull(mTestObject.waitForObjectArray());
959
960         executeJavaScript("testObject.setStringArray(float64_array);");
961         assertNull(mTestObject.waitForStringArray()[0]);
962
963         executeJavaScript("testObject.setCustomTypeArray(float64_array);");
964         assertNull(mTestObject.waitForCustomTypeArray());
965     }
966 }