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