/*
 * Copyright 2016 Federico Tomassetti
 *
 * 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.github.javaparser.symbolsolver.model.typesystem;

import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
import com.github.javaparser.resolution.types.ResolvedArrayType;
import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
import com.github.javaparser.resolution.types.ResolvedTypeVariable;
import com.github.javaparser.resolution.types.ResolvedVoidType;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionInterfaceDeclaration;
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
import com.google.common.collect.ImmutableList;
import org.junit.Before;
import org.junit.Test;

import java.util.Collections;
import java.util.List;

import static org.junit.Assert.*;

public class PrimitiveTypeTest {

    private ResolvedArrayType arrayOfBooleans;
    private ResolvedArrayType arrayOfListOfA;
    private ReferenceTypeImpl OBJECT;
    private ReferenceTypeImpl STRING;
    private TypeSolver typeSolver;

    private ReferenceTypeImpl booleanBox;
    private ReferenceTypeImpl characterBox;
    private ReferenceTypeImpl byteBox;
    private ReferenceTypeImpl shortBox;
    private ReferenceTypeImpl integerBox;
    private ReferenceTypeImpl longBox;
    private ReferenceTypeImpl floatBox;
    private ReferenceTypeImpl doubleBox;

    @Before
    public void setup() {
        typeSolver = new ReflectionTypeSolver();
        OBJECT = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
        STRING = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
        arrayOfBooleans = new ResolvedArrayType(ResolvedPrimitiveType.BOOLEAN);
        arrayOfListOfA = new ResolvedArrayType(new ReferenceTypeImpl(
                new ReflectionInterfaceDeclaration(List.class, typeSolver),
                ImmutableList.of(new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()))), typeSolver));

        booleanBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Boolean.class, typeSolver), typeSolver);
        characterBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Character.class, typeSolver), typeSolver);
        byteBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Byte.class, typeSolver), typeSolver);
        shortBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Short.class, typeSolver), typeSolver);
        integerBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Integer.class, typeSolver), typeSolver);
        longBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Long.class, typeSolver), typeSolver);
        floatBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Float.class, typeSolver), typeSolver);
        doubleBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Double.class, typeSolver), typeSolver);

    }

    @Test
    public void testIsArray() {
        for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
            assertEquals(false, ptu.isArray());
        }
    }

    @Test
    public void testIsPrimitive() {
        for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
            assertEquals(true, ptu.isPrimitive());
        }
    }

    @Test
    public void testIsNull() {
        for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
            assertEquals(false, ptu.isNull());
        }
    }

    @Test
    public void testIsReference() {
        for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
            assertEquals(false, ptu.isReference());
        }
    }

    @Test
    public void testIsReferenceType() {
        for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
            assertEquals(false, ptu.isReferenceType());
        }
    }

    @Test
    public void testIsVoid() {
        for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
            assertEquals(false, ptu.isVoid());
        }
    }

    @Test
    public void testIsTypeVariable() {
        for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
            assertEquals(false, ptu.isTypeVariable());
        }
    }

    @Test
    public void testAsReferenceTypeUsage() {
        for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
            try {
                ptu.asReferenceType();
                fail();
            } catch (UnsupportedOperationException e) {
            }
        }
    }

    @Test
    public void testAsTypeParameter() {
        for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
            try {
                ptu.asTypeParameter();
                fail();
            } catch (UnsupportedOperationException e) {
            }
        }
    }

    @Test
    public void testAsArrayTypeUsage() {
        for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
            try {
                ptu.asArrayType();
                fail();
            } catch (UnsupportedOperationException e) {
            }
        }
    }

    @Test
    public void testAsDescribe() {
        assertEquals("boolean", ResolvedPrimitiveType.BOOLEAN.describe());
        assertEquals("char", ResolvedPrimitiveType.CHAR.describe());
        assertEquals("byte", ResolvedPrimitiveType.BYTE.describe());
        assertEquals("short", ResolvedPrimitiveType.SHORT.describe());
        assertEquals("int", ResolvedPrimitiveType.INT.describe());
        assertEquals("long", ResolvedPrimitiveType.LONG.describe());
        assertEquals("float", ResolvedPrimitiveType.FLOAT.describe());
        assertEquals("double", ResolvedPrimitiveType.DOUBLE.describe());
    }

    @Test
    public void testIsAssignableByOtherPrimitiveTypes() {
        assertEquals(true, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.CHAR));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.BYTE));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.SHORT));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.INT));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.LONG));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.FLOAT));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.DOUBLE));

        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
        assertEquals(true, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.CHAR));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.BYTE));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.SHORT));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.INT));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.LONG));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.FLOAT));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.DOUBLE));

        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.CHAR));
        assertEquals(true, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.BYTE));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.SHORT));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.INT));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.LONG));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.FLOAT));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.DOUBLE));

        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.CHAR));
        assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.BYTE));
        assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.SHORT));
        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.INT));
        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.LONG));
        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.FLOAT));
        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.DOUBLE));

        assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
        assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.CHAR));
        assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.BYTE));
        assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.SHORT));
        assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.INT));
        assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.LONG));
        assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.FLOAT));
        assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.DOUBLE));

        assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
        assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.CHAR));
        assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.BYTE));
        assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.SHORT));
        assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.INT));
        assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.LONG));
        assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.FLOAT));
        assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.DOUBLE));

        assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.CHAR));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.BYTE));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.SHORT));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.INT));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.LONG));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.FLOAT));
        assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.DOUBLE));

        assertEquals(false, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.CHAR));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.BYTE));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.SHORT));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.INT));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.LONG));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.FLOAT));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
    }

    @Test
    public void testIsAssignableByBoxedTypes() {
        assertEquals(true, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(booleanBox));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(characterBox));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(byteBox));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(shortBox));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(integerBox));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(longBox));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(floatBox));
        assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(doubleBox));

        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(booleanBox));
        assertEquals(true, ResolvedPrimitiveType.CHAR.isAssignableBy(characterBox));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(byteBox));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(shortBox));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(integerBox));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(longBox));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(floatBox));
        assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(doubleBox));

        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(booleanBox));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(characterBox));
        assertEquals(true, ResolvedPrimitiveType.BYTE.isAssignableBy(byteBox));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(shortBox));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(integerBox));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(longBox));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(floatBox));
        assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(doubleBox));

        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(booleanBox));
        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(characterBox));
        assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(byteBox));
        assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(shortBox));
        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(integerBox));
        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(longBox));
        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(floatBox));
        assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(doubleBox));

        assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(booleanBox));
        assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(characterBox));
        assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(byteBox));
        assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(shortBox));
        assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(integerBox));
        assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(longBox));
        assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(floatBox));
        assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(doubleBox));

        assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(booleanBox));
        assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(characterBox));
        assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(byteBox));
        assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(shortBox));
        assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(integerBox));
        assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(longBox));
        assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(floatBox));
        assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(doubleBox));

        assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(booleanBox));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(characterBox));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(byteBox));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(shortBox));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(integerBox));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(longBox));
        assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(floatBox));
        assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(doubleBox));

        assertEquals(false, ResolvedPrimitiveType.DOUBLE.isAssignableBy(booleanBox));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(characterBox));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(byteBox));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(shortBox));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(integerBox));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(longBox));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(floatBox));
        assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(doubleBox));
    }

    @Test
    public void testIsAssignableByAnythingElse() {
        for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
            assertEquals(false, ptu.isAssignableBy(OBJECT));
            assertEquals(false, ptu.isAssignableBy(STRING));
            assertEquals(false, ptu.isAssignableBy(NullType.INSTANCE));
            assertEquals(false, ptu.isAssignableBy(ResolvedVoidType.INSTANCE));
            assertEquals(false, ptu.isAssignableBy(arrayOfBooleans));
            assertEquals(false, ptu.isAssignableBy(arrayOfListOfA));
        }
    }

}
