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.junit.bct;
18  
19  import static org.apache.juneau.commons.utils.CollectionUtils.*;
20  import static org.apache.juneau.commons.utils.Utils.*;
21  import static org.apache.juneau.junit.bct.BctAssertions.*;
22  import static org.junit.jupiter.api.Assertions.*;
23  
24  import java.util.*;
25  import java.util.concurrent.*;
26  import java.util.function.*;
27  
28  import org.apache.juneau.*;
29  import org.junit.jupiter.api.*;
30  
31  /**
32   * Unit tests for {@link Swappers}.
33   */
34  class Swappers_Test extends TestBase {
35  
36  	@Nested
37  	class A_optionalSwapper extends TestBase {
38  
39  	@Test
40  	void a01_swapPresentOptional() {
41  		var swapper = Swappers.optionalSwapper();
42  		var result = swapper.apply(null, opt("Hello"));
43  		assertEquals("Hello", result);
44  	}
45  
46  		@Test
47  		void a02_swapEmptyOptional() {
48  			var swapper = Swappers.optionalSwapper();
49  			var result = swapper.apply(null, opte());
50  			assertNull(result);
51  		}
52  
53  	@Test
54  	void a03_swapOptionalWithNull() {
55  		var swapper = Swappers.optionalSwapper();
56  		var result = swapper.apply(null, opt(null));
57  		assertNull(result);
58  	}
59  
60  	@Test
61  	void a04_swapOptionalWithComplexObject() {
62  		var swapper = Swappers.optionalSwapper();
63  		var list = l("a", "b", "c");
64  		var result = swapper.apply(null, opt(list));
65  		assertSame(list, result);
66  		}
67  
68  		@Test
69  		void a05_swapOptionalWithConverter() {
70  			var converter = BasicBeanConverter.builder().defaultSettings().build();
71  			var swapper = Swappers.optionalSwapper();
72  			var result = swapper.apply(converter, opt(42));
73  			assertEquals(42, result);
74  		}
75  	}
76  
77  	@Nested
78  	class B_supplierSwapper extends TestBase {
79  
80  		@Test
81  		void b01_swapSupplierWithValue() {
82  			var swapper = Swappers.supplierSwapper();
83  			Supplier<String> supplier = () -> "Hello World";
84  			var result = swapper.apply(null, supplier);
85  			assertEquals("Hello World", result);
86  		}
87  
88  		@Test
89  		void b02_swapSupplierWithNull() {
90  			var swapper = Swappers.supplierSwapper();
91  			Supplier<String> supplier = () -> null;
92  			var result = swapper.apply(null, supplier);
93  			assertNull(result);
94  		}
95  
96  	@Test
97  	void b03_swapSupplierWithComplexObject() {
98  		var swapper = Swappers.supplierSwapper();
99  		var list = l("x", "y", "z");
100 		Supplier<List<String>> supplier = () -> list;
101 		var result = swapper.apply(null, supplier);
102 			assertSame(list, result);
103 		}
104 
105 		@Test
106 		void b04_swapSupplierWithConverter() {
107 			var converter = BasicBeanConverter.builder().defaultSettings().build();
108 			var swapper = Swappers.supplierSwapper();
109 			Supplier<Integer> supplier = () -> 123;
110 			var result = swapper.apply(converter, supplier);
111 			assertEquals(123, result);
112 		}
113 
114 		@Test
115 		void b05_swapSupplierWithException() {
116 			var swapper = Swappers.supplierSwapper();
117 			Supplier<String> supplier = () -> {
118 				throw new RuntimeException("Test exception");
119 			};
120 			assertThrows(RuntimeException.class, () -> swapper.apply(null, supplier));
121 		}
122 	}
123 
124 	@Nested
125 	class C_futureSwapper extends TestBase {
126 
127 		@Test
128 		void c01_swapCompletedFuture() {
129 			var swapper = Swappers.futureSwapper();
130 			var future = CompletableFuture.completedFuture("Result");
131 			var result = swapper.apply(null, future);
132 			assertEquals("Result", result);
133 		}
134 
135 		@Test
136 		void c02_swapPendingFuture() {
137 			var swapper = Swappers.futureSwapper();
138 			var future = new CompletableFuture<String>();
139 			var result = swapper.apply(null, future);
140 			assertEquals("<pending>", result);
141 		}
142 
143 		@Test
144 		void c03_swapCancelledFuture() {
145 			var swapper = Swappers.futureSwapper();
146 			var future = new CompletableFuture<String>();
147 			future.cancel(true);
148 			var result = swapper.apply(null, future);
149 			assertEquals("<cancelled>", result);
150 		}
151 
152 		@Test
153 		void c04_swapFailedFuture() {
154 			var swapper = Swappers.futureSwapper();
155 			var future = new CompletableFuture<String>();
156 			future.completeExceptionally(new RuntimeException("Test error"));
157 			var result = swapper.apply(null, future);
158 			assertEquals("<error: java.lang.RuntimeException: Test error>", result);
159 		}
160 
161 		@Test
162 		void c05_swapCompletedFutureWithNull() {
163 			var swapper = Swappers.futureSwapper();
164 			var future = CompletableFuture.completedFuture(null);
165 			var result = swapper.apply(null, future);
166 			assertNull(result);
167 		}
168 
169 	@Test
170 	void c06_swapFutureWithComplexObject() {
171 		var swapper = Swappers.futureSwapper();
172 		var list = l("a", "b", "c");
173 		var future = CompletableFuture.completedFuture(list);
174 		var result = swapper.apply(null, future);
175 			assertSame(list, result);
176 		}
177 
178 		@Test
179 		void c07_swapFutureWithConverter() {
180 			var converter = BasicBeanConverter.builder().defaultSettings().build();
181 			var swapper = Swappers.futureSwapper();
182 			var future = CompletableFuture.completedFuture(999);
183 			var result = swapper.apply(converter, future);
184 			assertEquals(999, result);
185 		}
186 
187 		@Test
188 		void c08_swapFutureWithNestedCause() {
189 			var swapper = Swappers.futureSwapper();
190 			var future = new CompletableFuture<String>();
191 			var rootCause = new IllegalArgumentException("Root cause");
192 			var wrappedException = new RuntimeException("Wrapper", rootCause);
193 			future.completeExceptionally(wrappedException);
194 			var result = swapper.apply(null, future);
195 			assertEquals("<error: java.lang.RuntimeException: Wrapper>", result);
196 		}
197 	}
198 
199 	@Nested
200 	class D_integration extends TestBase {
201 
202 		@Test
203 		void d01_useInBasicBeanConverter() {
204 			// Test Optional swapping
205 			assertBean(opt("test"), "<self>", "test");
206 			assertBean(opte(), "<self>", "<null>");
207 
208 			// Test Supplier swapping
209 			Supplier<String> supplier = () -> "supplied";
210 			assertBean(supplier, "<self>", "supplied");
211 
212 			// Test Future swapping
213 			var future = CompletableFuture.completedFuture("future-result");
214 			assertBean(future, "<self>", "future-result");
215 		}
216 
217 		@Test
218 		void d02_customSwapperRegistration() {
219 			// Test that custom registration works
220 			assertBean(opt("custom"), "<self>", "custom");
221 		}
222 
223 		@Test
224 		void d03_nestedSwapping() {
225 			// Test nested Optional in Supplier
226 			Supplier<Optional<String>> nestedSupplier = () -> opt("nested");
227 			assertBean(nestedSupplier, "<self>", "nested");
228 
229 			// Test Optional containing Supplier
230 			Supplier<String> supplier = () -> "inner";
231 			assertBean(opt(supplier), "<self>", "inner");
232 		}
233 	}
234 }