http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ComboRoundTripTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ComboRoundTripTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ComboRoundTripTest.java
new file mode 100644
index 0000000..4da5f1e
--- /dev/null
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ComboRoundTripTest.java
@@ -0,0 +1,708 @@
+// 
***************************************************************************************************************************
+// * 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.jena.Constants.*;
+import static org.junit.Assert.*;
+
+import java.util.*;
+
+import org.apache.juneau.html.*;
+import org.apache.juneau.jena.*;
+import org.apache.juneau.json.*;
+import org.apache.juneau.msgpack.*;
+import org.apache.juneau.parser.*;
+import org.apache.juneau.serializer.*;
+import org.apache.juneau.uon.*;
+import org.apache.juneau.urlencoding.*;
+import org.apache.juneau.xml.*;
+import org.junit.*;
+import org.junit.runners.*;
+
+/**
+ * Superclass for tests that verify results against all supported content 
types.
+ */
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@SuppressWarnings({"unchecked","rawtypes"})
+public abstract class ComboRoundTripTest {
+
+       /* Parameter template */
+//     {
+//             "MyLabel",
+//             myInput,
+//             /* Json */              "xxx",
+//             /* JsonT */             "xxx",
+//             /* JsonR */             "xxx",
+//             /* Xml */               "xxx",
+//             /* XmlT */              "xxx",
+//             /* XmlR */              "xxx",
+//             /* XmlNs */             "xxx",
+//             /* Html */              "xxx",
+//             /* HtmlT */             "xxx",
+//             /* HtmlR */             "xxx",
+//             /* Uon */               "xxx",
+//             /* UonT */              "xxx",
+//             /* UonR */              "xxx",
+//             /* UrlEnc */    "xxx",
+//             /* UrlEncT */   "xxx",
+//             /* UrlEncR */   "xxx",
+//             /* MsgPack */   "xxx",
+//             /* MsgPackT */  "xxx",
+//             /* RdfXml */    "xxx",
+//             /* RdfXmlT */   "xxx",
+//             /* RdfXmlR */   "xxx",
+//     },
+
+       private final ComboInput comboInput;
+
+       // These are the names of all the tests.
+       // You can comment out the names here to skip them.
+       private static final String[] runTests = {
+               "serializeJson",
+               "parseJson",
+               "serializeJsonT",
+               "parseJsonT",
+               "serializeJsonR",
+               "parseJsonR",
+               "serializeXml",
+               "parseXml",
+               "serializeXmlT",
+               "parseXmlT",
+               "serializeXmlR",
+               "parseXmlR",
+               "serializeXmlNs",
+               "parseXmlNs",
+               "serializeHtml",
+               "parseHtml",
+               "serializeHtmlT",
+               "parseHtmlT",
+               "serializeHtmlR",
+               "parseHtmlR",
+               "serializeUon",
+               "parseUon",
+               "serializeUonT",
+               "parseUonT",
+               "serializeUonR",
+               "parseUonR",
+               "serializeUrlEncoding",
+               "parseUrlEncoding",
+               "serializeUrlEncodingT",
+               "parseUrlEncodingT",
+               "serializeUrlEncodingR",
+               "parseUrlEncodingR",
+               "serializeMsgPack",
+               "parseMsgPack",
+               "parseMsgPackJsonEquivalency",
+               "serializeMsgPackT",
+               "parseMsgPackT",
+               "parseMsgPackTJsonEquivalency",
+               "serializeRdfXml",
+               "parseRdfXml",
+               "serializeRdfXmlT",
+               "parseRdfXmlT",
+               "serializeRdfXmlR",
+               "parseRdfXmlR",
+       };
+
+       private static final Set<String> runTestsSet = new 
HashSet<String>(Arrays.asList(runTests));
+
+       private final boolean SKIP_RDF_TESTS = 
Boolean.getBoolean("skipRdfTests");
+
+       private Map<Serializer,Serializer> serializerMap = new 
IdentityHashMap<Serializer,Serializer>();
+       private Map<Parser,Parser> parserMap = new 
IdentityHashMap<Parser,Parser>();
+
+       public ComboRoundTripTest(ComboInput<?> comboInput) {
+               this.comboInput = comboInput;
+       }
+
+       private Serializer getSerializer(Serializer s) throws Exception {
+               Serializer s2 = serializerMap.get(s);
+               if (s2 == null) {
+                       s2 = applySettings(s);
+                       serializerMap.put(s, s2);
+               }
+               return s2;
+       }
+
+       private Parser getParser(Parser p) throws Exception {
+               Parser p2 = parserMap.get(p);
+               if (p2 == null) {
+                       p2 = applySettings(p);
+                       parserMap.put(p, p2);
+               }
+               return p2;
+       }
+
+       private void testSerialize(String testName, Serializer s, String 
expected) throws Exception {
+               try {
+                       s = getSerializer(s);
+
+                       boolean isRdf = s instanceof RdfSerializer;
+
+                       if ((isRdf && SKIP_RDF_TESTS) || expected.isEmpty() || 
! runTestsSet.contains(testName) ) {
+                               System.err.println(comboInput.label + "/" + 
testName + " for "+s.getClass().getSimpleName()+" skipped.");
+                               return;
+                       }
+
+                       String r = s.isWriterSerializer() ? 
((WriterSerializer)s).serialize(comboInput.getInput()) : 
((OutputStreamSerializer)s).serializeToHex(comboInput.getInput());
+
+                       // Can't control RdfSerializer output well, so manually 
remove namespace declarations
+                       // double-quotes with single-quotes, and spaces with 
tabs.
+                       // Also because RDF sucks really bad and can't be 
expected to produce consistent testable results,
+                       // we must also do an expensive sort-then-compare 
operation to verify the results.
+                       if (isRdf)
+                               r = r.replaceAll("<rdf:RDF[^>]*>", 
"<rdf:RDF>").replace('"', '\'');
+
+                       // 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 (isRdf)
+                               TestUtils.assertEqualsAfterSort(expected, r, 
"{0}/{1} parse-normal failed", comboInput.label, testName);
+                       else
+                               TestUtils.assertEquals(expected, r, "{0}/{1} 
parse-normal failed", comboInput.label, testName);
+
+               } catch (AssertionError e) {
+                       throw e;
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       throw new AssertionError(comboInput.label + "/" + 
testName + " failed.  exception=" + e.getLocalizedMessage());
+               }
+       }
+
+       private void testParse(String testName, Serializer s, Parser p, String 
expected) throws Exception {
+               try {
+                       s = getSerializer(s);
+                       p = getParser(p);
+
+                       boolean isRdf = s instanceof RdfSerializer;
+
+                       if ((isRdf && SKIP_RDF_TESTS) || expected.isEmpty() || 
! runTestsSet.contains(testName) ) {
+                               System.err.println(comboInput.label + "/" + 
testName + " for "+s.getClass().getSimpleName()+" skipped.");
+                               return;
+                       }
+
+                       String r = s.isWriterSerializer() ? 
((WriterSerializer)s).serialize(comboInput.getInput()) : 
((OutputStreamSerializer)s).serializeToHex(comboInput.getInput());
+                       Object o = p.parse(r, comboInput.type);
+                       r = s.isWriterSerializer() ? 
((WriterSerializer)s).serialize(o) : 
((OutputStreamSerializer)s).serializeToHex(o);
+
+                       if (isRdf)
+                               r = r.replaceAll("<rdf:RDF[^>]*>", 
"<rdf:RDF>").replace('"', '\'');
+
+                       if (isRdf)
+                               TestUtils.assertEqualsAfterSort(expected, r, 
"{0}/{1} parse-normal failed", comboInput.label, testName);
+                       else
+                               TestUtils.assertEquals(expected, r, "{0}/{1} 
parse-normal failed", comboInput.label, testName);
+
+               } catch (AssertionError e) {
+                       throw e;
+               } catch (Exception e) {
+                       throw new Exception(comboInput.label + "/" + testName + 
" failed.", e);
+               }
+       }
+
+       private void testParseVerify(String testName, Serializer s, Parser p) 
throws Exception {
+               try {
+                       s = getSerializer(s);
+                       p = getParser(p);
+
+                       String r = s.isWriterSerializer() ? 
((WriterSerializer)s).serialize(comboInput.getInput()) : 
((OutputStreamSerializer)s).serializeToHex(comboInput.getInput());
+                       Object o = p.parse(r, comboInput.type);
+
+                       comboInput.verify(o);
+               } catch (AssertionError e) {
+                       throw e;
+               } catch (Exception e) {
+                       throw new Exception(comboInput.label + "/" + testName + 
" failed.", e);
+               }
+       }
+
+
+       private void testParseJsonEquivalency(String testName, 
OutputStreamSerializer s, InputStreamParser p, String expected) throws 
Exception {
+               try {
+                       s = (OutputStreamSerializer)getSerializer(s);
+                       p = (InputStreamParser)getParser(p);
+                       WriterSerializer sJson = 
(WriterSerializer)getSerializer(this.sJson);
+
+                       String r = s.serializeToHex(comboInput.getInput());
+                       Object o = p.parse(r, comboInput.type);
+                       r = sJson.serialize(o);
+                       assertEquals(comboInput.label + "/" + testName + " 
parse-normal failed on JSON equivalency", expected, r);
+               } catch (AssertionError e) {
+                       throw e;
+               } catch (Exception e) {
+                       throw new Exception(comboInput.label + "/" + testName + 
" failed.", e);
+               }
+       }
+
+       protected Serializer applySettings(Serializer s) throws Exception {
+               return s;
+       }
+
+       protected Parser applySettings(Parser p) throws Exception {
+               return p;
+       }
+
+       
//--------------------------------------------------------------------------------
+       // JSON
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sJson = JsonSerializer.DEFAULT_LAX;
+       ReaderParser pJson = JsonParser.DEFAULT;
+
+       @Test
+       public void a11_serializeJson() throws Exception {
+               testSerialize("serializeJson", sJson, comboInput.json);
+       }
+
+       @Test
+       public void a12_parseJson() throws Exception {
+               testParse("parseJson", sJson, pJson, comboInput.json);
+       }
+
+       @Test
+       public void a13_verifyJson() throws Exception {
+               testParseVerify("verifyJson", sJson, pJson);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // JSON - 't' property
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sJsonT = new 
JsonSerializerBuilder().simple().beanTypePropertyName("t").build();
+       ReaderParser pJsonT = new 
JsonParserBuilder().beanTypePropertyName("t").build();
+
+       @Test
+       public void a21_serializeJsonT() throws Exception {
+               testSerialize("serializeJsonT", sJsonT, comboInput.jsonT);
+       }
+
+       @Test
+       public void a22_parseJsonT() throws Exception {
+               testParse("parseJsonT", sJsonT, pJsonT, comboInput.jsonT);
+       }
+
+       @Test
+       public void a23_verifyJsonT() throws Exception {
+               testParseVerify("verifyJsonT", sJsonT, pJsonT);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // JSON - Readable
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sJsonR = JsonSerializer.DEFAULT_LAX_READABLE;
+       ReaderParser pJsonR = JsonParser.DEFAULT;
+
+       @Test
+       public void a31_serializeJsonR() throws Exception {
+               testSerialize("serializeJsonR", sJsonR, comboInput.jsonR);
+       }
+
+       @Test
+       public void a32_parseJsonR() throws Exception {
+               testParse("parseJsonR", sJsonR, pJsonR, comboInput.jsonR);
+       }
+
+       @Test
+       public void a33_verifyJsonR() throws Exception {
+               testParseVerify("verifyJsonR", sJsonR, pJsonR);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // XML
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sXml = XmlSerializer.DEFAULT_SQ;
+       ReaderParser pXml = XmlParser.DEFAULT;
+
+       @Test
+       public void b11_serializeXml() throws Exception {
+               testSerialize("serializeXml", sXml, comboInput.xml);
+       }
+
+       @Test
+       public void b12_parseXml() throws Exception {
+               testParse("parseXml", sXml, pXml, comboInput.xml);
+       }
+
+       @Test
+       public void b13_verifyXml() throws Exception {
+               testParseVerify("verifyXml", sXml, pXml);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // XML - 't' property
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sXmlT = new 
XmlSerializerBuilder().sq().beanTypePropertyName("t").build();
+       ReaderParser pXmlT = new 
XmlParserBuilder().beanTypePropertyName("t").build();
+
+       @Test
+       public void b21_serializeXmlT() throws Exception {
+               testSerialize("serializeXmlT", sXmlT, comboInput.xmlT);
+       }
+
+       @Test
+       public void b22_parseXmlT() throws Exception {
+               testParse("parseXmlT", sXmlT, pXmlT, comboInput.xmlT);
+       }
+
+       @Test
+       public void b23_verifyXmlT() throws Exception {
+               testParseVerify("parseXmlTVerify", sXmlT, pXmlT);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // XML - Readable
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sXmlR = XmlSerializer.DEFAULT_SQ_READABLE;
+       ReaderParser pXmlR = XmlParser.DEFAULT;
+
+       @Test
+       public void b31_serializeXmlR() throws Exception {
+               testSerialize("serializeXmlR", sXmlR, comboInput.xmlR);
+       }
+
+       @Test
+       public void b32_parseXmlR() throws Exception {
+               testParse("parseXmlR", sXmlR, pXmlR, comboInput.xmlR);
+       }
+
+       @Test
+       public void b33_verifyXmlR() throws Exception {
+               testParseVerify("parseXmlRVerify", sXmlR, pXmlR);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // XML - Namespaces
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sXmlNs = XmlSerializer.DEFAULT_NS_SQ;
+       ReaderParser pXmlNs = XmlParser.DEFAULT;
+
+       @Test
+       public void b41_serializeXmlNs() throws Exception {
+               testSerialize("serializeXmlNs", sXmlNs, comboInput.xmlNs);
+       }
+
+       @Test
+       public void b42_parseXmlNs() throws Exception {
+               testParse("parseXmlNs", sXmlNs, pXmlNs, comboInput.xmlNs);
+       }
+
+       @Test
+       public void b43_verifyXmlNs() throws Exception {
+               testParseVerify("verifyXmlNs", sXmlNs, pXmlNs);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // HTML
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sHtml = HtmlSerializer.DEFAULT_SQ;
+       ReaderParser pHtml = HtmlParser.DEFAULT;
+
+       @Test
+       public void c11_serializeHtml() throws Exception {
+               testSerialize("serializeHtml", sHtml, comboInput.html);
+       }
+
+       @Test
+       public void c12_parseHtml() throws Exception {
+               testParse("parseHtml", sHtml, pHtml, comboInput.html);
+       }
+
+       @Test
+       public void c13_verifyHtml() throws Exception {
+               testParseVerify("verifyHtml", sHtml, pHtml);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // HTML - 't' property
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sHtmlT = new 
HtmlSerializerBuilder().sq().beanTypePropertyName("t").build();
+       ReaderParser pHtmlT =  new 
HtmlParserBuilder().beanTypePropertyName("t").build();
+
+       @Test
+       public void c21_serializeHtmlT() throws Exception {
+               testSerialize("serializeHtmlT", sHtmlT, comboInput.htmlT);
+       }
+
+       @Test
+       public void c22_parseHtmlT() throws Exception {
+               testParse("parseHtmlT", sHtmlT, pHtmlT, comboInput.htmlT);
+       }
+
+       @Test
+       public void c23_verifyHtmlT() throws Exception {
+               testParseVerify("verifyHtmlT", sHtmlT, pHtmlT);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // HTML - Readable
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sHtmlR = HtmlSerializer.DEFAULT_SQ_READABLE;
+       ReaderParser pHtmlR = HtmlParser.DEFAULT;
+
+       @Test
+       public void c31_serializeHtmlR() throws Exception {
+               testSerialize("serializeHtmlR", sHtmlR, comboInput.htmlR);
+       }
+
+       @Test
+       public void c32_parseHtmlR() throws Exception {
+               testParse("parseHtmlR", sHtmlR, pHtmlR, comboInput.htmlR);
+       }
+
+       @Test
+       public void c33_verifyHtmlR() throws Exception {
+               testParseVerify("verifyHtmlR", sHtmlR, pHtmlR);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // UON
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sUon = UonSerializer.DEFAULT;
+       ReaderParser pUon = UonParser.DEFAULT;
+
+       @Test
+       public void d11_serializeUon() throws Exception {
+               testSerialize("serializeUon", sUon, comboInput.uon);
+       }
+
+       @Test
+       public void d12_parseUon() throws Exception {
+               testParse("parseUon", sUon, pUon, comboInput.uon);
+       }
+
+       @Test
+       public void d13_verifyUon() throws Exception {
+               testParseVerify("verifyUon", sUon, pUon);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // UON - 't' property
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sUonT = new 
UonSerializerBuilder().beanTypePropertyName("t").build();
+       ReaderParser pUonT = new 
UonParserBuilder().beanTypePropertyName("t").build();
+
+       @Test
+       public void d21_serializeUonT() throws Exception {
+               testSerialize("serializeUonT", sUonT, comboInput.uonT);
+       }
+
+       @Test
+       public void d22_parseUonT() throws Exception {
+               testParse("parseUonT", sUonT, pUonT, comboInput.uonT);
+       }
+
+       @Test
+       public void d23_verifyUonT() throws Exception {
+               testParseVerify("verifyUonT", sUonT, pUonT);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // UON - Readable
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sUonR = UonSerializer.DEFAULT_READABLE;
+       ReaderParser pUonR = UonParser.DEFAULT;
+
+       @Test
+       public void d31_serializeUonR() throws Exception {
+               testSerialize("serializeUonR", sUonR, comboInput.uonR);
+       }
+
+       @Test
+       public void d32_parseUonR() throws Exception {
+               testParse("parseUonR", sUonR, pUonR, comboInput.uonR);
+       }
+
+       @Test
+       public void d33_verifyUonR() throws Exception {
+               testParseVerify("verifyUonR", sUonR, pUonR);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // UrlEncoding
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sUrlEncoding = UrlEncodingSerializer.DEFAULT;
+       ReaderParser pUrlEncoding = UrlEncodingParser.DEFAULT;
+
+       @Test
+       public void e11_serializeUrlEncoding() throws Exception {
+               testSerialize("serializeUrlEncoding", sUrlEncoding, 
comboInput.urlEncoding);
+       }
+
+       @Test
+       public void e12_parseUrlEncoding() throws Exception {
+               testParse("parseUrlEncoding", sUrlEncoding, pUrlEncoding, 
comboInput.urlEncoding);
+       }
+
+       @Test
+       public void e13_verifyUrlEncoding() throws Exception {
+               testParseVerify("verifyUrlEncoding", sUrlEncoding, 
pUrlEncoding);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // UrlEncoding - 't' property
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sUrlEncodingT = new 
UrlEncodingSerializerBuilder().beanTypePropertyName("t").build();
+       ReaderParser pUrlEncodingT = new 
UrlEncodingParserBuilder().beanTypePropertyName("t").build();
+
+       @Test
+       public void e21_serializeUrlEncodingT() throws Exception {
+               testSerialize("serializeUrlEncodingT", sUrlEncodingT, 
comboInput.urlEncodingT);
+       }
+
+       @Test
+       public void e22_parseUrlEncodingT() throws Exception {
+               testParse("parseUrlEncodingT", sUrlEncodingT, pUrlEncodingT, 
comboInput.urlEncodingT);
+       }
+
+       @Test
+       public void e23_verifyUrlEncodingT() throws Exception {
+               testParseVerify("verifyUrlEncodingT", sUrlEncodingT, 
pUrlEncodingT);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // UrlEncoding - Readable
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sUrlEncodingR = UrlEncodingSerializer.DEFAULT_READABLE;
+       ReaderParser pUrlEncodingR = UrlEncodingParser.DEFAULT;
+
+       @Test
+       public void e31_serializeUrlEncodingR() throws Exception {
+               testSerialize("serializeUrlEncodingR", sUrlEncodingR, 
comboInput.urlEncodingR);
+       }
+
+       @Test
+       public void e32_parseUrlEncodingR() throws Exception {
+               testParse("parseUrlEncodingR", sUrlEncodingR, pUrlEncodingR, 
comboInput.urlEncodingR);
+       }
+
+       @Test
+       public void e33_verifyUrlEncodingR() throws Exception {
+               testParseVerify("verifyUrlEncodingR", sUrlEncodingR, 
pUrlEncodingR);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // MsgPack
+       
//--------------------------------------------------------------------------------
+       OutputStreamSerializer sMsgPack = MsgPackSerializer.DEFAULT;
+       InputStreamParser pMsgPack = MsgPackParser.DEFAULT;
+
+       @Test
+       public void f11_serializeMsgPack() throws Exception {
+               testSerialize("serializeMsgPack", sMsgPack, comboInput.msgPack);
+       }
+
+       @Test
+       public void f12_parseMsgPack() throws Exception {
+               testParse("parseMsgPack", sMsgPack, pMsgPack, 
comboInput.msgPack);
+       }
+
+       @Test
+       public void f13_parseMsgPackJsonEquivalency() throws Exception {
+               testParseJsonEquivalency("parseMsgPackJsonEquivalency", 
sMsgPack, pMsgPack, comboInput.json);
+       }
+
+       @Test
+       public void f14_verifyMsgPack() throws Exception {
+               testParseVerify("verifyMsgPack", sMsgPack, pMsgPack);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // MsgPack - 't' property
+       
//--------------------------------------------------------------------------------
+       OutputStreamSerializer sMsgPackT = new 
MsgPackSerializerBuilder().beanTypePropertyName("t").build();
+       InputStreamParser pMsgPackT = new 
MsgPackParserBuilder().beanTypePropertyName("t").build();
+
+       @Test
+       public void f21_serializeMsgPackT() throws Exception {
+               testSerialize("serializeMsgPackT", sMsgPackT, 
comboInput.msgPackT);
+       }
+
+       @Test
+       public void f22_parseMsgPackT() throws Exception {
+               testParse("parseMsgPackT", sMsgPackT, pMsgPackT, 
comboInput.msgPackT);
+       }
+
+       @Test
+       public void f23_parseMsgPackTJsonEquivalency() throws Exception {
+               testParseJsonEquivalency("parseMsgPackTJsonEquivalency", 
sMsgPackT, pMsgPackT, comboInput.json);
+       }
+
+       @Test
+       public void f24_verifyMsgPackT() throws Exception {
+               testParseVerify("verifyMsgPackT", sMsgPackT, pMsgPackT);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // RdfXml
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sRdfXml = RdfSerializer.DEFAULT_XMLABBREV;
+       ReaderParser pRdfXml = RdfParser.DEFAULT_XML;
+
+       @Test
+       public void g11_serializeRdfXml() throws Exception {
+               testSerialize("serializeRdfXml", sRdfXml, comboInput.rdfXml);
+       }
+
+       @Test
+       public void g12_parseRdfXml() throws Exception {
+               testParse("parseRdfXml", sRdfXml, pRdfXml, comboInput.rdfXml);
+       }
+
+       @Test
+       public void g13_verifyRdfXml() throws Exception {
+               testParseVerify("verifyRdfXml", sRdfXml, pRdfXml);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // RdfXml - 't' property
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sRdfXmlT = new 
RdfSerializerBuilder().language(LANG_RDF_XML_ABBREV).beanTypePropertyName("t").build();
+       ReaderParser pRdfXmlT = new 
RdfParserBuilder().beanTypePropertyName("t").build();
+
+       @Test
+       public void g21_serializeRdfXmlT() throws Exception {
+               testSerialize("serializeRdfXmlT", sRdfXmlT, comboInput.rdfXmlT);
+       }
+
+       @Test
+       public void g22_parseRdfXmlT() throws Exception {
+               testParse("parseRdfXmlT", sRdfXmlT, pRdfXmlT, 
comboInput.rdfXmlT);
+       }
+
+       @Test
+       public void g23_verifyRdfXmlT() throws Exception {
+               testParseVerify("parseRdfXmlTVerify", sRdfXmlT, pRdfXmlT);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // RdfXml - Readable
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sRdfXmlR = new 
RdfSerializerBuilder().language(LANG_RDF_XML_ABBREV).ws().build();
+       ReaderParser pRdfXmlR = RdfParser.DEFAULT_XML;
+
+       @Test
+       public void g31_serializeRdfXmlR() throws Exception {
+               testSerialize("serializeRdfXmlR", sRdfXmlR, comboInput.rdfXmlR);
+       }
+
+       @Test
+       public void g32_parseRdfXmlR() throws Exception {
+               testParse("parseRdfXmlR", sRdfXmlR, pRdfXmlR, 
comboInput.rdfXmlR);
+       }
+
+       @Test
+       public void g33_verifyRdfXmlR() throws Exception {
+               testParseVerify("Verify", sRdfXmlR, pRdfXmlR);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ComboSerializeTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ComboSerializeTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ComboSerializeTest.java
new file mode 100644
index 0000000..6768d91
--- /dev/null
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/ComboSerializeTest.java
@@ -0,0 +1,367 @@
+// 
***************************************************************************************************************************
+// * 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.jena.Constants.*;
+
+import java.util.*;
+
+import org.apache.juneau.html.*;
+import org.apache.juneau.internal.*;
+import org.apache.juneau.jena.*;
+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.*;
+import org.junit.runners.*;
+
+/**
+ * Superclass for tests that verify results against all supported content 
types.
+ */
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@SuppressWarnings({"rawtypes"})
+public abstract class ComboSerializeTest {
+
+       /* Parameter template */
+//     {
+//             "MyLabel",
+//             myInput,
+//             /* Json */              "xxx",
+//             /* JsonT */             "xxx",
+//             /* JsonR */             "xxx",
+//             /* Xml */               "xxx",
+//             /* XmlT */              "xxx",
+//             /* XmlR */              "xxx",
+//             /* XmlNs */             "xxx",
+//             /* Html */              "xxx",
+//             /* HtmlT */             "xxx",
+//             /* HtmlR */             "xxx",
+//             /* Uon */               "xxx",
+//             /* UonT */              "xxx",
+//             /* UonR */              "xxx",
+//             /* UrlEnc */    "xxx",
+//             /* UrlEncT */   "xxx",
+//             /* UrlEncR */   "xxx",
+//             /* MsgPack */   "xxx",
+//             /* MsgPackT */  "xxx",
+//             /* RdfXml */    "xxx",
+//             /* RdfXmlT */   "xxx",
+//             /* RdfXmlR */   "xxx",
+//     },
+
+       private final ComboInput comboInput;
+
+       // These are the names of all the tests.
+       // You can comment out the names here to skip them.
+       private static final String[] runTests = {
+               "serializeJson",
+               "serializeJsonT",
+               "serializeJsonR",
+               "serializeXml",
+               "serializeXmlT",
+               "serializeXmlR",
+               "serializeXmlNs",
+               "serializeHtml",
+               "serializeHtmlT",
+               "serializeHtmlR",
+               "serializeUon",
+               "serializeUonT",
+               "serializeUonR",
+               "serializeUrlEncoding",
+               "serializeUrlEncodingT",
+               "serializeUrlEncodingR",
+               "serializeMsgPack",
+               "serializeMsgPackT",
+               "serializeRdfXml",
+               "serializeRdfXmlT",
+               "serializeRdfXmlR",
+       };
+
+       private static final Set<String> runTestsSet = new 
HashSet<String>(Arrays.asList(runTests));
+
+       private final boolean SKIP_RDF_TESTS = 
Boolean.getBoolean("skipRdfTests");
+
+       private Map<Serializer,Serializer> serializerMap = new 
IdentityHashMap<Serializer,Serializer>();
+
+       public ComboSerializeTest(ComboInput<?> comboInput) {
+               this.comboInput = comboInput;
+       }
+
+       private Serializer getSerializer(Serializer s) throws Exception {
+               Serializer s2 = serializerMap.get(s);
+               if (s2 == null) {
+                       s2 = applySettings(s);
+                       serializerMap.put(s, s2);
+               }
+               return s2;
+       }
+
+       private void testSerialize(String testName, Serializer s, String 
expected) throws Exception {
+               try {
+                       s = getSerializer(s);
+
+                       boolean isRdf = s instanceof RdfSerializer;
+
+                       if ((isRdf && SKIP_RDF_TESTS) || 
expected.equals("SKIP") || ! runTestsSet.contains(testName) ) {
+                               System.err.println(comboInput.label + "/" + 
testName + " for "+s.getClass().getSimpleName()+" skipped.");
+                               return;
+                       }
+
+                       String r = s.isWriterSerializer() ? 
((WriterSerializer)s).serialize(comboInput.getInput()) : 
((OutputStreamSerializer)s).serializeToHex(comboInput.getInput());
+
+                       // Can't control RdfSerializer output well, so manually 
remove namespace declarations
+                       // double-quotes with single-quotes, and spaces with 
tabs.
+                       // Also because RDF sucks really bad and can't be 
expected to produce consistent testable results,
+                       // we must also do an expensive sort-then-compare 
operation to verify the results.
+                       if (isRdf)
+                               r = r.replaceAll("<rdf:RDF[^>]*>", 
"<rdf:RDF>").replace('"', '\'');
+
+                       // 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))+"]");
+                               }
+                       }
+
+                       if (isRdf)
+                               TestUtils.assertEqualsAfterSort(expected, r, 
"{0}/{1} serialize-normal failed", comboInput.label, testName);
+                       else
+                               TestUtils.assertEquals(expected, r, "{0}/{1} 
serialize-normal failed", comboInput.label, testName);
+
+               } catch (AssertionError e) {
+                       throw e;
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       throw new AssertionError(comboInput.label + "/" + 
testName + " failed.  exception=" + e.getLocalizedMessage());
+               }
+       }
+
+       protected Serializer applySettings(Serializer s) throws Exception {
+               return s;
+       }
+
+       
//--------------------------------------------------------------------------------
+       // JSON
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sJson = JsonSerializer.DEFAULT_LAX;
+
+       @Test
+       public void a11_serializeJson() throws Exception {
+               testSerialize("serializeJson", sJson, comboInput.json);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // JSON - 't' property
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sJsonT = new 
JsonSerializerBuilder().simple().beanTypePropertyName("t").build();
+
+       @Test
+       public void a21_serializeJsonT() throws Exception {
+               testSerialize("serializeJsonT", sJsonT, comboInput.jsonT);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // JSON - Readable
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sJsonR = JsonSerializer.DEFAULT_LAX_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 = new 
XmlSerializerBuilder().sq().beanTypePropertyName("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 = new 
HtmlSerializerBuilder().sq().beanTypePropertyName("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 = new 
UonSerializerBuilder().beanTypePropertyName("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 = new 
UrlEncodingSerializerBuilder().beanTypePropertyName("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 = new 
MsgPackSerializerBuilder().beanTypePropertyName("t").build();
+
+       @Test
+       public void f21_serializeMsgPackT() throws Exception {
+               testSerialize("serializeMsgPackT", sMsgPackT, 
comboInput.msgPackT);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // RdfXml
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sRdfXml = RdfSerializer.DEFAULT_XMLABBREV;
+
+       @Test
+       public void g11_serializeRdfXml() throws Exception {
+               testSerialize("serializeRdfXml", sRdfXml, comboInput.rdfXml);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // RdfXml - 't' property
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sRdfXmlT = new 
RdfSerializerBuilder().language(LANG_RDF_XML_ABBREV).beanTypePropertyName("t").build();
+
+       @Test
+       public void g21_serializeRdfXmlT() throws Exception {
+               testSerialize("serializeRdfXmlT", sRdfXmlT, comboInput.rdfXmlT);
+       }
+
+       
//--------------------------------------------------------------------------------
+       // RdfXml - Readable
+       
//--------------------------------------------------------------------------------
+       WriterSerializer sRdfXmlR = new 
RdfSerializerBuilder().language(LANG_RDF_XML_ABBREV).ws().build();
+
+       @Test
+       public void g31_serializeRdfXmlR() throws Exception {
+               testSerialize("serializeRdfXmlR", sRdfXmlR, comboInput.rdfXmlR);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/DataConversionTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/DataConversionTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/DataConversionTest.java
new file mode 100755
index 0000000..be7c264
--- /dev/null
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/DataConversionTest.java
@@ -0,0 +1,155 @@
+// 
***************************************************************************************************************************
+// * 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.junit.Assert.*;
+
+import java.util.*;
+
+import org.apache.juneau.transforms.*;
+import org.junit.*;
+
+@SuppressWarnings({"unchecked","rawtypes","javadoc"})
+public class DataConversionTest {
+
+       @Before
+       public void beforeTest() {
+               TestUtils.setLocale(Locale.US);
+       }
+
+       @After
+       public void afterTest() {
+               TestUtils.unsetLocale();
+       }
+
+       
//====================================================================================================
+       // testBasic
+       
//====================================================================================================
+       @Test
+       public void testBasic() throws Exception {
+               ObjectMap m = new ObjectMap();
+
+               // *** Number ***
+               m.put("x", 123);
+               assertEquals((int)m.getInt("x"), 123);
+               assertEquals((long)m.getLong("x"), 123);
+
+               // *** Boolean ***
+               m.put("x", true);
+               assertEquals((boolean)m.getBoolean("x"), true);
+
+               // *** Null ***
+               m.put("x", null);
+               assertNull(m.getString("x"));
+               assertNull(m.getInt("x"));
+               assertNull(m.getLong("x"));
+               assertNull(m.getBoolean("x"));
+               assertNull(m.getMap("x"));
+               assertNull(m.getObjectMap("x"));
+               assertNull(m.getList("x"));
+               assertNull(m.getObjectList("x"));
+
+               // *** Map ***
+               m.put("x", new HashMap());
+               assertEquals(m.getString("x"), "{}");
+
+               // *** ObjectMap ***
+               m.put("x", new ObjectMap("{foo:123}"));
+               assertEquals(m.getString("x"), "{foo:123}");
+
+               // *** Collection ***
+               Set s = new HashSet();
+               s.add(123);
+               m.put("x", s);
+               assertEquals(m.getString("x"), "[123]");
+
+               // *** ObjectList ***
+               m.put("x", new ObjectList("[123]"));
+               assertEquals(m.getString("x"), "[123]");
+               assertEquals(m.getList("x").size(), 1);
+               assertEquals(m.getObjectList("x").size(), 1);
+
+               // *** Array ***
+               m.put("x", new Integer[]{123});
+               assertEquals(m.getString("x"), "[123]");
+               assertEquals(m.getList("x").size(), 1);
+               assertEquals(m.getObjectList("x").size(), 1);
+
+               // *** Enum ***
+               m.put("x", TestEnum.ENUM2);
+               assertEquals(m.getString("x"), "ENUM2");
+               assertFalse(m.getBoolean("x"));
+               try {
+                       m.getMap("x");
+                       fail("Invalid conversion from Enum to Map");
+               } catch (InvalidDataConversionException e) {}
+               try {
+                       m.getObjectMap("x");
+                       fail("Invalid conversion from Enum to ObjectMap");
+               } catch (InvalidDataConversionException e) {}
+
+               // *** Not a bean ***
+               m.put("x", new NotABean("foo"));
+               assertEquals(m.getString("x"), "foo");
+               try {
+                       m.getInt("x");
+                       fail("Invalid conversion from NotABean to Integer");
+               } catch (InvalidDataConversionException e) {}
+               try {
+                       m.getLong("x");
+                       fail("Invalid conversion from NotABean to Long");
+               } catch (InvalidDataConversionException e) {}
+               assertFalse(m.getBoolean("x"));
+               try {
+                       m.getMap("x");
+                       fail("Invalid conversion from NotABean to Map");
+               } catch (InvalidDataConversionException e) {}
+               try {
+                       m.getObjectMap("x");
+                       fail("Invalid conversion from NotABean to ObjectMap");
+               } catch (InvalidDataConversionException e) {}
+
+       }
+
+       public enum TestEnum {
+               ENUM0, ENUM1, ENUM2
+       }
+
+       public class NotABean {
+               private String arg;
+
+               public NotABean(String arg) {
+                       this.arg = arg;
+               }
+
+               @Override /* Object */
+               public String toString() {
+                       return arg;
+               }
+       }
+
+       
//====================================================================================================
+       // Data conversions with swaps.
+       
//====================================================================================================
+       @Test
+       public void testObjectSwaps() throws Exception {
+               String s = "Jan 12, 2001";
+               BeanSession session = 
PropertyStore.create().setPojoSwaps(CalendarSwap.DateMedium.class).getBeanContext().createSession();
+               Calendar c = session.convertToType(s, GregorianCalendar.class);
+               assertEquals(2001, c.get(Calendar.YEAR));
+               c = session.convertToType(s, Calendar.class);
+               assertEquals(2001, c.get(Calendar.YEAR));
+               s = session.convertToType(c, String.class);
+               assertEquals("Jan 12, 2001", s);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java
new file mode 100644
index 0000000..9afaaf8
--- /dev/null
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java
@@ -0,0 +1,339 @@
+// 
***************************************************************************************************************************
+// * 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.TestUtils.*;
+
+import java.util.*;
+
+import org.apache.juneau.annotation.*;
+import org.apache.juneau.parser.*;
+import org.apache.juneau.serializer.*;
+import org.apache.juneau.transforms.*;
+import org.junit.*;
+import org.junit.runner.*;
+import org.junit.runners.*;
+
+/**
+ * Exhaustive serialization tests DynaBean support.
+ */
+@RunWith(Parameterized.class)
+@SuppressWarnings({"javadoc"})
+public class DynaBeanComboTest extends ComboRoundTripTest {
+
+       @Parameterized.Parameters
+       public static Collection<Object[]> getParameters() {
+               return Arrays.asList(new Object[][] {
+                       {       /* 0 */
+                               new ComboInput<BeanWithDynaField>(
+                                       "BeanWithDynaField",
+                                       BeanWithDynaField.class,
+                                       new BeanWithDynaField().init(),
+                                       /* Json */              
"{f1:1,f2a:'a',f2b:'b',f3:3}",
+                                       /* JsonT */             
"{f1:1,f2a:'a',f2b:'b',f3:3}",
+                                       /* JsonR */             "{\n\tf1: 
1,\n\tf2a: 'a',\n\tf2b: 'b',\n\tf3: 3\n}",
+                                       /* Xml */               
"<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>",
+                                       /* XmlT */              
"<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>",
+                                       /* XmlR */              
"<object>\n\t<f1>1</f1>\n\t<f2a>a</f2a>\n\t<f2b>b</f2b>\n\t<f3>3</f3>\n</object>\n",
+                                       /* XmlNs */             
"<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>",
+                                       /* Html */              
"<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>",
+                                       /* HtmlT */             
"<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>",
+                                       /* HtmlR */             
"<table>\n\t<tr>\n\t\t<td>f1</td>\n\t\t<td>1</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2a</td>\n\t\t<td>a</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2b</td>\n\t\t<td>b</td>\n\t</tr>\n\t<tr>\n\t\t<td>f3</td>\n\t\t<td>3</td>\n\t</tr>\n</table>\n",
+                                       /* Uon */               
"(f1=1,f2a=a,f2b=b,f3=3)",
+                                       /* UonT */              
"(f1=1,f2a=a,f2b=b,f3=3)",
+                                       /* UonR */              
"(\n\tf1=1,\n\tf2a=a,\n\tf2b=b,\n\tf3=3\n)",
+                                       /* UrlEnc */    "f1=1&f2a=a&f2b=b&f3=3",
+                                       /* UrlEncT */   "f1=1&f2a=a&f2b=b&f3=3",
+                                       /* UrlEncR */   
"f1=1\n&f2a=a\n&f2b=b\n&f3=3",
+                                       /* MsgPack */   
"84A2663101A3663261A161A3663262A162A2663303",
+                                       /* MsgPackT */  
"84A2663101A3663261A161A3663262A162A2663303",
+                                       /* RdfXml */    
"<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:f1>1</jp:f1>\n    <jp:f2a>a</jp:f2a>\n    
<jp:f2b>b</jp:f2b>\n    <jp:f3>3</jp:f3>\n  </rdf:Description>\n</rdf:RDF>\n"
+                               )
+                               {
+                                       @Override
+                                       public void verify(BeanWithDynaField o) 
{
+                                               
assertType(BeanWithDynaField.class, o);
+                                       }
+                               }
+                       },
+                       {       /* 1 */
+                               new ComboInput<BeanWithDynaMethods>(
+                                       "BeanWithDynaMethods",
+                                       BeanWithDynaMethods.class,
+                                       new BeanWithDynaMethods().init(),
+                                       /* Json */              
"{f1:1,f2a:'a',f2b:'b',f3:3}",
+                                       /* JsonT */             
"{f1:1,f2a:'a',f2b:'b',f3:3}",
+                                       /* JsonR */             "{\n\tf1: 
1,\n\tf2a: 'a',\n\tf2b: 'b',\n\tf3: 3\n}",
+                                       /* Xml */               
"<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>",
+                                       /* XmlT */              
"<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>",
+                                       /* XmlR */              
"<object>\n\t<f1>1</f1>\n\t<f2a>a</f2a>\n\t<f2b>b</f2b>\n\t<f3>3</f3>\n</object>\n",
+                                       /* XmlNs */             
"<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>",
+                                       /* Html */              
"<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>",
+                                       /* HtmlT */             
"<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>",
+                                       /* HtmlR */             
"<table>\n\t<tr>\n\t\t<td>f1</td>\n\t\t<td>1</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2a</td>\n\t\t<td>a</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2b</td>\n\t\t<td>b</td>\n\t</tr>\n\t<tr>\n\t\t<td>f3</td>\n\t\t<td>3</td>\n\t</tr>\n</table>\n",
+                                       /* Uon */               
"(f1=1,f2a=a,f2b=b,f3=3)",
+                                       /* UonT */              
"(f1=1,f2a=a,f2b=b,f3=3)",
+                                       /* UonR */              
"(\n\tf1=1,\n\tf2a=a,\n\tf2b=b,\n\tf3=3\n)",
+                                       /* UrlEnc */    "f1=1&f2a=a&f2b=b&f3=3",
+                                       /* UrlEncT */   "f1=1&f2a=a&f2b=b&f3=3",
+                                       /* UrlEncR */   
"f1=1\n&f2a=a\n&f2b=b\n&f3=3",
+                                       /* MsgPack */   
"84A2663101A3663261A161A3663262A162A2663303",
+                                       /* MsgPackT */  
"84A2663101A3663261A161A3663262A162A2663303",
+                                       /* RdfXml */    
"<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:f1>1</jp:f1>\n    <jp:f2a>a</jp:f2a>\n    
<jp:f2b>b</jp:f2b>\n    <jp:f3>3</jp:f3>\n  </rdf:Description>\n</rdf:RDF>\n"
+                               )
+                               {
+                                       @Override
+                                       public void verify(BeanWithDynaMethods 
o) {
+                                               
assertType(BeanWithDynaMethods.class, o);
+                                               
Assert.assertTrue(o.setterCalled);
+                                       }
+                               }
+                       },
+                       {       /* 2 */
+                               new ComboInput<BeanWithDynaGetterOnly>(
+                                       "BeanWithDynaGetterOnly",
+                                       BeanWithDynaGetterOnly.class,
+                                       new BeanWithDynaGetterOnly().init(),
+                                       /* Json */              
"{f1:1,f2a:'a',f2b:'b',f3:3}",
+                                       /* JsonT */             
"{f1:1,f2a:'a',f2b:'b',f3:3}",
+                                       /* JsonR */             "{\n\tf1: 
1,\n\tf2a: 'a',\n\tf2b: 'b',\n\tf3: 3\n}",
+                                       /* Xml */               
"<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>",
+                                       /* XmlT */              
"<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>",
+                                       /* XmlR */              
"<object>\n\t<f1>1</f1>\n\t<f2a>a</f2a>\n\t<f2b>b</f2b>\n\t<f3>3</f3>\n</object>\n",
+                                       /* XmlNs */             
"<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>",
+                                       /* Html */              
"<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>",
+                                       /* HtmlT */             
"<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>",
+                                       /* HtmlR */             
"<table>\n\t<tr>\n\t\t<td>f1</td>\n\t\t<td>1</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2a</td>\n\t\t<td>a</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2b</td>\n\t\t<td>b</td>\n\t</tr>\n\t<tr>\n\t\t<td>f3</td>\n\t\t<td>3</td>\n\t</tr>\n</table>\n",
+                                       /* Uon */               
"(f1=1,f2a=a,f2b=b,f3=3)",
+                                       /* UonT */              
"(f1=1,f2a=a,f2b=b,f3=3)",
+                                       /* UonR */              
"(\n\tf1=1,\n\tf2a=a,\n\tf2b=b,\n\tf3=3\n)",
+                                       /* UrlEnc */    "f1=1&f2a=a&f2b=b&f3=3",
+                                       /* UrlEncT */   "f1=1&f2a=a&f2b=b&f3=3",
+                                       /* UrlEncR */   
"f1=1\n&f2a=a\n&f2b=b\n&f3=3",
+                                       /* MsgPack */   
"84A2663101A3663261A161A3663262A162A2663303",
+                                       /* MsgPackT */  
"84A2663101A3663261A161A3663262A162A2663303",
+                                       /* RdfXml */    
"<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:f1>1</jp:f1>\n    <jp:f2a>a</jp:f2a>\n    
<jp:f2b>b</jp:f2b>\n    <jp:f3>3</jp:f3>\n  </rdf:Description>\n</rdf:RDF>\n"
+                               )
+                               {
+                                       @Override
+                                       public void 
verify(BeanWithDynaGetterOnly o) {
+                                               
assertType(BeanWithDynaGetterOnly.class, o);
+                                       }
+                               }
+                       },
+                       {       /* 3 */
+                               new ComboInput<BeanWithDynaFieldSwapped>(
+                                       "BeanWithDynaFieldSwapped",
+                                       BeanWithDynaFieldSwapped.class,
+                                       new BeanWithDynaFieldSwapped().init(),
+                                       /* Json */              
"{f1a:'1901-03-03T18:11:12Z'}",
+                                       /* JsonT */             
"{f1a:'1901-03-03T18:11:12Z'}",
+                                       /* JsonR */             "{\n\tf1a: 
'1901-03-03T18:11:12Z'\n}",
+                                       /* Xml */               
"<object><f1a>1901-03-03T18:11:12Z</f1a></object>",
+                                       /* XmlT */              
"<object><f1a>1901-03-03T18:11:12Z</f1a></object>",
+                                       /* XmlR */              
"<object>\n\t<f1a>1901-03-03T18:11:12Z</f1a>\n</object>\n",
+                                       /* XmlNs */             
"<object><f1a>1901-03-03T18:11:12Z</f1a></object>",
+                                       /* Html */              
"<table><tr><td>f1a</td><td>1901-03-03T18:11:12Z</td></tr></table>",
+                                       /* HtmlT */             
"<table><tr><td>f1a</td><td>1901-03-03T18:11:12Z</td></tr></table>",
+                                       /* HtmlR */             
"<table>\n\t<tr>\n\t\t<td>f1a</td>\n\t\t<td>1901-03-03T18:11:12Z</td>\n\t</tr>\n</table>\n",
+                                       /* Uon */               
"(f1a=1901-03-03T18:11:12Z)",
+                                       /* UonT */              
"(f1a=1901-03-03T18:11:12Z)",
+                                       /* UonR */              
"(\n\tf1a=1901-03-03T18:11:12Z\n)",
+                                       /* UrlEnc */    
"f1a=1901-03-03T18:11:12Z",
+                                       /* UrlEncT */   
"f1a=1901-03-03T18:11:12Z",
+                                       /* UrlEncR */   
"f1a=1901-03-03T18:11:12Z",
+                                       /* MsgPack */   
"81A3663161B4313930312D30332D30335431383A31313A31325A",
+                                       /* MsgPackT */  
"81A3663161B4313930312D30332D30335431383A31313A31325A",
+                                       /* RdfXml */    
"<rdf:RDF>\n<rdf:Description>\n<jp:f1a>1901-03-03T18:11:12Z</jp:f1a>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:f1a>1901-03-03T18:11:12Z</jp:f1a>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:f1a>1901-03-03T18:11:12Z</jp:f1a>\n  
</rdf:Description>\n</rdf:RDF>\n"
+                               )
+                               {
+                                       @Override
+                                       public void 
verify(BeanWithDynaFieldSwapped o) {
+                                               
assertType(BeanWithDynaFieldSwapped.class, o);
+                                               assertType(Calendar.class, 
o.f1.get("f1a"));
+                                       }
+                               }
+                       },
+                       {       /* 4 */
+                               new ComboInput<BeanWithDynaFieldStringList>(
+                                       "BeanWithDynaFieldStringList",
+                                       BeanWithDynaFieldStringList.class,
+                                       new 
BeanWithDynaFieldStringList().init(),
+                                       /* Json */              
"{f1a:['foo','bar']}",
+                                       /* JsonT */             
"{f1a:['foo','bar']}",
+                                       /* JsonR */             "{\n\tf1a: 
[\n\t\t'foo',\n\t\t'bar'\n\t]\n}",
+                                       /* Xml */               
"<object><f1a><string>foo</string><string>bar</string></f1a></object>",
+                                       /* XmlT */              
"<object><f1a><string>foo</string><string>bar</string></f1a></object>",
+                                       /* XmlR */              
"<object>\n\t<f1a>\n\t\t<string>foo</string>\n\t\t<string>bar</string>\n\t</f1a>\n</object>\n",
+                                       /* XmlNs */             
"<object><f1a><string>foo</string><string>bar</string></f1a></object>",
+                                       /* Html */              
"<table><tr><td>f1a</td><td><ul><li>foo</li><li>bar</li></ul></td></tr></table>",
+                                       /* HtmlT */             
"<table><tr><td>f1a</td><td><ul><li>foo</li><li>bar</li></ul></td></tr></table>",
+                                       /* HtmlR */             
"<table>\n\t<tr>\n\t\t<td>f1a</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>foo</li>\n\t\t\t\t<li>bar</li>\n\t\t\t</ul>\n\t\t</td>\n\t</tr>\n</table>\n",
+                                       /* Uon */               
"(f1a=@(foo,bar))",
+                                       /* UonT */              
"(f1a=@(foo,bar))",
+                                       /* UonR */              
"(\n\tf1a=@(\n\t\tfoo,\n\t\tbar\n\t)\n)",
+                                       /* UrlEnc */    "f1a=@(foo,bar)",
+                                       /* UrlEncT */   "f1a=@(foo,bar)",
+                                       /* UrlEncR */   
"f1a=@(\n\tfoo,\n\tbar\n)",
+                                       /* MsgPack */   
"81A366316192A3666F6FA3626172",
+                                       /* MsgPackT */  
"81A366316192A3666F6FA3626172",
+                                       /* RdfXml */    
"<rdf:RDF>\n<rdf:Description>\n<jp:f1a>\n<rdf:Seq>\n<rdf:li>foo</rdf:li>\n<rdf:li>bar</rdf:li>\n</rdf:Seq>\n</jp:f1a>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlT */   
"<rdf:RDF>\n<rdf:Description>\n<jp:f1a>\n<rdf:Seq>\n<rdf:li>foo</rdf:li>\n<rdf:li>bar</rdf:li>\n</rdf:Seq>\n</jp:f1a>\n</rdf:Description>\n</rdf:RDF>\n",
+                                       /* RdfXmlR */   "<rdf:RDF>\n  
<rdf:Description>\n    <jp:f1a>\n      <rdf:Seq>\n        
<rdf:li>foo</rdf:li>\n        <rdf:li>bar</rdf:li>\n      </rdf:Seq>\n    
</jp:f1a>\n  </rdf:Description>\n</rdf:RDF>\n"
+                               )
+                               {
+                                       @Override
+                                       public void 
verify(BeanWithDynaFieldStringList o) {
+                                               
assertType(BeanWithDynaFieldStringList.class, o);
+                                       }
+                               }
+                       },
+               });
+       }
+
+       public DynaBeanComboTest(ComboInput<?> comboInput) {
+               super(comboInput);
+       }
+
+       @Override
+       protected Serializer applySettings(Serializer s) throws Exception {
+               return s.builder().trimNullProperties(false).build();
+       }
+
+       @Override
+       protected Parser applySettings(Parser p) throws Exception {
+               return p.builder().build();
+       }
+
+       @Bean(sort=true)
+       public static class BeanWithDynaField {
+               public int f1;
+               @BeanProperty(name="*")
+               public Map<String,Object> f2 = new 
LinkedHashMap<String,Object>();
+               public int f3;
+
+               public BeanWithDynaField init() {
+                       this.f1 = 1;
+                       this.f2 = new ObjectMap().append("f2a", 
"a").append("f2b", "b");
+                       this.f3 = 3;
+                       return this;
+               }
+       }
+
+       @Bean(sort=true)
+       public static class BeanWithDynaMethods {
+
+               private int f1, f3;
+               private Map<String,Object> f2 = new 
LinkedHashMap<String,Object>();
+               private boolean setterCalled = false;
+
+               public int getF1() {
+                       return f1;
+               }
+               public void setF1(int f1) {
+                       this.f1 = f1;
+               }
+               public int getF3() {
+                       return f3;
+               }
+               public void setF3(int f3) {
+                       this.f3 = f3;
+               }
+
+               @BeanProperty(name="*")
+               public Map<String, Object> xxx() {
+                       return f2;
+               }
+
+               @BeanProperty(name="*")
+               public void yyy(String name, Object o) {
+                       setterCalled = true;
+                       this.f2.put(name, o);
+               }
+
+               public BeanWithDynaMethods init() {
+                       this.f1 = 1;
+                       this.f2 = new ObjectMap().append("f2a", 
"a").append("f2b", "b");
+                       this.f3 = 3;
+                       return this;
+               }
+       }
+
+       @Bean(sort=true)
+       public static class BeanWithDynaGetterOnly {
+
+               private int f1, f3;
+               private Map<String,Object> f2 = new 
LinkedHashMap<String,Object>();
+
+               public int getF1() {
+                       return f1;
+               }
+               public void setF1(int f1) {
+                       this.f1 = f1;
+               }
+               public int getF3() {
+                       return f3;
+               }
+               public void setF3(int f3) {
+                       this.f3 = f3;
+               }
+
+               @BeanProperty(name="*")
+               public Map<String, Object> xxx() {
+                       return f2;
+               }
+
+               public BeanWithDynaGetterOnly init() {
+                       this.f1 = 1;
+                       this.f2 = new ObjectMap().append("f2a", 
"a").append("f2b", "b");
+                       this.f3 = 3;
+                       return this;
+               }
+       }
+
+       private static Calendar singleDate = new 
GregorianCalendar(TimeZone.getTimeZone("PST"));
+       static {
+               singleDate.setTimeInMillis(0);
+               singleDate.set(1901, 2, 3, 10, 11, 12);
+       }
+
+       @Bean(sort=true)
+       public static class BeanWithDynaFieldSwapped {
+               @BeanProperty(name="*", swap=CalendarSwap.ISO8601DTZ.class)
+               public Map<String,Calendar> f1 = new 
LinkedHashMap<String,Calendar>();
+
+               public BeanWithDynaFieldSwapped init() {
+                       this.f1.put("f1a", singleDate);
+                       return this;
+               }
+       }
+
+       @Bean(sort=true)
+       public static class BeanWithDynaFieldStringList {
+               @BeanProperty(name="*")
+               public Map<String,List<String>> f1 = new 
LinkedHashMap<String,List<String>>();
+
+               public BeanWithDynaFieldStringList init() {
+                       this.f1.put("f1a", Arrays.asList(new 
String[]{"foo","bar"}));
+                       return this;
+               }
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/IgnoredClassesTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/IgnoredClassesTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/IgnoredClassesTest.java
new file mode 100755
index 0000000..e22d86d
--- /dev/null
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/IgnoredClassesTest.java
@@ -0,0 +1,72 @@
+// 
***************************************************************************************************************************
+// * 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.TestUtils.*;
+import static org.junit.Assert.*;
+import static org.junit.Assume.*;
+
+import java.io.*;
+
+import org.apache.juneau.json.*;
+import org.junit.*;
+
+@SuppressWarnings("javadoc")
+public class IgnoredClassesTest {
+
+       
//====================================================================================================
+       // testFilesRenderedAsStrings
+       
//====================================================================================================
+       @Test
+       public void testFilesRenderedAsStrings() throws Exception {
+               
assumeTrue(System.getProperty("os.name").toLowerCase().startsWith("win"));
+               // Files should be rendered as strings.
+               File f = new File("C:/temp");
+               assertObjectEquals("'C:\\\\temp'", f);
+       }
+
+       
//====================================================================================================
+       // testIgnorePackages
+       
//====================================================================================================
+       @Test
+       public void testIgnorePackages() throws Exception {
+               A a = new A();
+               JsonSerializerBuilder s = new JsonSerializerBuilder().simple();
+               assertEquals("{f1:'isBean'}", s.build().serialize(a));
+               s.notBeanPackages("org.apache.juneau");
+               assertEquals("'isNotBean'", s.build().serialize(a));
+               s.removeNotBeanPackages("org.apache.juneau");
+               assertEquals("{f1:'isBean'}", s.build().serialize(a));
+               s.notBeanPackages("org.apache.juneau.*");
+               assertEquals("'isNotBean'", s.build().serialize(a));
+               s.removeNotBeanPackages("org.apache.juneau.*");
+               assertEquals("{f1:'isBean'}", s.build().serialize(a));
+               s.notBeanPackages("org.apache.juneau.*");
+               assertEquals("'isNotBean'", s.build().serialize(a));
+               s.removeNotBeanPackages("org.apache.juneau.*");
+               assertEquals("{f1:'isBean'}", s.build().serialize(a));
+               s.notBeanPackages("org.apache.juneau");
+               assertEquals("'isNotBean'", s.build().serialize(a));
+               s.notBeanPackages("org.apache.juneau.x");
+               assertEquals("'isNotBean'", s.build().serialize(a));
+       }
+
+       public static class A {
+               public String f1 = "isBean";
+               @Override /* Object */
+               public String toString() {
+                       return "isNotBean";
+               }
+       }
+       // TODO - Ignored packages.
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/JacocoDummyTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/JacocoDummyTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/JacocoDummyTest.java
new file mode 100755
index 0000000..98b1212
--- /dev/null
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/JacocoDummyTest.java
@@ -0,0 +1,47 @@
+// 
***************************************************************************************************************************
+// * 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 java.lang.reflect.*;
+
+import org.apache.juneau.ini.*;
+import org.apache.juneau.internal.*;
+import org.apache.juneau.jena.*;
+import org.apache.juneau.xml.annotation.*;
+import org.junit.*;
+
+@SuppressWarnings("javadoc")
+public class JacocoDummyTest {
+
+       
//====================================================================================================
+       // Dummy code to add test coverage in Jacoco.
+       
//====================================================================================================
+       @Test
+       public void accessPrivateConstructorsOnStaticUtilityClasses() throws 
Exception {
+
+               Class<?>[] classes = new Class[] {
+                       StringUtils.class, ArrayUtils.class, ClassUtils.class, 
CollectionUtils.class, ConfigUtils.class
+               };
+
+               for (Class<?> c : classes) {
+                       Constructor<?> c1 = c.getDeclaredConstructor();
+                       c1.setAccessible(true);
+                       c1.newInstance();
+               }
+
+               ConfigFileFormat.valueOf(ConfigFileFormat.INI.toString());
+               
RdfCollectionFormat.valueOf(RdfCollectionFormat.DEFAULT.toString());
+               XmlFormat.valueOf(XmlFormat.DEFAULT.toString());
+               Visibility.valueOf(Visibility.DEFAULT.toString());
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/75b0d8ee/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/MaxIndentTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/MaxIndentTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/MaxIndentTest.java
new file mode 100644
index 0000000..a88cba0
--- /dev/null
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/MaxIndentTest.java
@@ -0,0 +1,313 @@
+// 
***************************************************************************************************************************
+// * 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 java.util.*;
+
+import org.apache.juneau.html.*;
+import org.apache.juneau.json.*;
+import org.apache.juneau.serializer.*;
+import org.apache.juneau.test.pojos.*;
+import org.apache.juneau.uon.*;
+import org.apache.juneau.urlencoding.*;
+import org.apache.juneau.xml.*;
+import org.junit.*;
+import org.junit.runner.*;
+import org.junit.runners.*;
+
+/**
+ * Exhaustive serialization tests DynaBean support.
+ */
+@RunWith(Parameterized.class)
+@SuppressWarnings({"javadoc","serial"})
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class MaxIndentTest {
+
+       @Parameterized.Parameters
+       public static Collection<Object[]> getParameters() {
+               return Arrays.asList(new Object[][] {
+                       {       /* 0 */
+                               new Input(
+                                       "List1dOfBeans-0",
+                                       new List1dOfBeans().init1(),
+                                       0,
+                                       /* Json */              "[{a:1, 
b:'foo'}]",
+                                       /* Xml */               
"<array><object><a>1</a><b>foo</b></object></array>\n",
+                                       /* Html */              "<table 
_type='array'><tr><th>a</th><th>b</th></tr><tr><td>1</td><td>foo</td></tr></table>\n",
+                                       /* Uon */               
"@((a=1,b=foo))",
+                                       /* UrlEnc */    "0=(a=1,b=foo)"
+                               )
+                       },
+                       {       /* 1 */
+                               new Input(
+                                       "List1dOfBeans-1",
+                                       new List1dOfBeans().init1(),
+                                       1,
+                                       /* Json */              "[\n\t{a:1, 
b:'foo'}\n]",
+                                       /* Xml */               
"<array>\n\t<object><a>1</a><b>foo</b></object>\n</array>\n",
+                                       /* Html */              "<table 
_type='array'>\n\t<tr><th>a</th><th>b</th></tr>\n\t<tr><td>1</td><td>foo</td></tr>\n</table>\n",
+                                       /* Uon */               
"@(\n\t(a=1,b=foo)\n)",
+                                       /* UrlEnc */    
"0=(\n\ta=1,\n\tb=foo\n)"
+                               )
+                       },
+                       {       /* 2 */
+                               new Input(
+                                       "List1dOfBeans-2",
+                                       new List1dOfBeans().init1(),
+                                       2,
+                                       /* Json */              "[\n\t{\n\t\ta: 
1,\n\t\tb: 'foo'\n\t}\n]",
+                                       /* Xml */               
"<array>\n\t<object>\n\t\t<a>1</a>\n\t\t<b>foo</b>\n\t</object>\n</array>\n",
+                                       /* Html */              "<table 
_type='array'>\n\t<tr>\n\t\t<th>a</th>\n\t\t<th>b</th>\n\t</tr>\n\t<tr>\n\t\t<td>1</td>\n\t\t<td>foo</td>\n\t</tr>\n</table>\n",
+                                       /* Uon */               
"@(\n\t(\n\t\ta=1,\n\t\tb=foo\n\t)\n)",
+                                       /* UrlEnc */    
"0=(\n\ta=1,\n\tb=foo\n)"
+                               )
+                       },
+                       {       /* 3 */
+                               new Input(
+                                       "List2dOfBeans-0",
+                                       new List2dOfBeans().init2(),
+                                       0,
+                                       /* Json */              "[[{a:1, 
b:'foo'}]]",
+                                       /* Xml */               
"<array><array><object><a>1</a><b>foo</b></object></array></array>\n",
+                                       /* Html */              "<ul><li><table 
_type='array'><tr><th>a</th><th>b</th></tr><tr><td>1</td><td>foo</td></tr></table></li></ul>\n",
+                                       /* Uon */               
"@(@((a=1,b=foo)))",
+                                       /* UrlEnc */    "0=@((a=1,b=foo))"
+                               )
+                       },
+                       {       /* 4 */
+                               new Input(
+                                       "List2dOfBeans-1",
+                                       new List2dOfBeans().init2(),
+                                       1,
+                                       /* Json */              "[\n\t[{a:1, 
b:'foo'}]\n]",
+                                       /* Xml */               
"<array>\n\t<array><object><a>1</a><b>foo</b></object></array>\n</array>\n",
+                                       /* Html */              
"<ul>\n\t<li><table 
_type='array'><tr><th>a</th><th>b</th></tr><tr><td>1</td><td>foo</td></tr></table></li>\n</ul>\n",
+                                       /* Uon */               
"@(\n\t@((a=1,b=foo))\n)",
+                                       /* UrlEnc */    "0=@(\n\t(a=1,b=foo)\n)"
+                               )
+                       },
+                       {       /* 5 */
+                               new Input(
+                                       "List2dOfBeans-2",
+                                       new List2dOfBeans().init2(),
+                                       2,
+                                       /* Json */              
"[\n\t[\n\t\t{a:1, b:'foo'}\n\t]\n]",
+                                       /* Xml */               
"<array>\n\t<array>\n\t\t<object><a>1</a><b>foo</b></object>\n\t</array>\n</array>\n",
+                                       /* Html */              
"<ul>\n\t<li>\n\t\t<table 
_type='array'><tr><th>a</th><th>b</th></tr><tr><td>1</td><td>foo</td></tr></table>\n\t</li>\n</ul>\n",
+                                       /* Uon */               
"@(\n\t@(\n\t\t(a=1,b=foo)\n\t)\n)",
+                                       /* UrlEnc */    
"0=@(\n\t(\n\t\ta=1,\n\t\tb=foo\n\t)\n)"
+                               )
+                       },
+                       {       /* 6 */
+                               new Input(
+                                       "List2dOfBeans-3",
+                                       new List2dOfBeans().init2(),
+                                       3,
+                                       /* Json */              
"[\n\t[\n\t\t{\n\t\t\ta: 1,\n\t\t\tb: 'foo'\n\t\t}\n\t]\n]",
+                                       /* Xml */               
"<array>\n\t<array>\n\t\t<object>\n\t\t\t<a>1</a>\n\t\t\t<b>foo</b>\n\t\t</object>\n\t</array>\n</array>\n",
+                                       /* Html */              
"<ul>\n\t<li>\n\t\t<table 
_type='array'>\n\t\t\t<tr><th>a</th><th>b</th></tr>\n\t\t\t<tr><td>1</td><td>foo</td></tr>\n\t\t</table>\n\t</li>\n</ul>\n",
+                                       /* Uon */               
"@(\n\t@(\n\t\t(\n\t\t\ta=1,\n\t\t\tb=foo\n\t\t)\n\t)\n)",
+                                       /* UrlEnc */    
"0=@(\n\t(\n\t\ta=1,\n\t\tb=foo\n\t)\n)"
+                               )
+                       },
+                       {       /* 7 */
+                               new Input(
+                                       "Map1dOfBeans-0",
+                                       new Map1dOfBeans().init1(),
+                                       0,
+                                       /* Json */              "{a:{a:1, 
b:'foo'}}",
+                                       /* Xml */               
"<object><a><a>1</a><b>foo</b></a></object>\n",
+                                       /* Html */              
"<table><tr><td>a</td><td><table><tr><td>a</td><td>1</td></tr><tr><td>b</td><td>foo</td></tr></table></td></tr></table>\n",
+                                       /* Uon */               
"(a=(a=1,b=foo))",
+                                       /* UrlEnc */    "a=(a=1,b=foo)"
+                               )
+                       },
+                       {       /* 8 */
+                               new Input(
+                                       "Map1dOfBeans-1",
+                                       new Map1dOfBeans().init1(),
+                                       1,
+                                       /* Json */              "{\n\ta: {a:1, 
b:'foo'}\n}",
+                                       /* Xml */               
"<object>\n\t<a><a>1</a><b>foo</b></a>\n</object>\n",
+                                       /* Html */              
"<table>\n\t<tr><td>a</td><td><table><tr><td>a</td><td>1</td></tr><tr><td>b</td><td>foo</td></tr></table></td></tr>\n</table>\n",
+                                       /* Uon */               
"(\n\ta=(a=1,b=foo)\n)",
+                                       /* UrlEnc */    
"a=(\n\ta=1,\n\tb=foo\n)"
+                               )
+                       },
+                       {       /* 9 */
+                               new Input(
+                                       "Map1dOfBeans-2",
+                                       new Map1dOfBeans().init1(),
+                                       2,
+                                       /* Json */              "{\n\ta: 
{\n\t\ta: 1,\n\t\tb: 'foo'\n\t}\n}",
+                                       /* Xml */               
"<object>\n\t<a>\n\t\t<a>1</a>\n\t\t<b>foo</b>\n\t</a>\n</object>\n",
+                                       /* Html */              
"<table>\n\t<tr>\n\t\t<td>a</td>\n\t\t<td><table><tr><td>a</td><td>1</td></tr><tr><td>b</td><td>foo</td></tr></table></td>\n\t</tr>\n</table>\n",
+                                       /* Uon */               
"(\n\ta=(\n\t\ta=1,\n\t\tb=foo\n\t)\n)",
+                                       /* UrlEnc */    
"a=(\n\ta=1,\n\tb=foo\n)"
+                               )
+                       },
+                       {       /* 10 */
+                               new Input(
+                                       "Map2dOfBeans-0",
+                                       new Map2dOfBeans().init2(),
+                                       0,
+                                       /* Json */              "{b:{a:{a:1, 
b:'foo'}}}",
+                                       /* Xml */               
"<object><b><a><a>1</a><b>foo</b></a></b></object>\n",
+                                       /* Html */              
"<table><tr><td>b</td><td><table><tr><td>a</td><td><table><tr><td>a</td><td>1</td></tr><tr><td>b</td><td>foo</td></tr></table></td></tr></table></td></tr></table>\n",
+                                       /* Uon */               
"(b=(a=(a=1,b=foo)))",
+                                       /* UrlEnc */    "b=(a=(a=1,b=foo))"
+                               )
+                       },
+                       {       /* 11 */
+                               new Input(
+                                       "Map2dOfBeans-1",
+                                       new Map2dOfBeans().init2(),
+                                       1,
+                                       /* Json */              "{\n\tb: 
{a:{a:1, b:'foo'}}\n}",
+                                       /* Xml */               
"<object>\n\t<b><a><a>1</a><b>foo</b></a></b>\n</object>\n",
+                                       /* Html */              
"<table>\n\t<tr><td>b</td><td><table><tr><td>a</td><td><table><tr><td>a</td><td>1</td></tr><tr><td>b</td><td>foo</td></tr></table></td></tr></table></td></tr>\n</table>\n",
+                                       /* Uon */               
"(\n\tb=(a=(a=1,b=foo))\n)",
+                                       /* UrlEnc */    
"b=(\n\ta=(a=1,b=foo)\n)"
+                               )
+                       },
+                       {       /* 12 */
+                               new Input(
+                                       "Map2dOfBeans-2",
+                                       new Map2dOfBeans().init2(),
+                                       2,
+                                       /* Json */              "{\n\tb: 
{\n\t\ta: {a:1, b:'foo'}\n\t}\n}",
+                                       /* Xml */               
"<object>\n\t<b>\n\t\t<a><a>1</a><b>foo</b></a>\n\t</b>\n</object>\n",
+                                       /* Html */              
"<table>\n\t<tr>\n\t\t<td>b</td>\n\t\t<td><table><tr><td>a</td><td><table><tr><td>a</td><td>1</td></tr><tr><td>b</td><td>foo</td></tr></table></td></tr></table></td>\n\t</tr>\n</table>\n",
+                                       /* Uon */               
"(\n\tb=(\n\t\ta=(a=1,b=foo)\n\t)\n)",
+                                       /* UrlEnc */    
"b=(\n\ta=(\n\t\ta=1,\n\t\tb=foo\n\t)\n)"
+                               )
+                       },
+                       {       /* 13 */
+                               new Input(
+                                       "Map2dOfBeans-3",
+                                       new Map2dOfBeans().init2(),
+                                       3,
+                                       /* Json */              "{\n\tb: 
{\n\t\ta: {\n\t\t\ta: 1,\n\t\t\tb: 'foo'\n\t\t}\n\t}\n}",
+                                       /* Xml */               
"<object>\n\t<b>\n\t\t<a>\n\t\t\t<a>1</a>\n\t\t\t<b>foo</b>\n\t\t</a>\n\t</b>\n</object>\n",
+                                       /* Html */              
"<table>\n\t<tr>\n\t\t<td>b</td>\n\t\t<td>\n\t\t\t<table><tr><td>a</td><td><table><tr><td>a</td><td>1</td></tr><tr><td>b</td><td>foo</td></tr></table></td></tr></table>\n\t\t</td>\n\t</tr>\n</table>\n",
+                                       /* Uon */               
"(\n\tb=(\n\t\ta=(\n\t\t\ta=1,\n\t\t\tb=foo\n\t\t)\n\t)\n)",
+                                       /* UrlEnc */    
"b=(\n\ta=(\n\t\ta=1,\n\t\tb=foo\n\t)\n)"
+                               )
+                       },
+               });
+       }
+
+       Input input;
+
+       public MaxIndentTest(Input input) {
+               this.input = input;
+       }
+
+       static class Input {
+               String label;
+               Object in;
+               int maxDepth;
+               String json, xml, html, uon, urlEnc;
+
+               Input(String label, Object in, int maxDepth, String json, 
String xml, String html, String uon, String urlEnc) {
+                       this.label = label;
+                       this.in = in;
+                       this.maxDepth = maxDepth;
+                       this.json = json;
+                       this.xml = xml;
+                       this.html = html;
+                       this.uon = uon;
+                       this.urlEnc = urlEnc;
+               }
+       }
+
+       public static class List1dOfBeans extends LinkedList<ABean> {
+               public List1dOfBeans init1() {
+                       add(new ABean().init());
+                       return this;
+               }
+       }
+
+       public static class List2dOfBeans extends LinkedList<List1dOfBeans> {
+               public List2dOfBeans init2() {
+                       add(new List1dOfBeans().init1());
+                       return this;
+               }
+       }
+
+       public static class Map1dOfBeans extends LinkedHashMap<String,ABean> {
+               public Map1dOfBeans init1() {
+                       put("a", new ABean().init());
+                       return this;
+               }
+       }
+
+       public static class Map2dOfBeans extends 
LinkedHashMap<String,Map1dOfBeans> {
+               public Map2dOfBeans init2() {
+                       put("b", new Map1dOfBeans().init1());
+                       return this;
+               }
+       }
+
+       @Test
+       public void a1_serializeJson() throws Exception {
+               WriterSerializer s = 
JsonSerializer.DEFAULT_LAX_READABLE.builder().maxIndent(input.maxDepth).build();
+               testSerialize("json", s, input.json);
+       }
+
+       @Test
+       public void b11_serializeXml() throws Exception {
+               WriterSerializer s = 
XmlSerializer.DEFAULT_SQ_READABLE.builder().maxIndent(input.maxDepth).build();
+               testSerialize("xml", s, input.xml);
+       }
+
+       @Test
+       public void c11_serializeHtml() throws Exception {
+               WriterSerializer s = 
HtmlSerializer.DEFAULT_SQ_READABLE.builder().maxIndent(input.maxDepth).build();
+               testSerialize("html", s, input.html);
+       }
+
+       @Test
+       public void d11_serializeUon() throws Exception {
+               WriterSerializer s = 
UonSerializer.DEFAULT_READABLE.builder().maxIndent(input.maxDepth).build();
+               testSerialize("uon", s, input.uon);
+       }
+
+       @Test
+       public void e11_serializeUrlEncoding() throws Exception {
+               WriterSerializer s = 
UrlEncodingSerializer.DEFAULT_READABLE.builder().maxIndent(input.maxDepth).build();
+               testSerialize("urlEncoding", s, input.urlEnc);
+       }
+
+       private void testSerialize(String testName, Serializer s, String 
expected) throws Exception {
+               try {
+                       String r = s.isWriterSerializer() ? 
((WriterSerializer)s).serialize(input.in) : 
((OutputStreamSerializer)s).serializeToHex(input.in);
+
+                       // Specifying "xxx" in the expected results will spit 
out what we should populate the field with.
+                       if (expected.equals("xxx")) {
+                               System.out.println(input.label + "/" + testName 
+ "=\n" + r.replaceAll("\n", "\\\\n").replaceAll("\t", "\\\\t")); // NOT DEBUG
+                               System.out.println(r);
+                               return;
+                       }
+
+                       TestUtils.assertEquals(expected, r, "{0}/{1} 
parse-normal failed", input.label, testName);
+
+               } catch (AssertionError e) {
+                       throw e;
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       throw new AssertionError(input.label + "/" + testName + 
" failed.  exception=" + e.getLocalizedMessage());
+               }
+       }
+
+}
\ No newline at end of file

Reply via email to