/* * Copyright 2013 Cameron Beccario * * 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 net.nullschool.grains.generate; import net.nullschool.reflect.TypeToken; import org.junit.Test; import java.util.*; import static org.junit.Assert.*; /** * 2013-05-11<p/> * * @author Cameron Beccario */ public class CookTest { interface ComparatorMap<K extends Comparator<K>, V extends Comparator<V>> extends Map<K, V> { } interface NumberMap<K extends Number, V extends K> extends Map<K, V> { } interface NumbersMap<K extends Number, V extends List<K>> extends Map<K, V> { } interface ComplexList1<E extends ComplexList1> extends List<E> { } interface ComplexList2<E extends List<? extends E>> extends List<E> { } interface ComplexMap1<K extends List<V>, V extends List<K>> extends Map<K, V> { } interface ComplexMap2<K extends List<? extends V>, V extends List<? extends K>> extends Map<K, V> { } interface ComplexMap5<K extends Number, V extends Map<? extends K, ? extends List<K>>> extends Map<K, V> { } interface ComplexMap6<K extends Number, V extends Map<? super K, ? super List<K>>> extends Map<K, V> { } private class Outer<T extends Number> { private class Inner0 {} private abstract class Inner1<U extends T> implements List<U> {} } @Test public void test_cook() { Cook cook = new Cook(); assertEquals( new TypeToken<Integer>(){}.asType(), cook.apply(new TypeToken<Integer>(){}.asType())); assertEquals( new TypeToken<Integer[]>(){}.asType(), cook.apply(new TypeToken<Integer[]>(){}.asType())); assertEquals( new TypeToken<int[]>(){}.asType(), cook.apply(new TypeToken<int[]>(){}.asType())); assertEquals( new TypeToken<List<?>>(){}.asType(), cook.apply(new TypeToken<List>(){}.asType())); assertEquals( new TypeToken<List<?>[]>(){}.asType(), cook.apply(new TypeToken<List[]>(){}.asType())); assertEquals( new TypeToken<Enum<?>[]>(){}.asType(), cook.apply(new TypeToken<Enum<?>[]>(){}.asType())); assertEquals( new TypeToken<List<?>[][]>(){}.asType(), cook.apply(new TypeToken<List[][]>(){}.asType())); assertEquals( new TypeToken<Map<?, ?>>(){}.asType(), cook.apply(new TypeToken<Map>(){}.asType())); assertEquals( new TypeToken<Enum>(){}.asType(), cook.apply(new TypeToken<Enum>(){}.asType())); assertEquals( new TypeToken<EnumSet<? extends Enum>>(){}.asType(), cook.apply(new TypeToken<EnumSet>(){}.asType())); assertEquals( new TypeToken<ComparatorMap<? extends Comparator, ? extends Comparator>>(){}.asType(), cook.apply(new TypeToken<ComparatorMap>(){}.asType())); assertEquals( new TypeToken<NumberMap<? extends Number, ? extends Number>>(){}.asType(), cook.apply(new TypeToken<NumberMap>(){}.asType())); assertEquals( new TypeToken<NumbersMap<? extends Number, ? extends List<? extends Number>>>(){}.asType(), cook.apply(new TypeToken<NumbersMap>(){}.asType())); assertEquals( new TypeToken<ComplexList1<? extends ComplexList1>>(){}.asType(), cook.apply(new TypeToken<ComplexList1>(){}.asType())); assertEquals( new TypeToken<ComplexList2<? extends List<? extends List>>>(){}.asType(), cook.apply(new TypeToken<ComplexList2>(){}.asType())); assertEquals( new TypeToken<ComplexMap1<? extends List<? extends List>, ? extends List<? extends List>>>(){}.asType(), cook.apply(new TypeToken<ComplexMap1>(){}.asType())); assertEquals( new TypeToken<ComplexMap2<? extends List<? extends List>, ? extends List<? extends List>>>(){}.asType(), cook.apply(new TypeToken<ComplexMap2>(){}.asType())); assertEquals( new TypeToken<ComplexMap5<? extends Number, ? extends Map<? extends Number, ? extends List<? extends Number>>>>(){}.asType(), cook.apply(new TypeToken<ComplexMap5>(){}.asType())); assertEquals( new TypeToken<ComplexMap6<? extends Number, ? extends Map<? super Number, ? super List<? extends Number>>>>(){}.asType(), cook.apply(new TypeToken<ComplexMap6>(){}.asType())); assertEquals( new TypeToken<Outer<? extends Number>.Inner0>(){}.asType(), cook.apply(new TypeToken<Outer.Inner0>(){}.asType())); assertEquals( new TypeToken<Outer<? extends Number>.Inner1<? extends Number>>(){}.asType(), cook.apply(new TypeToken<Outer.Inner1>(){}.asType())); } }