1 // Copyright 2020 Google LLC 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package com.google.api.generator.engine.ast; 16 17 import static org.junit.Assert.assertEquals; 18 import static org.junit.Assert.assertFalse; 19 import static org.junit.Assert.assertTrue; 20 21 import java.util.ArrayList; 22 import java.util.Arrays; 23 import java.util.HashMap; 24 import java.util.List; 25 import java.util.Map; 26 import org.junit.Test; 27 28 public class ConcreteReferenceTest { 29 @Test basicConcreteReference()30 public void basicConcreteReference() { 31 Reference reference = ConcreteReference.builder().setClazz(Integer.class).build(); 32 assertEquals(Integer.class.getSimpleName(), reference.name()); 33 assertFalse(reference.isStaticImport()); 34 } 35 36 @Test basicConcreteReference_setIsStaticImport()37 public void basicConcreteReference_setIsStaticImport() { 38 Reference reference = 39 ConcreteReference.builder().setClazz(Integer.class).setIsStaticImport(true).build(); 40 assertEquals(Integer.class.getSimpleName(), reference.name()); 41 assertFalse(reference.isStaticImport()); 42 } 43 44 @Test basicConcreteReference_nested()45 public void basicConcreteReference_nested() { 46 Reference reference = ConcreteReference.builder().setClazz(Map.Entry.class).build(); 47 assertEquals("Map.Entry", reference.name()); 48 assertFalse(reference.isStaticImport()); 49 } 50 51 @Test basicConcreteReference_nestedAndStaticImport()52 public void basicConcreteReference_nestedAndStaticImport() { 53 Reference reference = 54 ConcreteReference.builder().setClazz(Map.Entry.class).setIsStaticImport(true).build(); 55 assertEquals(Map.Entry.class.getSimpleName(), reference.name()); 56 assertTrue(reference.isStaticImport()); 57 } 58 59 @Test parameterizedConcreteReference()60 public void parameterizedConcreteReference() { 61 Reference reference = 62 ConcreteReference.builder() 63 .setClazz(HashMap.class) 64 .setGenerics( 65 Arrays.asList( 66 ConcreteReference.withClazz(String.class), 67 ConcreteReference.withClazz(Integer.class))) 68 .build(); 69 assertEquals(reference.name(), "HashMap<String, Integer>"); 70 assertEquals("java.util.HashMap", reference.fullName()); 71 } 72 73 @Test nestedParameterizedConcreteReference()74 public void nestedParameterizedConcreteReference() { 75 Reference mapReference = 76 ConcreteReference.builder() 77 .setClazz(HashMap.class) 78 .setGenerics( 79 Arrays.asList( 80 ConcreteReference.withClazz(String.class), 81 ConcreteReference.withClazz(Integer.class))) 82 .build(); 83 Reference outerMapReference = 84 ConcreteReference.builder() 85 .setClazz(HashMap.class) 86 .setGenerics(Arrays.asList(mapReference, mapReference)) 87 .build(); 88 Reference listReference = 89 ConcreteReference.builder() 90 .setClazz(List.class) 91 .setGenerics(Arrays.asList(outerMapReference)) 92 .build(); 93 assertEquals( 94 "List<HashMap<HashMap<String, Integer>, HashMap<String, Integer>>>", listReference.name()); 95 assertEquals("java.util.List", listReference.fullName()); 96 } 97 98 @Test isSupertype_basic()99 public void isSupertype_basic() { 100 assertTrue(TypeNode.STRING.isSupertypeOrEquals(TypeNode.STRING)); 101 assertFalse(TypeNode.INT.isSupertypeOrEquals(TypeNode.STRING)); 102 assertFalse(TypeNode.STRING.isSupertypeOrEquals(TypeNode.INT)); 103 assertFalse(TypeNode.INT.isSupertypeOrEquals(TypeNode.INT)); 104 105 TypeNode mapType = TypeNode.withReference(ConcreteReference.withClazz(Map.class)); 106 TypeNode hashMapType = TypeNode.withReference(ConcreteReference.withClazz(HashMap.class)); 107 assertTrue(mapType.isSupertypeOrEquals(hashMapType)); 108 assertFalse(hashMapType.isSupertypeOrEquals(mapType)); 109 } 110 111 @Test isSupertype_nestedGenerics()112 public void isSupertype_nestedGenerics() { 113 Reference stringRef = ConcreteReference.withClazz(String.class); 114 TypeNode typeOne = 115 TypeNode.withReference( 116 ConcreteReference.builder() 117 .setClazz(Map.class) 118 .setGenerics( 119 Arrays.asList( 120 stringRef, 121 ConcreteReference.builder() 122 .setClazz(List.class) 123 .setGenerics(Arrays.asList(ConcreteReference.withClazz(Expr.class))) 124 .build())) 125 .build()); 126 TypeNode typeTwo = 127 TypeNode.withReference( 128 ConcreteReference.builder() 129 .setClazz(HashMap.class) 130 .setGenerics( 131 Arrays.asList( 132 stringRef, 133 ConcreteReference.builder() 134 .setClazz(ArrayList.class) 135 .setGenerics( 136 Arrays.asList(ConcreteReference.withClazz(ValueExpr.class))) 137 .build())) 138 .build()); 139 assertTrue(typeOne.isSupertypeOrEquals(typeOne)); 140 assertTrue(typeOne.isSupertypeOrEquals(typeTwo)); 141 assertFalse(typeTwo.isSupertypeOrEquals(typeOne)); 142 } 143 144 @Test wildcards()145 public void wildcards() { 146 assertEquals(ConcreteReference.wildcard().name(), "?"); 147 assertEquals( 148 "? extends String", 149 ConcreteReference.wildcardWithUpperBound(TypeNode.STRING.reference()).name()); 150 } 151 152 @Test isAssignableFrom_concreteRef()153 public void isAssignableFrom_concreteRef() { 154 assertFalse( 155 ConcreteReference.withClazz(List.class) 156 .isAssignableFrom(ConcreteReference.withClazz(Map.class))); 157 158 assertTrue( 159 ConcreteReference.withClazz(List.class) 160 .isAssignableFrom(ConcreteReference.withClazz(ArrayList.class))); 161 assertFalse( 162 ConcreteReference.withClazz(ArrayList.class) 163 .isAssignableFrom(ConcreteReference.withClazz(List.class))); 164 assertTrue( 165 ConcreteReference.withClazz(ArrayList.class) 166 .isAssignableFrom(ConcreteReference.withClazz(ArrayList.class))); 167 168 assertTrue( 169 ConcreteReference.withClazz(List.class) 170 .isAssignableFrom( 171 ConcreteReference.builder() 172 .setClazz(ArrayList.class) 173 .setGenerics(Arrays.asList(ConcreteReference.withClazz(String.class))) 174 .build())); 175 assertTrue( 176 ConcreteReference.builder() 177 .setClazz(List.class) 178 .setGenerics(Arrays.asList(ConcreteReference.withClazz(String.class))) 179 .build() 180 .isAssignableFrom( 181 ConcreteReference.builder() 182 .setClazz(ArrayList.class) 183 .setGenerics(Arrays.asList(ConcreteReference.withClazz(String.class))) 184 .build())); 185 assertFalse( 186 ConcreteReference.builder() 187 .setClazz(List.class) 188 .setGenerics(Arrays.asList(ConcreteReference.withClazz(Integer.class))) 189 .build() 190 .isAssignableFrom( 191 ConcreteReference.builder() 192 .setClazz(ArrayList.class) 193 .setGenerics(Arrays.asList(ConcreteReference.withClazz(String.class))) 194 .build())); 195 } 196 197 @Test isAssignableFrom_vaporRef()198 public void isAssignableFrom_vaporRef() { 199 assertFalse( 200 ConcreteReference.withClazz(List.class) 201 .isAssignableFrom( 202 VaporReference.builder().setName("ArrayList").setPakkage("java.util").build())); 203 assertFalse( 204 ConcreteReference.withClazz(ArrayList.class) 205 .isAssignableFrom( 206 VaporReference.builder().setName("ArrayList").setPakkage("java.util").build())); 207 } 208 209 @Test isAssignableFrom_vaporRefWithConcreteRefSupertype()210 public void isAssignableFrom_vaporRefWithConcreteRefSupertype() { 211 assertTrue( 212 ConcreteReference.withClazz(List.class) 213 .isAssignableFrom( 214 VaporReference.builder() 215 .setName("ArrayList") 216 .setPakkage("java.util") 217 .setSupertypeReference(ConcreteReference.withClazz(List.class)) 218 .build())); 219 assertTrue( 220 ConcreteReference.withClazz(List.class) 221 .isAssignableFrom( 222 VaporReference.builder() 223 .setName("SpecialArrayList") 224 .setPakkage("com.foo.bar") 225 .setSupertypeReference(ConcreteReference.withClazz(ArrayList.class)) 226 .build())); 227 assertFalse( 228 ConcreteReference.withClazz(List.class) 229 .isAssignableFrom( 230 VaporReference.builder() 231 .setName("HashMap") 232 .setPakkage("java.util") 233 .setSupertypeReference(ConcreteReference.withClazz(Map.class)) 234 .build())); 235 } 236 } 237