View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
5    */
6   package mockit.internal.util;
7   
8   import static org.junit.jupiter.api.Assertions.assertArrayEquals;
9   import static org.junit.jupiter.api.Assertions.assertEquals;
10  import static org.junit.jupiter.api.Assertions.assertFalse;
11  import static org.junit.jupiter.api.Assertions.assertNotNull;
12  import static org.junit.jupiter.api.Assertions.assertNull;
13  import static org.junit.jupiter.api.Assertions.assertTrue;
14  
15  import java.util.NoSuchElementException;
16  import java.util.PrimitiveIterator;
17  import java.util.Spliterator;
18  
19  import org.junit.jupiter.api.Test;
20  
21  final class DefaultValuesTest {
22  
23      @Test
24      void getReturnTypeDescExtracts() {
25          assertEquals("V", DefaultValues.getReturnTypeDesc("()V"));
26          assertEquals("I", DefaultValues.getReturnTypeDesc("(I)I"));
27          assertEquals("Ljava/lang/String;", DefaultValues.getReturnTypeDesc("()Ljava/lang/String;"));
28      }
29  
30      @Test
31      void computeForTypeVoidReturnsNull() {
32          assertNull(DefaultValues.computeForType("V"));
33      }
34  
35      @Test
36      void computeForTypePrimitiveInt() {
37          assertEquals(0, DefaultValues.computeForType("I"));
38      }
39  
40      @Test
41      void computeForTypeBoolean() {
42          assertEquals(Boolean.FALSE, DefaultValues.computeForType("Z"));
43      }
44  
45      @Test
46      void computeForTypeLong() {
47          assertEquals(0L, DefaultValues.computeForType("J"));
48      }
49  
50      @Test
51      void computeForTypeDouble() {
52          assertEquals(0.0, DefaultValues.computeForType("D"));
53      }
54  
55      @Test
56      void computeForTypeFloat() {
57          assertEquals(0.0f, DefaultValues.computeForType("F"));
58      }
59  
60      @Test
61      void computeForTypeObjectReturnsNull() {
62          // 'L' prefix for non-mapped types -> null
63          assertNull(DefaultValues.computeForType("Ljava/lang/Object;"));
64      }
65  
66      @Test
67      void computeForTypeIntArray() {
68          Object result = DefaultValues.computeForType("[I");
69          assertNotNull(result);
70          assertTrue(result instanceof int[]);
71          assertEquals(0, ((int[]) result).length);
72      }
73  
74      @Test
75      void computeForTypeStringArray() {
76          Object result = DefaultValues.computeForType("[Ljava/lang/String;");
77          assertNotNull(result);
78          assertTrue(result instanceof String[]);
79      }
80  
81      @Test
82      void computeForTypeMultiDimArray() {
83          Object result = DefaultValues.computeForType("[[I");
84          assertNotNull(result);
85      }
86  
87      @Test
88      void computeForClassArray() {
89          Object result = DefaultValues.computeForType(int[].class);
90          assertNotNull(result);
91          assertArrayEquals(new int[0], (int[]) result);
92      }
93  
94      @Test
95      void computeForClassPrimitive() {
96          assertEquals(0, DefaultValues.computeForType(int.class));
97      }
98  
99      @Test
100     void computeForClassVoid() {
101         assertNull(DefaultValues.computeForType(void.class));
102     }
103 
104     @Test
105     void computeForClassWrapper() {
106         assertEquals(0, DefaultValues.computeForType(Integer.class));
107     }
108 
109     @Test
110     void defaultValueForPrimitiveBoolean() {
111         assertEquals(Boolean.FALSE, DefaultValues.defaultValueForPrimitiveType(boolean.class));
112     }
113 
114     @Test
115     void defaultValueForPrimitiveLong() {
116         assertEquals(0L, DefaultValues.defaultValueForPrimitiveType(long.class));
117     }
118 
119     @Test
120     void defaultValueForPrimitiveDouble() {
121         assertEquals(0.0, DefaultValues.defaultValueForPrimitiveType(double.class));
122     }
123 
124     @Test
125     void defaultValueForPrimitiveFloat() {
126         Object result = DefaultValues.defaultValueForPrimitiveType(float.class);
127         assertEquals(0.0f, (Float) result, 0.0f);
128     }
129 
130     @Test
131     void defaultValueForPrimitiveChar() {
132         assertEquals('\0', DefaultValues.defaultValueForPrimitiveType(char.class));
133     }
134 
135     @Test
136     void defaultValueForPrimitiveByte() {
137         Object result = DefaultValues.defaultValueForPrimitiveType(byte.class);
138         assertEquals(0, ((Byte) result).intValue());
139     }
140 
141     @Test
142     void defaultValueForPrimitiveShort() {
143         Object result = DefaultValues.defaultValueForPrimitiveType(short.class);
144         assertEquals(0, ((Short) result).intValue());
145     }
146 
147     @Test
148     void computeForWrapperBoolean() {
149         assertEquals(Boolean.FALSE, DefaultValues.computeForWrapperType(Boolean.class));
150     }
151 
152     @Test
153     void computeForWrapperLong() {
154         Object result = DefaultValues.computeForWrapperType(Long.class);
155         assertEquals(0L, ((Long) result).longValue());
156     }
157 
158     @Test
159     void computeForWrapperDouble() {
160         assertEquals(0.0, DefaultValues.computeForWrapperType(Double.class));
161     }
162 
163     @Test
164     void computeForWrapperFloat() {
165         Object result = DefaultValues.computeForWrapperType(Float.class);
166         assertEquals(0.0f, (Float) result, 0.0f);
167     }
168 
169     @Test
170     void computeForWrapperCharacter() {
171         Object result = DefaultValues.computeForWrapperType(Character.class);
172         assertEquals('\0', ((Character) result).charValue());
173     }
174 
175     @Test
176     void computeForWrapperByte() {
177         Object result = DefaultValues.computeForWrapperType(Byte.class);
178         assertEquals(0, ((Byte) result).intValue());
179     }
180 
181     @Test
182     void computeForWrapperShort() {
183         Object result = DefaultValues.computeForWrapperType(Short.class);
184         assertEquals(0, ((Short) result).intValue());
185     }
186 
187     @Test
188     void computeForWrapperUnknownReturnsNull() {
189         assertNull(DefaultValues.computeForWrapperType(Object.class));
190     }
191 
192     @Test
193     void computeForReturnType() {
194         assertNull(DefaultValues.computeForReturnType("doSomething()V"));
195         assertEquals(0, DefaultValues.computeForReturnType("getValue()I"));
196     }
197 
198     @Test
199     void primitiveIteratorOfIntBehavior() {
200         // Retrieve PrimitiveIterator.OfInt from the map
201         Object result = DefaultValues.computeForType("Ljava/util/PrimitiveIterator$OfInt;");
202         assertNotNull(result);
203         assertTrue(result instanceof PrimitiveIterator.OfInt);
204         PrimitiveIterator.OfInt iter = (PrimitiveIterator.OfInt) result;
205         assertFalse(iter.hasNext());
206         assertThrowsNoSuchElement(iter::nextInt);
207         assertThrowsNoSuchElement(iter::next);
208     }
209 
210     @Test
211     void primitiveIteratorOfLongBehavior() {
212         Object result = DefaultValues.computeForType("Ljava/util/PrimitiveIterator$OfLong;");
213         assertNotNull(result);
214         assertTrue(result instanceof PrimitiveIterator.OfLong);
215         PrimitiveIterator.OfLong iter = (PrimitiveIterator.OfLong) result;
216         assertFalse(iter.hasNext());
217         assertThrowsNoSuchElement(iter::nextLong);
218     }
219 
220     @Test
221     void primitiveIteratorOfDoubleBehavior() {
222         Object result = DefaultValues.computeForType("Ljava/util/PrimitiveIterator$OfDouble;");
223         assertNotNull(result);
224         assertTrue(result instanceof PrimitiveIterator.OfDouble);
225         PrimitiveIterator.OfDouble iter = (PrimitiveIterator.OfDouble) result;
226         assertFalse(iter.hasNext());
227         assertThrowsNoSuchElement(iter::nextDouble);
228     }
229 
230     @Test
231     void computeForTypeOptional() {
232         Object opt = DefaultValues.computeForType("Ljava/util/Optional;");
233         assertNotNull(opt);
234     }
235 
236     @Test
237     void computeForTypeSpliterator() {
238         Object spliterator = DefaultValues.computeForType("Ljava/util/Spliterator;");
239         assertNotNull(spliterator);
240         assertTrue(spliterator instanceof Spliterator);
241     }
242 
243     @Test
244     void computeForTypeStream() {
245         Object stream = DefaultValues.computeForType("Ljava/util/stream/Stream;");
246         assertNotNull(stream);
247     }
248 
249     private static void assertThrowsNoSuchElement(Runnable action) {
250         try {
251             action.run();
252             throw new AssertionError("Expected NoSuchElementException");
253         } catch (NoSuchElementException e) {
254             // expected
255         }
256     }
257 }