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.collections;
18  
19  import static org.apache.juneau.junit.bct.BctAssertions.*;
20  import static org.junit.jupiter.api.Assertions.*;
21  
22  import java.util.*;
23  
24  import org.apache.juneau.*;
25  import org.junit.jupiter.api.*;
26  
27  class FluentList_Test extends TestBase {
28  
29  	//====================================================================================================
30  	// Basic functionality - a(E element)
31  	//====================================================================================================
32  
33  	@Test
34  	void a01_addSingleElement() {
35  		var list = new FluentList<>(new ArrayList<String>());
36  		list.a("item1").a("item2").a("item3");
37  
38  		assertSize(3, list);
39  		assertEquals("item1", list.get(0));
40  		assertEquals("item2", list.get(1));
41  		assertEquals("item3", list.get(2));
42  	}
43  
44  	@Test
45  	void a02_addSingleElement_returnsThis() {
46  		var list = new FluentList<>(new ArrayList<String>());
47  		var result = list.a("item1");
48  
49  		assertSame(list, result);
50  	}
51  
52  	@Test
53  	void a03_addSingleElement_nullValue() {
54  		var list = new FluentList<>(new ArrayList<String>());
55  		list.a("item1").a(null).a("item3");
56  
57  		assertSize(3, list);
58  		assertEquals("item1", list.get(0));
59  		assertNull(list.get(1));
60  		assertEquals("item3", list.get(2));
61  	}
62  
63  	//====================================================================================================
64  	// a(Collection) method
65  	//====================================================================================================
66  
67  	@Test
68  	void b01_addCollection() {
69  		var list = new FluentList<>(new ArrayList<String>());
70  		var other = List.of("item1", "item2", "item3");
71  		list.aa(other);
72  
73  		assertSize(3, list);
74  		assertEquals("item1", list.get(0));
75  		assertEquals("item2", list.get(1));
76  		assertEquals("item3", list.get(2));
77  	}
78  
79  	@Test
80  	void b02_addCollection_returnsThis() {
81  		var list = new FluentList<>(new ArrayList<String>());
82  		var other = List.of("item1", "item2");
83  		var result = list.aa(other);
84  
85  		assertSame(list, result);
86  	}
87  
88  	@Test
89  	void b03_addCollection_nullCollection() {
90  		var list = new FluentList<>(new ArrayList<String>());
91  		list.a("item1");
92  		list.aa((Collection<String>)null);
93  		list.a("item2");
94  
95  		assertSize(2, list);
96  		assertEquals("item1", list.get(0));
97  		assertEquals("item2", list.get(1));
98  	}
99  
100 	@Test
101 	void b04_addCollection_emptyCollection() {
102 		var list = new FluentList<>(new ArrayList<String>());
103 		list.a("item1");
104 		list.aa(List.of());
105 		list.a("item2");
106 
107 		assertSize(2, list);
108 		assertEquals("item1", list.get(0));
109 		assertEquals("item2", list.get(1));
110 	}
111 
112 	@Test
113 	void b05_addCollection_multipleCalls() {
114 		var list = new FluentList<>(new ArrayList<String>());
115 		list.aa(List.of("item1", "item2"));
116 		list.aa(List.of("item3", "item4"));
117 
118 		assertSize(4, list);
119 		assertEquals("item1", list.get(0));
120 		assertEquals("item2", list.get(1));
121 		assertEquals("item3", list.get(2));
122 		assertEquals("item4", list.get(3));
123 	}
124 
125 	//====================================================================================================
126 	// ai(boolean, E) method
127 	//====================================================================================================
128 
129 	@Test
130 	void c01_ai_conditionTrue() {
131 		var list = new FluentList<>(new ArrayList<String>());
132 		list.a("item1").ai(true, "item2").a("item3");
133 
134 		assertSize(3, list);
135 		assertEquals("item1", list.get(0));
136 		assertEquals("item2", list.get(1));
137 		assertEquals("item3", list.get(2));
138 	}
139 
140 	@Test
141 	void c02_ai_conditionFalse() {
142 		var list = new FluentList<>(new ArrayList<String>());
143 		list.a("item1").ai(false, "item2").a("item3");
144 
145 		assertSize(2, list);
146 		assertEquals("item1", list.get(0));
147 		assertEquals("item3", list.get(1));
148 	}
149 
150 	@Test
151 	void c03_ai_returnsThis() {
152 		var list = new FluentList<>(new ArrayList<String>());
153 		var result1 = list.ai(true, "item1");
154 		var result2 = list.ai(false, "item2");
155 
156 		assertSame(list, result1);
157 		assertSame(list, result2);
158 	}
159 
160 	@Test
161 	void c04_ai_conditionalBuilding() {
162 		boolean includeDebug = true;
163 		boolean includeTest = false;
164 
165 		var list = new FluentList<>(new ArrayList<String>())
166 			.a("basic")
167 			.ai(includeDebug, "debug")
168 			.ai(includeTest, "test");
169 
170 		assertSize(2, list);
171 		assertTrue(list.contains("basic"));
172 		assertTrue(list.contains("debug"));
173 		assertFalse(list.contains("test"));
174 	}
175 
176 	//====================================================================================================
177 	// Method chaining
178 	//====================================================================================================
179 
180 	@Test
181 	void d01_methodChaining() {
182 		var list = new FluentList<>(new ArrayList<String>())
183 			.a("item1")
184 			.a("item2")
185 			.ai(true, "item3")
186 			.ai(false, "item4")
187 			.aa(List.of("item5", "item6"));
188 
189 		assertSize(5, list);
190 		assertEquals("item1", list.get(0));
191 		assertEquals("item2", list.get(1));
192 		assertEquals("item3", list.get(2));
193 		assertEquals("item5", list.get(3));
194 		assertEquals("item6", list.get(4));
195 	}
196 
197 	//====================================================================================================
198 	// List interface methods
199 	//====================================================================================================
200 
201 	@Test
202 	void e01_listInterface_get() {
203 		var list = new FluentList<>(new ArrayList<String>());
204 		list.a("item1").a("item2").a("item3");
205 
206 		assertEquals("item1", list.get(0));
207 		assertEquals("item2", list.get(1));
208 		assertEquals("item3", list.get(2));
209 	}
210 
211 	@Test
212 	void e02_listInterface_size() {
213 		var list = new FluentList<>(new ArrayList<String>());
214 		assertEquals(0, list.size());
215 
216 		list.a("item1");
217 		assertEquals(1, list.size());
218 
219 		list.a("item2");
220 		assertEquals(2, list.size());
221 	}
222 
223 	@Test
224 	void e03_listInterface_add() {
225 		var list = new FluentList<>(new ArrayList<String>());
226 		assertTrue(list.add("item1"));
227 		assertTrue(list.add("item2"));
228 
229 		assertSize(2, list);
230 		assertEquals("item1", list.get(0));
231 		assertEquals("item2", list.get(1));
232 	}
233 
234 	@Test
235 	void e04_listInterface_addAtIndex() {
236 		var list = new FluentList<>(new ArrayList<String>());
237 		list.a("item1").a("item3");
238 		list.add(1, "item2");
239 
240 		assertSize(3, list);
241 		assertEquals("item1", list.get(0));
242 		assertEquals("item2", list.get(1));
243 		assertEquals("item3", list.get(2));
244 	}
245 
246 	@Test
247 	void e05_listInterface_addAll() {
248 		var list = new FluentList<>(new ArrayList<String>());
249 		list.a("item1");
250 		assertTrue(list.addAll(List.of("item2", "item3")));
251 
252 		assertSize(3, list);
253 		assertEquals("item1", list.get(0));
254 		assertEquals("item2", list.get(1));
255 		assertEquals("item3", list.get(2));
256 	}
257 
258 	@Test
259 	void e05b_listInterface_addAllAtIndex() {
260 		var list = new FluentList<>(new ArrayList<String>());
261 		list.a("item1").a("item4");
262 		assertTrue(list.addAll(1, List.of("item2", "item3")));
263 
264 		assertSize(4, list);
265 		assertEquals("item1", list.get(0));
266 		assertEquals("item2", list.get(1));
267 		assertEquals("item3", list.get(2));
268 		assertEquals("item4", list.get(3));
269 	}
270 
271 	@Test
272 	void e06_listInterface_remove() {
273 		var list = new FluentList<>(new ArrayList<String>());
274 		list.a("item1").a("item2").a("item3");
275 
276 		assertTrue(list.remove("item2"));
277 		assertSize(2, list);
278 		assertEquals("item1", list.get(0));
279 		assertEquals("item3", list.get(1));
280 	}
281 
282 	@Test
283 	void e07_listInterface_removeAtIndex() {
284 		var list = new FluentList<>(new ArrayList<String>());
285 		list.a("item1").a("item2").a("item3");
286 
287 		assertEquals("item2", list.remove(1));
288 		assertSize(2, list);
289 		assertEquals("item1", list.get(0));
290 		assertEquals("item3", list.get(1));
291 	}
292 
293 	@Test
294 	void e08_listInterface_set() {
295 		var list = new FluentList<>(new ArrayList<String>());
296 		list.a("item1").a("item2").a("item3");
297 
298 		assertEquals("item2", list.set(1, "item2-updated"));
299 		assertEquals("item2-updated", list.get(1));
300 	}
301 
302 	@Test
303 	void e09_listInterface_indexOf() {
304 		var list = new FluentList<>(new ArrayList<String>());
305 		list.a("item1").a("item2").a("item1");
306 
307 		assertEquals(0, list.indexOf("item1"));
308 		assertEquals(1, list.indexOf("item2"));
309 		assertEquals(-1, list.indexOf("item3"));
310 	}
311 
312 	@Test
313 	void e10_listInterface_lastIndexOf() {
314 		var list = new FluentList<>(new ArrayList<String>());
315 		list.a("item1").a("item2").a("item1");
316 
317 		assertEquals(2, list.lastIndexOf("item1"));
318 		assertEquals(1, list.lastIndexOf("item2"));
319 		assertEquals(-1, list.lastIndexOf("item3"));
320 	}
321 
322 	@Test
323 	void e11_listInterface_contains() {
324 		var list = new FluentList<>(new ArrayList<String>());
325 		list.a("item1").a("item2");
326 
327 		assertTrue(list.contains("item1"));
328 		assertTrue(list.contains("item2"));
329 		assertFalse(list.contains("item3"));
330 	}
331 
332 	@Test
333 	void e12_listInterface_containsAll() {
334 		var list = new FluentList<>(new ArrayList<String>());
335 		list.a("item1").a("item2").a("item3");
336 
337 		assertTrue(list.containsAll(List.of("item1", "item2")));
338 		assertTrue(list.containsAll(List.of("item1", "item2", "item3")));
339 		assertFalse(list.containsAll(List.of("item1", "item4")));
340 	}
341 
342 	@Test
343 	void e13_listInterface_isEmpty() {
344 		var list = new FluentList<>(new ArrayList<String>());
345 		assertTrue(list.isEmpty());
346 
347 		list.a("item1");
348 		assertFalse(list.isEmpty());
349 	}
350 
351 	@Test
352 	void e14_listInterface_clear() {
353 		var list = new FluentList<>(new ArrayList<String>());
354 		list.a("item1").a("item2").a("item3");
355 
356 		list.clear();
357 		assertTrue(list.isEmpty());
358 		assertSize(0, list);
359 	}
360 
361 	@Test
362 	void e15_listInterface_iterator() {
363 		var list = new FluentList<>(new ArrayList<String>());
364 		list.a("item1").a("item2").a("item3");
365 
366 		var found = new ArrayList<String>();
367 		for (var item : list) {
368 			found.add(item);
369 		}
370 
371 		assertEquals(List.of("item1", "item2", "item3"), found);
372 	}
373 
374 	@Test
375 	void e16_listInterface_listIterator() {
376 		var list = new FluentList<>(new ArrayList<String>());
377 		list.a("item1").a("item2").a("item3");
378 
379 		var it = list.listIterator();
380 		assertTrue(it.hasNext());
381 		assertEquals("item1", it.next());
382 		assertEquals("item2", it.next());
383 		assertTrue(it.hasPrevious());
384 		assertEquals("item2", it.previous());
385 	}
386 
387 	@Test
388 	void e17_listInterface_subList() {
389 		var list = new FluentList<>(new ArrayList<String>());
390 		list.a("item1").a("item2").a("item3").a("item4");
391 
392 		var subList = list.subList(1, 3);
393 		assertSize(2, subList);
394 		assertEquals("item2", subList.get(0));
395 		assertEquals("item3", subList.get(1));
396 	}
397 
398 	@Test
399 	void e18_listInterface_toArray() {
400 		var list = new FluentList<>(new ArrayList<String>());
401 		list.a("item1").a("item2").a("item3");
402 
403 		var array = list.toArray();
404 		assertEquals(3, array.length);
405 		assertEquals("item1", array[0]);
406 		assertEquals("item2", array[1]);
407 		assertEquals("item3", array[2]);
408 	}
409 
410 	@Test
411 	void e19_listInterface_toArrayTyped() {
412 		var list = new FluentList<>(new ArrayList<String>());
413 		list.a("item1").a("item2").a("item3");
414 
415 		var array = list.toArray(new String[0]);
416 		assertEquals(3, array.length);
417 		assertEquals("item1", array[0]);
418 		assertEquals("item2", array[1]);
419 		assertEquals("item3", array[2]);
420 	}
421 
422 	//====================================================================================================
423 	// Different list implementations
424 	//====================================================================================================
425 
426 	@Test
427 	void f01_linkedList() {
428 		var list = new FluentList<>(new LinkedList<String>());
429 		list.a("item1").a("item2").a("item3");
430 
431 		assertSize(3, list);
432 	}
433 
434 	@Test
435 	void f02_vector() {
436 		var list = new FluentList<>(new Vector<String>());
437 		list.a("item1").a("item2").a("item3");
438 
439 		assertSize(3, list);
440 	}
441 
442 	//====================================================================================================
443 	// Edge cases
444 	//====================================================================================================
445 
446 	@Test
447 	void g01_emptyList() {
448 		var list = new FluentList<>(new ArrayList<String>());
449 
450 		assertTrue(list.isEmpty());
451 		assertSize(0, list);
452 		assertFalse(list.contains("anything"));
453 	}
454 
455 	@Test
456 	void g02_removeAll() {
457 		var list = new FluentList<>(new ArrayList<String>());
458 		list.a("item1").a("item2").a("item3").a("item4");
459 
460 		assertTrue(list.removeAll(List.of("item2", "item4")));
461 		assertSize(2, list);
462 		assertEquals("item1", list.get(0));
463 		assertEquals("item3", list.get(1));
464 	}
465 
466 	@Test
467 	void g03_retainAll() {
468 		var list = new FluentList<>(new ArrayList<String>());
469 		list.a("item1").a("item2").a("item3").a("item4");
470 
471 		assertTrue(list.retainAll(List.of("item2", "item4")));
472 		assertSize(2, list);
473 		assertEquals("item2", list.get(0));
474 		assertEquals("item4", list.get(1));
475 	}
476 
477 	//====================================================================================================
478 	// toString(), equals(), hashCode()
479 	//====================================================================================================
480 
481 	@Test
482 	void w01_toString_delegatesToUnderlyingList() {
483 		var list = new FluentList<>(new ArrayList<String>());
484 		list.a("item1").a("item2").a("item3");
485 
486 		var underlyingList = new ArrayList<String>();
487 		underlyingList.add("item1");
488 		underlyingList.add("item2");
489 		underlyingList.add("item3");
490 
491 		assertEquals(underlyingList.toString(), list.toString());
492 	}
493 
494 	@Test
495 	void w02_equals_delegatesToUnderlyingList() {
496 		var list1 = new FluentList<>(new ArrayList<String>());
497 		list1.a("item1").a("item2").a("item3");
498 
499 		var list2 = new ArrayList<String>();
500 		list2.add("item1");
501 		list2.add("item2");
502 		list2.add("item3");
503 
504 		assertTrue(list1.equals(list2));
505 		assertTrue(list2.equals(list1));
506 	}
507 
508 	@Test
509 	void w03_equals_differentContents_returnsFalse() {
510 		var list1 = new FluentList<>(new ArrayList<String>());
511 		list1.a("item1").a("item2");
512 
513 		var list2 = new ArrayList<String>();
514 		list2.add("item1");
515 		list2.add("item3");
516 
517 		assertFalse(list1.equals(list2));
518 		assertFalse(list2.equals(list1));
519 	}
520 
521 	@Test
522 	void w04_hashCode_delegatesToUnderlyingList() {
523 		var list = new FluentList<>(new ArrayList<String>());
524 		list.a("item1").a("item2").a("item3");
525 
526 		var underlyingList = new ArrayList<String>();
527 		underlyingList.add("item1");
528 		underlyingList.add("item2");
529 		underlyingList.add("item3");
530 
531 		assertEquals(underlyingList.hashCode(), list.hashCode());
532 	}
533 }
534