http://git-wip-us.apache.org/repos/asf/nifi/blob/2c8c9374/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestWriteXMLResult.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestWriteXMLResult.java
 
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestWriteXMLResult.java
new file mode 100755
index 0000000..37fff12
--- /dev/null
+++ 
b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestWriteXMLResult.java
@@ -0,0 +1,1399 @@
+/*
+ * 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.nifi.xml;
+
+import org.apache.nifi.logging.ComponentLog;
+import org.apache.nifi.schema.access.SchemaNameAsAttribute;
+import org.apache.nifi.serialization.SimpleRecordSchema;
+import org.apache.nifi.serialization.record.DataType;
+import org.apache.nifi.serialization.record.MapRecord;
+import org.apache.nifi.serialization.record.Record;
+import org.apache.nifi.serialization.record.RecordField;
+import org.apache.nifi.serialization.record.RecordFieldType;
+import org.apache.nifi.serialization.record.RecordSchema;
+import org.apache.nifi.serialization.record.RecordSet;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.xmlunit.diff.DefaultNodeMatcher;
+import org.xmlunit.diff.ElementSelectors;
+import org.xmlunit.matchers.CompareMatcher;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.math.BigInteger;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+
+import static org.apache.nifi.xml.ArrayWrapping.NO_WRAPPING;
+import static org.apache.nifi.xml.ArrayWrapping.USE_PROPERTY_AS_WRAPPER;
+import static org.apache.nifi.xml.ArrayWrapping.USE_PROPERTY_FOR_ELEMENTS;
+import static org.apache.nifi.record.NullSuppression.ALWAYS_SUPPRESS;
+import static org.apache.nifi.record.NullSuppression.NEVER_SUPPRESS;
+import static org.apache.nifi.record.NullSuppression.SUPPRESS_MISSING;
+import static org.apache.nifi.xml.TestWriteXMLResultUtils.DATE_FORMAT;
+import static 
org.apache.nifi.xml.TestWriteXMLResultUtils.SCHEMA_IDENTIFIER_RECORD;
+import static org.apache.nifi.xml.TestWriteXMLResultUtils.TIMESTAMP_FORMAT;
+import static org.apache.nifi.xml.TestWriteXMLResultUtils.TIME_FORMAT;
+import static 
org.apache.nifi.xml.TestWriteXMLResultUtils.getEmptyNestedRecordDefinedSchema;
+import static 
org.apache.nifi.xml.TestWriteXMLResultUtils.getEmptyNestedRecordEmptyNestedSchema;
+import static 
org.apache.nifi.xml.TestWriteXMLResultUtils.getEmptyRecordsWithEmptySchema;
+import static org.apache.nifi.xml.TestWriteXMLResultUtils.getNestedRecords;
+import static 
org.apache.nifi.xml.TestWriteXMLResultUtils.getNestedRecordsWithOnlyNullValues;
+import static 
org.apache.nifi.xml.TestWriteXMLResultUtils.getNestedRecordsWithNullValues;
+import static 
org.apache.nifi.xml.TestWriteXMLResultUtils.getRecordWithSimpleArray;
+import static 
org.apache.nifi.xml.TestWriteXMLResultUtils.getRecordWithSimpleMap;
+import static org.apache.nifi.xml.TestWriteXMLResultUtils.getSimpleRecords;
+import static 
org.apache.nifi.xml.TestWriteXMLResultUtils.getSimpleRecordsWithChoice;
+import static 
org.apache.nifi.xml.TestWriteXMLResultUtils.getSimpleRecordsWithNullValues;
+import static 
org.apache.nifi.xml.TestWriteXMLResultUtils.getSimpleRecordsWithoutIdentifierInSchema;
+import static org.apache.nifi.xml.TestWriteXMLResultUtils.getSingleRecord;
+import static org.junit.Assert.assertThat;
+
+public class TestWriteXMLResult {
+
+    @Test
+    public void testRecordNameIsNullSchemaIdentifierMissing() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecordsWithoutIdentifierInSchema();
+
+        final String expectedMessage = "The property 'Name of Record Tag' has 
not been set and the writer does not find a record name in the schema.";
+        final StringBuilder actualMessage = new StringBuilder();
+
+        try {
+            new WriteXMLResult(Mockito.mock(ComponentLog.class), 
recordSet.getSchema(), new SchemaNameAsAttribute(),
+                    out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "root", 
null, "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        } catch (IOException e) {
+            actualMessage.append(e.getMessage());
+        }
+        Assert.assertEquals(expectedMessage, actualMessage.toString());
+
+    }
+
+    @Test
+    public void testRecordNameIsNullSchemaIdentifierExists() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecords();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", null, 
"UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isIdenticalTo(out.toString()).ignoreWhitespace());
+
+    }
+
+    @Test
+    public void testRootNameIsNull() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecords();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, null, "PERSON", 
"UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        final String expectedMessage = "The writer attempts to write multiple 
record although property \'Name of Root Tag\' " +
+                "has not been set. If the XMLRecordSetWriter is supposed to 
write multiple records into one FlowFile, this property is required to be 
configured.";
+        final StringBuilder actualMessage = new StringBuilder();
+
+        try {
+            writer.write(recordSet);
+
+        } catch (IOException e) {
+            actualMessage.append(e.getMessage());
+        }
+        Assert.assertEquals(expectedMessage, actualMessage.toString());
+    }
+
+    @Test
+    public void testSingleRecord() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSingleRecord();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, null, "PERSON", 
"UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>";
+
+        assertThat(xmlResult, 
CompareMatcher.isIdenticalTo(out.toString()).ignoreWhitespace());
+    }
+
+    @Test
+    public void testDataTypes() throws IOException, ParseException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        final List<RecordField> fields = new ArrayList<>();
+
+        for (final RecordFieldType fieldType : RecordFieldType.values()) {
+
+            if (fieldType == RecordFieldType.CHOICE) {
+                final List<DataType> possibleTypes = new ArrayList<>();
+                possibleTypes.add(RecordFieldType.INT.getDataType());
+                possibleTypes.add(RecordFieldType.LONG.getDataType());
+
+                fields.add(new RecordField(fieldType.name().toLowerCase(), 
fieldType.getChoiceDataType(possibleTypes)));
+
+            } else if (fieldType == RecordFieldType.MAP) {
+                fields.add(new RecordField(fieldType.name().toLowerCase(), 
fieldType.getMapDataType(RecordFieldType.INT.getDataType())));
+
+            } else {
+                fields.add(new RecordField(fieldType.name().toLowerCase(), 
fieldType.getDataType()));
+            }
+        }
+        final RecordSchema schema = new SimpleRecordSchema(fields, 
SCHEMA_IDENTIFIER_RECORD);
+
+        final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
+        df.setTimeZone(TimeZone.getTimeZone("gmt"));
+        final long time = df.parse("2017/01/01 17:00:00.000").getTime();
+
+        final Map<String, Object> map = new LinkedHashMap<>();
+        map.put("height", 48);
+        map.put("width", 96);
+
+        final Map<String, Object> valueMap = new LinkedHashMap<>();
+        valueMap.put("string", "string");
+        valueMap.put("boolean", true);
+        valueMap.put("byte", (byte) 1);
+        valueMap.put("char", 'c');
+        valueMap.put("short", (short) 8);
+        valueMap.put("int", 9);
+        valueMap.put("bigint", BigInteger.valueOf(8L));
+        valueMap.put("long", 8L);
+        valueMap.put("float", 8.0F);
+        valueMap.put("double", 8.0D);
+        valueMap.put("date", new Date(time));
+        valueMap.put("time", new Time(time));
+        valueMap.put("timestamp", new Timestamp(time));
+        valueMap.put("record", null);
+        valueMap.put("array", null);
+        valueMap.put("choice", 48L);
+        valueMap.put("map", map);
+
+        final Record record = new MapRecord(schema, valueMap);
+        final RecordSet rs = RecordSet.of(schema, record);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), rs.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"RECORD", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(rs);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><RECORD><string>string</string><boolean>true</boolean><byte>1</byte><char>c</char><short>8</short>"
 +
+                
"<int>9</int><bigint>8</bigint><long>8</long><float>8.0</float><double>8.0</double><date>2017-01-01</date>"
 +
+                "<time>17:00:00</time><timestamp>2017-01-01 
17:00:00</timestamp><record /><choice>48</choice><array />" +
+                
"<map><height>48</height><width>96</width></map></RECORD></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleRecord() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecords();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isIdenticalTo(out.toString()).ignoreWhitespace());
+    }
+
+    @Test
+    public void testSimpleRecordWithNullValuesAlwaysSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecordsWithNullValues();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isIdenticalTo(out.toString()).ignoreWhitespace());
+    }
+
+    @Test
+    public void testSimpleRecordWithNullValuesNeverSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecordsWithNullValues();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><NAME></NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><NAME></NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isIdenticalTo(out.toString()).ignoreWhitespace());
+    }
+
+    @Test
+    public void testSimpleRecordWithNullValuesSuppressMissings() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecordsWithNullValues();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, SUPPRESS_MISSING, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><NAME></NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isIdenticalTo(out.toString()).ignoreWhitespace());
+    }
+
+    @Test
+    public void testEmptyRecordWithEmptySchema() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getEmptyRecordsWithEmptySchema();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isIdenticalTo(out.toString()).ignoreWhitespace());
+    }
+
+    @Test
+    public void testNestedRecord() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getNestedRecords();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY>" +
+                "<ADDRESS><STREET>292 West Street</STREET><CITY>Jersey 
City</CITY></ADDRESS></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY><ADDRESS>" +
+                "<STREET>123 6th 
St.</STREET><CITY>Seattle</CITY></ADDRESS></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testNestedRecordWithNullValuesAlwaysSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getNestedRecordsWithNullValues();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><ADDRESS><CITY>Jersey 
City</CITY></ADDRESS><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><ADDRESS><CITY>Seattle</CITY></ADDRESS><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testNestedRecordWithNullValuesNeverSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getNestedRecordsWithNullValues();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY>" +
+                "<ADDRESS><STREET></STREET><CITY>Jersey 
City</CITY></ADDRESS></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY><ADDRESS>" +
+                
"<STREET></STREET><CITY>Seattle</CITY></ADDRESS></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testNestedRecordWithNullValuesSuppressMissings() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getNestedRecordsWithNullValues();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, SUPPRESS_MISSING, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY>" +
+                "<ADDRESS><STREET></STREET><CITY>Jersey 
City</CITY></ADDRESS></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY><ADDRESS>" +
+                "<CITY>Seattle</CITY></ADDRESS></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testNestedRecordWithOnlyNullValuesAlwaysSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = getNestedRecordsWithOnlyNullValues();
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testNestedRecordWithOnlyNullValuesNeverSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = getNestedRecordsWithOnlyNullValues();
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><ADDRESS><STREET></STREET><CITY></CITY></ADDRESS>" +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><ADDRESS><STREET></STREET><CITY></CITY></ADDRESS>" +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testEmptyNestedRecordEmptySchemaNeverSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = getEmptyNestedRecordEmptyNestedSchema();
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><ADDRESS></ADDRESS><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><ADDRESS></ADDRESS><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testEmptyNestedRecordEmptySchemaAlwaysSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = getEmptyNestedRecordEmptyNestedSchema();
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testNestedEmptyRecordDefinedSchemaSuppressMissing() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = getEmptyNestedRecordDefinedSchema();
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, SUPPRESS_MISSING, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><ADDRESS></ADDRESS><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><ADDRESS></ADDRESS><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleArray() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.WITHOUT_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN>Tom</CHILDREN><CHILDREN>Anna</CHILDREN><CHILDREN>Ben</CHILDREN>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN>Tom</CHILDREN><CHILDREN>Anna</CHILDREN><CHILDREN>Ben</CHILDREN>"
 +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleArrayWithNullValuesAlwaysSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.HAS_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN>Tom</CHILDREN><CHILDREN>Ben</CHILDREN>" +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><CHILDREN>Tom</CHILDREN><CHILDREN>Ben</CHILDREN>" +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleArrayWithNullValuesNeverSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.HAS_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN>Tom</CHILDREN><CHILDREN></CHILDREN><CHILDREN>Ben</CHILDREN>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN>Tom</CHILDREN><CHILDREN></CHILDREN><CHILDREN>Ben</CHILDREN>" 
+
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleArrayWithOnlyNullValuesAlwaysSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.ONLY_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleArrayWithOnlyNullValuesAlwaysSuppressWrapping() 
throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.ONLY_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, USE_PROPERTY_AS_WRAPPER, "ARRAY", 
"ROOT", "PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testEmptyArray() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.EMPTY);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testEmptyArrayNeverSupressPropAsWrapper() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.EMPTY);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, USE_PROPERTY_AS_WRAPPER, "ARRAY", 
"ROOT", "PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><ARRAY></ARRAY><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><ARRAY></ARRAY><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleArrayPropAsWrapper() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.WITHOUT_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, USE_PROPERTY_AS_WRAPPER, "ARRAY", 
"ROOT", "PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><ARRAY><CHILDREN>Tom</CHILDREN><CHILDREN>Anna</CHILDREN><CHILDREN>Ben</CHILDREN></ARRAY>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><ARRAY><CHILDREN>Tom</CHILDREN><CHILDREN>Anna</CHILDREN><CHILDREN>Ben</CHILDREN></ARRAY>"
 +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleArrayPropForElem() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.WITHOUT_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, USE_PROPERTY_FOR_ELEMENTS, "ELEM", 
"ROOT", "PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN><ELEM>Tom</ELEM><ELEM>Anna</ELEM><ELEM>Ben</ELEM></CHILDREN>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN><ELEM>Tom</ELEM><ELEM>Anna</ELEM><ELEM>Ben</ELEM></CHILDREN>"
 +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleMapAlwaysSuppressWithoutNull() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.WITHOUT_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3><CHILD2>Anna</CHILD2></CHILDREN>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3><CHILD2>Anna</CHILD2></CHILDREN>"
 +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleMapAlwaysSuppressHasNull() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.HAS_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3></CHILDREN>" +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3></CHILDREN>" +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleMapAlwaysSuppressOnlyNull() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.ONLY_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleMapAlwaysSuppressEmpty() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.EMPTY);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        System.out.println(out.toString());
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleMapNeverSuppressHasNull() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.HAS_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3><CHILD2></CHILD2></CHILDREN>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3><CHILD2></CHILD2></CHILDREN>"
 +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testSimpleMapNeverSuppressEmpty() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.EMPTY);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><CHILDREN></CHILDREN><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><CHILDREN></CHILDREN><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testChoice() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecordsWithChoice();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+
+    /*
+    *
+    *
+    * Test writeRawRecord
+    *
+    *
+     */
+
+
+    @Test
+    public void testWriteWithoutSchemaSimpleRecord() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecords();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void 
testWriteWithoutSchemaSimpleRecordWithNullValuesAlwaysSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecordsWithNullValues();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = 
"<ROOT><PERSON><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void 
testWriteWithoutSchemaSimpleRecordWithNullValuesNeverSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecordsWithNullValues();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = 
"<ROOT><PERSON><NAME></NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void 
testWriteWithoutSchemaSimpleRecordWithNullValuesSuppressMissings() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getSimpleRecordsWithNullValues();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, SUPPRESS_MISSING, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = 
"<ROOT><PERSON><NAME></NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaNestedRecord() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getNestedRecords();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY>" +
+                "<ADDRESS><STREET>292 West Street</STREET><CITY>Jersey 
City</CITY></ADDRESS></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY><ADDRESS>" +
+                "<STREET>123 6th 
St.</STREET><CITY>Seattle</CITY></ADDRESS></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void 
testWriteWithoutSchemaNestedRecordWithNullValuesAlwaysSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getNestedRecordsWithNullValues();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY>" +
+                "<ADDRESS><CITY>Jersey City</CITY></ADDRESS></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY><ADDRESS>" +
+                "<CITY>Seattle</CITY></ADDRESS></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void 
testWriteWithoutSchemaNestedRecordWithNullValuesNeverSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+        RecordSet recordSet = getNestedRecordsWithNullValues();
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY>" +
+                "<ADDRESS><STREET></STREET><CITY>Jersey 
City</CITY></ADDRESS></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY><ADDRESS>" +
+                "<CITY>Seattle</CITY></ADDRESS></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void 
testWriteWithoutSchemaNestedRecordWithOnlyNullValuesAlwaysSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = getNestedRecordsWithOnlyNullValues();
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void 
testWriteWithoutSchemaNestedRecordWithOnlyNullValuesNeverSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = getNestedRecordsWithOnlyNullValues();
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = 
"<ROOT><PERSON><ADDRESS><STREET></STREET><CITY></CITY></ADDRESS>" +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><ADDRESS></ADDRESS>" +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaSimpleArray() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.WITHOUT_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN>Tom</CHILDREN><CHILDREN>Anna</CHILDREN><CHILDREN>Ben</CHILDREN>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN>Tom</CHILDREN><CHILDREN>Anna</CHILDREN><CHILDREN>Ben</CHILDREN>"
 +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void 
