Home | History | Annotate | Download | only in typesystem
      1 /*
      2  * Copyright 2016 Federico Tomassetti
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.github.javaparser.symbolsolver.model.typesystem;
     18 
     19 import com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration;
     20 import com.github.javaparser.resolution.types.ResolvedArrayType;
     21 import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
     22 import com.github.javaparser.resolution.types.ResolvedTypeVariable;
     23 import com.github.javaparser.resolution.types.ResolvedVoidType;
     24 import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
     25 import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionClassDeclaration;
     26 import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionInterfaceDeclaration;
     27 import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
     28 import com.google.common.collect.ImmutableList;
     29 import org.junit.Before;
     30 import org.junit.Test;
     31 
     32 import java.util.Collections;
     33 import java.util.List;
     34 
     35 import static org.junit.Assert.*;
     36 
     37 public class PrimitiveTypeTest {
     38 
     39     private ResolvedArrayType arrayOfBooleans;
     40     private ResolvedArrayType arrayOfListOfA;
     41     private ReferenceTypeImpl OBJECT;
     42     private ReferenceTypeImpl STRING;
     43     private TypeSolver typeSolver;
     44 
     45     private ReferenceTypeImpl booleanBox;
     46     private ReferenceTypeImpl characterBox;
     47     private ReferenceTypeImpl byteBox;
     48     private ReferenceTypeImpl shortBox;
     49     private ReferenceTypeImpl integerBox;
     50     private ReferenceTypeImpl longBox;
     51     private ReferenceTypeImpl floatBox;
     52     private ReferenceTypeImpl doubleBox;
     53 
     54     @Before
     55     public void setup() {
     56         typeSolver = new ReflectionTypeSolver();
     57         OBJECT = new ReferenceTypeImpl(new ReflectionClassDeclaration(Object.class, typeSolver), typeSolver);
     58         STRING = new ReferenceTypeImpl(new ReflectionClassDeclaration(String.class, typeSolver), typeSolver);
     59         arrayOfBooleans = new ResolvedArrayType(ResolvedPrimitiveType.BOOLEAN);
     60         arrayOfListOfA = new ResolvedArrayType(new ReferenceTypeImpl(
     61                 new ReflectionInterfaceDeclaration(List.class, typeSolver),
     62                 ImmutableList.of(new ResolvedTypeVariable(ResolvedTypeParameterDeclaration.onType("A", "foo.Bar", Collections.emptyList()))), typeSolver));
     63 
     64         booleanBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Boolean.class, typeSolver), typeSolver);
     65         characterBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Character.class, typeSolver), typeSolver);
     66         byteBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Byte.class, typeSolver), typeSolver);
     67         shortBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Short.class, typeSolver), typeSolver);
     68         integerBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Integer.class, typeSolver), typeSolver);
     69         longBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Long.class, typeSolver), typeSolver);
     70         floatBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Float.class, typeSolver), typeSolver);
     71         doubleBox = new ReferenceTypeImpl(new ReflectionClassDeclaration(Double.class, typeSolver), typeSolver);
     72 
     73     }
     74 
     75     @Test
     76     public void testIsArray() {
     77         for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
     78             assertEquals(false, ptu.isArray());
     79         }
     80     }
     81 
     82     @Test
     83     public void testIsPrimitive() {
     84         for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
     85             assertEquals(true, ptu.isPrimitive());
     86         }
     87     }
     88 
     89     @Test
     90     public void testIsNull() {
     91         for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
     92             assertEquals(false, ptu.isNull());
     93         }
     94     }
     95 
     96     @Test
     97     public void testIsReference() {
     98         for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
     99             assertEquals(false, ptu.isReference());
    100         }
    101     }
    102 
    103     @Test
    104     public void testIsReferenceType() {
    105         for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
    106             assertEquals(false, ptu.isReferenceType());
    107         }
    108     }
    109 
    110     @Test
    111     public void testIsVoid() {
    112         for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
    113             assertEquals(false, ptu.isVoid());
    114         }
    115     }
    116 
    117     @Test
    118     public void testIsTypeVariable() {
    119         for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
    120             assertEquals(false, ptu.isTypeVariable());
    121         }
    122     }
    123 
    124     @Test
    125     public void testAsReferenceTypeUsage() {
    126         for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
    127             try {
    128                 ptu.asReferenceType();
    129                 fail();
    130             } catch (UnsupportedOperationException e) {
    131             }
    132         }
    133     }
    134 
    135     @Test
    136     public void testAsTypeParameter() {
    137         for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
    138             try {
    139                 ptu.asTypeParameter();
    140                 fail();
    141             } catch (UnsupportedOperationException e) {
    142             }
    143         }
    144     }
    145 
    146     @Test
    147     public void testAsArrayTypeUsage() {
    148         for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
    149             try {
    150                 ptu.asArrayType();
    151                 fail();
    152             } catch (UnsupportedOperationException e) {
    153             }
    154         }
    155     }
    156 
    157     @Test
    158     public void testAsDescribe() {
    159         assertEquals("boolean", ResolvedPrimitiveType.BOOLEAN.describe());
    160         assertEquals("char", ResolvedPrimitiveType.CHAR.describe());
    161         assertEquals("byte", ResolvedPrimitiveType.BYTE.describe());
    162         assertEquals("short", ResolvedPrimitiveType.SHORT.describe());
    163         assertEquals("int", ResolvedPrimitiveType.INT.describe());
    164         assertEquals("long", ResolvedPrimitiveType.LONG.describe());
    165         assertEquals("float", ResolvedPrimitiveType.FLOAT.describe());
    166         assertEquals("double", ResolvedPrimitiveType.DOUBLE.describe());
    167     }
    168 
    169     @Test
    170     public void testIsAssignableByOtherPrimitiveTypes() {
    171         assertEquals(true, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
    172         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.CHAR));
    173         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.BYTE));
    174         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.SHORT));
    175         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.INT));
    176         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.LONG));
    177         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.FLOAT));
    178         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
    179 
    180         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
    181         assertEquals(true, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.CHAR));
    182         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.BYTE));
    183         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.SHORT));
    184         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.INT));
    185         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.LONG));
    186         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.FLOAT));
    187         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
    188 
    189         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
    190         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.CHAR));
    191         assertEquals(true, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.BYTE));
    192         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.SHORT));
    193         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.INT));
    194         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.LONG));
    195         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.FLOAT));
    196         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
    197 
    198         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
    199         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.CHAR));
    200         assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.BYTE));
    201         assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.SHORT));
    202         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.INT));
    203         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.LONG));
    204         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.FLOAT));
    205         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
    206 
    207         assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
    208         assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.CHAR));
    209         assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.BYTE));
    210         assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.SHORT));
    211         assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.INT));
    212         assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.LONG));
    213         assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.FLOAT));
    214         assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
    215 
    216         assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
    217         assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.CHAR));
    218         assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.BYTE));
    219         assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.SHORT));
    220         assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.INT));
    221         assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.LONG));
    222         assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.FLOAT));
    223         assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
    224 
    225         assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
    226         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.CHAR));
    227         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.BYTE));
    228         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.SHORT));
    229         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.INT));
    230         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.LONG));
    231         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.FLOAT));
    232         assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
    233 
    234         assertEquals(false, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.BOOLEAN));
    235         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.CHAR));
    236         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.BYTE));
    237         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.SHORT));
    238         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.INT));
    239         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.LONG));
    240         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.FLOAT));
    241         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(ResolvedPrimitiveType.DOUBLE));
    242     }
    243 
    244     @Test
    245     public void testIsAssignableByBoxedTypes() {
    246         assertEquals(true, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(booleanBox));
    247         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(characterBox));
    248         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(byteBox));
    249         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(shortBox));
    250         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(integerBox));
    251         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(longBox));
    252         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(floatBox));
    253         assertEquals(false, ResolvedPrimitiveType.BOOLEAN.isAssignableBy(doubleBox));
    254 
    255         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(booleanBox));
    256         assertEquals(true, ResolvedPrimitiveType.CHAR.isAssignableBy(characterBox));
    257         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(byteBox));
    258         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(shortBox));
    259         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(integerBox));
    260         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(longBox));
    261         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(floatBox));
    262         assertEquals(false, ResolvedPrimitiveType.CHAR.isAssignableBy(doubleBox));
    263 
    264         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(booleanBox));
    265         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(characterBox));
    266         assertEquals(true, ResolvedPrimitiveType.BYTE.isAssignableBy(byteBox));
    267         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(shortBox));
    268         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(integerBox));
    269         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(longBox));
    270         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(floatBox));
    271         assertEquals(false, ResolvedPrimitiveType.BYTE.isAssignableBy(doubleBox));
    272 
    273         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(booleanBox));
    274         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(characterBox));
    275         assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(byteBox));
    276         assertEquals(true, ResolvedPrimitiveType.SHORT.isAssignableBy(shortBox));
    277         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(integerBox));
    278         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(longBox));
    279         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(floatBox));
    280         assertEquals(false, ResolvedPrimitiveType.SHORT.isAssignableBy(doubleBox));
    281 
    282         assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(booleanBox));
    283         assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(characterBox));
    284         assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(byteBox));
    285         assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(shortBox));
    286         assertEquals(true, ResolvedPrimitiveType.INT.isAssignableBy(integerBox));
    287         assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(longBox));
    288         assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(floatBox));
    289         assertEquals(false, ResolvedPrimitiveType.INT.isAssignableBy(doubleBox));
    290 
    291         assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(booleanBox));
    292         assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(characterBox));
    293         assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(byteBox));
    294         assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(shortBox));
    295         assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(integerBox));
    296         assertEquals(true, ResolvedPrimitiveType.LONG.isAssignableBy(longBox));
    297         assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(floatBox));
    298         assertEquals(false, ResolvedPrimitiveType.LONG.isAssignableBy(doubleBox));
    299 
    300         assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(booleanBox));
    301         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(characterBox));
    302         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(byteBox));
    303         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(shortBox));
    304         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(integerBox));
    305         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(longBox));
    306         assertEquals(true, ResolvedPrimitiveType.FLOAT.isAssignableBy(floatBox));
    307         assertEquals(false, ResolvedPrimitiveType.FLOAT.isAssignableBy(doubleBox));
    308 
    309         assertEquals(false, ResolvedPrimitiveType.DOUBLE.isAssignableBy(booleanBox));
    310         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(characterBox));
    311         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(byteBox));
    312         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(shortBox));
    313         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(integerBox));
    314         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(longBox));
    315         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(floatBox));
    316         assertEquals(true, ResolvedPrimitiveType.DOUBLE.isAssignableBy(doubleBox));
    317     }
    318 
    319     @Test
    320     public void testIsAssignableByAnythingElse() {
    321         for (ResolvedPrimitiveType ptu : ResolvedPrimitiveType.values()) {
    322             assertEquals(false, ptu.isAssignableBy(OBJECT));
    323             assertEquals(false, ptu.isAssignableBy(STRING));
    324             assertEquals(false, ptu.isAssignableBy(NullType.INSTANCE));
    325             assertEquals(false, ptu.isAssignableBy(ResolvedVoidType.INSTANCE));
    326             assertEquals(false, ptu.isAssignableBy(arrayOfBooleans));
    327             assertEquals(false, ptu.isAssignableBy(arrayOfListOfA));
    328         }
    329     }
    330 
    331 }
    332