blob: ca4be7d3c737e1fbaf34fb99eb8fedc405112e80 [file] [log] [blame]
/*
* Copyright 2014 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.impl;
import com.google.gwt.junit.DoNotRunWith;
import com.google.gwt.junit.Platform;
import com.google.gwt.junit.client.GWTTestCase;
/**
* Tests for {@link Impl}.
*/
public class ImplTest extends GWTTestCase {
@Override
public String getModuleName() {
return "com.google.gwt.core.Core";
}
// A function that is not referenced and can be pruned very early in the compilation pipeline.
public static String prunableFunction() {
return "Prunable";
}
// A very simple function that will certainly be inlined away in optimized compiles.
public static String inlinableFunction() {
return "Inlinable";
}
private static final class Foo {
// A very simple function that will certainly be made static but not inlined.
// because it refers to its parameter twice.
public final String statifiableFunction(String o) {
return "Statifiable " + o + o;
}
}
private static abstract class ClassWithAbstractMethod {
public abstract void abstractMethod();
}
@DoNotRunWith(Platform.Devel)
public void testPinnedByImpl_getNameOf() {
Foo foo = new Foo();
assertNotNull(foo.statifiableFunction(null));
assertNotNull(inlinableFunction());
assertNotNullNorEmpty(
Impl.getNameOf("@com.google.gwt.core.client.impl.ImplTest::inlinableFunction()"));
assertNotNullNorEmpty(
Impl.getNameOf("@com.google.gwt.core.client.impl.ImplTest.Foo::statifiableFunction(*)"));
assertNull(Impl.getNameOf("@com.google.gwt.core.client.impl.ImplTest.ClassWithAbstractMethod::"
+ "abstractMethod(*)"));
if (areNamesObfuscatedOrNotPresent()) {
// In obfuscated mode the names of the functions in the output code have no relation
// to their source names.
return;
}
String prunableFnName =
Impl.getNameOf("@com.google.gwt.core.client.impl.ImplTest::prunableFunction()");
assertTrue("Expecting 'prunableFunction' or null got '" + prunableFnName + "'",
prunableFnName == null || prunableFnName.contains("prunableFunction"));
String inlineableFnName =
Impl.getNameOf("@com.google.gwt.core.client.impl.ImplTest::inlinableFunction()");
assertTrue("Expecting 'inlinableFunction' got '" + inlineableFnName + "'",
inlineableFnName.contains("inlinableFunction"));
String statisfiableFnName =
Impl.getNameOf("@com.google.gwt.core.client.impl.ImplTest.Foo::statifiableFunction(*)");
assertTrue("Expecting 'statifiableFunction' got '" + statisfiableFnName + "'",
statisfiableFnName.contains("statifiableFunction"));
}
// This function is never inlined because there exists a jsni reference to it.
// TODO(rluble): This function should have a do not inline annotation.
private static native boolean areNamesObfuscatedOrNotPresent() /*-{
var fn = @ImplTest::areNamesObfuscatedOrNotPresent();
return !(fn.name && fn.name.indexOf("areNamesObfuscated") != -1);
}-*/;
private void assertNotNullNorEmpty(String s) {
assertNotNull(s);
assertFalse(s.isEmpty());
}
}