testWriteWithoutSchemaSimpleArrayWithNullValuesAlwaysSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.HAS_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN>Tom</CHILDREN><CHILDREN>Ben</CHILDREN>" +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><CHILDREN>Tom</CHILDREN><CHILDREN>Ben</CHILDREN>" +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaSimpleArrayWithNullValuesNeverSuppress() 
throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.HAS_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN>Tom</CHILDREN><CHILDREN></CHILDREN><CHILDREN>Ben</CHILDREN>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN>Tom</CHILDREN><CHILDREN></CHILDREN><CHILDREN>Ben</CHILDREN>" 
+
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void 
testWriteWithoutSchemaSimpleArrayWithOnlyNullValuesAlwaysSuppress() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.ONLY_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void 
testWriteWithoutSchemaSimpleArrayWithOnlyNullValuesAlwaysSuppressWrapping() 
throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.ONLY_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, USE_PROPERTY_AS_WRAPPER, "ARRAY", 
"ROOT", "PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaEmptyArray() throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.EMPTY);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaEmptyArrayNeverSupressPropAsWrapper() 
throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.EMPTY);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, USE_PROPERTY_AS_WRAPPER, "ARRAY", 
"ROOT", "PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><ARRAY></ARRAY><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><ARRAY></ARRAY><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaSimpleArrayPropAsWrapper() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.WITHOUT_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, USE_PROPERTY_AS_WRAPPER, "ARRAY", 
"ROOT", "PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = 
"<ROOT><PERSON><ARRAY><CHILDREN>Tom</CHILDREN><CHILDREN>Anna</CHILDREN><CHILDREN>Ben</CHILDREN></ARRAY>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><ARRAY><CHILDREN>Tom</CHILDREN><CHILDREN>Anna</CHILDREN><CHILDREN>Ben</CHILDREN></ARRAY>"
 +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaSimpleArrayPropForElem() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleArray(TestWriteXMLResultUtils.NullValues.WITHOUT_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, USE_PROPERTY_FOR_ELEMENTS, "ELEM", 
"ROOT", "PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN><ELEM>Tom</ELEM><ELEM>Anna</ELEM><ELEM>Ben</ELEM></CHILDREN>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN><ELEM>Tom</ELEM><ELEM>Anna</ELEM><ELEM>Ben</ELEM></CHILDREN>"
 +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaSimpleMapAlwaysSuppressWithoutNull() 
throws IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.WITHOUT_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3><CHILD2>Anna</CHILD2></CHILDREN>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3><CHILD2>Anna</CHILD2></CHILDREN>"
 +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaSimpleMapAlwaysSuppressHasNull() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.HAS_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.write(recordSet);
+        writer.flush();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3></CHILDREN>" +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3></CHILDREN>" +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaSimpleMapAlwaysSuppressOnlyNull() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.ONLY_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaSimpleMapAlwaysSuppressEmpty() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.EMPTY);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, ALWAYS_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaSimpleMapNeverSuppressHasNull() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.HAS_NULL);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = 
"<ROOT><PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3><CHILD2></CHILD2></CHILDREN>"
 +
