- add sources.
[platform/framework/web/crosswalk.git] / src / content / public / android / javatests / src / org / chromium / content / browser / JavaBridgeArrayCoercionTest.java
1 // Copyright (c) 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.DisabledTest;
10 import org.chromium.base.test.util.Feature;
11
12 /**
13  * Part of the test suite for the Java Bridge. This class tests that we correctly convert
14  * JavaScript arrays to Java arrays when passing them to the methods of injected Java objects.
15  *
16  * The conversions should follow
17  * http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_CONVERSIONS. Places in
18  * which the implementation differs from the spec are marked with
19  * LIVECONNECT_COMPLIANCE.
20  * FIXME: Consider making our implementation more compliant, if it will not
21  * break backwards-compatibility. See b/4408210.
22  */
23 public class JavaBridgeArrayCoercionTest extends JavaBridgeTestBase {
24     private class TestObject extends Controller {
25         private final Object mObjectInstance;
26         private final CustomType mCustomTypeInstance;
27
28         private boolean[] mBooleanArray;
29         private byte[] mByteArray;
30         private char[] mCharArray;
31         private short[] mShortArray;
32         private int[] mIntArray;
33         private long[] mLongArray;
34         private float[] mFloatArray;
35         private double[] mDoubleArray;
36         private String[] mStringArray;
37         private Object[] mObjectArray;
38         private CustomType[] mCustomTypeArray;
39
40         public TestObject() {
41             mObjectInstance = new Object();
42             mCustomTypeInstance = new CustomType();
43         }
44
45         public Object getObjectInstance() {
46             return mObjectInstance;
47         }
48         public CustomType getCustomTypeInstance() {
49             return mCustomTypeInstance;
50         }
51
52         public synchronized void setBooleanArray(boolean[] x) {
53             mBooleanArray = x;
54             notifyResultIsReady();
55         }
56         public synchronized void setByteArray(byte[] x) {
57             mByteArray = x;
58             notifyResultIsReady();
59         }
60         public synchronized void setCharArray(char[] x) {
61             mCharArray = x;
62             notifyResultIsReady();
63         }
64         public synchronized void setShortArray(short[] x) {
65             mShortArray = x;
66             notifyResultIsReady();
67         }
68         public synchronized void setIntArray(int[] x) {
69             mIntArray = x;
70             notifyResultIsReady();
71         }
72         public synchronized void setLongArray(long[] x) {
73             mLongArray = x;
74             notifyResultIsReady();
75         }
76         public synchronized void setFloatArray(float[] x) {
77             mFloatArray = x;
78             notifyResultIsReady();
79         }
80         public synchronized void setDoubleArray(double[] x) {
81             mDoubleArray = x;
82             notifyResultIsReady();
83         }
84         public synchronized void setStringArray(String[] x) {
85             mStringArray = x;
86             notifyResultIsReady();
87         }
88         public synchronized void setObjectArray(Object[] x) {
89             mObjectArray = x;
90             notifyResultIsReady();
91         }
92         public synchronized void setCustomTypeArray(CustomType[] x) {
93             mCustomTypeArray = x;
94             notifyResultIsReady();
95         }
96
97         public synchronized boolean[] waitForBooleanArray() {
98             waitForResult();
99             return mBooleanArray;
100         }
101         public synchronized byte[] waitForByteArray() {
102             waitForResult();
103             return mByteArray;
104         }
105         public synchronized char[] waitForCharArray() {
106             waitForResult();
107             return mCharArray;
108         }
109         public synchronized short[] waitForShortArray() {
110             waitForResult();
111             return mShortArray;
112         }
113         public synchronized int[] waitForIntArray() {
114             waitForResult();
115             return mIntArray;
116         }
117         public synchronized long[] waitForLongArray() {
118             waitForResult();
119             return mLongArray;
120         }
121         public synchronized float[] waitForFloatArray() {
122             waitForResult();
123             return mFloatArray;
124         }
125         public synchronized double[] waitForDoubleArray() {
126             waitForResult();
127             return mDoubleArray;
128         }
129         public synchronized String[] waitForStringArray() {
130             waitForResult();
131             return mStringArray;
132         }
133         public synchronized Object[] waitForObjectArray() {
134             waitForResult();
135             return mObjectArray;
136         }
137         public synchronized CustomType[] waitForCustomTypeArray() {
138             waitForResult();
139             return mCustomTypeArray;
140         }
141     }
142
143     // Two custom types used when testing passing objects.
144     private static class CustomType {
145     }
146
147     private TestObject mTestObject;
148
149     @Override
150     protected void setUp() throws Exception {
151         super.setUp();
152         mTestObject = new TestObject();
153         setUpContentView(mTestObject, "testObject");
154     }
155
156     // Note that all tests use a single element array for simplicity. We test
157     // multiple elements elsewhere.
158
159     // Test passing an array of JavaScript numbers in the int32 range to a
160     // method which takes a Java array.
161     @SmallTest
162     @Feature({"AndroidWebView", "Android-JavaBridge"})
163     public void testPassNumberInt32() throws Throwable {
164         executeJavaScript("testObject.setBooleanArray([0]);");
165         assertFalse(mTestObject.waitForBooleanArray()[0]);
166         // LIVECONNECT_COMPLIANCE: Should convert to boolean.
167         executeJavaScript("testObject.setBooleanArray([42]);");
168         assertFalse(mTestObject.waitForBooleanArray()[0]);
169
170         executeJavaScript("testObject.setByteArray([42]);");
171         assertEquals(42, mTestObject.waitForByteArray()[0]);
172
173         // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
174         executeJavaScript("testObject.setCharArray([42]);");
175         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
176
177         executeJavaScript("testObject.setShortArray([42]);");
178         assertEquals(42, mTestObject.waitForShortArray()[0]);
179
180         executeJavaScript("testObject.setIntArray([42]);");
181         assertEquals(42, mTestObject.waitForIntArray()[0]);
182
183         executeJavaScript("testObject.setLongArray([42]);");
184         assertEquals(42L, mTestObject.waitForLongArray()[0]);
185
186         executeJavaScript("testObject.setFloatArray([42]);");
187         assertEquals(42.0f, mTestObject.waitForFloatArray()[0]);
188
189         executeJavaScript("testObject.setDoubleArray([42]);");
190         assertEquals(42.0, mTestObject.waitForDoubleArray()[0]);
191
192         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
193         executeJavaScript("testObject.setObjectArray([42]);");
194         assertNull(mTestObject.waitForObjectArray());
195
196         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
197         executeJavaScript("testObject.setStringArray([42]);");
198         assertNull(mTestObject.waitForStringArray()[0]);
199
200         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
201         executeJavaScript("testObject.setCustomTypeArray([42]);");
202         assertNull(mTestObject.waitForCustomTypeArray());
203     }
204
205     // Test passing an array of JavaScript numbers in the double range to a
206     // method which takes a Java array.
207     @SmallTest
208     @Feature({"AndroidWebView", "Android-JavaBridge"})
209     public void testPassNumberDouble() throws Throwable {
210         // LIVECONNECT_COMPLIANCE: Should convert to boolean.
211         executeJavaScript("testObject.setBooleanArray([42.1]);");
212         assertFalse(mTestObject.waitForBooleanArray()[0]);
213
214         executeJavaScript("testObject.setByteArray([42.1]);");
215         assertEquals(42, mTestObject.waitForByteArray()[0]);
216
217         // LIVECONNECT_COMPLIANCE: Should convert to numeric char value.
218         executeJavaScript("testObject.setCharArray([42.1]);");
219         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
220
221         executeJavaScript("testObject.setShortArray([42.1]);");
222         assertEquals(42, mTestObject.waitForShortArray()[0]);
223
224         executeJavaScript("testObject.setIntArray([42.1]);");
225         assertEquals(42, mTestObject.waitForIntArray()[0]);
226
227         executeJavaScript("testObject.setLongArray([42.1]);");
228         assertEquals(42L, mTestObject.waitForLongArray()[0]);
229
230         executeJavaScript("testObject.setFloatArray([42.1]);");
231         assertEquals(42.1f, mTestObject.waitForFloatArray()[0]);
232
233         executeJavaScript("testObject.setDoubleArray([42.1]);");
234         assertEquals(42.1, mTestObject.waitForDoubleArray()[0]);
235
236         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
237         executeJavaScript("testObject.setObjectArray([42.1]);");
238         assertNull(mTestObject.waitForObjectArray());
239
240         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
241         executeJavaScript("testObject.setStringArray([42.1]);");
242         assertNull(mTestObject.waitForStringArray()[0]);
243
244         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
245         executeJavaScript("testObject.setCustomTypeArray([42.1]);");
246         assertNull(mTestObject.waitForCustomTypeArray());
247     }
248
249     // Test passing an array of JavaScript NaN values to a method which takes a
250     // Java array.
251     @SmallTest
252     @Feature({"AndroidWebView", "Android-JavaBridge"})
253     public void testPassNumberNaN() throws Throwable {
254         executeJavaScript("testObject.setBooleanArray([Number.NaN]);");
255         assertFalse(mTestObject.waitForBooleanArray()[0]);
256
257         executeJavaScript("testObject.setByteArray([Number.NaN]);");
258         assertEquals(0, mTestObject.waitForByteArray()[0]);
259
260         executeJavaScript("testObject.setCharArray([Number.NaN]);");
261         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
262
263         executeJavaScript("testObject.setShortArray([Number.NaN]);");
264         assertEquals(0, mTestObject.waitForShortArray()[0]);
265
266         executeJavaScript("testObject.setIntArray([Number.NaN]);");
267         assertEquals(0, mTestObject.waitForIntArray()[0]);
268
269         executeJavaScript("testObject.setLongArray([Number.NaN]);");
270         assertEquals(0L, mTestObject.waitForLongArray()[0]);
271
272         executeJavaScript("testObject.setFloatArray([Number.NaN]);");
273         assertEquals(Float.NaN, mTestObject.waitForFloatArray()[0]);
274
275         executeJavaScript("testObject.setDoubleArray([Number.NaN]);");
276         assertEquals(Double.NaN, mTestObject.waitForDoubleArray()[0]);
277
278         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
279         executeJavaScript("testObject.setObjectArray([Number.NaN]);");
280         assertNull(mTestObject.waitForObjectArray());
281
282         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
283         executeJavaScript("testObject.setStringArray([Number.NaN]);");
284         assertNull(mTestObject.waitForStringArray()[0]);
285
286         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
287         executeJavaScript("testObject.setCustomTypeArray([Number.NaN]);");
288         assertNull(mTestObject.waitForCustomTypeArray());
289     }
290
291     // Test passing an array of JavaScript infinity values to a method which
292     // takes a Java array.
293     @SmallTest
294     @Feature({"AndroidWebView", "Android-JavaBridge"})
295     public void testPassNumberInfinity() throws Throwable {
296         executeJavaScript("testObject.setBooleanArray([Infinity]);");
297         assertFalse(mTestObject.waitForBooleanArray()[0]);
298
299         executeJavaScript("testObject.setByteArray([Infinity]);");
300         assertEquals(-1, mTestObject.waitForByteArray()[0]);
301
302         // LIVECONNECT_COMPLIANCE: Should convert to maximum numeric char value.
303         executeJavaScript("testObject.setCharArray([Infinity]);");
304         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
305
306         executeJavaScript("testObject.setShortArray([Infinity]);");
307         assertEquals(-1, mTestObject.waitForShortArray()[0]);
308
309         executeJavaScript("testObject.setIntArray([Infinity]);");
310         assertEquals(Integer.MAX_VALUE, mTestObject.waitForIntArray()[0]);
311
312         executeJavaScript("testObject.setLongArray([Infinity]);");
313         assertEquals(Long.MAX_VALUE, mTestObject.waitForLongArray()[0]);
314
315         executeJavaScript("testObject.setFloatArray([Infinity]);");
316         assertEquals(Float.POSITIVE_INFINITY, mTestObject.waitForFloatArray()[0]);
317
318         executeJavaScript("testObject.setDoubleArray([Infinity]);");
319         assertEquals(Double.POSITIVE_INFINITY, mTestObject.waitForDoubleArray()[0]);
320
321         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
322         executeJavaScript("testObject.setObjectArray([Infinity]);");
323         assertNull(mTestObject.waitForObjectArray());
324
325         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
326         executeJavaScript("testObject.setStringArray([Infinity]);");
327         assertNull(mTestObject.waitForStringArray()[0]);
328
329         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
330         executeJavaScript("testObject.setCustomTypeArray([Infinity]);");
331         assertNull(mTestObject.waitForCustomTypeArray());
332     }
333
334     // Test passing an array of JavaScript boolean values to a method which
335     // takes a Java array.
336     @SmallTest
337     @Feature({"AndroidWebView", "Android-JavaBridge"})
338     public void testPassBoolean() throws Throwable {
339         executeJavaScript("testObject.setBooleanArray([true]);");
340         assertTrue(mTestObject.waitForBooleanArray()[0]);
341         executeJavaScript("testObject.setBooleanArray([false]);");
342         assertFalse(mTestObject.waitForBooleanArray()[0]);
343
344         // LIVECONNECT_COMPLIANCE: Should be 1.
345         executeJavaScript("testObject.setByteArray([true]);");
346         assertEquals(0, mTestObject.waitForByteArray()[0]);
347         executeJavaScript("testObject.setByteArray([false]);");
348         assertEquals(0, mTestObject.waitForByteArray()[0]);
349
350         // LIVECONNECT_COMPLIANCE: Should convert to numeric char value 1.
351         executeJavaScript("testObject.setCharArray([true]);");
352         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
353         executeJavaScript("testObject.setCharArray([false]);");
354         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
355
356         // LIVECONNECT_COMPLIANCE: Should be 1.
357         executeJavaScript("testObject.setShortArray([true]);");
358         assertEquals(0, mTestObject.waitForShortArray()[0]);
359         executeJavaScript("testObject.setShortArray([false]);");
360         assertEquals(0, mTestObject.waitForShortArray()[0]);
361
362         // LIVECONNECT_COMPLIANCE: Should be 1.
363         executeJavaScript("testObject.setIntArray([true]);");
364         assertEquals(0, mTestObject.waitForIntArray()[0]);
365         executeJavaScript("testObject.setIntArray([false]);");
366         assertEquals(0, mTestObject.waitForIntArray()[0]);
367
368         // LIVECONNECT_COMPLIANCE: Should be 1.
369         executeJavaScript("testObject.setLongArray([true]);");
370         assertEquals(0L, mTestObject.waitForLongArray()[0]);
371         executeJavaScript("testObject.setLongArray([false]);");
372         assertEquals(0L, mTestObject.waitForLongArray()[0]);
373
374         // LIVECONNECT_COMPLIANCE: Should be 1.0.
375         executeJavaScript("testObject.setFloatArray([true]);");
376         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
377         executeJavaScript("testObject.setFloatArray([false]);");
378         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
379
380         // LIVECONNECT_COMPLIANCE: Should be 1.0.
381         executeJavaScript("testObject.setDoubleArray([true]);");
382         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
383         executeJavaScript("testObject.setDoubleArray([false]);");
384         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
385
386         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
387         executeJavaScript("testObject.setObjectArray([true]);");
388         assertNull(mTestObject.waitForObjectArray());
389
390         // LIVECONNECT_COMPLIANCE: Should create instances of java.lang.String.
391         executeJavaScript("testObject.setStringArray([true]);");
392         assertNull(mTestObject.waitForStringArray()[0]);
393
394         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
395         executeJavaScript("testObject.setCustomTypeArray([true]);");
396         assertNull(mTestObject.waitForCustomTypeArray());
397     }
398
399     // Test passing an array of JavaScript strings to a method which takes a
400     // Java array.
401     @SmallTest
402     @Feature({"AndroidWebView", "Android-JavaBridge"})
403     public void testPassString() throws Throwable {
404         // LIVECONNECT_COMPLIANCE: Non-empty string should convert to true.
405         executeJavaScript("testObject.setBooleanArray([\"+042.10\"]);");
406         assertFalse(mTestObject.waitForBooleanArray()[0]);
407
408         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
409         executeJavaScript("testObject.setByteArray([\"+042.10\"]);");
410         assertEquals(0, mTestObject.waitForByteArray()[0]);
411
412         // LIVECONNECT_COMPLIANCE: Should decode and convert to numeric char value.
413         executeJavaScript("testObject.setCharArray([\"+042.10\"]);");
414         assertEquals(0, mTestObject.waitForCharArray()[0]);
415
416         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
417         executeJavaScript("testObject.setShortArray([\"+042.10\"]);");
418         assertEquals(0, mTestObject.waitForShortArray()[0]);
419
420         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
421         executeJavaScript("testObject.setIntArray([\"+042.10\"]);");
422         assertEquals(0, mTestObject.waitForIntArray()[0]);
423
424         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
425         executeJavaScript("testObject.setLongArray([\"+042.10\"]);");
426         assertEquals(0L, mTestObject.waitForLongArray()[0]);
427
428         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
429         executeJavaScript("testObject.setFloatArray([\"+042.10\"]);");
430         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
431
432         // LIVECONNECT_COMPLIANCE: Should use valueOf() of appropriate type.
433         executeJavaScript("testObject.setDoubleArray([\"+042.10\"]);");
434         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
435
436         // LIVECONNECT_COMPLIANCE: Should create array and create instances of java.lang.Number.
437         executeJavaScript("testObject.setObjectArray([\"+042.10\"]);");
438         assertNull(mTestObject.waitForObjectArray());
439
440         executeJavaScript("testObject.setStringArray([\"+042.10\"]);");
441         assertEquals("+042.10", mTestObject.waitForStringArray()[0]);
442
443         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
444         executeJavaScript("testObject.setCustomTypeArray([\"+042.10\"]);");
445         assertNull(mTestObject.waitForCustomTypeArray());
446     }
447
448     // Test passing an array of JavaScript objects to a method which takes a
449     // Java array.
450     @SmallTest
451     @Feature({"AndroidWebView", "Android-JavaBridge"})
452     public void testPassJavaScriptObject() throws Throwable {
453         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
454         executeJavaScript("testObject.setBooleanArray([{foo: 42}]);");
455         assertFalse(mTestObject.waitForBooleanArray()[0]);
456
457         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
458         executeJavaScript("testObject.setByteArray([{foo: 42}]);");
459         assertEquals(0, mTestObject.waitForByteArray()[0]);
460
461         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
462         executeJavaScript("testObject.setCharArray([{foo: 42}]);");
463         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
464
465         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
466         executeJavaScript("testObject.setShortArray([{foo: 42}]);");
467         assertEquals(0, mTestObject.waitForShortArray()[0]);
468
469         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
470         executeJavaScript("testObject.setIntArray([{foo: 42}]);");
471         assertEquals(0, mTestObject.waitForIntArray()[0]);
472
473         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
474         executeJavaScript("testObject.setLongArray([{foo: 42}]);");
475         assertEquals(0L, mTestObject.waitForLongArray()[0]);
476
477         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
478         executeJavaScript("testObject.setFloatArray([{foo: 42}]);");
479         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
480
481         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
482         executeJavaScript("testObject.setDoubleArray([{foo: 42}]);");
483         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
484
485         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
486         executeJavaScript("testObject.setObjectArray([{foo: 42}]);");
487         assertNull(mTestObject.waitForObjectArray());
488
489         // LIVECONNECT_COMPLIANCE: Should call toString() on object.
490         executeJavaScript("testObject.setStringArray([{foo: 42}]);");
491         assertNull(mTestObject.waitForStringArray()[0]);
492
493         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
494         executeJavaScript("testObject.setCustomTypeArray([{foo: 42}]);");
495         assertNull(mTestObject.waitForCustomTypeArray());
496     }
497
498     // Test passing an array of Java objects to a method which takes a Java
499     // array.
500     @SmallTest
501     @Feature({"AndroidWebView", "Android-JavaBridge"})
502     public void testPassJavaObject() throws Throwable {
503         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
504         executeJavaScript("testObject.setBooleanArray([testObject.getObjectInstance()]);");
505         assertFalse(mTestObject.waitForBooleanArray()[0]);
506
507         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
508         executeJavaScript("testObject.setByteArray([testObject.getObjectInstance()]);");
509         assertEquals(0, mTestObject.waitForByteArray()[0]);
510
511         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
512         executeJavaScript("testObject.setCharArray([testObject.getObjectInstance()]);");
513         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
514
515         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
516         executeJavaScript("testObject.setShortArray([testObject.getObjectInstance()]);");
517         assertEquals(0, mTestObject.waitForShortArray()[0]);
518
519         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
520         executeJavaScript("testObject.setIntArray([testObject.getObjectInstance()]);");
521         assertEquals(0, mTestObject.waitForIntArray()[0]);
522
523         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
524         executeJavaScript("testObject.setLongArray([testObject.getObjectInstance()]);");
525         assertEquals(0L, mTestObject.waitForLongArray()[0]);
526
527         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
528         executeJavaScript("testObject.setFloatArray([testObject.getObjectInstance()]);");
529         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
530
531         // LIVECONNECT_COMPLIANCE: Should raise a JavaScript exception.
532         executeJavaScript("testObject.setDoubleArray([testObject.getObjectInstance()]);");
533         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
534
535         // LIVECONNECT_COMPLIANCE: Should create an array and pass Java object.
536         executeJavaScript("testObject.setObjectArray([testObject.getObjectInstance()]);");
537         assertNull(mTestObject.waitForObjectArray());
538
539         // LIVECONNECT_COMPLIANCE: Should call toString() on object.
540         executeJavaScript("testObject.setStringArray([testObject.getObjectInstance()]);");
541         assertNull(mTestObject.waitForStringArray()[0]);
542
543         // LIVECONNECT_COMPLIANCE: Should create array and pass Java object.
544         executeJavaScript("testObject.setCustomTypeArray([testObject.getObjectInstance()]);");
545         assertNull(mTestObject.waitForCustomTypeArray());
546         executeJavaScript("testObject.setCustomTypeArray([testObject.getCustomTypeInstance()]);");
547         assertNull(mTestObject.waitForCustomTypeArray());
548     }
549
550     // Test passing an array of JavaScript null values to a method which takes
551     // a Java array.
552     @SmallTest
553     @Feature({"AndroidWebView", "Android-JavaBridge"})
554     public void testPassNull() throws Throwable {
555         executeJavaScript("testObject.setByteArray([null]);");
556         assertEquals(0, mTestObject.waitForByteArray()[0]);
557
558         executeJavaScript("testObject.setCharArray([null]);");
559         assertEquals('\u0000', mTestObject.waitForCharArray()[0]);
560
561         executeJavaScript("testObject.setShortArray([null]);");
562         assertEquals(0, mTestObject.waitForShortArray()[0]);
563
564         executeJavaScript("testObject.setIntArray([null]);");
565         assertEquals(0, mTestObject.waitForIntArray()[0]);
566
567         executeJavaScript("testObject.setLongArray([null]);");
568         assertEquals(0L, mTestObject.waitForLongArray()[0]);
569
570         executeJavaScript("testObject.setFloatArray([null]);");
571         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
572
573         executeJavaScript("testObject.setDoubleArray([null]);");
574         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
575
576         executeJavaScript("testObject.setBooleanArray([null]);");
577         assertFalse(mTestObject.waitForBooleanArray()[0]);
578
579         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
580         executeJavaScript("testObject.setObjectArray([null]);");
581         assertNull(mTestObject.waitForObjectArray());
582
583         executeJavaScript("testObject.setStringArray([null]);");
584         assertNull(mTestObject.waitForStringArray()[0]);
585
586         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
587         executeJavaScript("testObject.setCustomTypeArray([null]);");
588         assertNull(mTestObject.waitForCustomTypeArray());
589     }
590
591     // Test passing an array of JavaScript undefined values to a method which
592     // takes a Java array.
593     @SmallTest
594     @Feature({"AndroidWebView", "Android-JavaBridge"})
595     public void testPassUndefined() throws Throwable {
596         executeJavaScript("testObject.setByteArray([undefined]);");
597         assertEquals(0, mTestObject.waitForByteArray()[0]);
598
599         executeJavaScript("testObject.setCharArray([undefined]);");
600         assertEquals(0, mTestObject.waitForCharArray()[0]);
601
602         executeJavaScript("testObject.setShortArray([undefined]);");
603         assertEquals(0, mTestObject.waitForShortArray()[0]);
604
605         executeJavaScript("testObject.setIntArray([undefined]);");
606         assertEquals(0, mTestObject.waitForIntArray()[0]);
607
608         executeJavaScript("testObject.setLongArray([undefined]);");
609         assertEquals(0L, mTestObject.waitForLongArray()[0]);
610
611         executeJavaScript("testObject.setFloatArray([undefined]);");
612         assertEquals(0.0f, mTestObject.waitForFloatArray()[0]);
613
614         executeJavaScript("testObject.setDoubleArray([undefined]);");
615         assertEquals(0.0, mTestObject.waitForDoubleArray()[0]);
616
617         executeJavaScript("testObject.setBooleanArray([undefined]);");
618         assertEquals(false, mTestObject.waitForBooleanArray()[0]);
619
620         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
621         executeJavaScript("testObject.setObjectArray([undefined]);");
622         assertNull(mTestObject.waitForObjectArray());
623
624         executeJavaScript("testObject.setStringArray([undefined]);");
625         assertNull(mTestObject.waitForStringArray()[0]);
626
627         // LIVECONNECT_COMPLIANCE: Should create array and pass null.
628         executeJavaScript("testObject.setCustomTypeArray([undefined]);");
629         assertNull(mTestObject.waitForCustomTypeArray());
630     }
631 }