You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/08/27 22:22:22 UTC

[6/6] incubator-juneau git commit: Support serializing directly from Readers and InputStreams.

Support serializing directly from Readers and InputStreams.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/b37d99ba
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/b37d99ba
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/b37d99ba

Branch: refs/heads/master
Commit: b37d99bac5ddc63de368d5dbdd98f25347540ce7
Parents: 23fe563
Author: JamesBognar <ja...@apache.org>
Authored: Sun Aug 27 18:22:10 2017 -0400
Committer: JamesBognar <ja...@apache.org>
Committed: Sun Aug 27 18:22:10 2017 -0400

----------------------------------------------------------------------
 .../java/org/apache/juneau/jena/RdfParser.java  |    23 +-
 .../apache/juneau/jena/RdfParserBuilder.java    |     2 +-
 .../org/apache/juneau/jena/RdfSerializer.java   |    41 +-
 .../juneau/jena/RdfSerializerBuilder.java       |     2 +-
 .../juneau/jena/RdfSerializerSession.java       |     5 +-
 .../test/java/org/apache/juneau/ComboInput.java |    11 +-
 .../org/apache/juneau/ComboRoundTripTest.java   |   708 +
 .../org/apache/juneau/ComboSerializeTest.java   |   367 +
 .../test/java/org/apache/juneau/ComboTest.java  |   708 -
 .../org/apache/juneau/DynaBeanComboTest.java    |     2 +-
 .../apache/juneau/dto/html5/Html5ComboTest.java |     2 +-
 .../dto/html5/Html5TemplateComboTest.java       |     2 +-
 .../apache/juneau/parser/ParserGroupTest.java   |    25 +-
 .../serializer/ReaderObjectComboTest.java       |   439 +
 .../juneau/serializer/SerializerGroupTest.java  |    34 +-
 .../transforms/BeanDictionaryComboTest.java     |     2 +-
 .../ByteArrayBase64SwapComboTest.java           |     2 +-
 .../transforms/CalendarSwapComboTest.java       |     2 +-
 .../juneau/transforms/DateSwapComboTest.java    |     2 +-
 .../juneau/transforms/ReaderObjectSwapTest.java |   494 +
 .../org/apache/juneau/annotation/Consumes.java  |    72 -
 .../org/apache/juneau/annotation/Produces.java  |    85 -
 .../java/org/apache/juneau/csv/CsvParser.java   |     4 +-
 .../org/apache/juneau/csv/CsvSerializer.java    |     4 +-
 .../apache/juneau/csv/CsvSerializerSession.java |     1 -
 .../apache/juneau/html/HtmlDocSerializer.java   |    29 +-
 .../java/org/apache/juneau/html/HtmlParser.java |     4 +-
 .../juneau/html/HtmlSchemaDocSerializer.java    |    32 +-
 .../org/apache/juneau/html/HtmlSerializer.java  |    32 +-
 .../juneau/html/HtmlSerializerSession.java      |    11 +-
 .../juneau/html/HtmlStrippedDocSerializer.java  |    29 +-
 .../java/org/apache/juneau/http/MediaType.java  |    32 +-
 .../org/apache/juneau/internal/IOUtils.java     |    99 +-
 .../java/org/apache/juneau/jso/JsoParser.java   |     4 +-
 .../org/apache/juneau/jso/JsoSerializer.java    |     4 +-
 .../apache/juneau/jso/JsoSerializerSession.java |     3 +-
 .../java/org/apache/juneau/json/JsonParser.java |    14 +-
 .../juneau/json/JsonSchemaSerializer.java       |     8 +-
 .../json/JsonSchemaSerializerSession.java       |     1 -
 .../org/apache/juneau/json/JsonSerializer.java  |    39 +-
 .../juneau/json/JsonSerializerSession.java      |     5 +-
 .../apache/juneau/msgpack/MsgPackParser.java    |     6 +-
 .../juneau/msgpack/MsgPackSerializer.java       |     4 +-
 .../msgpack/MsgPackSerializerSession.java       |     8 +-
 .../apache/juneau/parser/InputStreamParser.java |    15 +-
 .../java/org/apache/juneau/parser/Parser.java   |    53 +-
 .../org/apache/juneau/parser/ParserSession.java |     4 +-
 .../apache/juneau/parser/ParserSessionArgs.java |     5 -
 .../org/apache/juneau/parser/ReaderParser.java  |    13 +-
 .../java/org/apache/juneau/parser/package.html  |     6 +-
 .../juneau/plaintext/PlainTextParser.java       |    17 +-
 .../juneau/plaintext/PlainTextSerializer.java   |    33 +-
 .../plaintext/PlainTextSerializerSession.java   |     1 -
 .../serializer/OutputStreamSerializer.java      |    33 +-
 .../OutputStreamSerializerSession.java          |     1 -
 .../apache/juneau/serializer/Serializer.java    |    70 +-
 .../juneau/serializer/SerializerSession.java    |     5 +-
 .../serializer/SerializerSessionArgs.java       |     5 -
 .../juneau/serializer/WriterSerializer.java     |    33 +-
 .../serializer/WriterSerializerSession.java     |     1 -
 .../org/apache/juneau/serializer/package.html   |     6 +-
 .../apache/juneau/soap/SoapXmlSerializer.java   |     4 +-
 .../juneau/soap/SoapXmlSerializerSession.java   |     1 -
 .../java/org/apache/juneau/uon/UonParser.java   |    21 +-
 .../org/apache/juneau/uon/UonParserSession.java |    14 +-
 .../org/apache/juneau/uon/UonSerializer.java    |    32 +-
 .../apache/juneau/uon/UonSerializerSession.java |     5 +-
 .../juneau/urlencoding/UrlEncodingParser.java   |     4 +-
 .../urlencoding/UrlEncodingSerializer.java      |    36 +-
 .../UrlEncodingSerializerSession.java           |     4 +-
 .../org/apache/juneau/xml/XmlDocSerializer.java |     2 -
 .../juneau/xml/XmlDocSerializerSession.java     |     1 -
 .../java/org/apache/juneau/xml/XmlParser.java   |    19 +-
 .../xml/XmlSchemaDocSerializerSession.java      |     1 -
 .../apache/juneau/xml/XmlSchemaSerializer.java  |     4 +-
 .../juneau/xml/XmlSchemaSerializerSession.java  |     1 -
 .../org/apache/juneau/xml/XmlSerializer.java    |    35 +-
 .../apache/juneau/xml/XmlSerializerSession.java |    53 +-
 juneau-core/src/main/javadoc/overview.html      | 22623 +++++++++--------
 .../juneau/examples/rest/PhotosResource.java    |     7 +-
 .../juneau/rest/test/AcceptCharsetResource.java |     7 +-
 .../rest/test/CharsetEncodingsResource.java     |     7 +-
 .../rest/test/DefaultContentTypesResource.java  |    27 +-
 .../apache/juneau/rest/test/GroupsResource.java |     7 +-
 .../juneau/rest/test/HeadersResource.java       |     7 +-
 .../juneau/rest/test/InheritanceResource.java   |    39 +-
 .../juneau/rest/test/NlsPropertyResource.java   |     4 +-
 .../juneau/rest/test/OnPostCallResource.java    |     4 +-
 .../juneau/rest/test/OnPreCallResource.java     |     4 +-
 .../juneau/rest/test/ParsersResource.java       |    13 +-
 .../juneau/rest/test/PropertiesResource.java    |     7 +-
 .../juneau/rest/test/SerializersResource.java   |    13 +-
 .../java/org/apache/juneau/rest/package.html    |     6 +-
 .../juneau/rest/response/DefaultHandler.java    |     3 +-
 94 files changed, 14126 insertions(+), 12593 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
