1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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
205 assertBean(opt("test"), "<self>", "test");
206 assertBean(opte(), "<self>", "<null>");
207
208
209 Supplier<String> supplier = () -> "supplied";
210 assertBean(supplier, "<self>", "supplied");
211
212
213 var future = CompletableFuture.completedFuture("future-result");
214 assertBean(future, "<self>", "future-result");
215 }
216
217 @Test
218 void d02_customSwapperRegistration() {
219
220 assertBean(opt("custom"), "<self>", "custom");
221 }
222
223 @Test
224 void d03_nestedSwapping() {
225
226 Supplier<Optional<String>> nestedSupplier = () -> opt("nested");
227 assertBean(nestedSupplier, "<self>", "nested");
228
229
230 Supplier<String> supplier = () -> "inner";
231 assertBean(opt(supplier), "<self>", "inner");
232 }
233 }
234 }