/*******************************************************************************
 * Copyright (c) 2011, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     David McCann - Novebmer 10, 2011 - 2.4 - Initial implementation
 ******************************************************************************/
package dbws.testing.types;

//javase imports
import java.io.StringReader;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.w3c.dom.Document;

//java eXtension imports
import javax.wsdl.WSDLException;

//JUnit4 imports
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

//EclipseLink imports
import org.eclipse.persistence.internal.xr.Invocation;
import org.eclipse.persistence.internal.xr.Operation;
import org.eclipse.persistence.oxm.XMLMarshaller;
import org.eclipse.persistence.oxm.XMLRoot;
import org.eclipse.persistence.tools.dbws.DBWSBuilder;

//test imports
import dbws.testing.DBWSTestSuite;

/**
 * Tests various types.
 *
 */
public class TypesTestSuite extends DBWSTestSuite {

    static {
        System.setProperty("user.timezone", "Canada/Eastern");
    }

    static final String CREATE_PACKAGE_TEST_TYPES =
    	"CREATE OR REPLACE PACKAGE TEST_TYPES AS" +
          "\nFUNCTION ECHO_INTEGER (PINTEGER IN INTEGER) RETURN INTEGER;" +
          "\nFUNCTION ECHO_SMALLINT(PSMALLINT IN SMALLINT) RETURN SMALLINT;" +
          "\nFUNCTION ECHO_NUMERIC (PNUMERIC IN NUMERIC) RETURN NUMERIC;" +
          "\nFUNCTION ECHO_DEC (PDEC IN DEC) RETURN DEC;" +
          "\nFUNCTION ECHO_DECIMAL (PDECIMAL IN DECIMAL) RETURN DECIMAL;" +
          "\nFUNCTION ECHO_NUMBER (PNUMBER IN NUMBER) RETURN NUMBER;" +
          "\nFUNCTION ECHO_VARCHAR(PVARCHAR IN VARCHAR) RETURN VARCHAR;" +
          "\nFUNCTION ECHO_VARCHAR2 (PINPUTVARCHAR IN VARCHAR2) RETURN VARCHAR2;" +
          "\nFUNCTION ECHO_CHAR (PINPUTCHAR IN CHAR) RETURN CHAR;" +
          "\nFUNCTION ECHO_REAL (PREAL IN REAL) RETURN REAL;" +
          "\nFUNCTION ECHO_FLOAT (PINPUTFLOAT IN FLOAT) RETURN FLOAT;" +
          "\nFUNCTION ECHO_DOUBLE (PDOUBLE IN DOUBLE PRECISION) RETURN DOUBLE PRECISION;" +
          "\nFUNCTION ECHO_DATE (PINPUTDATE IN DATE) RETURN DATE;" +
          "\nFUNCTION ECHO_TIMESTAMP (PINPUTTS IN TIMESTAMP) RETURN TIMESTAMP;" +
          "\nFUNCTION ECHO_CLOB (PINPUTCLOB IN CLOB) RETURN CLOB;" +
          "\nFUNCTION ECHO_BLOB (PINPUTBLOB IN BLOB) RETURN BLOB;" +
          "\nFUNCTION ECHO_LONG (PLONG IN LONG) RETURN LONG;" +
          "\nFUNCTION ECHO_LONG_RAW (PLONGRAW IN LONG RAW) RETURN LONG RAW;" +
          "\nFUNCTION ECHO_RAW(PRAW IN RAW) RETURN RAW;" +
          "\nFUNCTION ECHO_ROWID(PROWID IN ROWID) RETURN ROWID;" +
          "\nFUNCTION ECHO_BOOLEAN(P1 IN BOOLEAN) RETURN BOOLEAN;" +
          "\nPROCEDURE ECHO_BOOLEAN2(P1 IN BOOLEAN, P2 OUT BOOLEAN);" +
          "\nFUNCTION ECHO_NVARCHAR2 (PNVARCHAR IN NVARCHAR2) RETURN NVARCHAR2;" +
          "\nPROCEDURE pEchoNchar(p_nchar in nchar);" +
          "\nFUNCTION fEchoNchar(p_nchar in nchar) return nchar;" +
          "\nPROCEDURE pEchoNvarchar2(p_nvarchar2 in nvarchar2, p_nvarchar22 OUT nvarchar2);" +
        "\nEND;" ;