index d68c70a..a94c123 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java
@@ -16,7 +16,6 @@ import static org.apache.juneau.jena.Constants.*;
 import static org.apache.juneau.jena.RdfCommonContext.*;
 
 import org.apache.juneau.*;
-import org.apache.juneau.annotation.*;
 import org.apache.juneau.parser.*;
 
 /**
@@ -45,11 +44,10 @@ import org.apache.juneau.parser.*;
  * 
  * See <a class="doclink" href="package-summary.html#TOC">RDF Overview</a> for an overview of RDF support in Juneau.
  */
-@Consumes(value="text/xml+rdf")
 public class RdfParser extends ReaderParser {
 
 	/** Default XML parser, all default settings.*/
-	public static final RdfParser DEFAULT_XML = new RdfParser(PropertyStore.create());
+	public static final RdfParser DEFAULT_XML = new Xml(PropertyStore.create());
 
 	/** Default Turtle parser, all default settings.*/
 	public static final RdfParser DEFAULT_TURTLE = new Turtle(PropertyStore.create());
@@ -62,7 +60,6 @@ public class RdfParser extends ReaderParser {
 
 
 	/** Consumes RDF/XML input */
-	@Consumes("text/xml+rdf")
 	public static class Xml extends RdfParser {
 
 		/**
@@ -71,12 +68,11 @@ public class RdfParser extends ReaderParser {
 		 * @param propertyStore The property store containing all the settings for this object.
 		 */
 		public Xml(PropertyStore propertyStore) {
-			super(propertyStore.copy().append(RDF_language, LANG_RDF_XML));
+			super(propertyStore.copy().append(RDF_language, LANG_RDF_XML), "text/xml+rdf");
 		}
 	}
 
 	/** Consumes N-Triple input */
-	@Consumes(value="text/n-triple")
 	public static class NTriple extends RdfParser {
 
 		/**
@@ -85,12 +81,11 @@ public class RdfParser extends ReaderParser {
 		 * @param propertyStore The property store containing all the settings for this object.
 		 */
 		public NTriple(PropertyStore propertyStore) {
-			super(propertyStore.copy().append(RDF_language, LANG_NTRIPLE));
+			super(propertyStore.copy().append(RDF_language, LANG_NTRIPLE), "text/n-triple");
 		}
 	}
 
 	/** Consumes Turtle input */
-	@Consumes(value="text/turtle")
 	public static class Turtle extends RdfParser {
 
 		/**
@@ -99,12 +94,11 @@ public class RdfParser extends ReaderParser {
 		 * @param propertyStore The property store containing all the settings for this object.
 		 */
 		public Turtle(PropertyStore propertyStore) {
-			super(propertyStore.copy().append(RDF_language, LANG_TURTLE));
+			super(propertyStore.copy().append(RDF_language, LANG_TURTLE), "text/turtle");
 		}
 	}
 
 	/** Consumes N3 input */
-	@Consumes(value="text/n3")
 	public static class N3 extends RdfParser {
 
 		/**
@@ -113,7 +107,7 @@ public class RdfParser extends ReaderParser {
 		 * @param propertyStore The property store containing all the settings for this object.
 		 */
 		public N3(PropertyStore propertyStore) {
-			super(propertyStore.copy().append(RDF_language, LANG_N3));
+			super(propertyStore.copy().append(RDF_language, LANG_N3), "text/n3");
 		}
 	}
 
@@ -124,12 +118,13 @@ public class RdfParser extends ReaderParser {
 	 * Constructor.
 	 * 
 	 * @param propertyStore The property store containing all the settings for this object.
+	 * @param consumes The list of media types that this parser consumes (e.g. <js>"application/json"</js>).
 	 */
-	public RdfParser(PropertyStore propertyStore) {
-		super(propertyStore);
+	public RdfParser(PropertyStore propertyStore, String...consumes) {
+		super(propertyStore, consumes);
 		this.ctx = createContext(RdfParserContext.class);
 	}
-
+	
 	@Override /* CoreObject */
 	public RdfParserBuilder builder() {
 		return new RdfParserBuilder(propertyStore);

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java
index 61b60ca..095d45a 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParserBuilder.java
@@ -47,7 +47,7 @@ public class RdfParserBuilder extends ParserBuilder {
 
 	@Override /* CoreObjectBuilder */
 	public RdfParser build() {
-		return new RdfParser(propertyStore);
+		return new RdfParser(propertyStore, "text/xml+rdf");
 	}
 
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
index e19d8b2..b574186 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializer.java
@@ -16,7 +16,6 @@ import static org.apache.juneau.jena.Constants.*;
 import static org.apache.juneau.jena.RdfCommonContext.*;
 
 import org.apache.juneau.*;
-import org.apache.juneau.annotation.*;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -42,7 +41,6 @@ import org.apache.juneau.serializer.*;
  * 
  * See <a class="doclink" href="package-summary.html#TOC">RDF Overview</a> for an overview of RDF support in Juneau.
  */
-@Produces(value="text/xml+rdf+abbrev", contentType="text/xml+rdf")
 public class RdfSerializer extends WriterSerializer {
 
 	/** Default RDF/XML serializer, all default settings.*/
@@ -62,7 +60,6 @@ public class RdfSerializer extends WriterSerializer {
 
 
 	/** Produces RDF/XML output */
-	@Produces("text/xml+rdf")
 	public static class Xml extends RdfSerializer {
 
 		/**
@@ -71,12 +68,11 @@ public class RdfSerializer extends WriterSerializer {
 		 * @param propertyStore The property store containing all the settings for this object.
 		 */
 		public Xml(PropertyStore propertyStore) {
-			super(propertyStore.copy().append(RDF_language, LANG_RDF_XML));
+			super(propertyStore.copy().append(RDF_language, LANG_RDF_XML), "text/xml+rdf");
 		}
 	}
 
 	/** Produces Abbreviated RDF/XML output */
-	@Produces(value="text/xml+rdf+abbrev", contentType="text/xml+rdf")
 	public static class XmlAbbrev extends RdfSerializer {
 
 		/**
@@ -85,12 +81,11 @@ public class RdfSerializer extends WriterSerializer {
 		 * @param propertyStore The property store containing all the settings for this object.
 		 */
 		public XmlAbbrev(PropertyStore propertyStore) {
-			super(propertyStore.copy().append(RDF_language, LANG_RDF_XML_ABBREV));
+			super(propertyStore.copy().append(RDF_language, LANG_RDF_XML_ABBREV), "text/xml+rdf", "text/xml+rdf+abbrev");
 		}
 	}
 
 	/** Produces N-Triple output */
-	@Produces("text/n-triple")
 	public static class NTriple extends RdfSerializer {
 
 		/**
@@ -99,12 +94,11 @@ public class RdfSerializer extends WriterSerializer {
 		 * @param propertyStore The property store containing all the settings for this object.
 		 */
 		public NTriple(PropertyStore propertyStore) {
-			super(propertyStore.copy().append(RDF_language, LANG_NTRIPLE));
+			super(propertyStore.copy().append(RDF_language, LANG_NTRIPLE), "text/n-triple");
 		}
 	}
 
 	/** Produces Turtle output */
-	@Produces("text/turtle")
 	public static class Turtle extends RdfSerializer {
 
 		/**
@@ -113,12 +107,11 @@ public class RdfSerializer extends WriterSerializer {
 		 * @param propertyStore The property store containing all the settings for this object.
 		 */
 		public Turtle(PropertyStore propertyStore) {
-			super(propertyStore.copy().append(RDF_language, LANG_TURTLE));
+			super(propertyStore.copy().append(RDF_language, LANG_TURTLE), "text/turtle");
 		}
 	}
 
 	/** Produces N3 output */
-	@Produces("text/n3")
 	public static class N3 extends RdfSerializer {
 
 		/**
@@ -127,7 +120,7 @@ public class RdfSerializer extends WriterSerializer {
 		 * @param propertyStore The property store containing all the settings for this object.
 		 */
 		public N3(PropertyStore propertyStore) {
-			super(propertyStore.copy().append(RDF_language, LANG_N3));
+			super(propertyStore.copy().append(RDF_language, LANG_N3), "text/n3");
 		}
 	}
 
@@ -136,11 +129,27 @@ public class RdfSerializer extends WriterSerializer {
 
 	/**
 	 * Constructor.
-	 * 
-	 * @param propertyStore The property store containing all the settings for this object.
+	 *
+	 * @param propertyStore
+	 * 	The property store containing all the settings for this object.
+	 * @param produces
+	 * 	The media type that this serializer produces.
+	 * @param accept
+	 * 	The accept media types that the serializer can handle.
+	 * 	<p>
+	 * 	Can contain meta-characters per the <code>media-type</code> specification of
+	 * 	<a class="doclink" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1">RFC2616/14.1</a>
+	 * 	<p>
+	 * 	If empty, then assumes the only media type supported is <code>produces</code>.
+	 * 	<p>
+	 * 	For example, if this serializer produces <js>"application/json"</js> but should handle media types of
+	 * 	<js>"application/json"</js> and <js>"text/json"</js>, then the arguments should be:
+	 * 	<br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"application/json"</js>, <js>"text/json"</js>);</code>
+	 * 	<br>...or...
+	 * 	<br><code><jk>super</jk>(propertyStore, <js>"application/json"</js>, <js>"*&#8203;/json"</js>);</code>
 	 */
-	public RdfSerializer(PropertyStore propertyStore) {
-		super(propertyStore);
+	public RdfSerializer(PropertyStore propertyStore, String produces, String...accept) {
+		super(propertyStore, produces, accept);
 		this.ctx = createContext(RdfSerializerContext.class);
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
index 196bdfa..59b15c5 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerBuilder.java
@@ -47,7 +47,7 @@ public class RdfSerializerBuilder extends SerializerBuilder {
 
 	@Override /* CoreObjectBuilder */
 	public RdfSerializer build() {
-		return new RdfSerializer(propertyStore);
+		return new RdfSerializer(propertyStore, "text/xml+rdf");
 	}
 
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
index d033c45..0f66237 100644
--- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
+++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
@@ -63,7 +63,6 @@ public final class RdfSerializerSession extends WriterSerializerSession {
 	 * 	These specify session-level information such as locale and URI context.
 	 * 	It also include session-level properties that override the properties defined on the bean and
 	 * 	serializer contexts.
-	 * 	<br>If <jk>null</jk>, defaults to {@link SerializerSessionArgs#DEFAULT}.
 	 */
 	protected RdfSerializerSession(RdfSerializerContext ctx, SerializerSessionArgs args) {
 		super(ctx, args);
@@ -293,6 +292,10 @@ public final class RdfSerializerSession extends WriterSerializerSession {
 				case MULTI_VALUED: serializeToMultiProperties(c, eType, bpm, attrName, parentResource); break;
 				default: n = serializeToContainer(c, eType, m.createSeq());
 			}
+		
+		} else if (sType.isReader() || sType.isInputStream()) {
+			n = m.createLiteral(encodeTextInvalidChars(IOUtils.read(o)));
+		
 		} else {
 			n = m.createLiteral(encodeTextInvalidChars(toString(o)));
 		}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core-test/src/test/java/org/apache/juneau/ComboInput.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/ComboInput.java b/juneau-core-test/src/test/java/org/apache/juneau/ComboInput.java
index 2bfc196..3ee1389 100644
--- a/juneau-core-test/src/test/java/org/apache/juneau/ComboInput.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/ComboInput.java
@@ -21,7 +21,7 @@ import java.lang.reflect.*;
 public class ComboInput<T> {
 
 	final String label;
-	final Object in;
+	private final T in;
 	final Type type;
 	final String json, jsonT, jsonR, xml, xmlT, xmlR, xmlNs, html, htmlT, htmlR, uon, uonT, uonR, urlEncoding,
 		urlEncodingT, urlEncodingR, msgPack, msgPackT, rdfXml, rdfXmlT, rdfXmlR;
@@ -79,6 +79,15 @@ public class ComboInput<T> {
 	}
 
 	/**
+	 * Returns the input object.
+	 * Override this method if you want it dynamically created each time.
+	 * @throws Exception 
+	 */
+	public T getInput() throws Exception {
+		return in;
+	}
+	
+	/**
 	 * Override this method if you want to do a post-parse verification on the object.
 	 * <p>
 	 * Note that a Function would be preferred here, but it's not available in Java 6.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core-test/src/test/java/org/apache/juneau/ComboRoundTripTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/ComboRoundTripTest.java b/juneau-core-test/src/test/java/org/apache/juneau/ComboRoundTripTest.java
new file mode 100644
index 0000000..4da5f1e
--- /dev/null
+++ b/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/b37d99ba/juneau-core-test/src/test/java/org/apache/juneau/ComboSerializeTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/ComboSerializeTest.java b/juneau-core-test/src/test/java/org/apache/juneau/ComboSerializeTest.java
new file mode 100644
index 0000000..6768d91
--- /dev/null
+++ b/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/b37d99ba/juneau-core-test/src/test/java/org/apache/juneau/ComboTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/ComboTest.java b/juneau-core-test/src/test/java/org/apache/juneau/ComboTest.java
deleted file mode 100644
index 510fe01..0000000
--- a/juneau-core-test/src/test/java/org/apache/juneau/ComboTest.java
+++ /dev/null
@@ -1,708 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau;
-
-import static org.apache.juneau.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 ComboTest {
-
-	/* 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 ComboTest(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.in) : ((OutputStreamSerializer)s).serializeToHex(comboInput.in);
-
-			// 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.in) : ((OutputStreamSerializer)s).serializeToHex(comboInput.in);
-			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.in) : ((OutputStreamSerializer)s).serializeToHex(comboInput.in);
-			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.in);
-			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/b37d99ba/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java b/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java
index f15b238..9afaaf8 100644
--- a/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java
@@ -29,7 +29,7 @@ import org.junit.runners.*;
  */
 @RunWith(Parameterized.class)
 @SuppressWarnings({"javadoc"})
-public class DynaBeanComboTest extends ComboTest {
+public class DynaBeanComboTest extends ComboRoundTripTest {
 
 	@Parameterized.Parameters
 	public static Collection<Object[]> getParameters() {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java b/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java
index 5ef24a7..1e25392 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java
@@ -26,7 +26,7 @@ import org.junit.runners.*;
  */
 @RunWith(Parameterized.class)
 @SuppressWarnings({"javadoc"})
-public class Html5ComboTest extends ComboTest {
+public class Html5ComboTest extends ComboRoundTripTest {
 
 	private static final B btag = b("bbb");
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/b37d99ba/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5TemplateComboTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5TemplateComboTest.java b/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5TemplateComboTest.java
index 7fad0fb..e3a3267 100644
--- a/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5TemplateComboTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5TemplateComboTest.java
@@ -28,7 +28,7 @@ import org.junit.runners.*;
  */
 @RunWith(Parameterized.class)
 @SuppressWarnings({"javadoc"})
-public class Html5TemplateComboTest extends ComboTest {
+public class Html5TemplateComboTest extends ComboRoundTripTest {
 
 	@Parameterized.Parameters
 	public static Collection<Object[]> getParameters() {