blob: 828e0163e5964d63bcd4f6d5000818f1c2fad881 [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 static jsinterop.annotations.JsPackage.GLOBAL;
import com.google.gwt.junit.client.GWTTestCase;
import javaemul.internal.annotations.DoNotAutobox;
import jsinterop.annotations.JsMethod;
import jsinterop.annotations.JsProperty;
/**
* Tests JsMethod functionality.
*/
public class JsMethodTest extends GWTTestCase {
@Override
public String getModuleName() {
return "com.google.gwt.core.Interop";
}
class MyObject {
@JsProperty
public int mine;
@JsMethod
public native boolean hasOwnProperty(String name);
}
public void testNativeJsMethod() {
MyObject obj = new MyObject();
obj.mine = 0;
assertTrue(obj.hasOwnProperty("mine"));
assertFalse(obj.hasOwnProperty("toString"));
}
@JsMethod(namespace = GLOBAL)
private static native boolean isFinite(double d);
public void testStaticNativeJsMethod() {
assertFalse(isFinite(Double.POSITIVE_INFINITY));
assertFalse(isFinite(Double.NEGATIVE_INFINITY));
assertFalse(isFinite(Double.NaN));
assertTrue(isFinite(0));
assertTrue(isFinite(1));
}
@JsProperty(namespace = GLOBAL, name = "NaN")
private static native double getNaN();
@JsProperty(namespace = GLOBAL, name = "Infinity")
private static native double infinity();
public void testStaticNativeJsPropertyGetter() {
assertTrue(getNaN() != getNaN());
assertTrue(Double.isInfinite(infinity()));
assertTrue(Double.isInfinite(-infinity()));
}
@JsProperty(namespace = GLOBAL)
private static native void setJsInteropSecret(String magic);
@JsProperty(namespace = GLOBAL)
private static native String getJsInteropSecret();
public void testStaticNativeJsPropertySetter() {
setJsInteropSecret("very secret!");
assertEquals("very secret!", getJsInteropSecret());
}
public static double returnWithoutBoxing(@DoNotAutobox Object object) {
return (Double) object;
}
public static double sumWithoutBoxing(@DoNotAutobox Object... objects) {
double sum = 0;
for (Object o : objects) {
sum += (Double) o;
}
return sum;
}
@JsMethod
public static double sumWithoutBoxingJsVarargs(@DoNotAutobox Object... objects) {
double sum = 0;
for (Object o : objects) {
sum += (Double) o;
}
return sum;
}
public void testDoNotAutobox() {
assertEquals(3.0, returnWithoutBoxing(3));
assertEquals(4.5, sumWithoutBoxing(1, 1.5, (short) 1, (byte) 1));
assertEquals(4.5, sumWithoutBoxingJsVarargs(1, 1.5, (short) 1, (byte) 1));
try {
returnWithoutBoxing(Long.MAX_VALUE);
fail("Should have thrown ClassCastException");
} catch (ClassCastException expected) {
}
}
}