blob: ac66a883509735547f7f8b6f4fb89625dce01abb [file] [log] [blame]
/*
* Copyright 2010 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.place.rebind;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.dev.javac.CompilationState;
import com.google.gwt.dev.javac.CompilationStateBuilder;
import com.google.gwt.dev.javac.impl.JavaResourceBase;
import com.google.gwt.dev.resource.Resource;
import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceTokenizer;
import com.google.gwt.place.shared.Prefix;
import com.google.gwt.place.testplaces.Place1;
import com.google.gwt.place.testplaces.Place2;
import com.google.gwt.place.testplaces.Place3;
import com.google.gwt.place.testplaces.Place4;
import com.google.gwt.place.testplaces.Place5;
import junit.framework.TestCase;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
/**
* Test case for {@link MostToLeastDerivedPlaceTypeComparator} that uses mock
* CompilationStates.
*/
public class MostToLeastDerivedPlaceTypeComparatorTest extends TestCase {
private static TreeLogger createCompileLogger() {
PrintWriterTreeLogger logger = new PrintWriterTreeLogger(new PrintWriter(
System.err, true));
logger.setMaxDetail(TreeLogger.ERROR);
return logger;
}
private TypeOracle typeOracle;
private Comparator<JClassType> comparator;
private JClassType place;
private JClassType place1;
private JClassType place2;
private JClassType place3;
private JClassType place4;
private JClassType place5;
@Override
protected void setUp() throws Exception {
comparator = new MostToLeastDerivedPlaceTypeComparator();
TreeLogger logger = createCompileLogger();
CompilationState state = CompilationStateBuilder.buildFrom(logger,
getJavaResources());
typeOracle = state.getTypeOracle();
place = typeOracle.getType("com.google.gwt.app.place.shared.Place");
assertNotNull(place);
place1 = typeOracle.getType("com.google.gwt.app.place.shared.testplaces.Place1");
assertNotNull(place1);
place2 = typeOracle.getType("com.google.gwt.app.place.shared.testplaces.Place2");
assertNotNull(place2);
place3 = typeOracle.getType("com.google.gwt.app.place.shared.testplaces.Place3");
assertNotNull(place3);
place4 = typeOracle.getType("com.google.gwt.app.place.shared.testplaces.Place4");
assertNotNull(place4);
place5 = typeOracle.getType("com.google.gwt.app.place.shared.testplaces.Place5");
assertNotNull(place5);
}
private Set<Resource> getJavaResources() {
Set<Resource> rtn = new HashSet<Resource>(
Arrays.asList(JavaResourceBase.getStandardResources()));
rtn.add(new RealJavaResource(Place.class));
// referenced by Place1
rtn.add(new RealJavaResource(PlaceTokenizer.class));
// referenced by Place1.Tokenizer
rtn.add(new RealJavaResource(Prefix.class));
rtn.add(new RealJavaResource(Place1.class));
rtn.add(new RealJavaResource(Place2.class));
rtn.add(new RealJavaResource(Place3.class));
rtn.add(new RealJavaResource(Place4.class));
rtn.add(new RealJavaResource(Place5.class));
return rtn;
}
public void testEquality() {
for (JClassType p : new JClassType[] {
place, place1, place2, place3, place4, place5}) {
assertEquals(0, comparator.compare(p, p));
}
}
public void testPlaceComparesGreaterThanAnyDerivedClass() {
for (JClassType p : new JClassType[] {
place1, place2, place3, place4, place5}) {
assertEquals(1, (int) Math.signum(comparator.compare(place, p)));
assertEquals(-1, (int) Math.signum(comparator.compare(p, place)));
}
}
public void testPlaceInheritanceOrder() {
// Place3 extends Place1
assertEquals(1, (int) Math.signum(comparator.compare(place1, place3)));
assertEquals(-1, (int) Math.signum(comparator.compare(place3, place1)));
// Place5 extends Place3 extends Place1
assertEquals(1, (int) Math.signum(comparator.compare(place1, place5)));
assertEquals(-1, (int) Math.signum(comparator.compare(place5, place1)));
// Place4 extends Place1
assertEquals(1, (int) Math.signum(comparator.compare(place1, place4)));
assertEquals(-1, (int) Math.signum(comparator.compare(place4, place1)));
// Place5 extends Place3
assertEquals(1, (int) Math.signum(comparator.compare(place3, place5)));
assertEquals(-1, (int) Math.signum(comparator.compare(place5, place3)));
}
public void testFallbackToClassName() {
// Array sorted from least derived to most derived. In each pair of adjacent
// values, neither place extends the other.
JClassType[] places = {place1, place2, place3, place4, place5};
for (int i = 0; i < places.length - 1; i++) {
assertEquals(-1, (int) Math.signum(comparator.compare(places[i],
places[i + 1])));
assertEquals(1, (int) Math.signum(comparator.compare(places[i + 1],
places[i])));
}
}
}