Package org.jboss.weld.tests.unit.resolution

Source Code of org.jboss.weld.tests.unit.resolution.InvariantTypesTest

/*
* JBoss, Home of Professional Open Source
* Copyright 2014, Red Hat, Inc., and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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 org.jboss.weld.tests.unit.resolution;

import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.enterprise.util.TypeLiteral;

import org.jboss.weld.resolution.InvariantTypes;
import org.jboss.weld.util.reflection.GenericArrayTypeImpl;
import org.jboss.weld.util.reflection.ParameterizedTypeImpl;
import org.jboss.weld.util.reflection.WildcardTypeImpl;
import org.junit.Test;

/**
* Test for {@link InvariantTypes}
*
* @author Jozef Hartinger
*
*/
public class InvariantTypesTest {

    /*
     * Raw type
     */
    @Test
    public void testRawTypeAssignableFromRawType() {
        assertTrue(InvariantTypes.isAssignableFrom(Number.class, Number.class));
        assertTrue(InvariantTypes.isAssignableFrom(Integer.class, Integer.class));
        assertTrue(InvariantTypes.isAssignableFrom(int.class, int.class));
        assertFalse(InvariantTypes.isAssignableFrom(Integer.class, Number.class));
        assertFalse(InvariantTypes.isAssignableFrom(Number.class, Integer.class));
    }