+                "<NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                
"<PERSON><CHILDREN><CHILD1>Tom</CHILD1><CHILD3>Ben</CHILD3><CHILD2></CHILD2></CHILDREN>"
 +
+                "<NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+
+    @Test
+    public void testWriteWithoutSchemaSimpleMapNeverSuppressEmpty() throws 
IOException {
+        OutputStream out = new ByteArrayOutputStream();
+
+        RecordSet recordSet = 
getRecordWithSimpleMap(TestWriteXMLResultUtils.NullValues.EMPTY);
+
+        WriteXMLResult writer = new 
WriteXMLResult(Mockito.mock(ComponentLog.class), recordSet.getSchema(), new 
SchemaNameAsAttribute(),
+                out, true, NEVER_SUPPRESS, NO_WRAPPING, null, "ROOT", 
"PERSON", "UTF-8", DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT);
+
+        writer.onBeginRecordSet();
+
+        Record record;
+        while ((record = recordSet.next()) != null) {
+            writer.writeRawRecord(record);
+        }
+
+        writer.onFinishRecordSet();
+        writer.flush();
+        writer.close();
+
+        String xmlResult = "<ROOT><PERSON><CHILDREN></CHILDREN><NAME>Cleve 
Butler</NAME><AGE>42</AGE><COUNTRY>USA</COUNTRY></PERSON>" +
+                "<PERSON><CHILDREN></CHILDREN><NAME>Ainslie 
Fletcher</NAME><AGE>33</AGE><COUNTRY>UK</COUNTRY></PERSON></ROOT>";
+
+        assertThat(xmlResult, 
CompareMatcher.isSimilarTo(out.toString()).ignoreWhitespace().withNodeMatcher(new
 DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+    }
+}

Reply via email to