blob: 8e2ec8f294e0a3c3efbae4900b80aedc684caabe [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.dev.jjs.test;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.junit.DoNotRunWith;
import com.google.gwt.junit.Platform;
import com.google.gwt.junit.client.GWTTestCase;
/**
* This should probably be refactored at some point.
*/
public class NativeDevirtualizationTest extends GWTTestCase {
public static final String HELLO_WORLD = "Hello, World!";
@Override
public String getModuleName() {
return "com.google.gwt.dev.jjs.CompilerSuite";
}
public void testStringDevirtualization() {
String x = "hi";
assertEquals("hi", x);
assertEquals("hi", x.toString());
x = new String();
assertEquals("", x);
x = new String(x);
assertEquals("", x);
x = new String("hi");
assertEquals("hi", x);
assertEquals('i', x.charAt(1));
assertEquals("hiyay", x.concat("yay"));
assertEquals("hihi", x + x);
assertEquals(
"blahabctruefalsenullc27",
("blah" + String.valueOf(new char[] {'a', 'b', 'c'}) + true
+ false + null + 'c' + 27));
Object s = HELLO_WORLD;
assertEquals(String.class, s.getClass());
assertEquals(HELLO_WORLD, s.toString());
assertTrue(s.equals(HELLO_WORLD));
assertTrue(HELLO_WORLD.equals(s));
assertFalse(s.equals(""));
assertFalse("".equals(s));
assertEquals(HELLO_WORLD, s.toString());
assertTrue(s instanceof String);
Comparable b = HELLO_WORLD;
assertEquals(String.class, b.getClass());
assertEquals(HELLO_WORLD, b.toString());
assertEquals(HELLO_WORLD.hashCode(), b.hashCode());
assertTrue(((Comparable) HELLO_WORLD).compareTo(b) == 0);
assertTrue(b.compareTo(HELLO_WORLD) == 0);
assertTrue(((Comparable) "A").compareTo(b) < 0);
assertTrue(b.compareTo("A") > 0);
assertTrue(((Comparable) "Z").compareTo(b) > 0);
assertTrue(b.compareTo("Z") < 0);
assertTrue(b instanceof String);
CharSequence c = HELLO_WORLD;
assertEquals(String.class, c.getClass());
assertEquals(HELLO_WORLD, c.toString());
assertEquals(HELLO_WORLD.hashCode(), c.hashCode());
assertEquals('e', c.charAt(1));
assertEquals(13, c.length());
assertEquals("ello", c.subSequence(1, 5));
assertTrue(c instanceof String);
}
public void testBooleanDevirtualization() {
final Boolean FALSE = false;
Object o = FALSE;
assertEquals(Boolean.class, o.getClass());
assertEquals("false", o.toString());
assertFalse((Boolean) o);
assertTrue(o instanceof Boolean);
assertFalse(o instanceof Number);
assertTrue(o instanceof Comparable);
Comparable b = FALSE;
assertEquals(Boolean.class, b.getClass());
assertEquals("false", b.toString());
assertEquals(FALSE.hashCode(), b.hashCode());
}
public void testDoubleDevirtualization() {
final Double ONE_POINT_ONE = 1.1d;
Object o = ONE_POINT_ONE;
assertEquals(Double.class, o.getClass());
assertEquals("1.1", o.toString());
assertEquals(1.1d, o);
assertTrue(o instanceof Double);
assertTrue(o instanceof Number);
assertTrue(o instanceof Comparable);
Comparable b = ONE_POINT_ONE;
assertEquals(Double.class, b.getClass());
assertEquals("1.1", b.toString());
assertEquals(ONE_POINT_ONE.hashCode(), b.hashCode());
assertTrue(b.compareTo((Double) 1.2d) < 0);
Number c = ONE_POINT_ONE;
assertEquals(Double.class, c.getClass());
assertEquals("1.1", c.toString());
assertEquals(ONE_POINT_ONE.hashCode(), c.hashCode());
assertEquals(1, c.intValue());
}
/**
* Ensures that dispatch to JavaScript native arrays that are NOT Java arrays works properly.
*/
@DoNotRunWith(Platform.Devel)
public void testNativeJavaScriptArray() {
Object jsoArray = JavaScriptObject.createArray(10);
assertEquals(JavaScriptObject[].class, jsoArray.getClass());
// TODO(rluble): Plain arrays should return false to instanceof JSO.
assertTrue(jsoArray instanceof JavaScriptObject);
assertTrue(jsoArray instanceof JavaScriptObject[]);
Object objectArray = new Object[10];
assertEquals(Object[].class, objectArray.getClass());
assertTrue(objectArray instanceof Object[]);
assertFalse(jsoArray.toString().equals(objectArray.toString()));
}
}