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