blob: 11a2e8c08220a9eb8d2a7362cd0246aefd6e059a [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.CompilerContext;
import com.google.gwt.dev.javac.CompilationState;
import com.google.gwt.dev.javac.CompilationStateBuilder;
import com.google.gwt.dev.javac.testing.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.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
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, new CompilerContext(), getJavaResources());
typeOracle = state.getTypeOracle();
place = typeOracle.getType("com.google.gwt.place.shared.Place");
assertNotNull(place);
place1 = typeOracle.getType("com.google.gwt.place.testplaces.Place1");
assertNotNull(place1);
place2 = typeOracle.getType("com.google.gwt.place.testplaces.Place2");
assertNotNull(place2);
place3 = typeOracle.getType("com.google.gwt.place.testplaces.Place3");
assertNotNull(place3);
place4 = typeOracle.getType("com.google.gwt.place.testplaces.Place4");
assertNotNull(place4);
place5 = typeOracle.getType("com.google.gwt.place.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() {
JClassType[][] places = {
{place3, place4}, // place3 and place4 both extend directly from place1
{place1, place2}, // place1 and place2 both extend directly from place
};
for (JClassType[] pair : places) {
assertEquals(-1, (int) Math.signum(comparator.compare(pair[0], pair[1])));
assertEquals(1, (int) Math.signum(comparator.compare(pair[1], pair[0])));
}
}
public void testCollectionSort() {
List<JClassType> actual = Arrays.asList(place, place1, place3, place5);
Collections.sort(actual, comparator);
assertEquals(Arrays.asList(place5, place3, place1, place), actual);
actual = Arrays.asList(place5, place3, place1, place);
Collections.sort(actual, comparator);
assertEquals(Arrays.asList(place5, place3, place1, place), actual);
actual = Arrays.asList(place, place1, place2, place3, place4, place5);
Collections.sort(actual, comparator);
assertEquals(Arrays.asList(place5, place3, place4, place1, place2, place), actual);
actual = Arrays.asList(place5, place4, place3, place2, place1, place);
Collections.sort(actual, comparator);
assertEquals(Arrays.asList(place5, place3, place4, place1, place2, place), actual);
// This is equivalent to the test-case from issue 8036
// https://code.google.com/p/google-web-toolkit/issues/detail?id=8036
actual = Arrays.asList(place2, place1, place3);
Collections.sort(actual, comparator);
assertEquals(Arrays.asList(place3, place1, place2), actual);
}
}