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.a.rttests;
18  
19  import static org.apache.juneau.common.utils.Utils.*;
20  import static org.junit.jupiter.api.Assertions.*;
21  
22  import java.util.*;
23  
24  import org.apache.juneau.collections.*;
25  import org.junit.jupiter.params.*;
26  import org.junit.jupiter.params.provider.*;
27  
28  /**
29   * Tests designed to serialize and parse objects to make sure we end up
30   * with the same objects for all serializers and parsers.
31   */
32  @SuppressWarnings("rawtypes")
33  class SimpleObjects_RoundTripTest extends RoundTripTest_Base {
34  
35  	@ParameterizedTest
36  	@MethodSource("testers")
37  	void a01_null(RoundTrip_Tester t) throws Exception {
38  		assertNull(t.roundTrip((String)null));
39  	}
40  
41  	@ParameterizedTest
42  	@MethodSource("testers")
43  	void a02_optional(RoundTrip_Tester t) throws Exception {
44  		assertFalse(t.roundTrip(empty()).isPresent());
45  	}
46  
47  	@ParameterizedTest
48  	@MethodSource("testers")
49  	void a03_string(RoundTrip_Tester t) throws Exception {
50  		assertEquals("foobar", t.roundTrip("foobar"));
51  		assertEquals("", t.roundTrip(""));
52  	}
53  
54  	@ParameterizedTest
55  	@MethodSource("testers")
56  	void a04_optionalContainingString(RoundTrip_Tester t) throws Exception {
57  		assertEquals("foobar", t.roundTrip(opt("foobar")).get());
58  		assertEquals("", t.roundTrip(opt("")).get());
59  	}
60  
61  	@ParameterizedTest
62  	@MethodSource("testers")
63  	void a05_stringArray(RoundTrip_Tester t) throws Exception {
64  		assertArrayEquals(new String[]{"foo", null, "null", ""}, t.roundTrip(new String[]{"foo", null, "null", ""}, String[].class));
65  	}
66  
67  	@ParameterizedTest
68  	@MethodSource("testers")
69  	void a06_string2dArray(RoundTrip_Tester t) throws Exception {
70  		var x = a(a("foo", null, "null", ""),null);
71  		x = t.roundTrip(x, String[][].class);
72  		assertEquals("foo", x[0][0]);
73  		assertNull(x[0][1]);
74  		assertEquals("null", x[0][2]);
75  		assertEquals("", x[0][3]);
76  		assertNull(x[1]);
77  	}
78  
79  	@ParameterizedTest
80  	@MethodSource("testers")
81  	void a07_int(RoundTrip_Tester t) throws Exception {
82  		assertEquals(123, t.roundTrip(123).intValue());
83  	}
84  
85  	@ParameterizedTest
86  	@MethodSource("testers")
87  	void a08_intArray(RoundTrip_Tester t) throws Exception {
88  		assertArrayEquals(new int[]{1,2,3}, t.roundTrip(new int[]{1,2,3}, int[].class));
89  	}
90  
91  	@ParameterizedTest
92  	@MethodSource("testers")
93  	void a09_int2dArray(RoundTrip_Tester t) throws Exception {
94  		var x = new int[][]{{1,2,3},null};
95  		x = t.roundTrip(x, int[][].class);
96  		assertEquals(1, x[0][0]);
97  		assertEquals(2, x[0][1]);
98  		assertEquals(3, x[0][2]);
99  		assertNull(x[1]);
100 	}
101 
102 	@ParameterizedTest
103 	@MethodSource("testers")
104 	void a10_int3dArray(RoundTrip_Tester t) throws Exception {
105 		var x = new int[][][]{{{1,2,3},{4,5,6},null},null};
106 		x = t.roundTrip(x, int[][][].class);
107 		assertEquals(1, x[0][0][0]);
108 		assertEquals(2, x[0][0][1]);
109 		assertEquals(3, x[0][0][2]);
110 		assertEquals(4, x[0][1][0]);
111 		assertEquals(5, x[0][1][1]);
112 		assertEquals(6, x[0][1][2]);
113 		assertNull(x[0][2]);
114 		assertNull(x[1]);
115 	}
116 
117 	@ParameterizedTest
118 	@MethodSource("testers")
119 	void a11_boolean(RoundTrip_Tester t) throws Exception {
120 		assertTrue(t.roundTrip(true));
121 		assertFalse(t.roundTrip(false));
122 	}
123 
124 	@ParameterizedTest
125 	@MethodSource("testers")
126 	void a12_booleanArray(RoundTrip_Tester t) throws Exception {
127 		assertArrayEquals(new boolean[]{true,false}, t.roundTrip(new boolean[]{true,false}, boolean[].class));
128 	}
129 
130 	@ParameterizedTest
131 	@MethodSource("testers")
132 	void a13_boolean2dArray(RoundTrip_Tester t) throws Exception {
133 		var x = new boolean[][]{{true,false},null};
134 		x = t.roundTrip(x, boolean[][].class);
135 		assertTrue(x[0][0]);
136 		assertFalse(x[0][1]);
137 		assertNull(x[1]);
138 	}
139 
140 	@ParameterizedTest
141 	@MethodSource("testers")
142 	void a14_char(RoundTrip_Tester t) throws Exception {
143 		assertEquals('a', t.roundTrip('a', char.class).charValue());
144 	}
145 
146 	@ParameterizedTest
147 	@MethodSource("testers")
148 	void a15_charArray(RoundTrip_Tester t) throws Exception {
149 		assertArrayEquals(new char[]{'a',0}, t.roundTrip(new char[]{'a',0}, char[].class));
150 	}
151 
152 	@ParameterizedTest
153 	@MethodSource("testers")
154 	void a16_char2dArray(RoundTrip_Tester t) throws Exception {
155 		var x = new char[][]{{'a',0},null};
156 		x = t.roundTrip(x, char[][].class);
157 		assertEquals('a', x[0][0]);
158 		assertEquals(0, x[0][1]);
159 		assertNull(x[1]);
160 	}
161 
162 	@ParameterizedTest
163 	@MethodSource("testers")
164 	void a17_float(RoundTrip_Tester t) throws Exception {
165 		assertEquals(1f, t.roundTrip(1f, float.class), 0.1f);
166 	}
167 
168 	@ParameterizedTest
169 	@MethodSource("testers")
170 	void a18_floatArray(RoundTrip_Tester t) throws Exception {
171 		assertArrayEquals(new float[]{1f}, t.roundTrip(new float[]{1f}, float[].class), 0.1f);
172 	}
173 
174 	@ParameterizedTest
175 	@MethodSource("testers")
176 	void a19_float2dArray(RoundTrip_Tester t) throws Exception {
177 		var x = new float[][]{{1f},null};
178 		x = t.roundTrip(x, float[][].class);
179 		assertEquals(1f, x[0][0], 0.1f);
180 		assertNull(x[1]);
181 	}
182 
183 	@ParameterizedTest
184 	@MethodSource("testers")
185 	void a20_double(RoundTrip_Tester t) throws Exception {
186 		assertEquals(1d, t.roundTrip(1d, double.class), 0.1f);
187 	}
188 
189 	@ParameterizedTest
190 	@MethodSource("testers")
191 	void a21_doubleArray(RoundTrip_Tester t) throws Exception {
192 		assertArrayEquals(new double[]{1d}, t.roundTrip(new double[]{1d}, double[].class), 0.1);
193 	}
194 
195 	@ParameterizedTest
196 	@MethodSource("testers")
197 	void a22_double2dArray(RoundTrip_Tester t) throws Exception {
198 		var x = new double[][]{{1d},null};
199 		x = t.roundTrip(x, double[][].class);
200 		assertEquals(1d, x[0][0], 0.1f);
201 		assertNull(x[1]);
202 	}
203 
204 	@ParameterizedTest
205 	@MethodSource("testers")
206 	void a23_long(RoundTrip_Tester t) throws Exception {
207 		assertEquals(1L, t.roundTrip(1L, long.class).longValue());
208 	}
209 
210 	@ParameterizedTest
211 	@MethodSource("testers")
212 	void a24_longArray(RoundTrip_Tester t) throws Exception {
213 		assertArrayEquals(new long[]{1L}, t.roundTrip(new long[]{1L}, long[].class));
214 	}
215 
216 	@ParameterizedTest
217 	@MethodSource("testers")
218 	void a25_long2dArray(RoundTrip_Tester t) throws Exception {
219 		var x = new long[][]{{1L},null};
220 		x = t.roundTrip(x, long[][].class);
221 		assertEquals(1L, x[0][0]);
222 		assertNull(x[1]);
223 	}
224 
225 	@ParameterizedTest
226 	@MethodSource("testers")
227 	void a26_short(RoundTrip_Tester t) throws Exception {
228 		assertEquals((short)1, t.roundTrip((short)1, short.class).shortValue());
229 	}
230 
231 	@ParameterizedTest
232 	@MethodSource("testers")
233 	void a27_shortArray(RoundTrip_Tester t) throws Exception {
234 		assertArrayEquals(new short[]{(short)1}, t.roundTrip(new short[]{(short)1}, short[].class));
235 	}
236 
237 	@ParameterizedTest
238 	@MethodSource("testers")
239 	void a28_short2dArray(RoundTrip_Tester t) throws Exception {
240 		var x = new short[][]{{(short)1},null};
241 		x = t.roundTrip(x, short[][].class);
242 		assertEquals((short)1, x[0][0]);
243 		assertNull(x[1]);
244 	}
245 
246 	@ParameterizedTest
247 	@MethodSource("testers")
248 	void a29_integer(RoundTrip_Tester t) throws Exception {
249 		assertEquals(Integer.valueOf(123), t.roundTrip((Integer)123, Integer.class));
250 	}
251 
252 	@ParameterizedTest
253 	@MethodSource("testers")
254 	void a30_integerArray(RoundTrip_Tester t) throws Exception {
255 		var x = new Integer[]{123, null};
256 		x = t.roundTrip(x, Integer[].class);
257 		assertEquals(Integer.valueOf(123), x[0]);
258 		assertNull(x[1]);
259 	}
260 
261 	@ParameterizedTest
262 	@MethodSource("testers")
263 	void a31_integer2dArray(RoundTrip_Tester t) throws Exception {
264 		var x = new Integer[][]{{123,null},null};
265 		x = t.roundTrip(x, Integer[][].class);
266 		assertEquals(Integer.valueOf(123), x[0][0]);
267 		assertNull(x[0][1]);
268 		assertNull(x[1]);
269 	}
270 
271 	@ParameterizedTest
272 	@MethodSource("testers")
273 	void a32_integer3dArray(RoundTrip_Tester t) throws Exception {
274 		var x = new Integer[][][]{{{123,null},null},null};
275 		x = t.roundTrip(x, Integer[][][].class);
276 		assertEquals(Integer.valueOf(123), x[0][0][0]);
277 		assertNull(x[0][0][1]);
278 		assertNull(x[0][1]);
279 		assertNull(x[1]);
280 	}
281 
282 	@ParameterizedTest
283 	@MethodSource("testers")
284 	void a33_booleanObject(RoundTrip_Tester t) throws Exception {
285 		assertTrue(t.roundTrip(Boolean.TRUE, Boolean.class));
286 		assertFalse(t.roundTrip(Boolean.FALSE, Boolean.class));
287 	}
288 
289 	@ParameterizedTest
290 	@MethodSource("testers")
291 	void a34_booleanObjectArray(RoundTrip_Tester t) throws Exception {
292 		var x = new Boolean[]{true,false,null};
293 		x = t.roundTrip(x, Boolean[].class);
294 		assertTrue(x[0]);
295 		assertFalse(x[1]);
296 		assertNull(x[2]);
297 	}
298 
299 	@ParameterizedTest
300 	@MethodSource("testers")
301 	void a35_booleanObject2dArray(RoundTrip_Tester t) throws Exception {
302 		var x = new Boolean[][]{{true,false,null},null};
303 		x = t.roundTrip(x, Boolean[][].class);
304 		assertTrue(x[0][0]);
305 		assertFalse(x[0][1]);
306 		assertNull(x[0][2]);
307 		assertNull(x[1]);
308 	}
309 
310 	@ParameterizedTest
311 	@MethodSource("testers")
312 	void a36_character(RoundTrip_Tester t) throws Exception {
313 		assertEquals(Character.valueOf('a'), t.roundTrip((Character)'a', Character.class));
314 	}
315 
316 	@ParameterizedTest
317 	@MethodSource("testers")
318 	void a37_characterArray(RoundTrip_Tester t) throws Exception {
319 		var x = new Character[]{'a',null};
320 		x = t.roundTrip(x, Character[].class);
321 		assertEquals(Character.valueOf('a'), x[0]);
322 		assertNull(x[1]);
323 	}
324 
325 	@ParameterizedTest
326 	@MethodSource("testers")
327 	void a38_character2dArray(RoundTrip_Tester t) throws Exception {
328 		var x = new Character[][]{{'a',null},null};
329 		x = t.roundTrip(x, Character[][].class);
330 		assertEquals(Character.valueOf('a'), x[0][0]);
331 		assertNull(x[0][1]);
332 		assertNull(x[1]);
333 	}
334 
335 	@ParameterizedTest
336 	@MethodSource("testers")
337 	void a39_floatObject(RoundTrip_Tester t) throws Exception {
338 		assertEquals(Float.valueOf(1f), t.roundTrip((Float)1f, Float.class));
339 	}
340 
341 	@ParameterizedTest
342 	@MethodSource("testers")
343 	void a40_floatObjectArray(RoundTrip_Tester t) throws Exception {
344 		var x = new Float[]{1f, null};
345 		x = t.roundTrip(x, Float[].class);
346 		assertEquals(Float.valueOf(1f), x[0]);
347 		assertNull(x[1]);
348 	}
349 
350 	@ParameterizedTest
351 	@MethodSource("testers")
352 	void a41_floatObject2dArray(RoundTrip_Tester t) throws Exception {
353 		var x = new Float[][]{{1f,null},null};
354 		x = t.roundTrip(x, Float[][].class);
355 		assertEquals(Float.valueOf(1f), x[0][0]);
356 		assertNull(x[0][1]);
357 		assertNull(x[1]);
358 	}
359 
360 	@ParameterizedTest
361 	@MethodSource("testers")
362 	void a42_doubleObject(RoundTrip_Tester t) throws Exception {
363 		assertEquals(Double.valueOf(1d), t.roundTrip((Double)1d, Double.class));
364 	}
365 
366 	@ParameterizedTest
367 	@MethodSource("testers")
368 	void a43_doubleObjectArray(RoundTrip_Tester t) throws Exception {
369 		var x = new Double[]{1d,null};
370 		x = t.roundTrip(x, Double[].class);
371 		assertEquals(Double.valueOf(1d), x[0]);
372 		assertNull(x[1]);
373 	}
374 
375 	@ParameterizedTest
376 	@MethodSource("testers")
377 	void a44_doubleObject2dArray(RoundTrip_Tester t) throws Exception {
378 		var x = new Double[][]{{1d,null},null};
379 		x = t.roundTrip(x, Double[][].class);
380 		assertEquals(Double.valueOf(1d), x[0][0]);
381 		assertNull(x[0][1]);
382 		assertNull(x[1]);
383 	}
384 
385 	@ParameterizedTest
386 	@MethodSource("testers")
387 	void a45_longObject(RoundTrip_Tester t) throws Exception {
388 		assertEquals(Long.valueOf(1L), t.roundTrip((Long)1L, Long.class));
389 	}
390 
391 	@ParameterizedTest
392 	@MethodSource("testers")
393 	void a46_longObjectArray(RoundTrip_Tester t) throws Exception {
394 		var x = new Long[]{1L, null};
395 		x = t.roundTrip(x, Long[].class);
396 		assertEquals(Long.valueOf(1L), x[0]);
397 		assertNull(x[1]);
398 	}
399 
400 	@ParameterizedTest
401 	@MethodSource("testers")
402 	void a47_longObject2dArray(RoundTrip_Tester t) throws Exception {
403 		var x = new Long[][]{{1L,null},null};
404 		x = t.roundTrip(x, Long[][].class);
405 		assertEquals(Long.valueOf(1L), x[0][0]);
406 		assertNull(x[0][1]);
407 		assertNull(x[1]);
408 	}
409 
410 	@ParameterizedTest
411 	@MethodSource("testers")
412 	void a48_shortObject(RoundTrip_Tester t) throws Exception {
413 		assertEquals(Short.valueOf((short)1), t.roundTrip((Short)(short)1, Short.class));
414 	}
415 
416 	@ParameterizedTest
417 	@MethodSource("testers")
418 	void a49_shortObjectArray(RoundTrip_Tester t) throws Exception {
419 		var x = new Short[]{(short)1,null};
420 		x = t.roundTrip(x, Short[].class);
421 		assertEquals(Short.valueOf((short)1), x[0]);
422 		assertNull(x[1]);
423 	}
424 
425 	@ParameterizedTest
426 	@MethodSource("testers")
427 	void a50_shortObject2dArray(RoundTrip_Tester t) throws Exception {
428 		var x = new Short[][]{{(short)1,null},null};
429 		x = t.roundTrip(x, Short[][].class);
430 		assertEquals(Short.valueOf((short)1), x[0][0]);
431 		assertNull(x[0][1]);
432 		assertNull(x[1]);
433 	}
434 
435 	@ParameterizedTest
436 	@MethodSource("testers")
437 	void a51_jsonMap(RoundTrip_Tester t) throws Exception {
438 		var x = JsonMap.ofJson("{a:'b',c:123,d:false,e:null,f:[123,'abc',true,false,null]}");
439 		x = t.roundTrip(x);
440 		assertEquals("b", x.get("a"));
441 		assertEquals(123, x.get("c"));
442 		assertEquals(false, x.get("d"));
443 		assertNull(x.get("e"));
444 		var x2 = (List)x.get("f");
445 		assertEquals(123, x2.get(0));
446 		assertEquals("abc", x2.get(1));
447 		assertEquals(true, x2.get(2));
448 		assertEquals(false, x2.get(3));
449 		assertNull(x2.get(4));
450 	}
451 
452 	@ParameterizedTest
453 	@MethodSource("testers")
454 	void a52_jsonList(RoundTrip_Tester t) throws Exception {
455 		var x = new JsonList("['abc',123,true,false,null,{a:'b'}]");
456 		x = t.roundTrip(x);
457 		assertEquals("abc", x.get(0));
458 		assertEquals(123, x.get(1));
459 		assertEquals(true, x.get(2));
460 		assertEquals(false, x.get(3));
461 		assertNull(x.get(4));
462 		var m = (Map)x.get(5);
463 		assertEquals("b", m.get("a"));
464 	}
465 
466 	@ParameterizedTest
467 	@MethodSource("testers")
468 	void a53_treeMap(RoundTrip_Tester t) throws Exception {
469 		var x = new TreeMap<String,Object>();
470 		x.put("a", 1);
471 		x.put("b", 2);
472 		x.put("c", 3);
473 		x = t.roundTrip(x, TreeMap.class);
474 		assertEquals(1, x.get("a"));
475 		assertEquals(2, x.get("b"));
476 		assertEquals(3, x.get("c"));
477 
478 		x = new TreeMap<>();
479 		x.put("a", true);
480 		x.put("b", false);
481 		x.put("c", null);
482 		x.put("d", "foo");
483 		x.put("null", "baz");
484 		x.put("a\"a", "a\"a");
485 		x.put("b'b", "b'b");
486 		x.put("\"cc\"", "\"cc\"");
487 		x.put("'dd'", "'dd'");
488 		x = t.roundTrip(x, TreeMap.class);
489 		assertEquals(true, x.get("a"));
490 		assertEquals(false, x.get("b"));
491 		assertNull(x.get("c"));
492 		assertEquals("foo", x.get("d"));
493 		assertEquals("baz", x.get("null"));
494 		assertEquals("a\"a", x.get("a\"a"));
495 		assertEquals("b'b", x.get("b'b"));
496 		assertEquals("\"cc\"", x.get("\"cc\""));
497 		assertEquals("'dd'", x.get("'dd'"));
498 	}
499 
500 	@ParameterizedTest
501 	@MethodSource("testers")
502 	void a54_linkedHashMap(RoundTrip_Tester t) throws Exception {
503 		var x = new LinkedHashMap<String,Object>();
504 		x.put("a", true);
505 		x.put("b", false);
506 		x.put("c", null);
507 		x.put("d", "foo");
508 		x.put(null, "bar");
509 		x.put("null", "null");
510 		x.put("true", "true");
511 		x.put("false", "false");
512 		x.put("a\"a", "a\"a");
513 		x.put("b'b", "b'b");
514 		x.put("\"cc\"", "\"cc\"");
515 		x.put("'dd'", "'dd'");
516 		x.put("<ee>", "<ee>");
517 		x.put("<ff/>", "<ff/>");
518 		x.put("</gg>", "</gg>");
519 		x.put("<>", "<>");
520 		x.put("{}", "{}");
521 		x.put("[]", "[]");
522 		x.put("&", "&");
523 		x.put("?", "?");
524 		x.put("/", "/");
525 		x.put("\b", "\b");
526 		x.put("\\b", "\\b");
527 		x.put("\n", "\n");
528 		x.put("\\n", "\\n");
529 		x.put("\t", "\t");
530 		x.put("\\t", "\\t");
531 		x.put("\f", "\f");
532 		x.put("\\f", "\\f");
533 		x.put("\\", "\\");
534 		x.put("\\\\", "\\\\");
535 		x.put("\u2345", "\u2345");
536 		x.put("\\u2345", "\\u2345");
537 		x.put("\\\u2345", "\\\u2345");
538 		x.put("<>{}[]&?/\b\n\t\f\\\\\u2345", "<>{}[]&?/\b\n\t\f\\\\\u2345");
539 		x = t.roundTrip(x, LinkedHashMap.class);
540 		assertEquals(true, x.get("a"));
541 		assertEquals(false, x.get("b"));
542 		assertNull(x.get("c"));
543 		assertEquals("foo", x.get("d"));
544 		assertEquals("bar", x.get(null));
545 		assertEquals("null", x.get("null"));
546 		assertEquals("true", x.get("true"));
547 		assertEquals("false", x.get("false"));
548 		assertEquals("a\"a", x.get("a\"a"));
549 		assertEquals("b'b", x.get("b'b"));
550 		assertEquals("\"cc\"", x.get("\"cc\""));
551 		assertEquals("'dd'", x.get("'dd'"));
552 		assertEquals("<ee>", x.get("<ee>"));
553 		assertEquals("<ff/>", x.get("<ff/>"));
554 		assertEquals("</gg>", x.get("</gg>"));
555 		assertEquals("<>", x.get("<>"));
556 		assertEquals("{}", x.get("{}"));
557 		assertEquals("[]", x.get("[]"));
558 		assertEquals("&", x.get("&"));
559 		assertEquals("?", x.get("?"));
560 		assertEquals("/", x.get("/"));
561 		assertEquals("\b", x.get("\b"));
562 		assertEquals("\\b", x.get("\\b"));
563 		assertEquals("\n", x.get("\n"));
564 		assertEquals("\\n", x.get("\\n"));
565 		assertEquals("\t", x.get("\t"));
566 		assertEquals("\\t", x.get("\\t"));
567 		assertEquals("\f", x.get("\f"));
568 		assertEquals("\\f", x.get("\\f"));
569 		assertEquals("\\", x.get("\\"));
570 		assertEquals("\\\\", x.get("\\\\"));
571 		assertEquals("\u2345", x.get("\u2345"));
572 		assertEquals("\\u2345", x.get("\\u2345"));
573 		assertEquals("\\\u2345", x.get("\\\u2345"));
574 		assertEquals("<>{}[]&?/\b\n\t\f\\\\\u2345", x.get("<>{}[]&?/\b\n\t\f\\\\\u2345"));
575 	}
576 
577 	@ParameterizedTest
578 	@MethodSource("testers")
579 	void a55_vector(RoundTrip_Tester t) {
580 		var x = new Vector<Integer>();
581 		x.add(1);
582 		x.add(2);
583 		x.add(3);
584 		assertDoesNotThrow(()->t.roundTrip(x, Vector.class, Integer.class));
585 	}
586 
587 	@ParameterizedTest
588 	@MethodSource("testers")
589 	void a56_extendedUnicode(RoundTrip_Tester t) throws Exception {
590 		// Test 4-byte UTF-8 character
591 		assertEquals("𤭢𤭢", t.roundTrip("𤭢𤭢"));
592 	}
593 }