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