This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new 050da605e Modernize tests
050da605e is described below
commit 050da605eb6f90612669d6f9b6d48b35beed7f9d
Author: James Bognar <[email protected]>
AuthorDate: Fri Aug 22 12:01:36 2025 -0400
Modernize tests
---
.../BeanTraverseProperties_ComboRoundTripTest.java | 6 +
.../org/apache/juneau/ComboRoundTripTest_Base.java | 4 -
.../org/apache/juneau/ComboRoundTripTester.java | 6 +-
.../java/org/apache/juneau/ComboSerializeTest.java | 279 --------
.../org/apache/juneau/ComboSerializeTest_Base.java | 14 +-
.../org/apache/juneau/ComboSerializeTester.java | 12 +-
.../apache/juneau/DynaBean_ComboRoundTripTest.java | 5 +-
.../SerializerProperties_ComboRoundTripTest.java | 5 +
.../html5/Html5Template_ComboRoundTripTest.java | 6 +
.../juneau/dto/html5/Html5_ComboRoundTripTest.java | 5 +
.../ReaderObject_ComboSerializeTest.java | 303 +++++++++
.../BeanDictionary_ComboRoundTripTest.java | 4 +-
.../transforms/Builder_ComboRoundTripTest.java | 7 +
.../ByteArrayBase64Swap_ComboRoundTripTest.java | 10 +-
.../ReaderObjectSwap_ComboSerializeTest.java | 398 +++++++++++
.../SwapsAnnotation_ComboSerializeTest.java | 733 +++++++++++++++++++++
16 files changed, 1477 insertions(+), 320 deletions(-)
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/BeanTraverseProperties_ComboRoundTripTest.java
b/juneau-utest/src/test/java/org/apache/juneau/BeanTraverseProperties_ComboRoundTripTest.java
index f084a96c7..7142bd4a3 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/BeanTraverseProperties_ComboRoundTripTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/BeanTraverseProperties_ComboRoundTripTest.java
@@ -12,6 +12,8 @@
//
***************************************************************************************************************************
package org.apache.juneau;
+import java.lang.reflect.*;
+
import org.apache.juneau.BeanTraverseContext.*;
/**
@@ -19,6 +21,10 @@ import org.apache.juneau.BeanTraverseContext.*;
*/
class BeanTraverseProperties_ComboRoundTripTest extends
ComboRoundTripTest_Base {
+ private static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Type type, T bean) {
+ return ComboRoundTripTester.create(index, label, type,
()->bean);
+ }
+
private static ComboRoundTripTester<?>[] TESTERS = {
tester(1, "BEANTRAVERSE_initialDepth", A.class, new A().init())
.json("{f:1}")
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest_Base.java
b/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest_Base.java
index cfa144766..b045c54c2 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest_Base.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTest_Base.java
@@ -22,10 +22,6 @@ import org.junit.jupiter.params.provider.*;
*/
public abstract class ComboRoundTripTest_Base extends SimpleTestBase {
- protected static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Type type, T bean) {
- return ComboRoundTripTester.tester(index, label, type, bean);
- }
-
/**
* Creates a ClassMeta for the given types.
*/
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTester.java
b/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTester.java
index 343744dc0..4416be190 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTester.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ComboRoundTripTester.java
@@ -36,11 +36,7 @@ import org.apache.juneau.xml.*;
*/
public class ComboRoundTripTester<T> {
- public static <T> Builder<T> tester(int index, String label, Type type,
T in) {
- return new Builder<>("["+index+"] " + label, type, in);
- }
-
- public static <T> Builder<T> tester(int index, String label, Type type,
Supplier<T> in) {
+ public static <T> Builder<T> create(int index, String label, Type type,
Supplier<T> in) {
return new Builder<>("["+index+"] " + label, type, in);
}
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest.java
b/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest.java
deleted file mode 100644
index 06ecd513b..000000000
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest.java
+++ /dev/null
@@ -1,279 +0,0 @@
-//
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file *
-// * distributed with this work for additional information regarding copyright
ownership. The ASF licenses this file *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance *
-// * with the License. You may obtain a copy of the License at
*
-// *
*
-// * http://www.apache.org/licenses/LICENSE-2.0
*
-// *
*
-// * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the *
-// * specific language governing permissions and limitations under the
License. *
-//
***************************************************************************************************************************
-package org.apache.juneau;
-
-import static org.apache.juneau.AssertionHelpers.*;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.junit.runners.MethodSorters.*;
-
-import java.util.*;
-
-import org.apache.juneau.common.internal.*;
-import org.apache.juneau.html.*;
-import org.apache.juneau.json.*;
-import org.apache.juneau.msgpack.*;
-import org.apache.juneau.serializer.*;
-import org.apache.juneau.uon.*;
-import org.apache.juneau.urlencoding.*;
-import org.apache.juneau.xml.*;
-import org.junit.*;
-
-/**
- * Superclass for tests that verify results against all supported content
types.
- */
-@FixMethodOrder(NAME_ASCENDING)
-@SuppressWarnings("rawtypes")
-public abstract class ComboSerializeTest {
-
- private final ComboInput comboInput;
-
- private Map<Serializer,Serializer> serializerMap = new
IdentityHashMap<>();
-
- public ComboSerializeTest(ComboInput<?> comboInput) {
- this.comboInput = comboInput;
- }
-
- private Serializer getSerializer(Serializer s) {
- Serializer s2 = serializerMap.get(s);
- if (s2 == null) {
- s2 = applySettings(s);
- serializerMap.put(s, s2);
- }
- return s2;
- }
-
- private boolean isSkipped(String testName, String expected) {
- if ("SKIP".equals(expected) ||
comboInput.isTestSkipped(testName)) {
- System.err.println(getClass().getName() + ": " +
comboInput.label + "/" + testName + " skipped."); // NOT DEBUG
- return true;
- }
- return false;
- }
-
- private void testSerialize(String testName, Serializer s, String
expected) throws Exception {
- try {
- if (isSkipped(testName, expected))
- return;
-
- s = getSerializer(s);
-
- String r = s.serializeToString(comboInput.in.get());
-
- // Specifying "xxx" in the expected results will spit
out what we should populate the field with.
- if (expected.equals("xxx")) {
- System.out.println(comboInput.label + "/" +
testName + "=\n" + r.replaceAll("\n", "\\\\n").replaceAll("\t", "\\\\t")); //
NOT DEBUG
- System.out.println(r);
- if (s instanceof MsgPackSerializer) {
- System.out.println("decoded=["+new
String(StringUtils.fromHex(r))+"]");
- }
- }
-
- assertEquals(expected, r, ss("{0}/{1} parse-normal
failed: <<<MSG>>>", comboInput.label, testName));
-
- } catch (AssertionError e) {
- if (comboInput.exceptionMsg == null)
- throw e;
- assertThrowable(Exception.class,
comboInput.exceptionMsg, e);
- } catch (Exception e) {
- if (comboInput.exceptionMsg == null) {
- e.printStackTrace();
- throw new AssertionError(comboInput.label + "/"
+ testName + " failed. exception=" + e.getLocalizedMessage());
- }
- assertThrowable(Exception.class,
comboInput.exceptionMsg, e);
- }
- }
-
- protected Serializer applySettings(Serializer s) {
- return s;
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // JSON
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sJson = Json5Serializer.DEFAULT;
-
- @Test
- public void a11_serializeJson() throws Exception {
- testSerialize("serializeJson", sJson, comboInput.json);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // JSON - 't' property
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sJsonT =
Json5Serializer.create().json5().typePropertyName("t").build();
-
- @Test
- public void a21_serializeJsonT() throws Exception {
- testSerialize("serializeJsonT", sJsonT, comboInput.jsonT);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // JSON - Readable
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sJsonR = Json5Serializer.DEFAULT_READABLE;
-
- @Test
- public void a31_serializeJsonR() throws Exception {
- testSerialize("serializeJsonR", sJsonR, comboInput.jsonR);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // XML
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sXml = XmlSerializer.DEFAULT_SQ;
-
- @Test
- public void b11_serializeXml() throws Exception {
- testSerialize("serializeXml", sXml, comboInput.xml);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // XML - 't' property
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sXmlT =
XmlSerializer.create().sq().typePropertyName("t").build();
-
- @Test
- public void b21_serializeXmlT() throws Exception {
- testSerialize("serializeXmlT", sXmlT, comboInput.xmlT);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // XML - Readable
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sXmlR = XmlSerializer.DEFAULT_SQ_READABLE;
-
- @Test
- public void b31_serializeXmlR() throws Exception {
- testSerialize("serializeXmlR", sXmlR, comboInput.xmlR);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // XML - Namespaces
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sXmlNs = XmlSerializer.DEFAULT_NS_SQ;
-
- @Test
- public void b41_serializeXmlNs() throws Exception {
- testSerialize("serializeXmlNs", sXmlNs, comboInput.xmlNs);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // HTML
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sHtml = HtmlSerializer.DEFAULT_SQ;
-
- @Test
- public void c11_serializeHtml() throws Exception {
- testSerialize("serializeHtml", sHtml, comboInput.html);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // HTML - 't' property
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sHtmlT =
HtmlSerializer.create().sq().typePropertyName("t").build();
-
- @Test
- public void c21_serializeHtmlT() throws Exception {
- testSerialize("serializeHtmlT", sHtmlT, comboInput.htmlT);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // HTML - Readable
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sHtmlR = HtmlSerializer.DEFAULT_SQ_READABLE;
-
- @Test
- public void c31_serializeHtmlR() throws Exception {
- testSerialize("serializeHtmlR", sHtmlR, comboInput.htmlR);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // UON
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sUon = UonSerializer.DEFAULT;
-
- @Test
- public void d11_serializeUon() throws Exception {
- testSerialize("serializeUon", sUon, comboInput.uon);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // UON - 't' property
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sUonT =
UonSerializer.create().typePropertyName("t").build();
-
- @Test
- public void d21_serializeUonT() throws Exception {
- testSerialize("serializeUonT", sUonT, comboInput.uonT);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // UON - Readable
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sUonR = UonSerializer.DEFAULT_READABLE;
-
- @Test
- public void d31_serializeUonR() throws Exception {
- testSerialize("serializeUonR", sUonR, comboInput.uonR);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // UrlEncoding
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sUrlEncoding = UrlEncodingSerializer.DEFAULT;
-
- @Test
- public void e11_serializeUrlEncoding() throws Exception {
- testSerialize("serializeUrlEncoding", sUrlEncoding,
comboInput.urlEncoding);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // UrlEncoding - 't' property
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sUrlEncodingT =
UrlEncodingSerializer.create().typePropertyName("t").build();
-
- @Test
- public void e21_serializeUrlEncodingT() throws Exception {
- testSerialize("serializeUrlEncodingT", sUrlEncodingT,
comboInput.urlEncodingT);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // UrlEncoding - Readable
-
//-----------------------------------------------------------------------------------------------------------------
- WriterSerializer sUrlEncodingR = UrlEncodingSerializer.DEFAULT_READABLE;
-
- @Test
- public void e31_serializeUrlEncodingR() throws Exception {
- testSerialize("serializeUrlEncodingR", sUrlEncodingR,
comboInput.urlEncodingR);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // MsgPack
-
//-----------------------------------------------------------------------------------------------------------------
- OutputStreamSerializer sMsgPack = MsgPackSerializer.DEFAULT;
-
- @Test
- public void f11_serializeMsgPack() throws Exception {
- testSerialize("serializeMsgPack", sMsgPack, comboInput.msgPack);
- }
-
-
//-----------------------------------------------------------------------------------------------------------------
- // MsgPack - 't' property
-
//-----------------------------------------------------------------------------------------------------------------
- OutputStreamSerializer sMsgPackT =
MsgPackSerializer.create().typePropertyName("t").build();
-
- @Test
- public void f21_serializeMsgPackT() throws Exception {
- testSerialize("serializeMsgPackT", sMsgPackT,
comboInput.msgPackT);
- }
-}
\ No newline at end of file
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest_Base.java
b/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest_Base.java
index aec76df75..798d0af6a 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest_Base.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTest_Base.java
@@ -12,25 +12,13 @@
//
***************************************************************************************************************************
package org.apache.juneau;
-import java.lang.reflect.*;
-
import org.junit.jupiter.params.*;
import org.junit.jupiter.params.provider.*;
/**
* Superclass for tests that verify results against all supported content
types.
*/
-public abstract class ComboSerializeTest_Base {
-
- protected static <T> ComboSerializeTester.Builder<T> tester(int index,
String label, T bean) {
- return ComboSerializeTester.tester(index, label, bean);
- }
- /**
- * Creates a ClassMeta for the given types.
- */
- public static final Type getType(Type type, Type...args) {
- return BeanContext.DEFAULT_SESSION.getClassMeta(type, args);
- }
+public abstract class ComboSerializeTest_Base extends SimpleTestBase {
//-----------------------------------------------------------------------------------------------------------------
// JSON
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTester.java
b/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTester.java
index a63f4a1e8..e8c1c848f 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTester.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ComboSerializeTester.java
@@ -19,6 +19,7 @@ import static org.apache.juneau.AssertionHelpers.*;
import java.util.*;
import java.util.function.*;
+import org.apache.juneau.common.internal.*;
import org.apache.juneau.html.*;
import org.apache.juneau.json.*;
import org.apache.juneau.msgpack.*;
@@ -34,11 +35,7 @@ import org.apache.juneau.xml.*;
*/
public class ComboSerializeTester<T> {
- public static <T> Builder<T> tester(int index, String label, T in) {
- return new Builder<>("["+index+"] " + label, in);
- }
-
- public static <T> Builder<T> tester(int index, String label,
Supplier<T> in) {
+ public static <T> Builder<T> create(int index, String label,
Supplier<T> in) {
return new Builder<>("["+index+"] " + label, in);
}
@@ -116,7 +113,7 @@ public class ComboSerializeTester<T> {
exceptionMsg = b.exceptionMsg;
serializers.put("json", create(b,
Json5Serializer.DEFAULT.copy().addBeanTypes().addRootType()));
- serializers.put("jsonT", create(b,
JsonSerializer.create().json5().typePropertyName("t").addBeanTypes().addRootType()));
+ serializers.put("jsonT", create(b,
Json5Serializer.create().json5().typePropertyName("t").addBeanTypes().addRootType()));
serializers.put("jsonR", create(b,
Json5Serializer.DEFAULT_READABLE.copy().addBeanTypes().addRootType()));
serializers.put("xml", create(b,
XmlSerializer.DEFAULT_SQ.copy().addBeanTypes().addRootType()));
serializers.put("xmlT", create(b,
XmlSerializer.create().sq().typePropertyName("t").addBeanTypes().addRootType()));
@@ -163,6 +160,9 @@ public class ComboSerializeTester<T> {
if (eq(exp, "xxx")) {
System.out.println(getClass().getName() + ": "
+ label + "/" + testName + "=\n" + r.replaceAll("\n", "\\\\n").replaceAll("\t",
"\\\\t")); // NOT DEBUG
System.out.println(r);
+ if (s instanceof MsgPackSerializer) {
+ System.out.println("decoded=["+new
String(StringUtils.fromHex(r))+"]");
+ }
}
assertEquals(exp, r, ss("{0}/{1} serialize-normal
failed.", label, testName));
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/DynaBean_ComboRoundTripTest.java
b/juneau-utest/src/test/java/org/apache/juneau/DynaBean_ComboRoundTripTest.java
index 4b80bea3b..c3037c5e4 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/DynaBean_ComboRoundTripTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/DynaBean_ComboRoundTripTest.java
@@ -15,7 +15,6 @@ package org.apache.juneau;
import static org.apache.juneau.assertions.Verify.*;
import java.util.*;
-
import org.apache.juneau.annotation.*;
import org.apache.juneau.collections.*;
import org.apache.juneau.serializer.*;
@@ -32,8 +31,8 @@ class DynaBean_ComboRoundTripTest extends
ComboRoundTripTest_Base {
SINGLE_DATE.set(1901, 2, 3, 10, 11, 12);
}
- protected static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Class<T> type, T bean) {
- return ComboRoundTripTester.tester(index, label, type,
bean).serializerApply(Serializer.Builder::keepNullProperties);
+ private static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Class<T> type, T bean) {
+ return ComboRoundTripTester.create(index, label, type,
()->bean).serializerApply(Serializer.Builder::keepNullProperties);
}
private static ComboRoundTripTester<?>[] TESTERS = {
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/SerializerProperties_ComboRoundTripTest.java
b/juneau-utest/src/test/java/org/apache/juneau/SerializerProperties_ComboRoundTripTest.java
index 9a47404d9..c1658d083 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/SerializerProperties_ComboRoundTripTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/SerializerProperties_ComboRoundTripTest.java
@@ -14,6 +14,7 @@ package org.apache.juneau;
import static org.apache.juneau.internal.CollectionUtils.*;
+import java.lang.reflect.*;
import java.util.*;
import org.apache.juneau.annotation.*;
@@ -28,6 +29,10 @@ import org.apache.juneau.xml.*;
@SuppressWarnings({})
class SerializerProperties_ComboRoundTripTest extends ComboRoundTripTest_Base {
+ private static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Type type, T bean) {
+ return ComboRoundTripTester.create(index, label, type,
()->bean);
+ }
+
private static ComboRoundTripTester<?>[] TESTERS = {
tester(1, "SERIALIZER_addBeanTypes", JsonMap.class,
JsonMap.of("a", T0.create()))
.json("{a:{_type:'BwT',f:1}}")
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5Template_ComboRoundTripTest.java
b/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5Template_ComboRoundTripTest.java
index 351ae555f..098aee0d9 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5Template_ComboRoundTripTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5Template_ComboRoundTripTest.java
@@ -15,6 +15,8 @@ package org.apache.juneau.dto.html5;
import static org.apache.juneau.assertions.Verify.*;
import static org.apache.juneau.bean.html5.HtmlBuilder.*;
+import java.lang.reflect.*;
+
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.bean.html5.*;
@@ -25,6 +27,10 @@ import org.apache.juneau.bean.html5.*;
@SuppressWarnings({})
class Html5Template_ComboRoundTripTest extends ComboRoundTripTest_Base {
+ private static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Type type, T bean) {
+ return ComboRoundTripTester.create(index, label, type,
()->bean);
+ }
+
private static ComboRoundTripTester<?>[] TESTERS = {
tester(1, "FormTemplate-1", FormTemplate.class, new
FormTemplate("http://myaction", 123, true))
.json("{a:{action:'http://myaction'},c:[{_type:'input',a:{type:'text',name:'v1',value:123}},{_type:'input',a:{type:'text',name:'v2',value:true}}]}")
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5_ComboRoundTripTest.java
b/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5_ComboRoundTripTest.java
index af8eee9c8..2afd7f330 100755
---
a/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5_ComboRoundTripTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/dto/html5/Html5_ComboRoundTripTest.java
@@ -18,6 +18,7 @@ import static org.apache.juneau.bean.html5.HtmlBuilder.map;
import static org.apache.juneau.internal.CollectionUtils.*;
import static org.apache.juneau.internal.CollectionUtils.map;
+import java.lang.reflect.*;
import java.util.*;
import org.apache.juneau.*;
@@ -37,6 +38,10 @@ class Html5_ComboRoundTripTest extends
ComboRoundTripTest_Base {
return HtmlBuilder.a(ref, children);
}
+ private static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Type type, T bean) {
+ return ComboRoundTripTester.create(index, label, type,
()->bean);
+ }
+
private static ComboRoundTripTester<?>[] TESTERS = {
tester(1, "A", A.class, a2("http://foo", "bar"))
.json("{_type:'a',a:{href:'http://foo'},c:['bar']}")
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/serializer/ReaderObject_ComboSerializeTest.java
b/juneau-utest/src/test/java/org/apache/juneau/serializer/ReaderObject_ComboSerializeTest.java
new file mode 100644
index 000000000..9f947215c
--- /dev/null
+++
b/juneau-utest/src/test/java/org/apache/juneau/serializer/ReaderObject_ComboSerializeTest.java
@@ -0,0 +1,303 @@
+//
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file *
+// * distributed with this work for additional information regarding copyright
ownership. The ASF licenses this file *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance *
+// * with the License. You may obtain a copy of the License at
*
+// *
*
+// * http://www.apache.org/licenses/LICENSE-2.0
*
+// *
*
+// * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the *
+// * specific language governing permissions and limitations under the
License. *
+//
***************************************************************************************************************************
+package org.apache.juneau.serializer;
+
+import static org.apache.juneau.internal.CollectionUtils.*;
+import static org.apache.juneau.internal.CollectionUtils.list;
+import static org.apache.juneau.utest.utils.Utils2.*;
+
+import java.io.*;
+import java.util.*;
+import java.util.function.*;
+
+import org.apache.juneau.*;
+
+/**
+ * Verifies that Reader and InputStream objects are serialized correctly.
+ * Note that these are one-way serializations and you're not guaranteed to
produce parsable output.
+ */
+public class ReaderObject_ComboSerializeTest extends ComboSerializeTest_Base {
+
+ private static <T> ComboSerializeTester.Builder<T> tester(int index,
String label, Supplier<T> bean) {
+ return ComboSerializeTester.create(index, label,
bean).serializerApply(Serializer.Builder::keepNullProperties);
+ }
+
+ private static ComboSerializeTester<?>[] TESTERS = {
+ tester(1, "SimpleReader", ()->reader("foobar"))
+ .json("foobar")
+ .jsonT("foobar")
+ .jsonR("foobar")
+ .xml("foobar")
+ .xmlT("foobar")
+ .xmlR("foobar\n")
+ .xmlNs("foobar")
+ .html("foobar")
+ .htmlT("foobar")
+ .htmlR("foobar")
+ .uon("foobar")
+ .uonT("foobar")
+ .uonR("foobar")
+ .urlEnc("foobar")
+ .urlEncT("foobar")
+ .urlEncR("foobar")
+ .msgPack("666F6F626172")
+ .msgPackT("666F6F626172")
+ .build(),
+ tester(2, "SimpleInputStream", ()->inputStream("foobar"))
+ .json("foobar")
+ .jsonT("foobar")
+ .jsonR("foobar")
+ .xml("foobar")
+ .xmlT("foobar")
+ .xmlR("foobar\n")
+ .xmlNs("foobar")
+ .html("foobar")
+ .htmlT("foobar")
+ .htmlR("foobar")
+ .uon("foobar")
+ .uonT("foobar")
+ .uonR("foobar")
+ .urlEnc("foobar")
+ .urlEncT("foobar")
+ .urlEncR("foobar")
+ .msgPack("666F6F626172")
+ .msgPackT("666F6F626172")
+ .build(),
+ tester(3, "BeanWithReaderField", ()->new
BeanWithReaderField().init())
+ .json("{f:fv}")
+ .jsonT("{f:fv}")
+ .jsonR("{\n\tf: fv\n}")
+ .xml("<object><f>fv</f></object>")
+ .xmlT("<object><f>fv</f></object>")
+ .xmlR("<object>\n\t<f>fv</f>\n</object>\n")
+ .xmlNs("<object><f>fv</f></object>")
+ .html("<table><tr><td>f</td><td>fv</td></tr></table>")
+ .htmlT("<table><tr><td>f</td><td>fv</td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>fv</td>\n\t</tr>\n</table>\n")
+ .uon("(f=fv)")
+ .uonT("(f=fv)")
+ .uonR("(\n\tf=fv\n)")
+ .urlEnc("f=fv")
+ .urlEncT("f=fv")
+ .urlEncR("f=fv")
+ .msgPack("81A1666676")
+ .msgPackT("81A1666676")
+ .build(),
+ tester(4, "BeanWithReader1dField", ()->new
BeanWithReader1dField().init())
+ .json("{f:[fv1,fv2,null]}")
+ .jsonT("{f:[fv1,fv2,null]}")
+ .jsonR("{\n\tf:
[\n\t\tfv1,\n\t\tfv2,\n\t\tnull\n\t]\n}")
+ .xml("<object><f>fv1fv2<null/></f></object>")
+ .xmlT("<object><f>fv1fv2<null/></f></object>")
+
.xmlR("<object>\n\t<f>\n\t\tfv1\n\t\tfv2\n\t\t<null/>\n\t</f>\n</object>\n")
+ .xmlNs("<object><f>fv1fv2<null/></f></object>")
+
.html("<table><tr><td>f</td><td><ul><li>fv1</li><li>fv2</li><li><null/></li></ul></td></tr></table>")
+
.htmlT("<table><tr><td>f</td><td><ul><li>fv1</li><li>fv2</li><li><null/></li></ul></td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>fv1</li>\n\t\t\t\t<li>fv2</li>\n\t\t\t\t<li><null/></li>\n\t\t\t</ul>\n\t\t</td>\n\t</tr>\n</table>\n")
+ .uon("(f=@(fv1,fv2,null))")
+ .uonT("(f=@(fv1,fv2,null))")
+ .uonR("(\n\tf=@(\n\t\tfv1,\n\t\tfv2,\n\t\tnull\n\t)\n)")
+ .urlEnc("f=@(fv1,fv2,null)")
+ .urlEncT("f=@(fv1,fv2,null)")
+ .urlEncR("f=@(\n\tfv1,\n\tfv2,\n\tnull\n)")
+ .msgPack("81A16693667631667632C0")
+ .msgPackT("81A16693667631667632C0")
+ .build(),
+ tester(5, "BeanWithReaderNullField", ()->new
BeanWithReaderNullField().init())
+ .json("{f:null}")
+ .jsonT("{f:null}")
+ .jsonR("{\n\tf: null\n}")
+ .xml("<object><f _type='null'/></object>")
+ .xmlT("<object><f t='null'/></object>")
+ .xmlR("<object>\n\t<f _type='null'/>\n</object>\n")
+ .xmlNs("<object><f _type='null'/></object>")
+
.html("<table><tr><td>f</td><td><null/></td></tr></table>")
+
.htmlT("<table><tr><td>f</td><td><null/></td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td><null/></td>\n\t</tr>\n</table>\n")
+ .uon("(f=null)")
+ .uonT("(f=null)")
+ .uonR("(\n\tf=null\n)")
+ .urlEnc("f=null")
+ .urlEncT("f=null")
+ .urlEncR("f=null")
+ .msgPack("81A166C0")
+ .msgPackT("81A166C0")
+ .build(),
+ tester(6, "BeanWithReaderListField", ()->new
BeanWithReaderListField().init())
+ .json("{f:[fv1,fv2,null]}")
+ .jsonT("{f:[fv1,fv2,null]}")
+ .jsonR("{\n\tf:
[\n\t\tfv1,\n\t\tfv2,\n\t\tnull\n\t]\n}")
+ .xml("<object><f>fv1fv2<null/></f></object>")
+ .xmlT("<object><f>fv1fv2<null/></f></object>")
+
.xmlR("<object>\n\t<f>\n\t\tfv1\n\t\tfv2\n\t\t<null/>\n\t</f>\n</object>\n")
+ .xmlNs("<object><f>fv1fv2<null/></f></object>")
+
.html("<table><tr><td>f</td><td><ul><li>fv1</li><li>fv2</li><li><null/></li></ul></td></tr></table>")
+
.htmlT("<table><tr><td>f</td><td><ul><li>fv1</li><li>fv2</li><li><null/></li></ul></td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>fv1</li>\n\t\t\t\t<li>fv2</li>\n\t\t\t\t<li><null/></li>\n\t\t\t</ul>\n\t\t</td>\n\t</tr>\n</table>\n")
+ .uon("(f=@(fv1,fv2,null))")
+ .uonT("(f=@(fv1,fv2,null))")
+ .uonR("(\n\tf=@(\n\t\tfv1,\n\t\tfv2,\n\t\tnull\n\t)\n)")
+ .urlEnc("f=@(fv1,fv2,null)")
+ .urlEncT("f=@(fv1,fv2,null)")
+ .urlEncR("f=@(\n\tfv1,\n\tfv2,\n\tnull\n)")
+ .msgPack("81A16693667631667632C0")
+ .msgPackT("81A16693667631667632C0")
+ .build(),
+ tester(7, "BeanWithReaderMapField", ()->new
BeanWithReaderMapField().init())
+ .json("{f:{foo:fv1,bar:null,null:fv2}}")
+ .jsonT("{f:{foo:fv1,bar:null,null:fv2}}")
+ .jsonR("{\n\tf: {\n\t\tfoo: fv1,\n\t\tbar:
null,\n\t\tnull: fv2\n\t}\n}")
+ .xml("<object><f><foo>fv1</foo><bar
_type='null'/><_x0000_>fv2</_x0000_></f></object>")
+ .xmlT("<object><f><foo>fv1</foo><bar
t='null'/><_x0000_>fv2</_x0000_></f></object>")
+ .xmlR("<object>\n\t<f>\n\t\t<foo>fv1</foo>\n\t\t<bar
_type='null'/>\n\t\t<_x0000_>fv2</_x0000_>\n\t</f>\n</object>\n")
+ .xmlNs("<object><f><foo>fv1</foo><bar
_type='null'/><_x0000_>fv2</_x0000_></f></object>")
+
.html("<table><tr><td>f</td><td><table><tr><td>foo</td><td>fv1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>fv2</td></tr></table></td></tr></table>")
+
.htmlT("<table><tr><td>f</td><td><table><tr><td>foo</td><td>fv1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>fv2</td></tr></table></td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>foo</td>\n\t\t\t\t\t<td>fv1</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>bar</td>\n\t\t\t\t\t<td><null/></td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td><null/></td>\n\t\t\t\t\t<td>fv2</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>\n")
+ .uon("(f=(foo=fv1,bar=null,null=fv2))")
+ .uonT("(f=(foo=fv1,bar=null,null=fv2))")
+
.uonR("(\n\tf=(\n\t\tfoo=fv1,\n\t\tbar=null,\n\t\tnull=fv2\n\t)\n)")
+ .urlEnc("f=(foo=fv1,bar=null,null=fv2)")
+ .urlEncT("f=(foo=fv1,bar=null,null=fv2)")
+ .urlEncR("f=(\n\tfoo=fv1,\n\tbar=null,\n\tnull=fv2\n)")
+ .msgPack("81A16683A3666F6F667631A3626172C0C0667632")
+ .msgPackT("81A16683A3666F6F667631A3626172C0C0667632")
+ .build(),
+ tester(8, "BeanWithReaderBeanListField", ()->new
BeanWithReaderBeanListField().init())
+
.json("{f:[{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}},null]}")
+
.jsonT("{f:[{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}},null]}")
+ .jsonR("{\n\tf: [\n\t\t{\n\t\t\tf1: f1v,\n\t\t\tf2:
[\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf3:
null,\n\t\t\tf4:
[\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf5:
{\n\t\t\t\tfoo: f5v1,\n\t\t\t\tbar: null,\n\t\t\t\tnull:
f5v2\n\t\t\t}\n\t\t},\n\t\tnull\n\t]\n}")
+
.xml("<object><f><object><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar
_type='null'/><_x0000_>f5v2</_x0000_></f5></object><null/></f></object>")
+
.xmlT("<object><f><object><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3
t='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar
t='null'/><_x0000_>f5v2</_x0000_></f5></object><null/></f></object>")
+
.xmlR("<object>\n\t<f>\n\t\t<object>\n\t\t\t<f1>f1v</f1>\n\t\t\t<f2>\n\t\t\t\tf2v1\n\t\t\t\tf2v2\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f3
_type='null'/>\n\t\t\t<f4>\n\t\t\t\tf4v1\n\t\t\t\tf4v2\n\t\t\t\t<null/>\n\t\t\t</f4>\n\t\t\t<f5>\n\t\t\t\t<foo>f5v1</foo>\n\t\t\t\t<bar
_type='null'/>\n\t\t\t\t<_x0000_>f5v2</_x0000_>\n\t\t\t</f5>\n\t\t</object>\n\t\t<null/>\n\t</f>\n</object>\n")
+
.xmlNs("<object><f><object><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar
_type='null'/><_x0000_>f5v2</_x0000_></f5></object><null/></f></object>")
+
.html("<table><tr><td>f</td><td><ul><li><table><tr><td>f1</td><td>f1v</td></tr><tr><td>f2</td><td><ul><li>f2v1</li><li>f2v2</li><li><null/></li></ul></td></tr><tr><td>f3</td><td><null/></td></tr><tr><td>f4</td><td><ul><li>f4v1</li><li>f4v2</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>f5v1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>f5v2</td></tr></table></td></tr></table></li><li><null/></li></ul></td></tr></table>")
+
.htmlT("<table><tr><td>f</td><td><ul><li><table><tr><td>f1</td><td>f1v</td></tr><tr><td>f2</td><td><ul><li>f2v1</li><li>f2v2</li><li><null/></li></ul></td></tr><tr><td>f3</td><td><null/></td></tr><tr><td>f4</td><td><ul><li>f4v1</li><li>f4v2</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>f5v1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>f5v2</td></tr></table></td></tr></table></li><li><null/></li></ul></td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<table>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>f1</td>\n\t\t\t\t\t\t\t<td>f1v</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>f2</td>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t<li>f2v1</li>\n\t\t\t\t\t\t\t\t\t<li>f2v2</li>\n\t\t\t\t\t\t\t\t\t<li><null/></li>\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td>f3</td>\n\t\t
[...]
+
.uon("(f=@((f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),null))")
+
.uonT("(f=@((f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),null))")
+
.uonR("(\n\tf=@(\n\t\t(\n\t\t\tf1=f1v,\n\t\t\tf2=@(\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf3=null,\n\t\t\tf4=@(\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n\t\t\t\tfoo=f5v1,\n\t\t\t\tbar=null,\n\t\t\t\tnull=f5v2\n\t\t\t)\n\t\t),\n\t\tnull\n\t)\n)")
+
.urlEnc("f=@((f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),null)")
+
.urlEncT("f=@((f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),null)")
+
.urlEncR("f=@(\n\t(\n\t\tf1=f1v,\n\t\tf2=@(\n\t\t\tf2v1,\n\t\t\tf2v2,\n\t\t\tnull\n\t\t),\n\t\tf3=null,\n\t\tf4=@(\n\t\t\tf4v1,\n\t\t\tf4v2,\n\t\t\tnull\n\t\t),\n\t\tf5=(\n\t\t\tfoo=f5v1,\n\t\t\tbar=null,\n\t\t\tnull=f5v2\n\t\t)\n\t),\n\tnull\n)")
+
.msgPack("81A1669285A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632C0")
+
.msgPackT("81A1669285A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632C0")
+
.rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li
rdf:parseType='Resource'>\n<jp:f1>f1v</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>f2v1</rdf:li>\n<rdf:li>f2v2</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f3
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>f4v1</rdf:li>\n<rdf:li>f4v2</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rd [...]
+
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li
rdf:parseType='Resource'>\n<jp:f1>f1v</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>f2v1</rdf:li>\n<rdf:li>f2v2</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f3
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>f4v1</rdf:li>\n<rdf:li>f4v2</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</r [...]
+
.msgPack("81A1669285A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632C0")
+
.msgPackT("81A1669285A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632C0")
+ .build(),
+ tester(9, "BeanWithReaderBeanMapField", ()->new
BeanWithReaderBeanMapField().init())
+
.json("{f:{foo:{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}},bar:null,null:{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}}}}")
+
.jsonT("{f:{foo:{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}},bar:null,null:{f1:f1v,f2:[f2v1,f2v2,null],f3:null,f4:[f4v1,f4v2,null],f5:{foo:f5v1,bar:null,null:f5v2}}}}")
+ .jsonR("{\n\tf: {\n\t\tfoo: {\n\t\t\tf1:
f1v,\n\t\t\tf2:
[\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf3:
null,\n\t\t\tf4:
[\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf5:
{\n\t\t\t\tfoo: f5v1,\n\t\t\t\tbar: null,\n\t\t\t\tnull:
f5v2\n\t\t\t}\n\t\t},\n\t\tbar: null,\n\t\tnull: {\n\t\t\tf1: f1v,\n\t\t\tf2:
[\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf3:
null,\n\t\t\tf4: [\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t],\n\t\t\
[...]
+
.xml("<object><f><foo><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar
_type='null'/><_x0000_>f5v2</_x0000_></f5></foo><bar
_type='null'/><_x0000_><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar
_type='null'/><_x0000_>f5v2</_x0000_></f5></_x0000_></f></object>")
+
.xmlT("<object><f><foo><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3
t='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar
t='null'/><_x0000_>f5v2</_x0000_></f5></foo><bar
t='null'/><_x0000_><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3
t='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar
t='null'/><_x0000_>f5v2</_x0000_></f5></_x0000_></f></object>")
+
.xmlR("<object>\n\t<f>\n\t\t<foo>\n\t\t\t<f1>f1v</f1>\n\t\t\t<f2>\n\t\t\t\tf2v1\n\t\t\t\tf2v2\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f3
_type='null'/>\n\t\t\t<f4>\n\t\t\t\tf4v1\n\t\t\t\tf4v2\n\t\t\t\t<null/>\n\t\t\t</f4>\n\t\t\t<f5>\n\t\t\t\t<foo>f5v1</foo>\n\t\t\t\t<bar
_type='null'/>\n\t\t\t\t<_x0000_>f5v2</_x0000_>\n\t\t\t</f5>\n\t\t</foo>\n\t\t<bar
_type='null'/>\n\t\t<_x0000_>\n\t\t\t<f1>f1v</f1>\n\t\t\t<f2>\n\t\t\t\tf2v1\n\t\t\t\tf2v2\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f3
_typ [...]
+
.xmlNs("<object><f><foo><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar
_type='null'/><_x0000_>f5v2</_x0000_></f5></foo><bar
_type='null'/><_x0000_><f1>f1v</f1><f2>f2v1f2v2<null/></f2><f3
_type='null'/><f4>f4v1f4v2<null/></f4><f5><foo>f5v1</foo><bar
_type='null'/><_x0000_>f5v2</_x0000_></f5></_x0000_></f></object>")
+
.html("<table><tr><td>f</td><td><table><tr><td>foo</td><td><table><tr><td>f1</td><td>f1v</td></tr><tr><td>f2</td><td><ul><li>f2v1</li><li>f2v2</li><li><null/></li></ul></td></tr><tr><td>f3</td><td><null/></td></tr><tr><td>f4</td><td><ul><li>f4v1</li><li>f4v2</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>f5v1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>f5v2</td></tr></table></td></tr></table></td></tr><tr><td>bar</td><td><nul
[...]
+
.htmlT("<table><tr><td>f</td><td><table><tr><td>foo</td><td><table><tr><td>f1</td><td>f1v</td></tr><tr><td>f2</td><td><ul><li>f2v1</li><li>f2v2</li><li><null/></li></ul></td></tr><tr><td>f3</td><td><null/></td></tr><tr><td>f4</td><td><ul><li>f4v1</li><li>f4v2</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>f5v1</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>f5v2</td></tr></table></td></tr></table></td></tr><tr><td>bar</td><td><nu
[...]
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>foo</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<table>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>f1</td>\n\t\t\t\t\t\t\t\t<td>f1v</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>f2</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t<li>f2v1</li>\n\t\t\t\t\t\t\t\t\t\t<li>f2v2</li>\n\t\t\t\t\t\t\t\t\t\t<li><null/></li>\n\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t</td
[...]
+
.uon("(f=(foo=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),bar=null,null=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2))))")
+
.uonT("(f=(foo=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),bar=null,null=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2))))")
+
.uonR("(\n\tf=(\n\t\tfoo=(\n\t\t\tf1=f1v,\n\t\t\tf2=@(\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf3=null,\n\t\t\tf4=@(\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n\t\t\t\tfoo=f5v1,\n\t\t\t\tbar=null,\n\t\t\t\tnull=f5v2\n\t\t\t)\n\t\t),\n\t\tbar=null,\n\t\tnull=(\n\t\t\tf1=f1v,\n\t\t\tf2=@(\n\t\t\t\tf2v1,\n\t\t\t\tf2v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf3=null,\n\t\t\tf4=@(\n\t\t\t\tf4v1,\n\t\t\t\tf4v2,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n\t\t\t
[...]
+
.urlEnc("f=(foo=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),bar=null,null=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)))")
+
.urlEncT("f=(foo=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)),bar=null,null=(f1=f1v,f2=@(f2v1,f2v2,null),f3=null,f4=@(f4v1,f4v2,null),f5=(foo=f5v1,bar=null,null=f5v2)))")
+
.urlEncR("f=(\n\tfoo=(\n\t\tf1=f1v,\n\t\tf2=@(\n\t\t\tf2v1,\n\t\t\tf2v2,\n\t\t\tnull\n\t\t),\n\t\tf3=null,\n\t\tf4=@(\n\t\t\tf4v1,\n\t\t\tf4v2,\n\t\t\tnull\n\t\t),\n\t\tf5=(\n\t\t\tfoo=f5v1,\n\t\t\tbar=null,\n\t\t\tnull=f5v2\n\t\t)\n\t),\n\tbar=null,\n\tnull=(\n\t\tf1=f1v,\n\t\tf2=@(\n\t\t\tf2v1,\n\t\t\tf2v2,\n\t\t\tnull\n\t\t),\n\t\tf3=null,\n\t\tf4=@(\n\t\t\tf4v1,\n\t\t\tf4v2,\n\t\t\tnull\n\t\t),\n\t\tf5=(\n\t\t\tfoo=f5v1,\n\t\t\tbar=null,\n\t\t\tnull=f5v2\n\t\t)\n\t)\n)")
+
.msgPack("81A16683A3666F6F85A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632A3626172C0C085A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632")
+
.msgPackT("81A16683A3666F6F85A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632A3626172C0C085A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632")
+ .rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f
rdf:parseType='Resource'>\n<jp:foo
rdf:parseType='Resource'>\n<jp:f1>f1v</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>f2v1</rdf:li>\n<rdf:li>f2v2</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f3
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>f4v1</rdf:li>\n<rdf:li>f4v2</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-n [...]
+ .rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f
rdf:parseType='Resource'>\n<jp:foo
rdf:parseType='Resource'>\n<jp:f1>f1v</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>f2v1</rdf:li>\n<rdf:li>f2v2</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f3
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>f4v1</rdf:li>\n<rdf:li>f4v2</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax- [...]
+
.msgPack("81A16683A3666F6F85A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632A3626172C0C085A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632")
+
.msgPackT("81A16683A3666F6F85A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632A3626172C0C085A26631663176A26632936632763166327632C0A26633C0A26634936634763166347632C0A2663583A3666F6F66357631A3626172C0C066357632")
+ .build()
+ };
+
+ static ComboSerializeTester<?>[] testers() {
+ return TESTERS;
+ }
+
+ public static class BeanWithReaderField {
+ public Reader f;
+ public BeanWithReaderField init() {
+ f = reader("fv");
+ return this;
+ }
+ }
+
+ public static class BeanWithReader1dField {
+ public Reader[] f;
+ public BeanWithReader1dField init() {
+ f = new Reader[]{reader("fv1"),reader("fv2"),null};
+ return this;
+ }
+ }
+
+ public static class BeanWithReaderNullField {
+ public Reader f;
+ public BeanWithReaderNullField init() {
+ f = null;
+ return this;
+ }
+ }
+
+ public static class BeanWithReaderListField {
+ public List<Reader> f;
+ public BeanWithReaderListField init() {
+ f = list(reader("fv1"),reader("fv2"),null);
+ return this;
+ }
+ }
+
+ public static class BeanWithReaderMapField {
+ public Map<String,Reader> f;
+ public BeanWithReaderMapField init() {
+ f =
map("foo",reader("fv1"),"bar",null,null,reader("fv2"));
+ return this;
+ }
+ }
+
+ public static class BeanWithReaderBeanListField {
+ public List<B> f;
+ public BeanWithReaderBeanListField init() {
+ f = list(new B().init(),null);
+ return this;
+ }
+ }
+
+ public static class BeanWithReaderBeanMapField {
+ public Map<String,B> f;
+ public BeanWithReaderBeanMapField init() {
+ f = map("foo",new B().init(),"bar",null,null,new
B().init());
+ return this;
+ }
+ }
+
+ public static class B {
+ public Reader f1;
+ public Reader[] f2;
+ public Reader f3;
+ public List<Reader> f4;
+ public Map<String,Reader> f5;
+
+ public B init() {
+ f1 = reader("f1v");
+ f2 = new Reader[]{reader("f2v1"),reader("f2v2"),null};
+ f3 = null;
+ f4 = list(reader("f4v1"),reader("f4v2"),null)
+ ;
+ f5 =
map("foo",reader("f5v1"),"bar",null,null,reader("f5v2"));
+ return this;
+ }
+ }
+}
\ No newline at end of file
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/transforms/BeanDictionary_ComboRoundTripTest.java
b/juneau-utest/src/test/java/org/apache/juneau/transforms/BeanDictionary_ComboRoundTripTest.java
index f94dce5ab..cd7070ccb 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/transforms/BeanDictionary_ComboRoundTripTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/transforms/BeanDictionary_ComboRoundTripTest.java
@@ -27,8 +27,8 @@ import org.apache.juneau.serializer.*;
*/
class BeanDictionary_ComboRoundTripTest extends ComboRoundTripTest_Base {
- public static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Type type, T bean) {
- return ComboRoundTripTester.tester(index, label, type,
bean).serializerApply(Serializer.Builder::keepNullProperties);
+ private static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Type type, T bean) {
+ return ComboRoundTripTester.create(index, label, type,
()->bean).serializerApply(Serializer.Builder::keepNullProperties);
}
private static ComboRoundTripTester<?>[] TESTERS = {
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/transforms/Builder_ComboRoundTripTest.java
b/juneau-utest/src/test/java/org/apache/juneau/transforms/Builder_ComboRoundTripTest.java
index 14d5e2316..ee9b5f62a 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/transforms/Builder_ComboRoundTripTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/transforms/Builder_ComboRoundTripTest.java
@@ -14,10 +14,17 @@ package org.apache.juneau.transforms;
import static org.apache.juneau.assertions.Verify.*;
+import java.lang.reflect.*;
+
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
+
class Builder_ComboRoundTripTest extends ComboRoundTripTest_Base {
+ private static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Type type, T bean) {
+ return ComboRoundTripTester.create(index, label, type,
()->bean);
+ }
+
private static ComboRoundTripTester<?>[] TESTERS = {
tester(1, "A", A.class, new A(null).init())
.json("{a:1}")
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64Swap_ComboRoundTripTest.java
b/juneau-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64Swap_ComboRoundTripTest.java
index a5e040b04..d1754db55 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64Swap_ComboRoundTripTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/transforms/ByteArrayBase64Swap_ComboRoundTripTest.java
@@ -23,14 +23,8 @@ import org.apache.juneau.swaps.*;
class ByteArrayBase64Swap_ComboRoundTripTest extends ComboRoundTripTest_Base {
- protected static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Class<T> type, T bean) {
- return ComboRoundTripTester.tester(index, label, type, bean)
- .serializerApply(s ->
s.swaps(ByteArraySwap.Base64.class).keepNullProperties())
- .parserApply(p -> p.swaps(ByteArraySwap.Base64.class));
- }
-
- protected static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Type type, T bean) {
- return ComboRoundTripTester.tester(index, label, type, bean)
+ private static <T> ComboRoundTripTester.Builder<T> tester(int index,
String label, Type type, T bean) {
+ return ComboRoundTripTester.create(index, label, type, ()->bean)
.serializerApply(s ->
s.swaps(ByteArraySwap.Base64.class).keepNullProperties())
.parserApply(p -> p.swaps(ByteArraySwap.Base64.class));
}
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/transforms/ReaderObjectSwap_ComboSerializeTest.java
b/juneau-utest/src/test/java/org/apache/juneau/transforms/ReaderObjectSwap_ComboSerializeTest.java
new file mode 100644
index 000000000..d7e38f499
--- /dev/null
+++
b/juneau-utest/src/test/java/org/apache/juneau/transforms/ReaderObjectSwap_ComboSerializeTest.java
@@ -0,0 +1,398 @@
+//
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file *
+// * distributed with this work for additional information regarding copyright
ownership. The ASF licenses this file *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance *
+// * with the License. You may obtain a copy of the License at
*
+// *
*
+// * http://www.apache.org/licenses/LICENSE-2.0
*
+// *
*
+// * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the *
+// * specific language governing permissions and limitations under the
License. *
+//
***************************************************************************************************************************
+package org.apache.juneau.transforms;
+
+import static org.apache.juneau.internal.CollectionUtils.*;
+import static org.apache.juneau.internal.CollectionUtils.list;
+import static org.apache.juneau.utest.utils.Utils2.*;
+
+import java.io.*;
+import java.util.*;
+import java.util.function.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.swap.*;
+
+/**
+ * Verifies that Reader and InputStream objects are serialized correctly.
+ * Note that these are one-way serializations and you're not guaranteed to
produce parsable output.
+ */
+@SuppressWarnings({})
+public class ReaderObjectSwap_ComboSerializeTest extends
ComboSerializeTest_Base {
+
+ private static <T> ComboSerializeTester.Builder<T> tester(int index,
String label, Supplier<T> bean) {
+ return ComboSerializeTester.create(index, label, bean);
+ }
+
+ private static ComboSerializeTester<?>[] TESTERS = {
+ tester(1, "PojoToSimpleReader", PojoToSimpleReader::new)
+ .json("foo")
+ .jsonT("foo")
+ .jsonR("foo")
+ .xml("foo")
+ .xmlT("foo")
+ .xmlR("foo\n")
+ .xmlNs("foo")
+ .html("foo")
+ .htmlT("foo")
+ .htmlR("foo")
+ .uon("foo")
+ .uonT("foo")
+ .uonR("foo")
+ .urlEnc("foo")
+ .urlEncT("foo")
+ .urlEncR("foo")
+ .msgPack("666F6F")
+ .msgPackT("666F6F")
+ .build(),
+ tester(2, "PojoToDynamicReader", ()->new
PojoToDynamicReader("foo"))
+ .json("foo-json5")
+ .jsonT("foo-json5")
+ .jsonR("foo-json5")
+ .xml("foo-xml")
+ .xmlT("foo-xml")
+ .xmlR("foo-xml\n")
+ .xmlNs("foo-xml")
+ .html("foo-html")
+ .htmlT("foo-html")
+ .htmlR("foo-html")
+ .uon("foo-uon")
+ .uonT("foo-uon")
+ .uonR("foo-uon")
+ .urlEnc("foo-x-www-form-urlencoded")
+ .urlEncT("foo-x-www-form-urlencoded")
+ .urlEncR("foo-x-www-form-urlencoded")
+ .msgPack("666F6F2D6D73677061636B")
+ .msgPackT("666F6F2D6D73677061636B")
+ .build(),
+ tester(3, "SometimesSwappedBean1", ()->new
SometimesSwappedBean1("foo"))
+ .json("foo-application/json5")
+ .jsonT("foo-application/json5")
+ .jsonR("foo-application/json5")
+ .xml("foo-text/xml")
+ .xmlT("foo-text/xml")
+ .xmlR("foo-text/xml\n")
+ .xmlNs("foo-text/xml")
+ .html("<table><tr><td>f</td><td>foo</td></tr></table>")
+ .htmlT("<table><tr><td>f</td><td>foo</td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>foo</td>\n\t</tr>\n</table>\n")
+ .uon("(f=foo)")
+ .uonT("(f=foo)")
+ .uonR("(\n\tf=foo\n)")
+ .urlEnc("f=foo")
+ .urlEncT("f=foo")
+ .urlEncR("f=foo")
+ .msgPack("81A166A3666F6F")
+ .msgPackT("81A166A3666F6F")
+ .build(),
+ tester(4, "SometimesSwappedBean2", ()->new
SometimesSwappedBean2("foo"))
+ .json("{f:'foo'}")
+ .jsonT("{f:'foo'}")
+ .jsonR("{\n\tf: 'foo'\n}")
+ .xml("<object><f>foo</f></object>")
+ .xmlT("<object><f>foo</f></object>")
+ .xmlR("<object>\n\t<f>foo</f>\n</object>\n")
+ .xmlNs("<object><f>foo</f></object>")
+ .html("foo-text/html")
+ .htmlT("foo-text/html")
+ .htmlR("foo-text/html")
+ .uon("foo-text/uon")
+ .uonT("foo-text/uon")
+ .uonR("foo-text/uon")
+ .urlEnc("foo-application/x-www-form-urlencoded")
+ .urlEncT("foo-application/x-www-form-urlencoded")
+ .urlEncR("foo-application/x-www-form-urlencoded")
+ .msgPack("666F6F2D6F6374616C2F6D73677061636B")
+ .msgPackT("666F6F2D6F6374616C2F6D73677061636B")
+ .build(),
+ tester(5, "BeanWithSwappedField", ()->new
BeanWithSwappedField("x"))
+ .json("{f:x-json5}")
+ .jsonT("{f:x-json5}")
+ .jsonR("{\n\tf: x-json5\n}")
+ .xml("<object><f>x-xml</f></object>")
+ .xmlT("<object><f>x-xml</f></object>")
+ .xmlR("<object>\n\t<f>x-xml</f>\n</object>\n")
+ .xmlNs("<object><f>x-xml</f></object>")
+
.html("<table><tr><td>f</td><td>x-html</td></tr></table>")
+
.htmlT("<table><tr><td>f</td><td>x-html</td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>x-html</td>\n\t</tr>\n</table>\n")
+ .uon("(f=x-uon)")
+ .uonT("(f=x-uon)")
+ .uonR("(\n\tf=x-uon\n)")
+ .urlEnc("f=x-x-www-form-urlencoded")
+ .urlEncT("f=x-x-www-form-urlencoded")
+ .urlEncR("f=x-x-www-form-urlencoded")
+ .msgPack("81A166782D6D73677061636B")
+ .msgPackT("81A166782D6D73677061636B")
+ .build(),
+ tester(6, "BeanWithSwapped1dField", ()->new
BeanWithSwapped1dField("x"))
+ .json("{f:[x1-json5,x2-json5,null]}")
+ .jsonT("{f:[x1-json5,x2-json5,null]}")
+ .jsonR("{\n\tf:
[\n\t\tx1-json5,\n\t\tx2-json5,\n\t\tnull\n\t]\n}")
+ .xml("<object><f>x1-xmlx2-xml<null/></f></object>")
+ .xmlT("<object><f>x1-xmlx2-xml<null/></f></object>")
+
.xmlR("<object>\n\t<f>\n\t\tx1-xml\n\t\tx2-xml\n\t\t<null/>\n\t</f>\n</object>\n")
+ .xmlNs("<object><f>x1-xmlx2-xml<null/></f></object>")
+
.html("<table><tr><td>f</td><td><ul><li>x1-html</li><li>x2-html</li><li><null/></li></ul></td></tr></table>")
+
.htmlT("<table><tr><td>f</td><td><ul><li>x1-html</li><li>x2-html</li><li><null/></li></ul></td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>x1-html</li>\n\t\t\t\t<li>x2-html</li>\n\t\t\t\t<li><null/></li>\n\t\t\t</ul>\n\t\t</td>\n\t</tr>\n</table>\n")
+ .uon("(f=@(x1-uon,x2-uon,null))")
+ .uonT("(f=@(x1-uon,x2-uon,null))")
+
.uonR("(\n\tf=@(\n\t\tx1-uon,\n\t\tx2-uon,\n\t\tnull\n\t)\n)")
+
.urlEnc("f=@(x1-x-www-form-urlencoded,x2-x-www-form-urlencoded,null)")
+
.urlEncT("f=@(x1-x-www-form-urlencoded,x2-x-www-form-urlencoded,null)")
+
.urlEncR("f=@(\n\tx1-x-www-form-urlencoded,\n\tx2-x-www-form-urlencoded,\n\tnull\n)")
+
.msgPack("81A1669378312D6D73677061636B78322D6D73677061636BC0")
+
.msgPackT("81A1669378312D6D73677061636B78322D6D73677061636BC0")
+
.rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li>x1-xml</rdf:li>\n<rdf:li>x2-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li>x1-xml</rdf:li>\n<rdf:li>x2-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+ .build(),
+ tester(7, "BeanWithSwappedNullField",
BeanWithSwappedNullField::new)
+ .json("{}")
+ .jsonT("{}")
+ .jsonR("{\n}")
+ .xml("<object/>")
+ .xmlT("<object/>")
+ .xmlR("<object/>\n")
+ .xmlNs("<object/>")
+ .html("<table></table>")
+ .htmlT("<table></table>")
+ .htmlR("<table>\n</table>\n")
+ .uon("()")
+ .uonT("()")
+ .uonR("(\n)")
+ .urlEnc("")
+ .urlEncT("")
+ .urlEncR("")
+ .msgPack("80")
+ .msgPackT("80")
+ .build(),
+ tester(8, "BeanWithSwappedListField", ()->new
BeanWithSwappedListField("x"))
+ .json("{f:[x1-json5,x2-json5,null]}")
+ .jsonT("{f:[x1-json5,x2-json5,null]}")
+ .jsonR("{\n\tf:
[\n\t\tx1-json5,\n\t\tx2-json5,\n\t\tnull\n\t]\n}")
+ .xml("<object><f>x1-xmlx2-xml<null/></f></object>")
+ .xmlT("<object><f>x1-xmlx2-xml<null/></f></object>")
+
.xmlR("<object>\n\t<f>\n\t\tx1-xml\n\t\tx2-xml\n\t\t<null/>\n\t</f>\n</object>\n")
+ .xmlNs("<object><f>x1-xmlx2-xml<null/></f></object>")
+
.html("<table><tr><td>f</td><td><ul><li>x1-html</li><li>x2-html</li><li><null/></li></ul></td></tr></table>")
+
.htmlT("<table><tr><td>f</td><td><ul><li>x1-html</li><li>x2-html</li><li><null/></li></ul></td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>x1-html</li>\n\t\t\t\t<li>x2-html</li>\n\t\t\t\t<li><null/></li>\n\t\t\t</ul>\n\t\t</td>\n\t</tr>\n</table>\n")
+ .uon("(f=@(x1-uon,x2-uon,null))")
+ .uonT("(f=@(x1-uon,x2-uon,null))")
+
.uonR("(\n\tf=@(\n\t\tx1-uon,\n\t\tx2-uon,\n\t\tnull\n\t)\n)")
+
.urlEnc("f=@(x1-x-www-form-urlencoded,x2-x-www-form-urlencoded,null)")
+
.urlEncT("f=@(x1-x-www-form-urlencoded,x2-x-www-form-urlencoded,null)")
+
.urlEncR("f=@(\n\tx1-x-www-form-urlencoded,\n\tx2-x-www-form-urlencoded,\n\tnull\n)")
+
.msgPack("81A1669378312D6D73677061636B78322D6D73677061636BC0")
+
.msgPackT("81A1669378312D6D73677061636B78322D6D73677061636BC0")
+
.rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li>x1-xml</rdf:li>\n<rdf:li>x2-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li>x1-xml</rdf:li>\n<rdf:li>x2-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+ .build(),
+ tester(9, "BeanWithSwappedMapField", ()->new
BeanWithSwappedMapField("x"))
+ .json("{f:{foo:x1-json5,bar:null,null:x2-json5}}")
+ .jsonT("{f:{foo:x1-json5,bar:null,null:x2-json5}}")
+ .jsonR("{\n\tf: {\n\t\tfoo: x1-json5,\n\t\tbar:
null,\n\t\tnull: x2-json5\n\t}\n}")
+ .xml("<object><f><foo>x1-xml</foo><bar
_type='null'/><_x0000_>x2-xml</_x0000_></f></object>")
+ .xmlT("<object><f><foo>x1-xml</foo><bar
t='null'/><_x0000_>x2-xml</_x0000_></f></object>")
+ .xmlR("<object>\n\t<f>\n\t\t<foo>x1-xml</foo>\n\t\t<bar
_type='null'/>\n\t\t<_x0000_>x2-xml</_x0000_>\n\t</f>\n</object>\n")
+ .xmlNs("<object><f><foo>x1-xml</foo><bar
_type='null'/><_x0000_>x2-xml</_x0000_></f></object>")
+
.html("<table><tr><td>f</td><td><table><tr><td>foo</td><td>x1-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x2-html</td></tr></table></td></tr></table>")
+
.htmlT("<table><tr><td>f</td><td><table><tr><td>foo</td><td>x1-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x2-html</td></tr></table></td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>foo</td>\n\t\t\t\t\t<td>x1-html</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>bar</td>\n\t\t\t\t\t<td><null/></td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td><null/></td>\n\t\t\t\t\t<td>x2-html</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>\n")
+ .uon("(f=(foo=x1-uon,bar=null,null=x2-uon))")
+ .uonT("(f=(foo=x1-uon,bar=null,null=x2-uon))")
+
.uonR("(\n\tf=(\n\t\tfoo=x1-uon,\n\t\tbar=null,\n\t\tnull=x2-uon\n\t)\n)")
+
.urlEnc("f=(foo=x1-x-www-form-urlencoded,bar=null,null=x2-x-www-form-urlencoded)")
+
.urlEncT("f=(foo=x1-x-www-form-urlencoded,bar=null,null=x2-x-www-form-urlencoded)")
+
.urlEncR("f=(\n\tfoo=x1-x-www-form-urlencoded,\n\tbar=null,\n\tnull=x2-x-www-form-urlencoded\n)")
+
.msgPack("81A16683A3666F6F78312D6D73677061636BA3626172C0C078322D6D73677061636B")
+
.msgPackT("81A16683A3666F6F78312D6D73677061636BA3626172C0C078322D6D73677061636B")
+ .rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f
rdf:parseType='Resource'>\n<jp:foo>x1-xml</jp:foo>\n<jp:bar
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:_x0000_>x2-xml</jp:_x0000_>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+ .rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f
rdf:parseType='Resource'>\n<jp:foo>x1-xml</jp:foo>\n<jp:bar
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n<jp:_x0000_>x2-xml</jp:_x0000_>\n</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
+ .build(),
+ tester(10, "BeanWithListBeanSwappedField", ()->new
BeanWithListBeanSwappedField("x"))
+
.json("{f:[{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}},null]}")
+
.jsonT("{f:[{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}},null]}")
+ .jsonR("{\n\tf: [\n\t\t{\n\t\t\tf1:
x1a-json5,\n\t\t\tf2:
[\n\t\t\t\tx2a-json5,\n\t\t\t\tx2b-json5,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf4:
[\n\t\t\t\tx4a-json5,\n\t\t\t\tx4b-json5,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf5:
{\n\t\t\t\tfoo: x5a-json5,\n\t\t\t\tbar: null,\n\t\t\t\tnull:
x5c-json5\n\t\t\t}\n\t\t},\n\t\tnull\n\t]\n}")
+
.xml("<object><f><object><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
_type='null'/><_x0000_>x5c-xml</_x0000_></f5></object><null/></f></object>")
+
.xmlT("<object><f><object><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
t='null'/><_x0000_>x5c-xml</_x0000_></f5></object><null/></f></object>")
+
.xmlR("<object>\n\t<f>\n\t\t<object>\n\t\t\t<f1>x1a-xml</f1>\n\t\t\t<f2>\n\t\t\t\tx2a-xml\n\t\t\t\tx2b-xml\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f4>\n\t\t\t\tx4a-xml\n\t\t\t\tx4b-xml\n\t\t\t\t<null/>\n\t\t\t</f4>\n\t\t\t<f5>\n\t\t\t\t<foo>x5a-xml</foo>\n\t\t\t\t<bar
_type='null'/>\n\t\t\t\t<_x0000_>x5c-xml</_x0000_>\n\t\t\t</f5>\n\t\t</object>\n\t\t<null/>\n\t</f>\n</object>\n")
+
.xmlNs("<object><f><object><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
_type='null'/><_x0000_>x5c-xml</_x0000_></f5></object><null/></f></object>")
+ .html("<table><tr><td>f</td><td><table
_type='array'><tr><th>f1</th><th>f2</th><th>f3</th><th>f4</th><th>f5</th></tr><tr><td>x1a-html</td><td><ul><li>x2a-html</li><li>x2b-html</li><li><null/></li></ul></td><td><null/></td><td><ul><li>x4a-html</li><li>x4b-html</li><li><null/></li></ul></td><td><table><tr><td>foo</td><td>x5a-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x5c-html</td></tr></table></td></tr><tr><null/></tr></table></td></tr></table>")
+ .htmlT("<table><tr><td>f</td><td><table
t='array'><tr><th>f1</th><th>f2</th><th>f3</th><th>f4</th><th>f5</th></tr><tr><td>x1a-html</td><td><ul><li>x2a-html</li><li>x2b-html</li><li><null/></li></ul></td><td><null/></td><td><ul><li>x4a-html</li><li>x4b-html</li><li><null/></li></ul></td><td><table><tr><td>foo</td><td>x5a-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x5c-html</td></tr></table></td></tr><tr><null/></tr></table></td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<table
_type='array'>\n\t\t\t\t<tr>\n\t\t\t\t\t<th>f1</th>\n\t\t\t\t\t<th>f2</th>\n\t\t\t\t\t<th>f3</th>\n\t\t\t\t\t<th>f4</th>\n\t\t\t\t\t<th>f5</th>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>x1a-html</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li>x2a-html</li>\n\t\t\t\t\t\t\t<li>x2b-html</li>\n\t\t\t\t\t\t\t<li><null/></li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td><null/></td>\n\t\t\t\t\t<td>\n\t\t\t\t\t
[...]
+
.uon("(f=@((f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon)),null))")
+
.uonT("(f=@((f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon)),null))")
+
.uonR("(\n\tf=@(\n\t\t(\n\t\t\tf1=x1a-uon,\n\t\t\tf2=@(\n\t\t\t\tx2a-uon,\n\t\t\t\tx2b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf4=@(\n\t\t\t\tx4a-uon,\n\t\t\t\tx4b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n\t\t\t\tfoo=x5a-uon,\n\t\t\t\tbar=null,\n\t\t\t\tnull=x5c-uon\n\t\t\t)\n\t\t),\n\t\tnull\n\t)\n)")
+
.urlEnc("f=@((f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlencoded)),null)")
+
.urlEncT("f=@((f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlencoded)),null)")
+
.urlEncR("f=@(\n\t(\n\t\tf1=x1a-x-www-form-urlencoded,\n\t\tf2=@(\n\t\t\tx2a-x-www-form-urlencoded,\n\t\t\tx2b-x-www-form-urlencoded,\n\t\t\tnull\n\t\t),\n\t\tf4=@(\n\t\t\tx4a-x-www-form-urlencoded,\n\t\t\tx4b-x-www-form-urlencoded,\n\t\t\tnull\n\t\t),\n\t\tf5=(\n\t\t\tfoo=x5a-x-www-form-urlencoded,\n\t\t\tbar=null,\n\t\t\tnull=x5c-x-www-form-urlencoded\n\t\t)\n\t),\n\tnull\n)")
+
.msgPack("81A1669284A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636BC0")
+
.msgPackT("81A1669284A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636BC0")
+
.rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li
rdf:parseType='Resource'>\n<jp:f1>x1a-xml</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>x2a-xml</rdf:li>\n<rdf:li>x2b-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>x4a-xml</rdf:li>\n<rdf:li>x4b-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f4>\n<jp:f5
rdf:parseType='Resource'>\n<jp: [...]
+
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f>\n<rdf:Seq>\n<rdf:li
rdf:parseType='Resource'>\n<jp:f1>x1a-xml</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>x2a-xml</rdf:li>\n<rdf:li>x2b-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>x4a-xml</rdf:li>\n<rdf:li>x4b-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f4>\n<jp:f5
rdf:parseType='Resource'>\n<jp [...]
+ .build(),
+ tester(11, "BeanWithMapBeanSwappedField", ()->new
BeanWithMapBeanSwappedField("x"))
+
.json("{f:{foo:{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}},bar:null,null:{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}}}}")
+
.jsonT("{f:{foo:{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}},bar:null,null:{f1:x1a-json5,f2:[x2a-json5,x2b-json5,null],f4:[x4a-json5,x4b-json5,null],f5:{foo:x5a-json5,bar:null,null:x5c-json5}}}}")
+ .jsonR("{\n\tf: {\n\t\tfoo: {\n\t\t\tf1:
x1a-json5,\n\t\t\tf2:
[\n\t\t\t\tx2a-json5,\n\t\t\t\tx2b-json5,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf4:
[\n\t\t\t\tx4a-json5,\n\t\t\t\tx4b-json5,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf5:
{\n\t\t\t\tfoo: x5a-json5,\n\t\t\t\tbar: null,\n\t\t\t\tnull:
x5c-json5\n\t\t\t}\n\t\t},\n\t\tbar: null,\n\t\tnull: {\n\t\t\tf1:
x1a-json5,\n\t\t\tf2:
[\n\t\t\t\tx2a-json5,\n\t\t\t\tx2b-json5,\n\t\t\t\tnull\n\t\t\t],\n\t\t\tf4:
[\n\t\t\t\tx4a-json5,\n\t\t\t\tx4b-json5,\n\ [...]
+
.xml("<object><f><foo><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
_type='null'/><_x0000_>x5c-xml</_x0000_></f5></foo><bar
_type='null'/><_x0000_><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
_type='null'/><_x0000_>x5c-xml</_x0000_></f5></_x0000_></f></object>")
+
.xmlT("<object><f><foo><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
t='null'/><_x0000_>x5c-xml</_x0000_></f5></foo><bar
t='null'/><_x0000_><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
t='null'/><_x0000_>x5c-xml</_x0000_></f5></_x0000_></f></object>")
+
.xmlR("<object>\n\t<f>\n\t\t<foo>\n\t\t\t<f1>x1a-xml</f1>\n\t\t\t<f2>\n\t\t\t\tx2a-xml\n\t\t\t\tx2b-xml\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f4>\n\t\t\t\tx4a-xml\n\t\t\t\tx4b-xml\n\t\t\t\t<null/>\n\t\t\t</f4>\n\t\t\t<f5>\n\t\t\t\t<foo>x5a-xml</foo>\n\t\t\t\t<bar
_type='null'/>\n\t\t\t\t<_x0000_>x5c-xml</_x0000_>\n\t\t\t</f5>\n\t\t</foo>\n\t\t<bar
_type='null'/>\n\t\t<_x0000_>\n\t\t\t<f1>x1a-xml</f1>\n\t\t\t<f2>\n\t\t\t\tx2a-xml\n\t\t\t\tx2b-xml\n\t\t\t\t<null/>\n\t\t\t</f2>\n\t\t\t<f
[...]
+
.xmlNs("<object><f><foo><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
_type='null'/><_x0000_>x5c-xml</_x0000_></f5></foo><bar
_type='null'/><_x0000_><f1>x1a-xml</f1><f2>x2a-xmlx2b-xml<null/></f2><f4>x4a-xmlx4b-xml<null/></f4><f5><foo>x5a-xml</foo><bar
_type='null'/><_x0000_>x5c-xml</_x0000_></f5></_x0000_></f></object>")
+
.html("<table><tr><td>f</td><td><table><tr><td>foo</td><td><table><tr><td>f1</td><td>x1a-html</td></tr><tr><td>f2</td><td><ul><li>x2a-html</li><li>x2b-html</li><li><null/></li></ul></td></tr><tr><td>f4</td><td><ul><li>x4a-html</li><li>x4b-html</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>x5a-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x5c-html</td></tr></table></td></tr></table></td></tr><tr><td>bar</td><td><null/></td
[...]
+
.htmlT("<table><tr><td>f</td><td><table><tr><td>foo</td><td><table><tr><td>f1</td><td>x1a-html</td></tr><tr><td>f2</td><td><ul><li>x2a-html</li><li>x2b-html</li><li><null/></li></ul></td></tr><tr><td>f4</td><td><ul><li>x4a-html</li><li>x4b-html</li><li><null/></li></ul></td></tr><tr><td>f5</td><td><table><tr><td>foo</td><td>x5a-html</td></tr><tr><td>bar</td><td><null/></td></tr><tr><td><null/></td><td>x5c-html</td></tr></table></td></tr></table></td></tr><tr><td>bar</td><td><null/></t
[...]
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>\n\t\t\t<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>foo</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<table>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>f1</td>\n\t\t\t\t\t\t\t\t<td>x1a-html</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>f2</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t<li>x2a-html</li>\n\t\t\t\t\t\t\t\t\t\t<li>x2b-html</li>\n\t\t\t\t\t\t\t\t\t\t<li><null/></li>\n\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\
[...]
+
.uon("(f=(foo=(f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon)),bar=null,null=(f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon))))")
+
.uonT("(f=(foo=(f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon)),bar=null,null=(f1=x1a-uon,f2=@(x2a-uon,x2b-uon,null),f4=@(x4a-uon,x4b-uon,null),f5=(foo=x5a-uon,bar=null,null=x5c-uon))))")
+
.uonR("(\n\tf=(\n\t\tfoo=(\n\t\t\tf1=x1a-uon,\n\t\t\tf2=@(\n\t\t\t\tx2a-uon,\n\t\t\t\tx2b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf4=@(\n\t\t\t\tx4a-uon,\n\t\t\t\tx4b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n\t\t\t\tfoo=x5a-uon,\n\t\t\t\tbar=null,\n\t\t\t\tnull=x5c-uon\n\t\t\t)\n\t\t),\n\t\tbar=null,\n\t\tnull=(\n\t\t\tf1=x1a-uon,\n\t\t\tf2=@(\n\t\t\t\tx2a-uon,\n\t\t\t\tx2b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf4=@(\n\t\t\t\tx4a-uon,\n\t\t\t\tx4b-uon,\n\t\t\t\tnull\n\t\t\t),\n\t\t\tf5=(\n
[...]
+
.urlEnc("f=(foo=(f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlencoded)),bar=null,null=(f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlencoded)))")
+
.urlEncT("f=(foo=(f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlencoded)),bar=null,null=(f1=x1a-x-www-form-urlencoded,f2=@(x2a-x-www-form-urlencoded,x2b-x-www-form-urlencoded,null),f4=@(x4a-x-www-form-urlencoded,x4b-x-www-form-urlencoded,null),f5=(foo=x5a-x-www-form-urlencoded,bar=null,null=x5c-x-www-form-urlenco
[...]
+
.urlEncR("f=(\n\tfoo=(\n\t\tf1=x1a-x-www-form-urlencoded,\n\t\tf2=@(\n\t\t\tx2a-x-www-form-urlencoded,\n\t\t\tx2b-x-www-form-urlencoded,\n\t\t\tnull\n\t\t),\n\t\tf4=@(\n\t\t\tx4a-x-www-form-urlencoded,\n\t\t\tx4b-x-www-form-urlencoded,\n\t\t\tnull\n\t\t),\n\t\tf5=(\n\t\t\tfoo=x5a-x-www-form-urlencoded,\n\t\t\tbar=null,\n\t\t\tnull=x5c-x-www-form-urlencoded\n\t\t)\n\t),\n\tbar=null,\n\tnull=(\n\t\tf1=x1a-x-www-form-urlencoded,\n\t\tf2=@(\n\t\t\tx2a-x-www-form-urlencoded,\n\t\t\tx2b-x-w
[...]
+
.msgPack("81A16683A3666F6F84A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636BA3626172C0C084A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636B")
+
.msgPackT("81A16683A3666F6F84A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636BA3626172C0C084A266317831612D6D73677061636BA26632937832612D6D73677061636B7832622D6D73677061636BC0A26634937834612D6D73677061636B7834622D6D73677061636BC0A2663583A3666F6F7835612D6D73677061636BA3626172C0C07835632D6D73677061636B")
+ .rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f
rdf:parseType='Resource'>\n<jp:foo
rdf:parseType='Resource'>\n<jp:f1>x1a-xml</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>x2a-xml</rdf:li>\n<rdf:li>x2b-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>x4a-xml</rdf:li>\n<rdf:li>x4b-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f4>\n<jp:f5
rdf:parseType='Re [...]
+ .rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f
rdf:parseType='Resource'>\n<jp:foo
rdf:parseType='Resource'>\n<jp:f1>x1a-xml</jp:f1>\n<jp:f2>\n<rdf:Seq>\n<rdf:li>x2a-xml</rdf:li>\n<rdf:li>x2b-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f2>\n<jp:f4>\n<rdf:Seq>\n<rdf:li>x4a-xml</rdf:li>\n<rdf:li>x4b-xml</rdf:li>\n<rdf:li
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Seq>\n</jp:f4>\n<jp:f5
rdf:parseType='R [...]
+ .build()
+ };
+
+ static ComboSerializeTester<?>[] testers() {
+ return TESTERS;
+ }
+
+ @Swap(PojoToSimpleReaderSwap.class)
+ public static class PojoToSimpleReader {}
+
+ public static class PojoToSimpleReaderSwap extends
ObjectSwap<PojoToSimpleReader,Reader> {
+ @Override
+ public Reader swap(BeanSession session, PojoToSimpleReader o)
throws Exception {
+ return reader("foo");
+ }
+ }
+
+ @Swap(PojoToDynamicReaderSwap.class)
+ public static class PojoToDynamicReader {
+ private String f;
+ public PojoToDynamicReader(String f) {
+ this.f = f;
+ }
+ }
+
+ public static class PojoToDynamicReaderSwap extends
ObjectSwap<PojoToDynamicReader,Object> {
+ @Override
+ public Object swap(BeanSession session, PojoToDynamicReader o)
throws Exception {
+ return reader(o.f + "-" +
session.getMediaType().getSubTypes().get(0));
+ }
+ }
+
+ @Swap(SometimesSwappedBeanSwap1.class)
+ public static class SometimesSwappedBean1 {
+ public String f;
+ public SometimesSwappedBean1(String f) {
+ this.f = f;
+ }
+ }
+
+ public static class SometimesSwappedBeanSwap1 extends
ObjectSwap<SometimesSwappedBean1,Object> {
+ @Override
+ public Object swap(BeanSession session, SometimesSwappedBean1
o) throws Exception {
+ MediaType mt = session.getMediaType();
+ if (mt.hasSubType("json5") || mt.hasSubType("xml"))
+ return reader(o.f + "-" + mt);
+ return o;
+ }
+ }
+
+ @Swap(SometimesSwappedBeanSwap2.class)
+ public static class SometimesSwappedBean2 {
+ public String f;
+ public SometimesSwappedBean2(String f) {
+ this.f = f;
+ }
+ }
+
+ public static class SometimesSwappedBeanSwap2 extends
ObjectSwap<SometimesSwappedBean2,Object> {
+ @Override
+ public Object swap(BeanSession session, SometimesSwappedBean2
o) throws Exception {
+ MediaType mt = session.getMediaType();
+ if (mt.hasSubType("json5") || mt.hasSubType("xml"))
+ return o;
+ return reader(o.f + "-" + mt);
+ }
+ }
+
+
+ public static class BeanWithSwappedField {
+ public PojoToDynamicReader f;
+ public BeanWithSwappedField(String f) {
+ this.f = new PojoToDynamicReader(f);
+ }
+ }
+
+ public static class BeanWithSwapped1dField {
+ public PojoToDynamicReader[] f;
+ public BeanWithSwapped1dField(String f) {
+ this.f = new PojoToDynamicReader[]{new
PojoToDynamicReader(f + "1"),new PojoToDynamicReader(f + 2),null};
+ }
+ }
+
+ public static class BeanWithSwappedNullField {
+ public PojoToDynamicReader f;
+ }
+
+ public static class BeanWithSwappedListField {
+ public List<PojoToDynamicReader> f;
+ public BeanWithSwappedListField(String f) {
+ this.f = list(new PojoToDynamicReader(f + "1"),new
PojoToDynamicReader(f + "2"),null);
+ }
+ }
+
+ public static class BeanWithSwappedMapField {
+ public Map<String,PojoToDynamicReader> f;
+ public BeanWithSwappedMapField(String f) {
+ this.f = map("foo",new PojoToDynamicReader(f +
"1"),"bar",null,null,new PojoToDynamicReader(f + "2"));
+ }
+ }
+
+ public static class BeanWithListBeanSwappedField {
+ public List<B> f;
+ public BeanWithListBeanSwappedField(String f) {
+ this.f = list(new B(f),null);
+ }
+ }
+
+ public static class BeanWithMapBeanSwappedField {
+ public Map<String,B> f;
+ public BeanWithMapBeanSwappedField(String f) {
+ this.f = map("foo",new B(f),"bar",null,null,new B(f));
+ }
+ }
+
+ public static class B {
+ public PojoToDynamicReader f1;
+ public PojoToDynamicReader[] f2;
+ public PojoToDynamicReader f3;
+ public List<PojoToDynamicReader> f4;
+ public Map<String,PojoToDynamicReader> f5;
+
+ public B(String f) {
+ f1 = new PojoToDynamicReader(f + "1a");
+ f2 = new PojoToDynamicReader[]{new
PojoToDynamicReader(f + "2a"),new PojoToDynamicReader(f + "2b"),null};
+ f3 = null;
+ f4 = list(new PojoToDynamicReader(f + "4a"),new
PojoToDynamicReader(f + "4b"),null);
+ f5 = map("foo",new PojoToDynamicReader(f +
"5a"),"bar",null,null,new PojoToDynamicReader(f + "5c"));
+ }
+ }
+}
\ No newline at end of file
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/transforms/SwapsAnnotation_ComboSerializeTest.java
b/juneau-utest/src/test/java/org/apache/juneau/transforms/SwapsAnnotation_ComboSerializeTest.java
new file mode 100644
index 000000000..734967935
--- /dev/null
+++
b/juneau-utest/src/test/java/org/apache/juneau/transforms/SwapsAnnotation_ComboSerializeTest.java
@@ -0,0 +1,733 @@
+//
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file *
+// * distributed with this work for additional information regarding copyright
ownership. The ASF licenses this file *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance *
+// * with the License. You may obtain a copy of the License at
*
+// *
*
+// * http://www.apache.org/licenses/LICENSE-2.0
*
+// *
*
+// * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the *
+// * specific language governing permissions and limitations under the
License. *
+//
***************************************************************************************************************************
+package org.apache.juneau.transforms;
+
+import static org.apache.juneau.utest.utils.Utils2.*;
+
+import java.util.function.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.swap.*;
+
+/**
+ * Exhaustive serialization tests Swap annotation.
+ */
+class SwapsAnnotation_ComboSerializeTest extends ComboSerializeTest_Base {
+
+ private static <T> ComboSerializeTester.Builder<T> tester(int index,
String label, Supplier<T> bean) {
+ return ComboSerializeTester.create(index, label,
bean).serializerApply(s -> s.swaps(
+ ContextSwap.class,
+ ContextSwapJson.class,
+ ContextSwapXml.class,
+ ContextSwapHtml.class,
+ ContextSwapUon.class,
+ ContextSwapUrlEncoding.class,
+ ContextSwapMsgPack.class,
+ ContextSwapRdfXml.class
+ ));
+ }
+
+ private static ComboSerializeTester<?>[] TESTERS = {
+ tester(1, "TestMediaTypeLiterals", TestMediaTypeLiterals::new)
+ .json("'JSON'")
+ .jsonT("'JSON'")
+ .jsonR("'JSON'")
+ .xml("<string>XML</string>")
+ .xmlT("<string>XML</string>")
+ .xmlR("<string>XML</string>\n")
+ .xmlNs("<string>XML</string>")
+ .html("<string>HTML</string>")
+ .htmlT("<string>HTML</string>")
+ .htmlR("<string>HTML</string>")
+ .uon("UON")
+ .uonT("UON")
+ .uonR("UON")
+ .urlEnc("_value=URLENCODING")
+ .urlEncT("_value=URLENCODING")
+ .urlEncR("_value=URLENCODING")
+ .msgPack("A74D53475041434B")
+ .msgPackT("A74D53475041434B")
+ .build(),
+ tester(2, "TestMediaTypePatterns", TestMediaTypePatterns::new)
+ .json("'JSON'")
+ .jsonT("'JSON'")
+ .jsonR("'JSON'")
+ .xml("<string>XML</string>")
+ .xmlT("<string>XML</string>")
+ .xmlR("<string>XML</string>\n")
+ .xmlNs("<string>XML</string>")
+ .html("<string>HTML</string>")
+ .htmlT("<string>HTML</string>")
+ .htmlR("<string>HTML</string>")
+ .uon("UON")
+ .uonT("UON")
+ .uonR("UON")
+ .urlEnc("_value=URLENCODING")
+ .urlEncT("_value=URLENCODING")
+ .urlEncR("_value=URLENCODING")
+ .msgPack("A74D53475041434B")
+ .msgPackT("A74D53475041434B")
+ .build(),
+ tester(3, "TestMediaTypePatternsReversed",
TestMediaTypePatternsReversed::new)
+ .json("'JSON'")
+ .jsonT("'JSON'")
+ .jsonR("'JSON'")
+ .xml("<string>XML</string>")
+ .xmlT("<string>XML</string>")
+ .xmlR("<string>XML</string>\n")
+ .xmlNs("<string>XML</string>")
+ .html("<string>HTML</string>")
+ .htmlT("<string>HTML</string>")
+ .htmlR("<string>HTML</string>")
+ .uon("UON")
+ .uonT("UON")
+ .uonR("UON")
+ .urlEnc("_value=URLENCODING")
+ .urlEncT("_value=URLENCODING")
+ .urlEncR("_value=URLENCODING")
+ .msgPack("A74D53475041434B")
+ .msgPackT("A74D53475041434B")
+ .build(),
+ tester(4, "TestMediaTypePatternsMulti",
TestMediaTypePatternsMulti::new)
+ .json("'JSON'")
+ .jsonT("'JSON'")
+ .jsonR("'JSON'")
+ .xml("<string>XML</string>")
+ .xmlT("<string>XML</string>")
+ .xmlR("<string>XML</string>\n")
+ .xmlNs("<string>XML</string>")
+ .html("<string>HTML</string>")
+ .htmlT("<string>HTML</string>")
+ .htmlR("<string>HTML</string>")
+ .uon("UON")
+ .uonT("UON")
+ .uonR("UON")
+ .urlEnc("_value=URLENCODING")
+ .urlEncT("_value=URLENCODING")
+ .urlEncR("_value=URLENCODING")
+ .msgPack("A74D53475041434B")
+ .msgPackT("A74D53475041434B")
+ .build(),
+ // In this case, "text/xml" should NOT match "text/xml+rdf".
+ tester(5, "TestMediaTypePatternsPartial1",
TestMediaTypePatternsPartial1::new)
+ .json("'JSON'")
+ .jsonT("'JSON'")
+ .jsonR("'JSON'")
+ .xml("<string>XML</string>")
+ .xmlT("<string>XML</string>")
+ .xmlR("<string>XML</string>\n")
+ .xmlNs("<string>XML</string>")
+ .html("<string>HTML</string>")
+ .htmlT("<string>HTML</string>")
+ .htmlR("<string>HTML</string>")
+ .uon("foo")
+ .uonT("foo")
+ .uonR("foo")
+ .urlEnc("_value=foo")
+ .urlEncT("_value=foo")
+ .urlEncR("_value=foo")
+ .msgPack("A3666F6F")
+ .msgPackT("A3666F6F")
+ .build(),
+ // In this case, "text/xml+rdf" should NOT match "text/xml".
+ tester(6, "TestMediaTypePatternsPartial2",
TestMediaTypePatternsPartial2::new)
+ .json("'foo'")
+ .jsonT("'foo'")
+ .jsonR("'foo'")
+ .xml("<string>foo</string>")
+ .xmlT("<string>foo</string>")
+ .xmlR("<string>foo</string>\n")
+ .xmlNs("<string>foo</string>")
+ .html("<string>foo</string>")
+ .htmlT("<string>foo</string>")
+ .htmlR("<string>foo</string>")
+ .uon("UON")
+ .uonT("UON")
+ .uonR("UON")
+ .urlEnc("_value=URLENCODING")
+ .urlEncT("_value=URLENCODING")
+ .urlEncR("_value=URLENCODING")
+ .msgPack("A74D53475041434B")
+ .msgPackT("A74D53475041434B")
+ .build(),
+ // XML and RDF serializers.
+ tester(7, "TestMediaTypePatternsXmlPlus",
TestMediaTypePatternsXmlPlus::new)
+ .json("'foo'")
+ .jsonT("'foo'")
+ .jsonR("'foo'")
+ .xml("<string>XML</string>")
+ .xmlT("<string>XML</string>")
+ .xmlR("<string>XML</string>\n")
+ .xmlNs("<string>XML</string>")
+ .html("<string>foo</string>")
+ .htmlT("<string>foo</string>")
+ .htmlR("<string>foo</string>")
+ .uon("foo")
+ .uonT("foo")
+ .uonR("foo")
+ .urlEnc("_value=foo")
+ .urlEncT("_value=foo")
+ .urlEncR("_value=foo")
+ .msgPack("A3666F6F")
+ .msgPackT("A3666F6F")
+ .build(),
+ // XML and RDF serializers.
+ tester(8, "TestMediaTypePatternsXmlPlusReversed",
TestMediaTypePatternsXmlPlusReversed::new)
+ .json("'foo'")
+ .jsonT("'foo'")
+ .jsonR("'foo'")
+ .xml("<string>XML</string>")
+ .xmlT("<string>XML</string>")
+ .xmlR("<string>XML</string>\n")
+ .xmlNs("<string>XML</string>")
+ .html("<string>foo</string>")
+ .htmlT("<string>foo</string>")
+ .htmlR("<string>foo</string>")
+ .uon("foo")
+ .uonT("foo")
+ .uonR("foo")
+ .urlEnc("_value=foo")
+ .urlEncT("_value=foo")
+ .urlEncR("_value=foo")
+ .msgPack("A3666F6F")
+ .msgPackT("A3666F6F")
+ .build(),
+ // RDF serializer.
+ tester(9, "TestMediaTypePatternsRdfPlus",
TestMediaTypePatternsRdfPlus::new)
+ .json("'foo'")
+ .jsonT("'foo'")
+ .jsonR("'foo'")
+ .xml("<string>foo</string>")
+ .xmlT("<string>foo</string>")
+ .xmlR("<string>foo</string>\n")
+ .xmlNs("<string>foo</string>")
+ .html("<string>foo</string>")
+ .htmlT("<string>foo</string>")
+ .htmlR("<string>foo</string>")
+ .uon("foo")
+ .uonT("foo")
+ .uonR("foo")
+ .urlEnc("_value=foo")
+ .urlEncT("_value=foo")
+ .urlEncR("_value=foo")
+ .msgPack("A3666F6F")
+ .msgPackT("A3666F6F")
+ .build(),
+ tester(10, "TestTemplate", TestTemplate::new)
+ .json("foo")
+ .jsonT("foo")
+ .jsonR("foo")
+ .xml("foo")
+ .xmlT("foo")
+ .xmlR("foo\n")
+ .xmlNs("foo")
+ .html("foo")
+ .htmlT("foo")
+ .htmlR("foo")
+ .uon("foo")
+ .uonT("foo")
+ .uonR("foo")
+ .urlEnc("foo")
+ .urlEncT("foo")
+ .urlEncR("foo")
+ .msgPack("666F6F")
+ .msgPackT("666F6F")
+ .build(),
+ tester(11, "TestTemplates", TestTemplates::new)
+ .json("JSON")
+ .jsonT("JSON")
+ .jsonR("JSON")
+ .xml("XML")
+ .xmlT("XML")
+ .xmlR("XML\n")
+ .xmlNs("XML")
+ .html("HTML")
+ .htmlT("HTML")
+ .htmlR("HTML")
+ .uon("UON")
+ .uonT("UON")
+ .uonR("UON")
+ .urlEnc("URLENCODING")
+ .urlEncT("URLENCODING")
+ .urlEncR("URLENCODING")
+ .msgPack("4D53475041434B")
+ .msgPackT("4D53475041434B")
+ .build(),
+ tester(12, "TestProgrammaticTemplates",
TestProgrammaticTemplates::new)
+ .json("JSON")
+ .jsonT("JSON")
+ .jsonR("JSON")
+ .xml("XML")
+ .xmlT("XML")
+ .xmlR("XML\n")
+ .xmlNs("XML")
+ .html("HTML")
+ .htmlT("HTML")
+ .htmlR("HTML")
+ .uon("UON")
+ .uonT("UON")
+ .uonR("UON")
+ .urlEnc("URLENCODING")
+ .urlEncT("URLENCODING")
+ .urlEncR("URLENCODING")
+ .msgPack("4D53475041434B")
+ .msgPackT("4D53475041434B")
+ .build(),
+ tester(13, "TestContextSwap", TestContextSwap::new)
+ .json("TEMPLATE")
+ .jsonT("TEMPLATE")
+ .jsonR("TEMPLATE")
+ .xml("TEMPLATE")
+ .xmlT("TEMPLATE")
+ .xmlR("TEMPLATE\n")
+ .xmlNs("TEMPLATE")
+ .html("TEMPLATE")
+ .htmlT("TEMPLATE")
+ .htmlR("TEMPLATE")
+ .uon("TEMPLATE")
+ .uonT("TEMPLATE")
+ .uonR("TEMPLATE")
+ .urlEnc("TEMPLATE")
+ .urlEncT("TEMPLATE")
+ .urlEncR("TEMPLATE")
+ .msgPack("54454D504C415445")
+ .msgPackT("54454D504C415445")
+ .build(),
+ tester(14, "TestContextSwaps", TestContextSwaps::new)
+ .json("JSON")
+ .jsonT("JSON")
+ .jsonR("JSON")
+ .xml("XML")
+ .xmlT("XML")
+ .xmlR("XML\n")
+ .xmlNs("XML")
+ .html("HTML")
+ .htmlT("HTML")
+ .htmlR("HTML")
+ .uon("UON")
+ .uonT("UON")
+ .uonR("UON")
+ .urlEnc("URLENCODING")
+ .urlEncT("URLENCODING")
+ .urlEncR("URLENCODING")
+ .msgPack("4D53475041434B")
+ .msgPackT("4D53475041434B")
+ .build(),
+ tester(15, "BeanA", BeanA::new)
+ .json("SWAPPED")
+ .jsonT("SWAPPED")
+ .jsonR("SWAPPED")
+ .xml("SWAPPED")
+ .xmlT("SWAPPED")
+ .xmlR("SWAPPED\n")
+ .xmlNs("SWAPPED")
+ .html("SWAPPED")
+ .htmlT("SWAPPED")
+ .htmlR("SWAPPED")
+ .uon("(f=1)")
+ .uonT("(f=1)")
+ .uonR("(\n\tf=1\n)")
+ .urlEnc("f=1")
+ .urlEncT("f=1")
+ .urlEncR("f=1")
+ .msgPack("81A16601")
+ .msgPackT("81A16601")
+ .build(),
+ tester(16, "BeanB", BeanB::new)
+ .json("{f:1}")
+ .jsonT("{f:1}")
+ .jsonR("{\n\tf: 1\n}")
+ .xml("<object><f>1</f></object>")
+ .xmlT("<object><f>1</f></object>")
+ .xmlR("<object>\n\t<f>1</f>\n</object>\n")
+ .xmlNs("<object><f>1</f></object>")
+ .html("<table><tr><td>f</td><td>1</td></tr></table>")
+ .htmlT("<table><tr><td>f</td><td>1</td></tr></table>")
+
.htmlR("<table>\n\t<tr>\n\t\t<td>f</td>\n\t\t<td>1</td>\n\t</tr>\n</table>\n")
+ .uon("SWAPPED")
+ .uonT("SWAPPED")
+ .uonR("SWAPPED")
+ .urlEnc("SWAPPED")
+ .urlEncT("SWAPPED")
+ .urlEncR("SWAPPED")
+ .msgPack("53574150504544")
+ .msgPackT("53574150504544")
+ .build()
+ };
+
+ static ComboSerializeTester<?>[] testers() {
+ return TESTERS;
+ }
+
+ @Swap(value=SwapJson.class, mediaTypes={"application/json5"})
+ @Swap(value=SwapXml.class, mediaTypes={"text/xml"})
+ @Swap(value=SwapHtml.class, mediaTypes={"text/html"})
+ @Swap(value=SwapUon.class, mediaTypes={"text/uon"})
+ @Swap(value=SwapUrlEncoding.class,
mediaTypes={"application/x-www-form-urlencoded"})
+ @Swap(value=SwapMsgPack.class, mediaTypes={"octal/msgpack"})
+ @Swap(value=SwapRdfXml.class, mediaTypes={"text/xml+rdf"})
+ public static class TestMediaTypeLiterals {}
+
+ @Swap(value=SwapJson.class, mediaTypes={"*/json5"})
+ @Swap(value=SwapXml.class, mediaTypes={"*/xml"})
+ @Swap(value=SwapHtml.class, mediaTypes={"*/html"})
+ @Swap(value=SwapUon.class, mediaTypes={"*/uon"})
+ @Swap(value=SwapUrlEncoding.class,
mediaTypes={"*/x-www-form-urlencoded"})
+ @Swap(value=SwapMsgPack.class, mediaTypes={"*/msgpack"})
+ @Swap(value=SwapRdfXml.class, mediaTypes={"*/xml+rdf"})
+ public static class TestMediaTypePatterns {}
+
+ @Swap(value=SwapRdfXml.class, mediaTypes={"*/xml+rdf"})
+ @Swap(value=SwapMsgPack.class, mediaTypes={"*/msgpack"})
+ @Swap(value=SwapUrlEncoding.class,
mediaTypes={"*/x-www-form-urlencoded"})
+ @Swap(value=SwapUon.class, mediaTypes={"*/uon"})
+ @Swap(value=SwapHtml.class, mediaTypes={"*/html"})
+ @Swap(value=SwapXml.class, mediaTypes={"*/xml"})
+ @Swap(value=SwapJson.class, mediaTypes={"*/json5"})
+ public static class TestMediaTypePatternsReversed {}
+
+ @Swap(value=SwapJson.class, mediaTypes={"*/foo","*/json5","*/bar"})
+ @Swap(value=SwapXml.class, mediaTypes={"*/foo","*/xml","*/bar"})
+ @Swap(value=SwapHtml.class, mediaTypes={"*/foo","*/html","*/bar"})
+ @Swap(value=SwapUon.class, mediaTypes={"*/foo","*/uon","*/bar"})
+ @Swap(value=SwapUrlEncoding.class,
mediaTypes={"*/foo","*/x-www-form-urlencoded","*/bar"})
+ @Swap(value=SwapMsgPack.class, mediaTypes={"*/foo","*/msgpack","*/bar"})
+ @Swap(value=SwapRdfXml.class, mediaTypes={"*/foo","*/xml+rdf","*/bar"})
+ public static class TestMediaTypePatternsMulti {}
+
+ @Swap(value=SwapJson.class, mediaTypes={"*/foo","*/json5","*/bar"})
+ @Swap(value=SwapXml.class, mediaTypes={"*/foo","*/xml","*/bar"})
+ @Swap(value=SwapHtml.class, mediaTypes={"*/foo","*/html","*/bar"})
+ public static class TestMediaTypePatternsPartial1 {
+ @Override
+ public String toString() {
+ return "foo";
+ }
+ }
+
+ @Swap(value=SwapUon.class, mediaTypes={"*/foo","*/uon","*/bar"})
+ @Swap(value=SwapUrlEncoding.class,
mediaTypes={"*/foo","*/x-www-form-urlencoded","*/bar"})
+ @Swap(value=SwapMsgPack.class, mediaTypes={"*/foo","*/msgpack","*/bar"})
+ @Swap(value=SwapRdfXml.class, mediaTypes={"*/foo","*/xml+rdf","*/bar"})
+ public static class TestMediaTypePatternsPartial2 {
+ @Override
+ public String toString() {
+ return "foo";
+ }
+ }
+
+ @Swap(value=SwapXml.class, mediaTypes={"text/xml+*"})
+ public static class TestMediaTypePatternsXmlPlus {
+ @Override
+ public String toString() {
+ return "foo";
+ }
+ }
+
+ @Swap(value=SwapXml.class, mediaTypes={"text/*+xml"})
+ public static class TestMediaTypePatternsXmlPlusReversed {
+ @Override
+ public String toString() {
+ return "foo";
+ }
+ }
+
+ @Swap(value=SwapXml.class, mediaTypes={"text/rdf+*"})
+ public static class TestMediaTypePatternsRdfPlus {
+ @Override
+ public String toString() {
+ return "foo";
+ }
+ }
+
+ public static class SwapJson extends ObjectSwap<Object,Object> {
+ @Override
+ public Object swap(BeanSession session, Object o) throws
Exception {
+ return "JSON";
+ }
+ }
+ public static class SwapXml extends ObjectSwap<Object,Object> {
+ @Override
+ public Object swap(BeanSession session, Object o) throws
Exception {
+ return "XML";
+ }
+ }
+ public static class SwapHtml extends ObjectSwap<Object,Object> {
+ @Override
+ public Object swap(BeanSession session, Object o) throws
Exception {
+ return "HTML";
+ }
+ }
+ public static class SwapUon extends ObjectSwap<Object,Object> {
+ @Override
+ public Object swap(BeanSession session, Object o) throws
Exception {
+ return "UON";
+ }
+ }
+ public static class SwapUrlEncoding extends ObjectSwap<Object,Object> {
+ @Override
+ public Object swap(BeanSession session, Object o) throws
Exception {
+ return "URLENCODING";
+ }
+ }
+ public static class SwapMsgPack extends ObjectSwap<Object,Object> {
+ @Override
+ public Object swap(BeanSession session, Object o) throws
Exception {
+ return "MSGPACK";
+ }
+ }
+ public static class SwapRdfXml extends ObjectSwap<Object,Object> {
+ @Override
+ public Object swap(BeanSession session, Object o) throws
Exception {
+ return "RDFXML";
+ }
+ }
+
+ @Swap(impl=TemplateSwap.class,template="foo")
+ public static class TestTemplate {}
+
+ @Swap(value=TemplateSwap.class, mediaTypes={"*/json5"}, template="JSON")
+ @Swap(value=TemplateSwap.class, mediaTypes={"*/xml"}, template="XML")
+ @Swap(value=TemplateSwap.class, mediaTypes={"*/html"}, template="HTML")
+ @Swap(value=TemplateSwap.class, mediaTypes={"*/uon"}, template="UON")
+ @Swap(value=TemplateSwap.class, mediaTypes={"*/x-www-form-urlencoded"},
template="URLENCODING")
+ @Swap(value=TemplateSwap.class, mediaTypes={"*/msgpack"},
template="MSGPACK")
+ @Swap(value=TemplateSwap.class, mediaTypes={"*/xml+rdf"},
template="RDFXML")
+ public static class TestTemplates {}
+
+
+ public static class TemplateSwap extends ObjectSwap<Object,Object> {
+ @Override
+ public Object swap(BeanSession session, Object o, String
template) throws Exception {
+ return reader(template);
+ }
+ }
+
+ @Swap(TemplateSwapJson.class)
+ @Swap(TemplateSwapXml.class)
+ @Swap(TemplateSwapHtml.class)
+ @Swap(TemplateSwapUon.class)
+ @Swap(TemplateSwapUrlEncoding.class)
+ @Swap(TemplateSwapMsgPack.class)
+ @Swap(TemplateSwapRdfXml.class)
+ public static class TestProgrammaticTemplates {}
+
+ public static class TemplateSwapJson extends TemplateSwap {
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/json5");
+ }
+ @Override
+ public String withTemplate() {
+ return "JSON";
+ }
+ }
+ public static class TemplateSwapXml extends TemplateSwap {
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/xml");
+ }
+ @Override
+ public String withTemplate() {
+ return "XML";
+ }
+ }
+ public static class TemplateSwapHtml extends TemplateSwap {
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/html");
+ }
+ @Override
+ public String withTemplate() {
+ return "HTML";
+ }
+ }
+ public static class TemplateSwapUon extends TemplateSwap {
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/uon");
+ }
+ @Override
+ public String withTemplate() {
+ return "UON";
+ }
+ }
+ public static class TemplateSwapUrlEncoding extends TemplateSwap {
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/x-www-form-urlencoded");
+ }
+ @Override
+ public String withTemplate() {
+ return "URLENCODING";
+ }
+ }
+ public static class TemplateSwapMsgPack extends TemplateSwap {
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/msgpack");
+ }
+ @Override
+ public String withTemplate() {
+ return "MSGPACK";
+ }
+ }
+ public static class TemplateSwapRdfXml extends TemplateSwap {
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/xml+rdf");
+ }
+ @Override
+ public String withTemplate() {
+ return "RDFXML";
+ }
+ }
+
+
+ public static class TestContextSwap {}
+
+ public static class ContextSwap extends
ObjectSwap<TestContextSwap,Object> {
+ @Override
+ public Object swap(BeanSession session, TestContextSwap o,
String template) throws Exception {
+ return reader(template);
+ }
+ @Override
+ public String withTemplate() {
+ return "TEMPLATE";
+ }
+ }
+
+ public static class TestContextSwaps {}
+
+ public static class ContextSwapJson extends
ObjectSwap<TestContextSwaps,Object> {
+ @Override
+ public Object swap(BeanSession session, TestContextSwaps o,
String template) throws Exception {
+ return reader(template);
+ }
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/json5");
+ }
+ @Override
+ public String withTemplate() {
+ return "JSON";
+ }
+ }
+ public static class ContextSwapXml extends
ObjectSwap<TestContextSwaps,Object> {
+ @Override
+ public Object swap(BeanSession session, TestContextSwaps o,
String template) throws Exception {
+ return reader(template);
+ }
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/xml");
+ }
+ @Override
+ public String withTemplate() {
+ return "XML";
+ }
+ }
+ public static class ContextSwapHtml extends
ObjectSwap<TestContextSwaps,Object> {
+ @Override
+ public Object swap(BeanSession session, TestContextSwaps o,
String template) throws Exception {
+ return reader(template);
+ }
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/html");
+ }
+ @Override
+ public String withTemplate() {
+ return "HTML";
+ }
+ }
+ public static class ContextSwapUon extends
ObjectSwap<TestContextSwaps,Object> {
+ @Override
+ public Object swap(BeanSession session, TestContextSwaps o,
String template) throws Exception {
+ return reader(template);
+ }
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/uon");
+ }
+ @Override
+ public String withTemplate() {
+ return "UON";
+ }
+ }
+ public static class ContextSwapUrlEncoding extends
ObjectSwap<TestContextSwaps,Object> {
+ @Override
+ public Object swap(BeanSession session, TestContextSwaps o,
String template) throws Exception {
+ return reader(template);
+ }
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/x-www-form-urlencoded");
+ }
+ @Override
+ public String withTemplate() {
+ return "URLENCODING";
+ }
+ }
+ public static class ContextSwapMsgPack extends
ObjectSwap<TestContextSwaps,Object> {
+ @Override
+ public Object swap(BeanSession session, TestContextSwaps o,
String template) throws Exception {
+ return reader(template);
+ }
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/msgpack");
+ }
+ @Override
+ public String withTemplate() {
+ return "MSGPACK";
+ }
+ }
+ public static class ContextSwapRdfXml extends
ObjectSwap<TestContextSwaps,Object> {
+ @Override
+ public Object swap(BeanSession session, TestContextSwaps o,
String template) throws Exception {
+ return reader(template);
+ }
+ @Override
+ public MediaType[] forMediaTypes() {
+ return MediaType.ofAll("*/xml+rdf");
+ }
+ @Override
+ public String withTemplate() {
+ return "RDFXML";
+ }
+ }
+
+ @Swap(value=BeanSwap.class, mediaTypes={"*/json5"})
+ @Swap(value=BeanSwap.class, mediaTypes={"*/xml"})
+ @Swap(value=BeanSwap.class, mediaTypes={"*/html"})
+ public static class BeanA {
+ public int f = 1;
+ }
+
+ @Swap(value=BeanSwap.class, mediaTypes={"*/uon"})
+ @Swap(value=BeanSwap.class, mediaTypes={"*/x-www-form-urlencoded"})
+ @Swap(value=BeanSwap.class, mediaTypes={"*/msgpack"})
+ @Swap(value=BeanSwap.class, mediaTypes={"*/xml+rdf"})
+ public static class BeanB {
+ public int f = 1;
+ }
+
+ public static class BeanSwap extends ObjectSwap<Object,Object> {
+ @Override
+ public Object swap(BeanSession session, Object o, String
template) throws Exception {
+ return reader("SWAPPED");
+ }
+ }
+}
\ No newline at end of file