    static final String CREATE_PACKAGE_BODY_TEST_TYPES =
        "CREATE OR REPLACE PACKAGE BODY TEST_TYPES AS" +
          "\nFUNCTION ECHO_INTEGER (PINTEGER IN INTEGER) RETURN INTEGER IS" +
          "\nBEGIN" +
            "\nRETURN PINTEGER;" +
          "\nEND ECHO_INTEGER;" +
          "\nFUNCTION ECHO_SMALLINT(PSMALLINT IN SMALLINT) RETURN SMALLINT IS" +
          "\nBEGIN" +
            "\nRETURN PSMALLINT;" +
          "\nEND ECHO_SMALLINT;" +
          "\nFUNCTION ECHO_NUMERIC (PNUMERIC IN NUMERIC) RETURN NUMERIC IS" +
          "\nBEGIN" +
            "\nRETURN PNUMERIC;" +
          "\nEND ECHO_NUMERIC;" +
          "\nFUNCTION ECHO_DEC (PDEC IN DEC) RETURN DEC IS" +
          "\nBEGIN" +
            "\nRETURN PDEC;" +
          "\nEND ECHO_DEC;" +
          "\nFUNCTION ECHO_DECIMAL (PDECIMAL IN DECIMAL) RETURN DECIMAL IS" +
          "\nBEGIN" +
            "\nRETURN PDECIMAL;" +
          "\nEND ECHO_DECIMAL;" +
          "\nFUNCTION ECHO_NUMBER (PNUMBER IN NUMBER) RETURN NUMBER IS" +
          "\nBEGIN" +
            "\nRETURN PNUMBER;" +
          "\nEND ECHO_NUMBER;" +
          "\nFUNCTION ECHO_VARCHAR(PVARCHAR IN VARCHAR) RETURN VARCHAR IS" +
          "\nBEGIN" +
            "\nRETURN PVARCHAR;" +
          "\nEND ECHO_VARCHAR;" +
          "\nFUNCTION ECHO_VARCHAR2 (PINPUTVARCHAR IN VARCHAR2) RETURN VARCHAR2 IS" +
          "\nBEGIN" +
            "\nRETURN PINPUTVARCHAR;" +
          "\nEND ECHO_VARCHAR2;" +
          "\nFUNCTION ECHO_NVARCHAR2 (PNVARCHAR IN NVARCHAR2) RETURN NVARCHAR2 IS" +
          "\nBEGIN" +
            "\nRETURN PNVARCHAR;" +
          "\nEND ECHO_NVARCHAR2;" +
          "\nFUNCTION ECHO_CHAR (PINPUTCHAR IN CHAR) RETURN CHAR IS" +
          "\nBEGIN" +
            "\nRETURN PINPUTCHAR;" +
          "\nEND ECHO_CHAR;" +
          "\nFUNCTION ECHO_REAL (PREAL IN REAL) RETURN REAL IS" +
          "\nBEGIN" +
              "\nRETURN PREAL;" +
          "\nEND ECHO_REAL;" +
          "\nFUNCTION ECHO_FLOAT (PINPUTFLOAT IN FLOAT) RETURN FLOAT IS" +
          "\nBEGIN" +
            "\nRETURN PINPUTFLOAT;" +
          "\nEND ECHO_FLOAT;" +
          "\nFUNCTION ECHO_DOUBLE (PDOUBLE IN DOUBLE PRECISION) RETURN DOUBLE PRECISION IS" +
          "\nBEGIN" +
            "\nRETURN PDOUBLE;" +
          "\nEND ECHO_DOUBLE;" +
          "\nFUNCTION ECHO_DATE (PINPUTDATE IN DATE) RETURN DATE IS" +
          "\nBEGIN" +
            "\nRETURN PINPUTDATE;" +
          "\nEND ECHO_DATE;" +
          "\nFUNCTION ECHO_TIMESTAMP (PINPUTTS IN TIMESTAMP) RETURN TIMESTAMP IS" +
          "\nBEGIN" +
            "\nRETURN PINPUTTS;" +
          "\nEND ECHO_TIMESTAMP;" +
          "\nFUNCTION ECHO_CLOB (PINPUTCLOB IN CLOB) RETURN CLOB IS" +
          "\nBEGIN" +
            "\nRETURN PINPUTCLOB;" +
          "\nEND ECHO_CLOB;" +
          "\nFUNCTION ECHO_BLOB (PINPUTBLOB IN BLOB) RETURN BLOB IS" +
          "\nBEGIN" +
            "\nRETURN PINPUTBLOB;" +
          "\nEND ECHO_BLOB;" +
          "\nFUNCTION ECHO_LONG (PLONG IN LONG) RETURN LONG IS" +
          "\nBEGIN" +
            "\nRETURN PLONG;" +
          "\nEND ECHO_LONG;" +
          "\nFUNCTION ECHO_LONG_RAW (PLONGRAW IN LONG RAW) RETURN LONG RAW IS" +
          "\nBEGIN" +
            "\nRETURN PLONGRAW;" +
          "\nEND ECHO_LONG_RAW;" +
          "\nFUNCTION ECHO_RAW(PRAW IN RAW) RETURN RAW IS" +
          "\nBEGIN" +
            "\nRETURN PRAW;" +
          "\nEND ECHO_RAW;" +
          "\nFUNCTION ECHO_ROWID(PROWID IN ROWID) RETURN ROWID IS" +
          "\nBEGIN" +
              "\nRETURN PROWID;" +
          "\nEND ECHO_ROWID;" +
          "\nFUNCTION ECHO_BOOLEAN(P1 IN BOOLEAN) RETURN BOOLEAN IS" +
          "\nBEGIN" +
              "\nRETURN P1;" +
          "\nEND ECHO_BOOLEAN;" +
          "\nPROCEDURE ECHO_BOOLEAN2(P1 IN BOOLEAN, P2 OUT BOOLEAN) IS" +
          "\nBEGIN" +
              "\nP2 := P1;" +
          "\nEND ECHO_BOOLEAN2;" +
		  "\nPROCEDURE pEchoNchar(p_nchar in nchar) AS" +
		  "\nBEGIN" +
		      "\nNULL;" +
		  "\nEND pEchoNchar;" +
          "\nFUNCTION fEchoNchar(p_nchar in nchar) return nchar AS" +
          "\nBEGIN" +
              "\nreturn p_nchar;" +
          "\nEND fEchoNchar;" +
          "\nPROCEDURE pEchoNvarchar2(p_nvarchar2 in nvarchar2, p_nvarchar22 OUT nvarchar2) AS" +
          "\nBEGIN" +
              "\np_nvarchar22 := p_nvarchar2;" +
          "\nEND pEchoNvarchar2;" +
        "\nEND;" ;

