blob: b1e50d43e686fd042913c7064cadcfec3fcf02fb [file] [log] [blame]
/*
* Copyright 2015 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.core.interop;
import com.google.gwt.core.client.ScriptInjector;
import com.google.gwt.junit.client.GWTTestCase;
import jsinterop.annotations.JsFunction;
import jsinterop.annotations.JsPackage;
import jsinterop.annotations.JsProperty;
import jsinterop.annotations.JsType;
/**
* Tests JsType with array functionality.
*/
public class JsTypeArrayTest extends GWTTestCase {
@Override
protected void gwtSetUp() throws Exception {
ScriptInjector.fromString("function JsTypeArrayTest_SimpleJsTypeReturnForMultiDimArray() {}")
.setWindow(ScriptInjector.TOP_WINDOW)
.inject();
}
@Override
public String getModuleName() {
return "com.google.gwt.core.Interop";
}
/* MAKE SURE EACH TYPE IS ONLY USED ONCE PER TEST CASE */
@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "String")
private static class SomeJsType { }
@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object")
private static class SomeOtherJsType { }
public void testJsTypeArray() {
Object[] array = new SomeJsType[10];
array[0] = new SomeJsType();
array[0] = new SomeOtherJsType();
array[0] = new Object();
assertTrue(array instanceof SomeJsType[]);
assertTrue(array instanceof SomeOtherJsType[]);
assertTrue(array instanceof Object[]);
SomeOtherJsType[] other1 = (SomeOtherJsType[]) array;
SomeOtherJsType[] other2 = (SomeOtherJsType[]) new Object[0];
}
@JsType(isNative = true)
interface SimpleJsTypeReturnFromNative { }
public void testJsTypeArray_returnFromNative() {
SimpleJsTypeReturnFromNative[] array = returnJsTypeFromNative();
assertEquals(2, array.length);
assertNotNull(array[0]);
}
private native SimpleJsTypeReturnFromNative[] returnJsTypeFromNative() /*-{
return [{}, {}];
}-*/;
@JsType(isNative = true)
interface SimpleJsTypeReturnFromNativeWithAMethod {
@JsProperty int getId();
}
public void testJsTypeArray_returnFromNativeWithACall() {
SimpleJsTypeReturnFromNativeWithAMethod[] array = returnJsTypeWithIdsFromNative();
assertEquals(2, array[1].getId());
}
private native SimpleJsTypeReturnFromNativeWithAMethod[] returnJsTypeWithIdsFromNative() /*-{
return [{id:1}, {id:2}];
}-*/;
@JsType(isNative = true)
interface SimpleJsTypeAsAField { }
@JsType
static class SimpleJsTypeAsAFieldHolder {
public SimpleJsTypeAsAField[] arrayField;
}
public void testJsTypeArray_asAField() {
SimpleJsTypeAsAFieldHolder holder = new SimpleJsTypeAsAFieldHolder();
fillArrayField(holder);
SimpleJsTypeAsAField[] array = holder.arrayField;
assertEquals(2, array.length);
assertNotNull(array[0]);
}
private native static void fillArrayField(SimpleJsTypeAsAFieldHolder holder) /*-{
holder.arrayField = [{}, {}];
}-*/;
@JsType(isNative = true)
interface SimpleJsTypeAsAParam { }
@JsType
static class SimpleJsTypeAsAParamHolder {
private SimpleJsTypeAsAParam[] theParam;
public void setArrayParam(SimpleJsTypeAsAParam[] param) {
theParam = param;
}
}
public void testJsTypeArray_asAParam() {
SimpleJsTypeAsAParamHolder holder = new SimpleJsTypeAsAParamHolder();
fillArrayParam(holder);
SimpleJsTypeAsAParam[] array = holder.theParam;
assertEquals(2, array.length);
assertNotNull(array[0]);
}
private native void fillArrayParam(SimpleJsTypeAsAParamHolder holder) /*-{
holder.setArrayParam([{}, {}]);
}-*/;
@JsType(isNative = true, namespace = JsPackage.GLOBAL,
name = "JsTypeArrayTest_SimpleJsTypeReturnForMultiDimArray")
static class SimpleJsTypeReturnForMultiDimArray {
@JsProperty public native int getId();
}
public void testJsType3DimArray_castFromNativeWithACall() {
SimpleJsTypeReturnForMultiDimArray[][][] array =
(SimpleJsTypeReturnForMultiDimArray[][][]) returnJsType3DimFromNative();
assertEquals(1, array.length);
assertEquals(2, array[0].length);
assertEquals(3, array[0][0].length);
assertEquals(2, array[0][0][1].getId());
}
private native Object returnJsType3DimFromNative() /*-{
return [ [ [{id:1}, {id:2}, {}], [] ] ];
}-*/;
private native SimpleJsTypeReturnForMultiDimArray getSimpleJsType(int i) /*-{
return {id:i};
}-*/;
public void testObjectArray_castFromNative() {
SimpleJsTypeReturnForMultiDimArray[] array =
(SimpleJsTypeReturnForMultiDimArray[]) returnObjectArrayFromNative();
assertNotNull((Object[]) array);
assertEquals(3, array.length);
assertEquals("1", array[0]);
}
public void testJsTypeArray_objectArrayInterchangeability() {
Object[] objArray = new Object[1];
SimpleJsTypeReturnForMultiDimArray[][][] array =
(SimpleJsTypeReturnForMultiDimArray[][][]) objArray;
objArray[0] = new Object[2];
((Object[]) objArray[0])[0] = new Object[3];
array[0][0][1] = getSimpleJsType(2);
assertEquals(1, array.length);
assertEquals(2, array[0].length);
assertEquals(3, array[0][0].length);
assertEquals(2, array[0][0][1].getId());
}
public void testObjectArray_instanceOf() {
Object array = new Object[0];
assertTrue(array instanceof Object[]);
assertFalse(array instanceof Double[]);
assertFalse(array instanceof int[]);
assertFalse(array instanceof SimpleJsTypeReturnForMultiDimArray);
assertTrue(array instanceof SimpleJsTypeReturnForMultiDimArray[]);
assertTrue(array instanceof SimpleJsTypeReturnForMultiDimArray[][]);
assertTrue(array instanceof SimpleJsTypeReturnForMultiDimArray[][][]);
}
public void testJsTypeArray_instanceOf() {
Object array = returnJsType3DimFromNative();
assertTrue(array instanceof Object[]);
assertFalse(array instanceof Double[]);
assertFalse(array instanceof int[]);
assertFalse(array instanceof SimpleJsTypeReturnForMultiDimArray);
assertTrue(array instanceof SimpleJsTypeReturnForMultiDimArray[]);
assertTrue(array instanceof SimpleJsTypeReturnForMultiDimArray[][]);
assertTrue(array instanceof SimpleJsTypeReturnForMultiDimArray[][][]);
}
@JsType(isNative = true)
private static class UnreferencedNativeType { }
private static native Object createArray() /*-{
return [];
}-*/;
public void testJsTypeArray_unreferencedNativeArrayInstanceOf() {
assertTrue(createArray() instanceof UnreferencedNativeType[]);
}
@JsFunction
interface SomeFunction {
int m(int i);
}
@JsFunction
interface SomeOtherFunction {
int m(int i);
}
public void testJsFunctionArray() {
Object[] array = new SomeFunction[10];
array[0] = returnSomeFunction();
assertTrue(array instanceof SomeFunction[]);
assertFalse(array instanceof SomeOtherFunction[]);
try {
SomeOtherFunction[] other = (SomeOtherFunction[]) array;
fail("Should have thrown");
} catch (ClassCastException expected) {
}
try {
array[1] = new Object();
fail("Should have thrown");
} catch (ArrayStoreException expected) {
}
}
private native Object returnObjectArrayFromNative() /*-{
return ["1", "2", "3"];
}-*/;
private native Object returnSomeFunction() /*-{
return function(a) { return a + 2; };
}-*/;
}