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 BooleanValue_Test extends TestBase {
27  
28  	//-----------------------------------------------------------------------------------------------------------------
29  	// Basic tests
30  	//-----------------------------------------------------------------------------------------------------------------
31  
32  	@Test
33  	void a01_create() {
34  		var v = BooleanValue.create();
35  		assertEquals(false, v.get());
36  	}
37  
38  	@Test
39  	void a02_of() {
40  		var v = BooleanValue.of(true);
41  		assertEquals(true, v.get());
42  	}
43  
44  	@Test
45  	void a03_constructor() {
46  		var v = new BooleanValue(true);
47  		assertEquals(true, v.get());
48  	}
49  
50  	@Test
51  	void a04_constructor_withNull() {
52  		var v = new BooleanValue(null);
53  		assertNull(v.get());
54  	}
55  
56  	//-----------------------------------------------------------------------------------------------------------------
57  	// isTrue() / isNotTrue()
58  	//-----------------------------------------------------------------------------------------------------------------
59  
60  	@Test
61  	void b01_isTrue_whenTrue() {
62  		var v = BooleanValue.of(true);
63  		assertTrue(v.isTrue());
64  		assertFalse(v.isNotTrue());
65  	}
66  
67  	@Test
68  	void b02_isTrue_whenFalse() {
69  		var v = BooleanValue.of(false);
70  		assertFalse(v.isTrue());
71  		assertTrue(v.isNotTrue());
72  	}
73  
74  	@Test
75  	void b03_isTrue_whenNull() {
76  		var v = new BooleanValue(null);
77  		assertFalse(v.isTrue());
78  		assertTrue(v.isNotTrue());
79  	}
80  
81  	@Test
82  	void b04_threeStates() {
83  		// Test that BooleanValue supports three states: true, false, null
84  		var vTrue = BooleanValue.of(true);
85  		var vFalse = BooleanValue.of(false);
86  		var vNull = new BooleanValue(null);
87  
88  		assertTrue(vTrue.get());
89  		assertFalse(vFalse.get());
90  		assertNull(vNull.get());
91  
92  		// Distinguished by isTrue()
93  		assertTrue(vTrue.isTrue());
94  		assertFalse(vFalse.isTrue());
95  		assertFalse(vNull.isTrue());
96  
97  		// Distinguished by isNotTrue()
98  		assertFalse(vTrue.isNotTrue());
99  		assertTrue(vFalse.isNotTrue());
100 		assertTrue(vNull.isNotTrue());
101 	}
102 
103 	//-----------------------------------------------------------------------------------------------------------------
104 	// Inherited Value<Boolean> methods
105 	//-----------------------------------------------------------------------------------------------------------------
106 
107 	@Test
108 	void c01_set() {
109 		var v = BooleanValue.create();
110 		v.set(true);
111 		assertEquals(true, v.get());
112 	}
113 
114 	@Test
115 	void c02_setIfEmpty() {
116 		var v = new BooleanValue(null);
117 		v.setIfEmpty(true);
118 		assertEquals(true, v.get());
119 
120 		v.setIfEmpty(false);
121 		assertEquals(true, v.get()); // Should not change
122 	}
123 
124 	@Test
125 	void c03_orElse() {
126 		var v = new BooleanValue(null);
127 		assertEquals(true, v.orElse(true));
128 
129 		v.set(false);
130 		assertEquals(false, v.orElse(true));
131 	}
132 
133 	@Test
134 	void c04_map() {
135 		var v = BooleanValue.of(true);
136 		Value<Boolean> v2 = v.map(x -> !x);
137 		assertEquals(false, v2.get());
138 	}
139 
140 	@Test
141 	void c05_ifPresent() {
142 		var v = BooleanValue.of(true);
143 		var sb = new StringBuilder();
144 		v.ifPresent(x -> sb.append(x));
145 		assertEquals("true", sb.toString());
146 	}
147 
148 	@Test
149 	void c06_isPresent() {
150 		var v = new BooleanValue(null);
151 		assertFalse(v.isPresent());
152 
153 		v.set(false);
154 		assertTrue(v.isPresent());
155 	}
156 
157 	@Test
158 	void c07_isEmpty() {
159 		var v = new BooleanValue(null);
160 		assertEmpty(v);
161 
162 		v.set(true);
163 		assertNotEmpty(v);
164 	}
165 
166 	@Test
167 	void c08_getAndSet() {
168 		var v = BooleanValue.of(true);
169 		assertEquals(true, v.getAndSet(false));
170 		assertEquals(false, v.get());
171 	}
172 
173 	@Test
174 	void c09_getAndUnset() {
175 		var v = BooleanValue.of(true);
176 		assertEquals(true, v.getAndUnset());
177 		assertNull(v.get());
178 	}
179 
180 	//-----------------------------------------------------------------------------------------------------------------
181 	// Use case scenarios
182 	//-----------------------------------------------------------------------------------------------------------------
183 
184 	@Test
185 	void d01_trackingConditionMet() {
186 		var found = BooleanValue.of(false);
187 
188 		l(1, 2, 3, 4, 5).forEach(x -> {
189 			if (x > 3) {
190 				found.set(true);
191 			}
192 		});
193 
194 		assertTrue(found.isTrue());
195 	}
196 
197 	@Test
198 	void d02_allConditionsMet() {
199 		var allValid = BooleanValue.of(true);
200 
201 		l(2, 4, 6, 8, 10).forEach(x -> {
202 			if (x % 2 != 0) {
203 				allValid.set(false);
204 			}
205 		});
206 
207 		assertTrue(allValid.isTrue());
208 	}
209 
210 	@Test
211 	void d03_toggle() {
212 		var toggle = BooleanValue.of(false);
213 
214 		// Toggle it 5 times
215 		for (var i = 0; i < 5; i++) {
216 			toggle.set(!toggle.get());
217 		}
218 
219 		assertTrue(toggle.isTrue());
220 	}
221 
222 	@Test
223 	void d04_nullStateTracking() {
224 		var state = new BooleanValue(null);
225 
226 		// Uninitialized state (null)
227 		assertNull(state.get());
228 		assertTrue(state.isNotTrue());
229 
230 		// Initialize to true
231 		state.set(true);
232 		assertTrue(state.isTrue());
233 
234 		// Change to false
235 		state.set(false);
236 		assertFalse(state.isTrue());
237 		assertTrue(state.isNotTrue());
238 
239 		// Reset to uninitialized (null)
240 		state.set(null);
241 		assertNull(state.get());
242 		assertTrue(state.isNotTrue());
243 	}
244 
245 	//-----------------------------------------------------------------------------------------------------------------
246 	// is(Boolean) - equality comparison
247 	//-----------------------------------------------------------------------------------------------------------------
248 
249 	@Test
250 	void e01_is_whenTrue() {
251 		var v = BooleanValue.of(true);
252 		assertTrue(v.is(true));
253 		assertFalse(v.is(false));
254 		assertFalse(v.is(null));
255 	}
256 
257 	@Test
258 	void e02_is_whenFalse() {
259 		var v = BooleanValue.of(false);
260 		assertFalse(v.is(true));
261 		assertTrue(v.is(false));
262 		assertFalse(v.is(null));
263 	}
264 
265 	@Test
266 	void e03_is_whenNull() {
267 		var v = new BooleanValue(null);
268 		assertFalse(v.is(true));
269 		assertFalse(v.is(false));
270 		assertTrue(v.is(null));
271 	}
272 
273 	@Test
274 	void e04_is_afterSet() {
275 		var v = BooleanValue.of(true);
276 		assertTrue(v.is(true));
277 
278 		v.set(false);
279 		assertFalse(v.is(true));
280 		assertTrue(v.is(false));
281 
282 		v.set(null);
283 		assertFalse(v.is(true));
284 		assertFalse(v.is(false));
285 		assertTrue(v.is(null));
286 	}
287 
288 	//-----------------------------------------------------------------------------------------------------------------
289 	// isAny(Boolean...) - matching any value
290 	//-----------------------------------------------------------------------------------------------------------------
291 
292 	@Test
293 	void f01_isAny_whenTrue() {
294 		var v = BooleanValue.of(true);
295 		assertTrue(v.isAny(true, null));
296 		assertTrue(v.isAny(true, false));
297 		assertTrue(v.isAny(true));
298 		assertFalse(v.isAny(false, null));
299 		assertFalse(v.isAny(false));
300 		assertFalse(v.isAny());
301 	}
302 
303 	@Test
304 	void f02_isAny_whenFalse() {
305 		var v = BooleanValue.of(false);
306 		assertTrue(v.isAny(false, null));
307 		assertTrue(v.isAny(true, false));
308 		assertTrue(v.isAny(false));
309 		assertFalse(v.isAny(true, null));
310 		assertFalse(v.isAny(true));
311 		assertFalse(v.isAny());
312 	}
313 
314 	@Test
315 	void f03_isAny_whenNull() {
316 		var v = new BooleanValue(null);
317 		assertTrue(v.isAny((Boolean)null, true));
318 		assertTrue(v.isAny(false, (Boolean)null));
319 		assertTrue(v.isAny((Boolean)null));
320 		assertFalse(v.isAny(true, false));
321 		assertFalse(v.isAny(true));
322 		assertFalse(v.isAny(false));
323 		assertFalse(v.isAny());
324 		
325 		// Test that null array throws IllegalArgumentException
326 		assertThrows(IllegalArgumentException.class, () -> v.isAny((Boolean[])null));
327 	}
328 
329 	@Test
330 	void f04_isAny_afterSet() {
331 		var v = BooleanValue.of(true);
332 		assertTrue(v.isAny(true, false));
333 
334 		v.set(false);
335 		assertTrue(v.isAny(true, false));
336 		assertFalse(v.isAny(true, null));
337 
338 		v.set(null);
339 		assertTrue(v.isAny(null, true));
340 		assertFalse(v.isAny(true, false));
341 	}
342 
343 	@Test
344 	void f05_isAny_allThreeStates() {
345 		var vTrue = BooleanValue.of(true);
346 		var vFalse = BooleanValue.of(false);
347 		var vNull = new BooleanValue(null);
348 
349 		// All should match when all three states are provided
350 		assertTrue(vTrue.isAny(true, false, null));
351 		assertTrue(vFalse.isAny(true, false, null));
352 		assertTrue(vNull.isAny(true, false, null));
353 	}
354 }
355