    static final String CREATE_XMLTYPEDATA_TABLE =
        "CREATE TABLE XMLTYPEDATA (" +
            "ID NUMBER(4,0) NOT NULL," +
            "XMLDATA XMLType," +
            "PRIMARY KEY (ID)" +
        ")";
    
    static final String[] POPULATE_XMLTYPEDATA_TABLE = new String[] {
        "INSERT INTO XMLTYPEDATA (ID, XMLDATA) VALUES (666, XMLTYPE('<blah>some blah text</blah>'))",
        "INSERT INTO XMLTYPEDATA (ID, XMLDATA) VALUES (667, XMLTYPE('<foo>yo fool!</foo>'))",
    };
    
    static final String DROP_XMLTYPEDATA_TABLE =
        "DROP TABLE XMLTYPEDATA";
    
    static final String DROP_PACKAGE_TEST_TYPES =
        "DROP PACKAGE TEST_TYPES";

    static final String DROP_PACKAGE_BODY_TEST_TYPES =
        "DROP PACKAGE BODY TEST_TYPES";

    static boolean ddlCreate = false;
    static boolean ddlDrop = false;
    static boolean ddlDebug = false;

    @BeforeClass
    public static void setUp() throws WSDLException {
        if (conn == null) {
            try {
                conn = buildConnection();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        String ddlCreateProp = System.getProperty(DATABASE_DDL_CREATE_KEY, DEFAULT_DATABASE_DDL_CREATE);
        if ("true".equalsIgnoreCase(ddlCreateProp)) {
            ddlCreate = true;
        }
        String ddlDropProp = System.getProperty(DATABASE_DDL_DROP_KEY, DEFAULT_DATABASE_DDL_DROP);
        if ("true".equalsIgnoreCase(ddlDropProp)) {
            ddlDrop = true;
        }
        String ddlDebugProp = System.getProperty(DATABASE_DDL_DEBUG_KEY, DEFAULT_DATABASE_DDL_DEBUG);
        if ("true".equalsIgnoreCase(ddlDebugProp)) {
            ddlDebug = true;
        }
        if (ddlCreate) {
            runDdl(conn, CREATE_PACKAGE_TEST_TYPES, ddlDebug);
            runDdl(conn, CREATE_PACKAGE_BODY_TEST_TYPES, ddlDebug);
            
            runDdl(conn, CREATE_XMLTYPEDATA_TABLE, ddlDebug);
            try {
                Statement stmt = conn.createStatement();
                for (int i = 0; i < POPULATE_XMLTYPEDATA_TABLE.length; i++) {
                    stmt.addBatch(POPULATE_XMLTYPEDATA_TABLE[i]);
                }
                stmt.executeBatch();
            }
            catch (SQLException e) {
              //e.printStackTrace();
            }
        }
        DBWS_BUILDER_XML_USERNAME =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
            "<dbws-builder xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
              "<properties>" +
                  "<property name=\"projectName\">Types</property>" +
                  "<property name=\"logLevel\">off</property>" +
                  "<property name=\"username\">";
          DBWS_BUILDER_XML_PASSWORD =
                  "</property><property name=\"password\">";
          DBWS_BUILDER_XML_URL =
                  "</property><property name=\"url\">";
          DBWS_BUILDER_XML_DRIVER =
                  "</property><property name=\"driver\">";
          DBWS_BUILDER_XML_PLATFORM =
                  "</property><property name=\"platformClassname\">";
          DBWS_BUILDER_XML_MAIN =
                  "</property>" +
              "</properties>" +
              "<procedure " +
                  "name=\"echoInteger\" " +
                  "catalogPattern=\"TEST_TYPES\" " +
                  "procedurePattern=\"ECHO_INTEGER\" " +
                  "isSimpleXMLFormat=\"true\" " +
               "/>" +
               "<procedure " +
                  "name=\"echoSmallint\" " +
                  "catalogPattern=\"TEST_TYPES\" " +
                  "procedurePattern=\"ECHO_SMALLINT\" " +
                  "isSimpleXMLFormat=\"true\" " +
               "/>" +
               "<procedure " +
                  "name=\"echoNumeric\" " +
                  "catalogPattern=\"TEST_TYPES\" " +
                  "procedurePattern=\"ECHO_NUMERIC\" " +
                  "isSimpleXMLFormat=\"true\" " +
               "/>" +
	           "<procedure " +
	              "name=\"echoDec\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_DEC\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoDecimal\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_DECIMAL\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoNumber\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_NUMBER\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoVarchar\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_VARCHAR\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoVarchar2\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_VARCHAR2\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
               "<procedure " +
                   "name=\"echoNVarchar2\" " +
                   "catalogPattern=\"TEST_TYPES\" " +
                   "procedurePattern=\"ECHO_NVARCHAR2\" " +
                   "isSimpleXMLFormat=\"true\" " +
                "/>" +
                "<procedure " +
                    "name=\"pEchoNchar\" " +
                    "catalogPattern=\"TEST_TYPES\" " +
                    "procedurePattern=\"pEchoNchar\" " +
                    "isSimpleXMLFormat=\"true\" " +
                 "/>" +
                 "<procedure " +
                     "name=\"fEchoNchar\" " +
                     "catalogPattern=\"TEST_TYPES\" " +
                     "procedurePattern=\"fEchoNchar\" " +
                     "isSimpleXMLFormat=\"true\" " +
                  "/>" +
                  "<procedure " +
                      "name=\"pEchoNvarchar2\" " +
                      "catalogPattern=\"TEST_TYPES\" " +
                      "procedurePattern=\"pEchoNvarchar2\" " +
                      "isSimpleXMLFormat=\"true\" " +
                   "/>" +
	           "<procedure " +
	              "name=\"echoChar\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_CHAR\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoReal\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_REAL\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoFloat\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_FLOAT\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoDouble\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_DOUBLE\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoDate\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_DATE\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoTimestamp\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_TIMESTAMP\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoClob\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_CLOB\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoBlob\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_BLOB\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoLong\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_LONG\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoLongRaw\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_LONG_RAW\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
	           "<procedure " +
	              "name=\"echoRaw\" " +
	              "catalogPattern=\"TEST_TYPES\" " +
	              "procedurePattern=\"ECHO_RAW\" " +
	              "isSimpleXMLFormat=\"true\" " +
	           "/>" +
               "<procedure " +
                   "name=\"echoRowId\" " +
                   "catalogPattern=\"TEST_TYPES\" " +
                   "procedurePattern=\"ECHO_ROWID\" " +
                   "isSimpleXMLFormat=\"true\" " +
                "/>" +
                "<procedure " +
	                "name=\"echoBoolean\" " +
	                "catalogPattern=\"TEST_TYPES\" " +
	                "procedurePattern=\"ECHO_BOOLEAN\" " +
	                "isSimpleXMLFormat=\"true\" " +
	             "/>" +
                "<procedure " +
	                "name=\"echoBoolean2\" " +
	                "catalogPattern=\"TEST_TYPES\" " +
	                "procedurePattern=\"ECHO_BOOLEAN2\" " +
	                "isSimpleXMLFormat=\"true\" " +
	             "/>" +
	             "<sql " +
                    "name=\"selectXMLData\" " +
                    "isSimpleXMLFormat=\"true\" " +
                    ">" +
                    "<text><![CDATA[select * from XMLTYPEDATA]]></text>" +
                "</sql>" +
            "</dbws-builder>";
          builder = new DBWSBuilder();
          DBWSTestSuite.setUp(".");
    }

    @AfterClass
    public static void tearDown() {
        String ddlDrop = System.getProperty(DATABASE_DDL_DROP_KEY, DEFAULT_DATABASE_DDL_DROP);
        if ("true".equalsIgnoreCase(ddlDrop)) {
            runDdl(conn, DROP_PACKAGE_BODY_TEST_TYPES, ddlDebug);
            runDdl(conn, DROP_PACKAGE_TEST_TYPES, ddlDebug);
            runDdl(conn, DROP_XMLTYPEDATA_TABLE, ddlDebug);
        }
    }

    @Test
    public void echoInteger() {
        Invocation invocation = new Invocation("echoInteger");
        invocation.setParameter("PINTEGER", Integer.valueOf(128));
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_INTEGER_RESULT));
        assertTrue("Control document not same as instance document.\nExpected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String ECHO_INTEGER_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>128</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoSmallint() {
        Invocation invocation = new Invocation("echoSmallint");
        invocation.setParameter("PSMALLINT", Integer.valueOf(7));
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_SMALLINT_RESULT));
        assertTrue("Control document not same as instance document.\nExpected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String ECHO_SMALLINT_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>7</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoNumeric() {
        Invocation invocation = new Invocation("echoNumeric");
        invocation.setParameter("PNUMERIC", new BigDecimal("123.45"));
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_NUMERIC_RESULT));
        assertTrue("Control document not same as instance document.\nExpected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String ECHO_NUMERIC_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>123.45</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoDec() {
        Invocation invocation = new Invocation("echoDec");
        invocation.setParameter("PDEC", new BigDecimal("543.21"));
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_DEC_RESULT));
        assertTrue("Control document not same as instance document.\nExpected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String ECHO_DEC_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>543.21</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoDecimal() {
        Invocation invocation = new Invocation("echoDecimal");
        invocation.setParameter("PDECIMAL", new BigDecimal("23.9"));
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_DECIMAL_RESULT));
        assertTrue("Control document not same as instance document.\nExpected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String ECHO_DECIMAL_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>23.9</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoNumber() {
        Invocation invocation = new Invocation("echoNumber");
        invocation.setParameter("PNUMBER", BigDecimal.valueOf(17));
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_NUMBER_RESULT));
        assertTrue("Control document not same as instance document.\nExpected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String ECHO_NUMBER_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>17</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoVarchar() {
        Invocation invocation = new Invocation("echoVarchar");
        invocation.setParameter("PVARCHAR", "this is a varchar test");
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_VARCHAR_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_VARCHAR_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>this is a varchar test</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoVarchar2() {
        Invocation invocation = new Invocation("echoVarchar2");
        invocation.setParameter("PINPUTVARCHAR", "this is a varchar2 test");
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_VARCHAR2_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_VARCHAR2_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>this is a varchar2 test</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoNVarchar2() {
        Invocation invocation = new Invocation("echoNVarchar2");
        invocation.setParameter("PNVARCHAR", "N'qwerty'");
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_NVARCHAR2_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_NVARCHAR2_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>N'qwerty'</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";
    
    @Test
    public void pEchoNvarchar2() {
        Invocation invocation = new Invocation("pEchoNvarchar2");
        invocation.setParameter("p_nvarchar2", "N'qwerty'");
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(P_ECHO_NVARCHAR2_RESULT));
        assertTrue("control document not same as instance document.  Expected " + documentToString(controlDoc) + " but was " + documentToString(doc), comparer.isNodeEqual(
                controlDoc, doc));
    }
    public static final String P_ECHO_NVARCHAR2_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>N'qwerty'</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";
    
    @Test
    public void pEchoNchar() {
        Invocation invocation = new Invocation("pEchoNchar");
        invocation.setParameter("p_nchar", "N'q'");
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_NCHAR_RESULT));
        assertTrue("control document not same as instance document.  Expected " + documentToString(controlDoc) + " but was " + documentToString(doc), comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_NCHAR_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>1</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void fEchoNchar() {
        Invocation invocation = new Invocation("fEchoNchar");
        invocation.setParameter("p_nchar", "N'q'");
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(F_ECHO_NCHAR_RESULT));
        assertTrue("control document not same as instance document.  Expected " + documentToString(controlDoc) + " but was " + documentToString(doc), comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String F_ECHO_NCHAR_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>N'q'</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";
    
    @Test
    public void echoChar() {
        Invocation invocation = new Invocation("echoChar");
        invocation.setParameter("PINPUTCHAR", "Q");
        Operation op = xrService.getOperation(invocation.getName());
        // something goes wrong with invoke
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_CHAR_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_CHAR_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>Q</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoReal() {
        Invocation invocation = new Invocation("echoReal");
        invocation.setParameter("PREAL", new Float("3.14159"));
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_REAL_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_REAL_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>3.14159</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoFloat() {
        Invocation invocation = new Invocation("echoFloat");
        invocation.setParameter("PINPUTFLOAT", new Float("31415.926"));
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_FLOAT_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_FLOAT_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>31415.926</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoDouble() {
        Invocation invocation = new Invocation("echoDouble");
        invocation.setParameter("PDOUBLE", new Double("314.15926"));
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_DOUBLE_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_DOUBLE_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>314.15926</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoDate() throws ParseException {
        Invocation invocation = new Invocation("echoDate");
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        invocation.setParameter("PINPUTDATE", format.parse("20091203"));
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_DATE_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_DATE_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>2009-12-03T00:00:00-05:00</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoTimestamp() throws ParseException {
        Invocation invocation = new Invocation("echoTimestamp");
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd:hhmmss.SSS");
        invocation.setParameter("PINPUTTS", format.parse("20091204:091923.123"));
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_TS_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_TS_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>2009-12-04T09:19:23.123-05:00</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoClob() throws ParseException, SQLException {
        Invocation invocation = new Invocation("echoClob");
        invocation.setParameter("PINPUTCLOB", "This is a Clob test");
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_CLOB_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_CLOB_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>This is a Clob test</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoBlob() throws ParseException {
        Invocation invocation = new Invocation("echoBlob");
        byte[] testBytes = "This is a test".getBytes();
        invocation.setParameter("PINPUTBLOB", testBytes);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(((XMLRoot)result).getObject(), doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_BLOB_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_BLOB_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result xsi:type=\"xsd:base64Binary\" " +
                 "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
                 "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
                 "5647687063794270637942684948526C6333513D" +
              "</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoLong() throws ParseException {
        Invocation invocation = new Invocation("echoLong");
        invocation.setParameter("PLONG", "This is a LONG type test.  A LONG type represents 2GB of character data.");
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(((XMLRoot)result).getObject(), doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_LONG_RESULT));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));

    }
    public static final String ECHO_LONG_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>" +
                 "This is a LONG type test.  A LONG type represents 2GB of character data." +
              "</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoLongRaw() throws ParseException {
        Invocation invocation = new Invocation("echoLongRaw");
        byte[] testBytes = ("This is yet another test (long stringggggggggggggggggggggggggggggggggggggg" +
                "ggggggggggggggggggggggggggggggggggggggg").getBytes();
        invocation.setParameter("PLONGRAW", testBytes);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(((XMLRoot)result).getObject(), doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_LONGRAW_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_LONGRAW_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result xsi:type=\"xsd:base64Binary\" " +
                 "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
                 "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
                 "5647687063794270637942355A585167595735766447686C636942305A584E30494368736232356E49484E30636D6C755A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32646E5A32633D" +
              "</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoRaw() throws ParseException {
        Invocation invocation = new Invocation("echoRaw");
        byte[] testBytes = "This is yet another test!".getBytes();
        invocation.setParameter("PRAW", testBytes);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(((XMLRoot)result).getObject(), doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_RAW_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_RAW_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result xsi:type=\"xsd:base64Binary\" " +
                 "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
                 "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
                 "5647687063794270637942355A585167595735766447686C636942305A584E3049513D3D" +
              "</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";
    
    @Test
    public void echoRowId() throws ParseException {
        Invocation invocation = new Invocation("echoRowId");
        invocation.setParameter("PROWID", "'AAADL1AABAAACTEAAE'");
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(((XMLRoot)result).getObject(), doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_ROWID_RESULT));
        assertTrue("control document not same as instance document", comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_ROWID_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<result>" +
                 "'AAADL1AABAAACTEAAE'" +
              "</result>" +
           "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void selectXMLData() throws ParseException {
        Invocation invocation = new Invocation("selectXMLData");
        Operation op = xrService.getOperation(invocation.getName());
        Object result = null;
        try {
            result = op.invoke(xrService, invocation);
        } catch (NoClassDefFoundError ncdfex) {
            fail("Test failed unexpectedly.  Please make sure that Oracle's XDB and XMLParser jars are on the test classpath.\nException:\n" + ncdfex);
        }
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(((XMLRoot)result).getObject(), doc);
        Document controlDoc = xmlParser.parse(new StringReader(XMLTYPE_XML_2));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String XMLTYPE_XML_2 =
        "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" +
        "<simple-xml-format>" +
          "<simple-xml>" +
            "<ID>666</ID>" +
            "<XMLDATA>&lt;blah>some blah text&lt;/blah></XMLDATA>" +
          "</simple-xml>" +
          "<simple-xml>" +
            "<ID>667</ID>" +
            "<XMLDATA>&lt;foo>yo fool!&lt;/foo></XMLDATA>" +
          "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoBooleanTrue() {
        Invocation invocation = new Invocation("echoBoolean");
        invocation.setParameter("P1", 1);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_BOOLEAN_TRUE_RESULT));
        assertTrue("control document not same as instance document:  expected " + documentToString(controlDoc) + " but was " + documentToString(doc), comparer.isNodeEqual(
            controlDoc, doc));
    }
    @Test
    public void echoBooleanTrue2() {
        Invocation invocation = new Invocation("echoBoolean2");
        invocation.setParameter("P1", 1);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_BOOLEAN_TRUE_RESULT2));
        assertTrue("control document not same as instance document:  expected " + documentToString(controlDoc) + " but was " + documentToString(doc), comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_BOOLEAN_TRUE_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<RESULT>1</RESULT>" +
           "</simple-xml>" +
        "</simple-xml-format>";
    public static final String ECHO_BOOLEAN_TRUE_RESULT2 =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<P2>1</P2>" +
           "</simple-xml>" +
        "</simple-xml-format>";    
    @Test
    public void echoBooleanFalse() {
        Invocation invocation = new Invocation("echoBoolean");
        invocation.setParameter("P1", 0);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_BOOLEAN_RESULT));
        assertTrue("control document not same as instance document:  expected " + documentToString(controlDoc) + " but was " + documentToString(doc), comparer.isNodeEqual(
            controlDoc, doc));
    }
    @Test
    public void echoBooleanFalse2() {
        Invocation invocation = new Invocation("echoBoolean2");
        invocation.setParameter("P1", 0);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ECHO_BOOLEAN_RESULT2));
        assertTrue("control document not same as instance document:  expected " + documentToString(controlDoc) + " but was " + documentToString(doc), comparer.isNodeEqual(
            controlDoc, doc));
    }
    public static final String ECHO_BOOLEAN_RESULT =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<RESULT>0</RESULT>" +
           "</simple-xml>" +
        "</simple-xml-format>";
    public static final String ECHO_BOOLEAN_RESULT2 =
        "<?xml version = '1.0' encoding = 'UTF-8'?>" +
        "<simple-xml-format>" +
           "<simple-xml>" +
              "<P2>0</P2>" +
           "</simple-xml>" +
        "</simple-xml-format>";
}