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.lang;
18  
19  import static org.apache.juneau.commons.utils.CollectionUtils.*;
20  import static org.apache.juneau.junit.bct.BctAssertions.*;
21  import static org.junit.jupiter.api.Assertions.*;
22  
23  import org.apache.juneau.*;
24  import org.junit.jupiter.api.*;
25  
26  class IntegerValue_Test extends TestBase {
27  
28  	//-----------------------------------------------------------------------------------------------------------------
29  	// Basic tests
30  	//-----------------------------------------------------------------------------------------------------------------
31  
32  	@Test
33  	void a01_create() {
34  		var a = IntegerValue.create();
35  		assertEquals(0, a.get());
36  		assertTrue(a.isPresent());
37  	}
38  
39  	@Test
40  	void a02_of() {
41  		var a = IntegerValue.of(42);
42  		assertEquals(42, a.get());
43  		assertTrue(a.isPresent());
44  	}
45  
46  	@Test
47  	void a03_of_null() {
48  		var a = IntegerValue.of(null);
49  		assertEquals(0, a.get());
50  		assertTrue(a.isPresent());
51  	}
52  
53  	@Test
54  	void a04_constructor_default() {
55  		var a = new IntegerValue();
56  		assertEquals(0, a.get());
57  	}
58  
59  	@Test
60  	void a05_constructor_withValue() {
61  		var a = new IntegerValue(100);
62  		assertEquals(100, a.get());
63  	}
64  
65  	//-----------------------------------------------------------------------------------------------------------------
66  	// getAndIncrement() tests
67  	//-----------------------------------------------------------------------------------------------------------------
68  
69  	@Test
70  	void b01_getAndIncrement_basic() {
71  		var a = IntegerValue.of(5);
72  		assertEquals(5, a.getAndIncrement());
73  		assertEquals(6, a.get());
74  	}
75  
76  	@Test
77  	void b02_getAndIncrement_fromZero() {
78  		var a = IntegerValue.create();
79  		assertEquals(0, a.getAndIncrement());
80  		assertEquals(1, a.get());
81  	}
82  
83  	@Test
84  	void b03_getAndIncrement_multiple() {
85  		var a = IntegerValue.of(10);
86  		assertEquals(10, a.getAndIncrement());
87  		assertEquals(11, a.getAndIncrement());
88  		assertEquals(12, a.getAndIncrement());
89  		assertEquals(13, a.get());
90  	}
91  
92  	@Test
93  	void b04_getAndIncrement_withNull() {
94  		var a = new IntegerValue();
95  		a.set(null);
96  		assertEquals(0, a.getAndIncrement());
97  		assertEquals(1, a.get());
98  	}
99  
100 	//-----------------------------------------------------------------------------------------------------------------
101 	// increment/decrement tests
102 	//-----------------------------------------------------------------------------------------------------------------
103 
104 	@Test
105 	void b05_increment() {
106 		var a = IntegerValue.of(5);
107 		a.increment();
108 		assertEquals(6, a.get());
109 	}
110 
111 	@Test
112 	void b06_decrement() {
113 		var a = IntegerValue.of(5);
114 		a.decrement();
115 		assertEquals(4, a.get());
116 	}
117 
118 	@Test
119 	void b07_incrementAndGet() {
120 		var a = IntegerValue.of(5);
121 		assertEquals(6, a.incrementAndGet());
122 		assertEquals(6, a.get());
123 	}
124 
125 	@Test
126 	void b08_decrementAndGet() {
127 		var a = IntegerValue.of(5);
128 		assertEquals(4, a.decrementAndGet());
129 		assertEquals(4, a.get());
130 	}
131 
132 	@Test
133 	void b09_add() {
134 		var a = IntegerValue.of(10);
135 		a.add(5);
136 		assertEquals(15, a.get());
137 	}
138 
139 	@Test
140 	void b09b_add_null() {
141 		var a = IntegerValue.of(10);
142 		a.add(null);
143 		assertEquals(10, a.get()); // null should be treated as 0
144 	}
145 
146 	@Test
147 	void b09c_add_negative() {
148 		var a = IntegerValue.of(10);
149 		a.add(-3);
150 		assertEquals(7, a.get());
151 	}
152 
153 	@Test
154 	void b09d_add_zero() {
155 		var a = IntegerValue.of(10);
156 		a.add(0);
157 		assertEquals(10, a.get());
158 	}
159 
160 	@Test
161 	void b09e_add_chain() {
162 		var a = IntegerValue.of(0);
163 		a.add(5).add(10).add(15);
164 		assertEquals(30, a.get());
165 	}
166 
167 	@Test
168 	void b10_addAndGet() {
169 		var a = IntegerValue.of(10);
170 		assertEquals(15, a.addAndGet(5));
171 		assertEquals(15, a.get());
172 	}
173 
174 	@Test
175 	void b10b_addAndGet_null() {
176 		var a = IntegerValue.of(10);
177 		assertEquals(10, a.addAndGet(null)); // null should be treated as 0
178 		assertEquals(10, a.get());
179 	}
180 
181 	@Test
182 	void b10c_addAndGet_negative() {
183 		var a = IntegerValue.of(10);
184 		assertEquals(7, a.addAndGet(-3));
185 		assertEquals(7, a.get());
186 	}
187 
188 	@Test
189 	void b10d_addAndGet_zero() {
190 		var a = IntegerValue.of(10);
191 		assertEquals(10, a.addAndGet(0));
192 		assertEquals(10, a.get());
193 	}
194 
195 	@Test
196 	void b11_is() {
197 		var a = IntegerValue.of(42);
198 		assertTrue(a.is(42));
199 		assertFalse(a.is(43));
200 	}
201 
202 	@Test
203 	void b12_isAny() {
204 		var a = IntegerValue.of(5);
205 		assertTrue(a.isAny(3, 5, 7));
206 		assertFalse(a.isAny(1, 2));
207 	}
208 
209 	//-----------------------------------------------------------------------------------------------------------------
210 	// Inherited Value<Integer> functionality tests
211 	//-----------------------------------------------------------------------------------------------------------------
212 
213 	@Test
214 	void c01_set() {
215 		var a = IntegerValue.create();
216 		a.set(99);
217 		assertEquals(99, a.get());
218 	}
219 
220 	@Test
221 	void c02_setIfEmpty() {
222 		var a = IntegerValue.of(5);
223 		a.setIfEmpty(10);
224 		assertEquals(5, a.get());  // Should not change
225 
226 		a.set(null);
227 		a.setIfEmpty(10);
228 		assertEquals(10, a.get());  // Should change
229 	}
230 
231 	@Test
232 	void c03_getAndUnset() {
233 		var a = IntegerValue.of(42);
234 		var b = a.getAndUnset();
235 		assertEquals(42, b);
236 		assertNull(a.get());
237 		assertFalse(a.isPresent());
238 	}
239 
240 	@Test
241 	void c04_isPresent_isEmpty() {
242 		var a = IntegerValue.of(5);
243 		assertTrue(a.isPresent());
244 		assertNotEmpty(a);
245 
246 		a.set(null);
247 		assertFalse(a.isPresent());
248 		assertEmpty(a);
249 	}
250 
251 	@Test
252 	void c05_orElse() {
253 		var a = IntegerValue.of(10);
254 		assertEquals(10, a.orElse(999));
255 
256 		a.set(null);
257 		assertEquals(999, a.orElse(999));
258 	}
259 
260 	@Test
261 	void c06_orElseGet() {
262 		var a = IntegerValue.of(10);
263 		assertEquals(10, a.orElseGet(() -> 999));
264 
265 		a.set(null);
266 		assertEquals(999, a.orElseGet(() -> 999));
267 	}
268 
269 	@Test
270 	void c07_orElseThrow() {
271 		var a = IntegerValue.of(10);
272 		assertEquals(10, a.orElseThrow(() -> new RuntimeException("error")));
273 
274 		a.set(null);
275 		assertThrows(RuntimeException.class, () -> a.orElseThrow(() -> new RuntimeException("error")));
276 	}
277 
278 	@Test
279 	void c08_ifPresent() {
280 		var a = IntegerValue.of(10);
281 		var b = Flag.create();
282 
283 		a.ifPresent(x -> b.set());
284 		assertTrue(b.isSet());
285 
286 		var c = Flag.create();
287 		a.set(null);
288 		a.ifPresent(x -> c.set());
289 		assertFalse(c.isSet());
290 	}
291 
292 	@Test
293 	void c09_map() {
294 		var a = IntegerValue.of(10);
295 		var b = a.map(x -> x * 2);
296 		assertEquals(20, b.get());
297 
298 		a.set(null);
299 		var c = a.map(x -> x * 2);
300 		assertNull(c.get());
301 		assertFalse(c.isPresent());
302 	}
303 
304 	@Test
305 	void c10_setIf() {
306 		var a = IntegerValue.of(10);
307 		a.setIf(true, 20);
308 		assertEquals(20, a.get());
309 
310 		a.setIf(false, 30);
311 		assertEquals(20, a.get());  // Should not change
312 	}
313 
314 	@Test
315 	void c11_update() {
316 		var a = IntegerValue.of(10);
317 		a.update(x -> x * 2);
318 		assertEquals(20, a.get());
319 
320 		a.set(null);
321 		a.update(x -> x * 2);  // Should be no-op
322 		assertNull(a.get());
323 	}
324 
325 	//-----------------------------------------------------------------------------------------------------------------
326 	// Use case scenarios
327 	//-----------------------------------------------------------------------------------------------------------------
328 
329 	@Test
330 	void d01_counterInLambda() {
331 		var a = IntegerValue.create();
332 
333 		var list = l("a", "b", "c", "d", "e");
334 		list.forEach(x -> a.getAndIncrement());
335 
336 		assertEquals(5, a.get());
337 	}
338 
339 	@Test
340 	void d02_conditionalCounting() {
341 		var a = IntegerValue.create();
342 
343 		l(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).forEach(x -> {
344 			if (x % 2 == 0) {
345 				a.getAndIncrement();
346 			}
347 		});
348 
349 		assertEquals(5, a.get());  // 5 even numbers
350 	}
351 
352 	@Test
353 	void d03_multipleCounters() {
354 		var a = IntegerValue.create();
355 		var b = IntegerValue.create();
356 
357 		l(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).forEach(x -> {
358 			if (x % 2 == 0) {
359 				a.getAndIncrement();
360 			} else {
361 				b.getAndIncrement();
362 			}
363 		});
364 
365 		assertEquals(5, a.get());  // even count
366 		assertEquals(5, b.get());  // odd count
367 	}
368 
369 	@Test
370 	void d04_resetAndReuse() {
371 		var a = IntegerValue.of(100);
372 		assertEquals(100, a.get());
373 
374 		a.set(0);
375 		assertEquals(0, a.get());
376 
377 		for (var i = 0; i < 10; i++) {
378 			a.getAndIncrement();
379 		}
380 		assertEquals(10, a.get());
381 	}
382 }