    @Test
    public void testRawArrayAssignableFromRawArray() {
        final Type numbers = new Number[0].getClass();
        final Type integers = new Integer[0].getClass();
        final Type ints = new int[0].getClass();
        assertFalse(InvariantTypes.isAssignableFrom(Object.class, numbers));
        assertFalse(InvariantTypes.isAssignableFrom(Object.class, integers));
        assertFalse(InvariantTypes.isAssignableFrom(Object.class, ints));
        assertTrue(InvariantTypes.isAssignableFrom(numbers, numbers));
        assertFalse(InvariantTypes.isAssignableFrom(numbers, integers));
        assertFalse(InvariantTypes.isAssignableFrom(numbers, ints));
        assertTrue(InvariantTypes.isAssignableFrom(integers, integers));
        assertFalse(InvariantTypes.isAssignableFrom(integers, ints));
        assertFalse(InvariantTypes.isAssignableFrom(numbers, Object.class));
        assertFalse(InvariantTypes.isAssignableFrom(integers, Object.class));
        assertFalse(InvariantTypes.isAssignableFrom(ints, Object.class));
        assertFalse(InvariantTypes.isAssignableFrom(integers, numbers));
        assertFalse(InvariantTypes.isAssignableFrom(ints, numbers));

        assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.defaultInstance(), numbers));
        assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.defaultInstance(), integers));
        assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.defaultInstance(), ints));
        assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(numbers), numbers));
        assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(numbers), integers));
        assertFalse(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(numbers), ints));
        assertFalse(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(integers), numbers));
        assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(integers), integers));
        assertFalse(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(integers), ints));
        assertFalse(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(ints), numbers));
        assertFalse(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(ints), integers));
        assertTrue(InvariantTypes.isAssignableFrom(WildcardTypeImpl.withUpperBound(ints), ints));
    }


    @Test
    public void testRawTypeAssignableFromParameterizedType() {
        assertFalse(InvariantTypes.isAssignableFrom(Map.class, new ParameterizedTypeImpl(Map.class, String.class, Integer.class)));
        assertFalse(InvariantTypes.isAssignableFrom(Map.class, new ParameterizedTypeImpl(Map.class, Object.class, Object.class)));
        assertFalse(InvariantTypes.isAssignableFrom(Map.class, new ParameterizedTypeImpl(HashMap.class, Object.class, Object.class)));
        assertFalse(InvariantTypes.isAssignableFrom(Map.class, new ParameterizedTypeImpl(List.class, Object.class)));
    }

    @Test
    public void testRawTypeAssignableFromGenericArrayType() {
        assertFalse(InvariantTypes.isAssignableFrom(new List[0].getClass(), new GenericArrayTypeImpl(List.class, Object.class)));
        assertFalse(InvariantTypes.isAssignableFrom(new List[0].getClass(), new GenericArrayTypeImpl(List.class, Integer.class)));
        assertFalse(InvariantTypes.isAssignableFrom(new List[0].getClass(), new GenericArrayTypeImpl(ArrayList.class, Integer.class)));
        assertFalse(InvariantTypes.isAssignableFrom(new ArrayList[0].getClass(), new GenericArrayTypeImpl(List.class, Integer.class)));
    }

    /*
     * Parameterized types
     */
    @Test
    public void testParameterizedTypeAssignableFromParameterizedType() {
        assertTrue(InvariantTypes.isAssignableFrom(new ParameterizedTypeImpl(Map.class, Number.class, String.class), new ParameterizedTypeImpl(Map.class, Number.class, String.class)));
        assertFalse(InvariantTypes.isAssignableFrom(new ParameterizedTypeImpl(Map.class, Number.class, String.class), new ParameterizedTypeImpl(HashMap.class, Number.class, String.class)));
        assertFalse(InvariantTypes.isAssignableFrom(new ParameterizedTypeImpl(Map.class, Number.class, String.class), new ParameterizedTypeImpl(Map.class, Integer.class, String.class)));
        assertFalse(InvariantTypes.isAssignableFrom(new ParameterizedTypeImpl(Map.class, Number.class, String.class), new ParameterizedTypeImpl(Map.class, Number.class, Object.class)));
    }

    /*
     * Type variables
     */
    @Test
    @SuppressWarnings("all")
    public <A, B, C extends Number, D extends Integer, E extends A> void testTypeVariableAssignableFromTypeVariable() {
        final int count = 5;
        Type[] typeVariables = new Type[count];
        typeVariables[0] = new TypeLiteral<A>() {
        }.getType();
        typeVariables[1] = new TypeLiteral<B>() {
        }.getType();
        typeVariables[2] = new TypeLiteral<C>() {
        }.getType();
        typeVariables[3] = new TypeLiteral<D>() {
        }.getType();
        typeVariables[4] = new TypeLiteral<E>() {
        }.getType();

        // type variables should only be assignable if they are equal
        for (int i = 0; i < count; i++) {
            for (int j = 0; j < count; j++) {
                if (i == j) {
                    assertTrue(InvariantTypes.isAssignableFrom(typeVariables[i], typeVariables[j]));
                } else {
                    assertFalse(InvariantTypes.isAssignableFrom(typeVariables[i], typeVariables[j]));
                }
            }
        }
    }

    /*
     * Generic array types
     */
    @Test
    public void testGenericArrayTypeAssignableGenericArrayType() {
        assertTrue(InvariantTypes.isAssignableFrom(new GenericArrayTypeImpl(List.class, Number.class), new GenericArrayTypeImpl(List.class, Number.class)));
        assertTrue(InvariantTypes.isAssignableFrom(new GenericArrayTypeImpl(Map.class, String.class, Runnable.class), new GenericArrayTypeImpl(Map.class, String.class, Runnable.class)));
        assertFalse(InvariantTypes.isAssignableFrom(new GenericArrayTypeImpl(List.class, Number.class), new GenericArrayTypeImpl(List.class, Integer.class)));
        assertFalse(InvariantTypes.isAssignableFrom(new GenericArrayTypeImpl(List.class, Number.class), new GenericArrayTypeImpl(List.class, Object.class)));
        assertFalse(InvariantTypes.isAssignableFrom(new GenericArrayTypeImpl(Map.class, Object.class, Object.class), new GenericArrayTypeImpl(Map.class, String.class, Runnable.class)));
    }
}
TOP

Related Classes of org.jboss.weld.tests.unit.resolution.InvariantTypesTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.