View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.commons.reflect;
18  
19  import static org.apache.juneau.commons.reflect.ClassArrayFormat.*;
20  import static org.apache.juneau.commons.reflect.ClassNameFormat.*;
21  import static org.junit.jupiter.api.Assertions.*;
22  
23  import org.apache.juneau.*;
24  import org.junit.jupiter.api.*;
25  
26  /**
27   * Tests for {@link ClassArrayFormat}.
28   */
29  class ClassArrayFormat_Test extends TestBase {
30  
31  	//====================================================================================================
32  	// Enum values
33  	//====================================================================================================
34  
35  	@Test
36  	void a01_enumValues_exist() {
37  		assertNotNull(JVM);
38  		assertNotNull(BRACKETS);
39  		assertNotNull(WORD);
40  		assertEquals(3, ClassArrayFormat.values().length);
41  	}
42  
43  	@Test
44  	void a02_enumValueOf_works() {
45  		assertEquals(JVM, ClassArrayFormat.valueOf("JVM"));
46  		assertEquals(BRACKETS, ClassArrayFormat.valueOf("BRACKETS"));
47  		assertEquals(WORD, ClassArrayFormat.valueOf("WORD"));
48  	}
49  
50  	//====================================================================================================
51  	// BRACKETS format - single dimension arrays
52  	//====================================================================================================
53  
54  	@Test
55  	void b01_brackets_singleDimensionStringArray() {
56  		var ci = ClassInfo.of(String[].class);
57  		var result = ci.getNameFormatted(SIMPLE, false, '$', BRACKETS);
58  		assertEquals("String[]", result);
59  	}
60  
61  	@Test
62  	void b02_brackets_singleDimensionIntArray() {
63  		var ci = ClassInfo.of(int[].class);
64  		var result = ci.getNameFormatted(SIMPLE, false, '$', BRACKETS);
65  		assertEquals("int[]", result);
66  	}
67  
68  	@Test
69  	void b03_brackets_singleDimensionBooleanArray() {
70  		var ci = ClassInfo.of(boolean[].class);
71  		var result = ci.getNameFormatted(SIMPLE, false, '$', BRACKETS);
72  		assertEquals("boolean[]", result);
73  	}
74  
75  	//====================================================================================================
76  	// BRACKETS format - multi-dimensional arrays
77  	//====================================================================================================
78  
79  	@Test
80  	void c01_brackets_twoDimensionalStringArray() {
81  		var ci = ClassInfo.of(String[][].class);
82  		var result = ci.getNameFormatted(SIMPLE, false, '$', BRACKETS);
83  		assertEquals("String[][]", result);
84  	}
85  
86  	@Test
87  	void c02_brackets_threeDimensionalIntArray() {
88  		var ci = ClassInfo.of(int[][][].class);
89  		var result = ci.getNameFormatted(SIMPLE, false, '$', BRACKETS);
90  		assertEquals("int[][][]", result);
91  	}
92  
93  	@Test
94  	void c03_brackets_twoDimensionalBooleanArray() {
95  		var ci = ClassInfo.of(boolean[][].class);
96  		var result = ci.getNameFormatted(SIMPLE, false, '$', BRACKETS);
97  		assertEquals("boolean[][]", result);
98  	}
99  
100 	//====================================================================================================
101 	// WORD format - single dimension arrays
102 	//====================================================================================================
103 
104 	@Test
105 	void d01_word_singleDimensionStringArray() {
106 		var ci = ClassInfo.of(String[].class);
107 		var result = ci.getNameFormatted(SIMPLE, false, '$', WORD);
108 		assertEquals("StringArray", result);
109 	}
110 
111 	@Test
112 	void d02_word_singleDimensionIntArray() {
113 		var ci = ClassInfo.of(int[].class);
114 		var result = ci.getNameFormatted(SIMPLE, false, '$', WORD);
115 		assertEquals("intArray", result);
116 	}
117 
118 	@Test
119 	void d03_word_singleDimensionBooleanArray() {
120 		var ci = ClassInfo.of(boolean[].class);
121 		var result = ci.getNameFormatted(SIMPLE, false, '$', WORD);
122 		assertEquals("booleanArray", result);
123 	}
124 
125 	//====================================================================================================
126 	// WORD format - multi-dimensional arrays
127 	//====================================================================================================
128 
129 	@Test
130 	void e01_word_twoDimensionalStringArray() {
131 		var ci = ClassInfo.of(String[][].class);
132 		var result = ci.getNameFormatted(SIMPLE, false, '$', WORD);
133 		assertEquals("StringArrayArray", result);
134 	}
135 
136 	@Test
137 	void e02_word_threeDimensionalIntArray() {
138 		var ci = ClassInfo.of(int[][][].class);
139 		var result = ci.getNameFormatted(SIMPLE, false, '$', WORD);
140 		assertEquals("intArrayArrayArray", result);
141 	}
142 
143 	@Test
144 	void e03_word_twoDimensionalBooleanArray() {
145 		var ci = ClassInfo.of(boolean[][].class);
146 		var result = ci.getNameFormatted(SIMPLE, false, '$', WORD);
147 		assertEquals("booleanArrayArray", result);
148 	}
149 
150 	//====================================================================================================
151 	// JVM format - uses Class.getName() which already has JVM format
152 	//====================================================================================================
153 
154 	@Test
155 	void f01_jvm_singleDimensionStringArray() {
156 		var ci = ClassInfo.of(String[].class);
157 		// JVM format is already in Class.getName()
158 		var jvmName = String[].class.getName();
159 		assertEquals("[Ljava.lang.String;", jvmName);
160 		// When using JVM format, it should use the class name directly
161 		var result = ci.getNameFormatted(SIMPLE, false, '$', JVM);
162 		// For JVM format, it uses the inner class name which is already in JVM format
163 		assertTrue(result.contains("String") || result.equals(jvmName));
164 	}
165 
166 	@Test
167 	void f02_jvm_singleDimensionIntArray() {
168 		var ci = ClassInfo.of(int[].class);
169 		var jvmName = int[].class.getName();
170 		assertEquals("[I", jvmName);
171 		var result = ci.getNameFormatted(SIMPLE, false, '$', JVM);
172 		assertTrue(result.contains("int") || result.equals(jvmName));
173 	}
174 
175 	@Test
176 	void f03_jvm_twoDimensionalStringArray() {
177 		var ci = ClassInfo.of(String[][].class);
178 		var jvmName = String[][].class.getName();
179 		assertEquals("[[Ljava.lang.String;", jvmName);
180 		var result = ci.getNameFormatted(SIMPLE, false, '$', JVM);
181 		assertTrue(result.contains("String") || result.equals(jvmName));
182 	}
183 
184 	//====================================================================================================
185 	// appendNameFormatted with different formats
186 	//====================================================================================================
187 
188 	@Test
189 	void g01_appendNameFormatted_brackets_appendsCorrectly() {
190 		var ci = ClassInfo.of(String[][].class);
191 		var sb = new StringBuilder();
192 		ci.appendNameFormatted(sb, SIMPLE, false, '$', BRACKETS);
193 		assertEquals("String[][]", sb.toString());
194 	}
195 
196 	@Test
197 	void g02_appendNameFormatted_word_appendsCorrectly() {
198 		var ci = ClassInfo.of(int[][].class);
199 		var sb = new StringBuilder();
200 		ci.appendNameFormatted(sb, SIMPLE, false, '$', WORD);
201 		assertEquals("intArrayArray", sb.toString());
202 	}
203 
204 	@Test
205 	void g03_appendNameFormatted_brackets_withFullName() {
206 		var ci = ClassInfo.of(String[][].class);
207 		var sb = new StringBuilder();
208 		ci.appendNameFormatted(sb, FULL, false, '$', BRACKETS);
209 		assertTrue(sb.toString().contains("String[][]"));
210 		assertTrue(sb.toString().contains("java.lang"));
211 	}
212 
213 	@Test
214 	void g04_appendNameFormatted_word_withFullName() {
215 		var ci = ClassInfo.of(Integer[][].class);
216 		var sb = new StringBuilder();
217 		ci.appendNameFormatted(sb, FULL, false, '$', WORD);
218 		assertTrue(sb.toString().contains("ArrayArray"));
219 		assertTrue(sb.toString().contains("Integer"));
220 	}
221 
222 	//====================================================================================================
223 	// Non-array classes (should not be affected by array format)
224 	//====================================================================================================
225 
226 	@Test
227 	void h01_nonArrayClass_brackets_returnsNormalName() {
228 		var ci = ClassInfo.of(String.class);
229 		var result = ci.getNameFormatted(SIMPLE, false, '$', BRACKETS);
230 		assertEquals("String", result);
231 	}
232 
233 	@Test
234 	void h02_nonArrayClass_word_returnsNormalName() {
235 		var ci = ClassInfo.of(Integer.class);
236 		var result = ci.getNameFormatted(SIMPLE, false, '$', WORD);
237 		assertEquals("Integer", result);
238 	}
239 
240 	@Test
241 	void h03_nonArrayClass_jvm_returnsNormalName() {
242 		var ci = ClassInfo.of(String.class);
243 		var result = ci.getNameFormatted(SIMPLE, false, '$', JVM);
244 		assertEquals("String", result);
245 	}
246 
247 	//====================================================================================================
248 	// Primitive arrays with different formats
249 	//====================================================================================================
250 
251 	@Test
252 	void i01_primitiveArrays_brackets() {
253 		assertEquals("byte[]", ClassInfo.of(byte[].class).getNameFormatted(SIMPLE, false, '$', BRACKETS));
254 		assertEquals("short[]", ClassInfo.of(short[].class).getNameFormatted(SIMPLE, false, '$', BRACKETS));
255 		assertEquals("char[]", ClassInfo.of(char[].class).getNameFormatted(SIMPLE, false, '$', BRACKETS));
256 		assertEquals("long[]", ClassInfo.of(long[].class).getNameFormatted(SIMPLE, false, '$', BRACKETS));
257 		assertEquals("float[]", ClassInfo.of(float[].class).getNameFormatted(SIMPLE, false, '$', BRACKETS));
258 		assertEquals("double[]", ClassInfo.of(double[].class).getNameFormatted(SIMPLE, false, '$', BRACKETS));
259 	}
260 
261 	@Test
262 	void i02_primitiveArrays_word() {
263 		assertEquals("byteArray", ClassInfo.of(byte[].class).getNameFormatted(SIMPLE, false, '$', WORD));
264 		assertEquals("shortArray", ClassInfo.of(short[].class).getNameFormatted(SIMPLE, false, '$', WORD));
265 		assertEquals("charArray", ClassInfo.of(char[].class).getNameFormatted(SIMPLE, false, '$', WORD));
266 		assertEquals("longArray", ClassInfo.of(long[].class).getNameFormatted(SIMPLE, false, '$', WORD));
267 		assertEquals("floatArray", ClassInfo.of(float[].class).getNameFormatted(SIMPLE, false, '$', WORD));
268 		assertEquals("doubleArray", ClassInfo.of(double[].class).getNameFormatted(SIMPLE, false, '$', WORD));
269 	}
270 
271 	//====================================================================================================
272 	// Complex array types
273 	//====================================================================================================
274 
275 	@Test
276 	void j01_complexArray_brackets() {
277 		var ci = ClassInfo.of(java.util.List[].class);
278 		var result = ci.getNameFormatted(SIMPLE, false, '$', BRACKETS);
279 		assertEquals("List[]", result);
280 	}
281 
282 	@Test
283 	void j02_complexArray_word() {
284 		var ci = ClassInfo.of(java.util.Map[].class);
285 		var result = ci.getNameFormatted(SIMPLE, false, '$', WORD);
286 		assertEquals("MapArray", result);
287 	}
288 
289 	@Test
290 	void j03_complexArray_multiDimensional() {
291 		var ci = ClassInfo.of(java.util.List[][].class);
292 		var bracketsResult = ci.getNameFormatted(SIMPLE, false, '$', BRACKETS);
293 		var wordResult = ci.getNameFormatted(SIMPLE, false, '$', WORD);
294 		assertEquals("List[][]", bracketsResult);
295 		assertEquals("ListArrayArray", wordResult);
296 	}
297 }
298