blob: f61b1302cc08514780a62f821823e9fd1ea5cbc4 [file] [log] [blame]
/*
* Copyright 2011 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.client;
import com.google.gwt.junit.client.GWTTestCase;
/**
* Test Js Identity.
*/
public class JsIdentityTest extends GWTTestCase {
/*
* (non-Javadoc)
*
* @see com.google.gwt.junit.client.GWTTestCase#getModuleName()
*/
@Override
public String getModuleName() {
return "com.google.gwt.core.Core";
}
/**
* Store some JavaObjects in a JsArrayOf, then ask Javascript to run find
* elements via indexOf().
*/
public void testJsIdentity() {
JsArrayOf<Object> elements = JsArrayOf.create();
Object id1 = new Object();
Object id2 = new Object();
Object id3 = new Object();
Object id4 = new Object();
elements.push(id1);
elements.push(id2);
elements.push(id3);
// id4 not pushed for failure test.
assertEquals(true, elements.contains(id1)); // pass (0)
assertEquals(true, elements.contains(id2)); // pass (1)
assertEquals(true, elements.contains(id3)); // pass (2)
assertEquals(false, elements.contains(id4)); // pass (-1)
}
/**
* Test that the same Java object passed twice is in fact the same in JS.
*/
public void testJavaToJs() {
Object Foo = new Object();
assertTrue(jsID(Foo,Foo));
}
/**
* Store a JavaObject in Javascript, then pass the object back to JS to test
* for identity.
*/
public void testJavaObjectStorage() {
Object Foo = new Object();
set(Foo);
assertTrue(isSet(Foo));
assertTrue(isStrictlySet(Foo));
}
/**
* Store a JavaScriptObject in Javascript, then fetch the JSO twice to test
* for identity (multiple NPObject requests).
*/
public void testJsoJavaComparison() {
storeJsoIdentity();
JavaScriptObject obj1 = getJsoIdentity();
JavaScriptObject obj2 = getJsoIdentity();
assertSame(obj1,obj2);
}
/**
* Store a JavaObject in JavascriptArray and store it in an array, then try to
* fetch it back. Specific test for old plugin problem.
*/
public void testJavaArrayArray() {
Object id1 = new Object();
Object id2 = new Object();
JsArray<JsoTestArray<Object>> elements = JavaScriptObject.createArray().cast();
elements.push(JsoTestArray.create(id1));
elements.push(JsoTestArray.create(id2));
Object get1 = elements.get(0).getT();
Object get2 = elements.get(1).getT();
assertEquals(2, elements.length());
assertSame(id1,get1);
assertSame(id2,get2);
}
static final class JsoTestArray<T> extends JavaScriptObject {
public static native <T> JsoTestArray<T> create(T cmd) /*-{
return [cmd, false];
}-*/;
protected JsoTestArray() {
}
/**
* Has implicit cast.
*/
public native T getT() /*-{
return this[0];
}-*/;
public native boolean isRepeating() /*-{
return this[1];
}-*/;
}
static native void set(Object obj) /*-{
$wnd.__idTest_JavaObj = obj;
}-*/;
static native boolean isSet(Object obj) /*-{
return $wnd.__idTest_JavaObj == obj;
}-*/;
static native boolean isStrictlySet(Object obj) /*-{
return $wnd.__idTest_JavaObj === obj;
}-*/;
static native void storeJsoIdentity() /*-{
var idObject = {
something : 'another',
another : 1234
};
$wnd.__idTest_Jso = idObject;
}-*/;
static native JavaScriptObject getJsoIdentity() /*-{
return $wnd.__idTest_Jso;
}-*/;
static native boolean jsID(Object a, Object b) /*-{
return a === b;
}-*/;
}
/**
* JavaScript native implementation for arrays.
*/
final class JsArrayOf<T> extends JavaScriptObject {
/**
* Create a new empty Array instance.
*/
public static <T> JsArrayOf<T> create() {
return JavaScriptObject.createArray().cast();
}
protected JsArrayOf() {
}
public boolean contains(T value) {
return indexOf(value) != -1;
}
public native T get(int index) /*-{
return this[index];
}-*/;
public native int indexOf(T value) /*-{
if(this.indexOf) {
return this.indexOf(value);
} else {
for(var i=0; i<this.length; i++) {
if(this[i]==value) {
return i;
}
}
return -1;
}
}-*/;
public native int length() /*-{
return this.length;
}-*/;
/**
* Pushes the given value onto the end of the array.
*/
public native void push(T value) /*-{
this[this.length] = value;
}-*/;
public native void set(int index, T value) /*-{
this[index] = value;
}-*/;
}