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