View Javadoc
1   /*
2    *    Copyright 2006-2025 the original author or authors.
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    *       https://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  package org.mybatis.generator.api.dom.java;
17  
18  import static org.assertj.core.api.Assertions.assertThat;
19  import static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertFalse;
21  import static org.junit.jupiter.api.Assertions.assertTrue;
22  
23  import org.junit.jupiter.api.Test;
24  import org.mybatis.generator.api.dom.java.render.TopLevelInterfaceRenderer;
25  
26  /**
27   * @author Jeff Butler
28   */
29  class FullyQualifiedJavaTypeTest {
30  
31      @Test
32      void testJavaType() {
33          FullyQualifiedJavaType fqjt =
34              new FullyQualifiedJavaType("java.lang.String"); //$NON-NLS-1$
35          assertFalse(fqjt.isExplicitlyImported());
36          assertEquals("String", fqjt.getShortName()); //$NON-NLS-1$
37          assertEquals("java.lang.String", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
38          assertEquals("java.lang", fqjt.getPackageName()); //$NON-NLS-1$
39          assertEquals(0, fqjt.getImportList().size());
40      }
41  
42      @Test
43      void testSimpleType() {
44          FullyQualifiedJavaType fqjt =
45              new FullyQualifiedJavaType("com.foo.Bar"); //$NON-NLS-1$
46          assertTrue(fqjt.isExplicitlyImported());
47          assertEquals("Bar", fqjt.getShortName()); //$NON-NLS-1$
48          assertEquals("com.foo.Bar", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
49          assertEquals("com.foo", fqjt.getPackageName()); //$NON-NLS-1$
50          assertEquals(1, fqjt.getImportList().size());
51          assertEquals("com.foo.Bar", fqjt.getImportList().get(0));
52      }
53  
54      @Test
55      void testSimpleType2() {
56          FullyQualifiedJavaType fqjt =
57              new FullyQualifiedJavaType("com.foo.bar"); //$NON-NLS-1$
58          assertTrue(fqjt.isExplicitlyImported());
59          assertEquals("bar", fqjt.getShortName()); //$NON-NLS-1$
60          assertEquals("com.foo.bar", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
61          assertEquals("com.foo", fqjt.getPackageName()); //$NON-NLS-1$
62          assertEquals(1, fqjt.getImportList().size());
63          assertEquals("com.foo.bar", fqjt.getImportList().get(0));
64      }
65  
66      @Test
67      void testSimpleType3() {
68          FullyQualifiedJavaType fqjt =
69              new FullyQualifiedJavaType("int"); //$NON-NLS-1$
70          assertFalse(fqjt.isExplicitlyImported());
71          assertEquals("int", fqjt.getShortName()); //$NON-NLS-1$
72          assertEquals("int", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
73          assertEquals("", fqjt.getPackageName()); //$NON-NLS-1$
74          assertEquals(0, fqjt.getImportList().size());
75      }
76  
77      @Test
78      void testGenericType1() {
79          FullyQualifiedJavaType fqjt =
80              new FullyQualifiedJavaType("java.util.List<java.lang.String>"); //$NON-NLS-1$
81          assertTrue(fqjt.isExplicitlyImported());
82          assertEquals("List<String>", fqjt.getShortName()); //$NON-NLS-1$
83          assertEquals("java.util.List<java.lang.String>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
84          assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
85          assertEquals(1, fqjt.getImportList().size());
86          assertEquals("java.util.List", fqjt.getImportList().get(0));
87          assertEquals("java.util.List", fqjt.getFullyQualifiedNameWithoutTypeParameters()); //$NON-NLS-1$
88      }
89  
90      @Test
91      void testGenericType2() {
92          FullyQualifiedJavaType fqjt =
93              new FullyQualifiedJavaType("java.util.Map<java.lang.String, java.util.List<java.lang.String>>"); //$NON-NLS-1$
94          assertTrue(fqjt.isExplicitlyImported());
95          assertEquals("Map<String, List<String>>", fqjt.getShortName()); //$NON-NLS-1$
96          assertEquals("java.util.Map<java.lang.String, java.util.List<java.lang.String>>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
97          assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
98          assertEquals(2, fqjt.getImportList().size());
99          assertEquals("java.util.Map", fqjt.getFullyQualifiedNameWithoutTypeParameters()); //$NON-NLS-1$
100     }
101 
102     @Test
103     void testGenericType3() {
104         FullyQualifiedJavaType listOfStrings = new FullyQualifiedJavaType("java.util.List"); //$NON-NLS-1$
105         listOfStrings.addTypeArgument(new FullyQualifiedJavaType("java.lang.String")); //$NON-NLS-1$
106 
107         FullyQualifiedJavaType fqjt =
108             new FullyQualifiedJavaType("java.util.Map"); //$NON-NLS-1$
109         fqjt.addTypeArgument(new FullyQualifiedJavaType("java.lang.String")); //$NON-NLS-1$
110         fqjt.addTypeArgument(listOfStrings);
111 
112         assertTrue(fqjt.isExplicitlyImported());
113         assertEquals("Map<String, List<String>>", fqjt.getShortName()); //$NON-NLS-1$
114         assertEquals("java.util.Map<java.lang.String, java.util.List<java.lang.String>>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
115         assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
116         assertEquals(2, fqjt.getImportList().size());
117         assertEquals("java.util.Map", fqjt.getFullyQualifiedNameWithoutTypeParameters()); //$NON-NLS-1$
118     }
119 
120     @Test
121     void testGenericType4() {
122         FullyQualifiedJavaType fqjt =
123             new FullyQualifiedJavaType("java.util.List<java.util.Map<java.lang.String, java.lang.Object>>"); //$NON-NLS-1$
124         assertTrue(fqjt.isExplicitlyImported());
125         assertEquals("List<Map<String, Object>>", fqjt.getShortName()); //$NON-NLS-1$
126         assertEquals("java.util.List<java.util.Map<java.lang.String, java.lang.Object>>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
127         assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
128         assertEquals(2, fqjt.getImportList().size());
129         assertEquals("java.util.List", fqjt.getFullyQualifiedNameWithoutTypeParameters()); //$NON-NLS-1$
130     }
131 
132     @Test
133     void testWildcardType1() {
134         FullyQualifiedJavaType fqjt =
135             new FullyQualifiedJavaType("java.util.Map<java.lang.String, ? extends com.foo.Bar>");
136         assertTrue(fqjt.isExplicitlyImported());
137         assertEquals("Map<String, ? extends Bar>", fqjt.getShortName()); //$NON-NLS-1$
138         assertEquals("java.util.Map<java.lang.String, ? extends com.foo.Bar>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
139         assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
140         assertEquals(2, fqjt.getImportList().size());
141         assertEquals("java.util.Map", fqjt.getFullyQualifiedNameWithoutTypeParameters()); //$NON-NLS-1$
142     }
143 
144     @Test
145     void testWildcardType2() {
146         FullyQualifiedJavaType fqjt =
147             new FullyQualifiedJavaType("java.util.Map<java.lang.String, ?>");
148         assertTrue(fqjt.isExplicitlyImported());
149         assertEquals("Map<String, ?>", fqjt.getShortName()); //$NON-NLS-1$
150         assertEquals("java.util.Map<java.lang.String, ?>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
151         assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
152         assertEquals(1, fqjt.getImportList().size());
153         assertEquals("java.util.Map", fqjt.getImportList().get(0));
154         assertEquals("java.util.Map", fqjt.getFullyQualifiedNameWithoutTypeParameters()); //$NON-NLS-1$
155     }
156 
157     @Test
158     void testWildcardType3() {
159         FullyQualifiedJavaType fqjt =
160             new FullyQualifiedJavaType("java.util.Map<? extends java.util.List<?>, ?>");
161         assertTrue(fqjt.isExplicitlyImported());
162         assertEquals("Map<? extends List<?>, ?>", fqjt.getShortName()); //$NON-NLS-1$
163         assertEquals("java.util.Map<? extends java.util.List<?>, ?>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
164         assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
165         assertEquals(2, fqjt.getImportList().size());
166         assertEquals("java.util.Map", fqjt.getFullyQualifiedNameWithoutTypeParameters()); //$NON-NLS-1$
167     }
168 
169     @Test
170     void testWildcardType4() {
171         FullyQualifiedJavaType fqjt =
172             new FullyQualifiedJavaType("java.util.Map<?, ?>");
173         assertTrue(fqjt.isExplicitlyImported());
174         assertEquals("Map<?, ?>", fqjt.getShortName()); //$NON-NLS-1$
175         assertEquals("java.util.Map<?, ?>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
176         assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
177         assertEquals(1, fqjt.getImportList().size());
178         assertEquals("java.util.Map", fqjt.getImportList().get(0));
179         assertEquals("java.util.Map", fqjt.getFullyQualifiedNameWithoutTypeParameters()); //$NON-NLS-1$
180     }
181 
182     @Test
183     void testWildcardType5() {
184         FullyQualifiedJavaType fqjt =
185             new FullyQualifiedJavaType("java.util.List<? extends java.util.Map<? super java.lang.Object, ?>>");
186         assertTrue(fqjt.isExplicitlyImported());
187         assertEquals("List<? extends Map<? super Object, ?>>", fqjt.getShortName()); //$NON-NLS-1$
188         assertEquals("java.util.List<? extends java.util.Map<? super java.lang.Object, ?>>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
189         assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
190         assertEquals(2, fqjt.getImportList().size());
191         assertEquals("java.util.List", fqjt.getFullyQualifiedNameWithoutTypeParameters()); //$NON-NLS-1$
192     }
193 
194     @Test
195     void testUppercasePackage1() {
196         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("org.foo.Bar.Inner");
197         assertTrue(fqjt.isExplicitlyImported());
198         assertEquals("Inner", fqjt.getShortName()); //$NON-NLS-1$
199         assertEquals("org.foo.Bar.Inner", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
200         assertEquals("org.foo.Bar", fqjt.getPackageName()); //$NON-NLS-1$
201         assertEquals(1, fqjt.getImportList().size());
202         assertEquals("org.foo.Bar.Inner", fqjt.getImportList().get(0));
203     }
204 
205     @Test
206     void testUppercasePackage2() {
207         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("org.foo.Bar.Inner.Inner");
208         assertTrue(fqjt.isExplicitlyImported());
209         assertEquals("Inner", fqjt.getShortName()); //$NON-NLS-1$
210         assertEquals("org.foo.Bar.Inner.Inner", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
211         assertEquals("org.foo.Bar.Inner", fqjt.getPackageName()); //$NON-NLS-1$
212         assertEquals(1, fqjt.getImportList().size());
213         assertEquals("org.foo.Bar.Inner.Inner", fqjt.getImportList().get(0));
214     }
215 
216     @Test
217     void testUppercasePackage3() {
218         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("java.util.List<org.foo.Bar.Inner>");
219         assertTrue(fqjt.isExplicitlyImported());
220         assertEquals("List<Inner>", fqjt.getShortName()); //$NON-NLS-1$
221         assertEquals("java.util.List<org.foo.Bar.Inner>", fqjt.getFullyQualifiedName()); //$NON-NLS-1$
222         assertEquals("java.util", fqjt.getPackageName()); //$NON-NLS-1$
223         assertEquals(2, fqjt.getImportList().size());
224         assertTrue(fqjt.getImportList().contains("java.util.List"));
225         assertTrue(fqjt.getImportList().contains("org.foo.Bar.Inner"));
226     }
227 
228     @Test
229     void testByteArray1() {
230         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("byte[]");
231         assertFalse(fqjt.isPrimitive());
232         assertTrue(fqjt.isArray());
233     }
234 
235     @Test
236     void testByteArray2() {
237         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("byte[ ]");
238         assertFalse(fqjt.isPrimitive());
239         assertTrue(fqjt.isArray());
240     }
241 
242     @Test
243     void testStringArray() {
244         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("java.lang.String[]");
245         assertFalse(fqjt.isPrimitive());
246         assertTrue(fqjt.isArray());
247     }
248 
249     @Test
250     void testStringArray2() {
251         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("java.math.BigDecimal[]");
252         assertEquals(1, fqjt.getImportList().size());
253         assertEquals("java.math.BigDecimal", fqjt.getImportList().get(0));
254         assertEquals("BigDecimal[]", fqjt.getShortName());
255         assertFalse(fqjt.isPrimitive());
256         assertTrue(fqjt.isArray());
257     }
258 
259     @Test
260     void testComplexArray() {
261         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("java.util.List<String>[]");
262         assertFalse(fqjt.isPrimitive());
263         assertTrue(fqjt.isArray());
264     }
265 
266     @Test
267     void testComplexArrayWithoutGenerics() {
268         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("java.util.List[]");
269         assertFalse(fqjt.isPrimitive());
270         assertTrue(fqjt.isArray());
271         assertTrue(fqjt.getImportList().contains("java.util.List"));
272         assertFalse(fqjt.getImportList().contains("java.util.List[]"));
273     }
274 
275     @Test
276     void gh1288Test1() {
277         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("Class<?>");
278         assertThat(fqjt.getFullyQualifiedName()).isEqualTo("Class<?>");
279 
280         Method method = new Method("setConverter");
281         Parameter parameter = new Parameter(fqjt, "converterType");
282         method.addParameter(parameter);
283         method.setAbstract(true);
284 
285         Interface interfaze = new Interface("foo.Bar");
286         interfaze.setVisibility(JavaVisibility.PUBLIC);
287         interfaze.addMethod(method);
288 
289         TopLevelInterfaceRenderer renderer = new TopLevelInterfaceRenderer();
290         String out = renderer.render(interfaze);
291 
292         assertThat(out).isEqualToNormalizingNewlines("package foo;\n\npublic interface Bar {\n    void setConverter(Class<?> converterType);\n}");
293     }
294 
295     @Test
296     void gh1288Test2() {
297         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("Class<? extends String>");
298         assertThat(fqjt.getFullyQualifiedName()).isEqualTo("Class<? extends String>");
299 
300         Method method = new Method("setConverter");
301         Parameter parameter = new Parameter(fqjt, "converterType");
302         method.addParameter(parameter);
303         method.setAbstract(true);
304 
305         Interface interfaze = new Interface("foo.Bar");
306         interfaze.setVisibility(JavaVisibility.PUBLIC);
307         interfaze.addMethod(method);
308 
309         TopLevelInterfaceRenderer renderer = new TopLevelInterfaceRenderer();
310         String out = renderer.render(interfaze);
311 
312         assertThat(out).isEqualToNormalizingNewlines("package foo;\n\npublic interface Bar {\n    void setConverter(Class<? extends String> converterType);\n}");
313     }
314 
315     @Test
316     void gh1288Test3() {
317         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("Class");
318         fqjt.addTypeArgument(new FullyQualifiedJavaType("? extends HttpMessageConverter<?>"));
319         assertThat(fqjt.getFullyQualifiedName()).isEqualTo("Class<? extends HttpMessageConverter<?>>");
320 
321         Method method = new Method("setConverter");
322         Parameter parameter = new Parameter(fqjt, "converterType");
323         method.addParameter(parameter);
324         method.setAbstract(true);
325 
326         Interface interfaze = new Interface("foo.Bar");
327         interfaze.setVisibility(JavaVisibility.PUBLIC);
328         interfaze.addMethod(method);
329 
330         TopLevelInterfaceRenderer renderer = new TopLevelInterfaceRenderer();
331         String out = renderer.render(interfaze);
332 
333         assertThat(out).isEqualToNormalizingNewlines("package foo;\n\npublic interface Bar {\n    void setConverter(Class<? extends HttpMessageConverter<?>> converterType);\n}");
334     }
335 
336     @Test
337     void gh1288Test3Minified() {
338         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("Class");
339         fqjt.addTypeArgument(new FullyQualifiedJavaType("? extends HttpMessageConverter<?>"));
340         assertThat(fqjt.getFullyQualifiedName()).isEqualTo("Class<? extends HttpMessageConverter<?>>");
341 
342         Parameter parameter = new Parameter(fqjt, "converterType");
343         String out = parameter.toString();
344         assertThat(out).isEqualTo("Class<? extends HttpMessageConverter<?>> converterType");
345     }
346 }