/* * 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())); } }