/*
 * Copyright (c) 2011, 2020 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     David McCann - December 29, 2011 - 2.4 - Initial implementation
package dbws.testing.nonassociativeplsql;

//javase imports
import java.io.StringReader;
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;

//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.XMLUnmarshaller;

//test imports
import dbws.testing.DBWSTestSuite;

/**
 * Tests non-associative PL/SQL collections.
 *
 */
public class NonAssociativePLSQLCollectionTestSuite extends DBWSTestSuite {

    static final String CREATE_NONASSOC_PACKAGE =
        "CREATE OR REPLACE PACKAGE NONASSOC_PACKAGE AS" +
            "\nTYPE NONASSO_ARRAY IS TABLE OF VARCHAR2(20);" +
            "\nTYPE ASSO_ARRAY IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;" +
            "\nPROCEDURE GETARRAYCOUNT(NAMES IN NONASSO_ARRAY, CNT OUT NUMERIC);" +
            "\nPROCEDURE GETITEMCOUNTFORINDEX(NAMES IN NONASSO_ARRAY, CNT IN OUT NUMERIC);" +
            "\nPROCEDURE CREATEARRAY(ITEM1 IN VARCHAR2, ITEM2 IN VARCHAR2, ITEM3 IN VARCHAR2, OUTARRAY OUT NONASSO_ARRAY);" +
            "\nPROCEDURE COPYARRAY(INARRAY IN NONASSO_ARRAY, OUTARRAY OUT NONASSO_ARRAY);" +
            "\nPROCEDURE COPYTOINDEXEDARRAY(INARRAY IN NONASSO_ARRAY, OUTARRAY OUT ASSO_ARRAY);" +
            "\nPROCEDURE COPYFROMINDEXEDARRAY(INARRAY IN ASSO_ARRAY, OUTARRAY OUT NONASSO_ARRAY);" +
            "\nPROCEDURE ADDNAMETOARRAY(NAMETOADD IN VARCHAR2, NAMES IN OUT NONASSO_ARRAY);" +
            "\nFUNCTION GETARRAYCOUNTFUNC(NAMES IN NONASSO_ARRAY) RETURN NUMERIC;" +
            "\nFUNCTION CREATEARRAYFUNC(ITEM1 IN VARCHAR2, ITEM2 IN VARCHAR2, ITEM3 IN VARCHAR2) RETURN NONASSO_ARRAY;" +
            "\nFUNCTION COPYARRAYFUNC(INARRAY IN NONASSO_ARRAY) RETURN NONASSO_ARRAY;" +
            "\nFUNCTION COPYTOINDEXEDARRAYFUNC(INARRAY IN NONASSO_ARRAY) RETURN ASSO_ARRAY;" +
            "\nFUNCTION COPYFROMINDEXEDARRAYFUNC(INARRAY IN ASSO_ARRAY) RETURN NONASSO_ARRAY;" +
        "\nEND NONASSOC_PACKAGE;" ;
    static final String CREATE_NONASSOC_PACKAGE_BODY =
        "CREATE OR REPLACE PACKAGE BODY NONASSOC_PACKAGE AS" +
            "\nPROCEDURE GETARRAYCOUNT(NAMES IN NONASSO_ARRAY, CNT OUT NUMERIC) AS" +
            "\nBEGIN" +
                "\nCNT := NAMES.COUNT;" +
            "\nEND GETARRAYCOUNT;" +
            "\nPROCEDURE GETITEMCOUNTFORINDEX(NAMES IN NONASSO_ARRAY, CNT IN OUT NUMERIC) AS" +
            "\nBEGIN" +
                "\nCNT := LENGTH(NAMES(CNT));" +
            "\nEND GETITEMCOUNTFORINDEX;" +
            "\nPROCEDURE CREATEARRAY(ITEM1 IN VARCHAR2, ITEM2 IN VARCHAR2, ITEM3 IN VARCHAR2, OUTARRAY OUT NONASSO_ARRAY) AS" +
            "\nBEGIN" +
                "\nOUTARRAY := NONASSO_ARRAY(ITEM1, ITEM2, ITEM3);" +
            "\nEND CREATEARRAY;" +
            "\nPROCEDURE COPYARRAY(INARRAY IN NONASSO_ARRAY, OUTARRAY OUT NONASSO_ARRAY) AS" +
            "\nBEGIN" +
                "\nOUTARRAY := NONASSO_ARRAY();" +
                "\nFOR I IN INARRAY.FIRST .. INARRAY.LAST" +
                "\nLOOP" +
                    "\nOUTARRAY.EXTEND;" +
                    "\nOUTARRAY(I) := INARRAY(I);" +
                "\nEND LOOP;" +
            "\nEND COPYARRAY;" +
            "\nPROCEDURE COPYTOINDEXEDARRAY(INARRAY IN NONASSO_ARRAY, OUTARRAY OUT ASSO_ARRAY) AS" +
            "\nBEGIN" +
                "\nFOR I IN INARRAY.FIRST .. INARRAY.LAST" +
                "\nLOOP" +
                    "\nOUTARRAY(I) := INARRAY(I);" +
                "\nEND LOOP;" +
            "\nEND COPYTOINDEXEDARRAY;" +
            "\nPROCEDURE COPYFROMINDEXEDARRAY(INARRAY IN ASSO_ARRAY, OUTARRAY OUT NONASSO_ARRAY) AS" +
            "\nBEGIN" +
                "\nOUTARRAY := NONASSO_ARRAY();" +
                "\nFOR I IN INARRAY.FIRST .. INARRAY.LAST" +
                "\nLOOP" +
                    "\nOUTARRAY.EXTEND;" +
                    "\nOUTARRAY(I) := INARRAY(I);" +
                "\nEND LOOP;" +
            "\nEND COPYFROMINDEXEDARRAY;" +
            "\nPROCEDURE ADDNAMETOARRAY(NAMETOADD IN VARCHAR2, NAMES IN OUT NONASSO_ARRAY) AS" +
            "\nBEGIN" +
                "\nNAMES.EXTEND;" +
                "\nNAMES(NAMES.COUNT) := NAMETOADD;" +
            "\nEND ADDNAMETOARRAY;" +
            "\nFUNCTION GETARRAYCOUNTFUNC(NAMES IN NONASSO_ARRAY) RETURN NUMERIC AS" +
            "\nCNT NUMERIC;" +
            "\nBEGIN" +
                "\nCNT := NAMES.COUNT;" +
                "\nRETURN CNT;" +
            "\nEND GETARRAYCOUNTFUNC;" +
            "\nFUNCTION CREATEARRAYFUNC(ITEM1 IN VARCHAR2, ITEM2 IN VARCHAR2, ITEM3 IN VARCHAR2) RETURN NONASSO_ARRAY AS" +
            "\nOUTARRAY NONASSO_ARRAY;" +
            "\nBEGIN" +
                "\nOUTARRAY := NONASSO_ARRAY(ITEM1, ITEM2, ITEM3);" +
                "\nRETURN OUTARRAY;" +
            "\nEND CREATEARRAYFUNC;" +
            "\nFUNCTION COPYARRAYFUNC(INARRAY IN NONASSO_ARRAY) RETURN NONASSO_ARRAY AS" +
            "\nOUTARRAY NONASSO_ARRAY;" +
            "\nBEGIN" +
                "\nOUTARRAY := NONASSO_ARRAY();" +
                "\nFOR I IN INARRAY.FIRST .. INARRAY.LAST" +
                "\nLOOP" +
                    "\nOUTARRAY.EXTEND;" +
                    "\nOUTARRAY(I) := INARRAY(I);" +
                "\nEND LOOP;" +
                "\nRETURN OUTARRAY;" +
            "\nEND COPYARRAYFUNC;" +
            "\nFUNCTION COPYTOINDEXEDARRAYFUNC(INARRAY IN NONASSO_ARRAY) RETURN ASSO_ARRAY AS" +
            "\nOUTARRAY ASSO_ARRAY;" +
            "\nBEGIN" +
                "\nFOR I IN INARRAY.FIRST .. INARRAY.LAST" +
                "\nLOOP" +
                    "\nOUTARRAY(I) := INARRAY(I);" +
                "\nEND LOOP;" +
                "\nRETURN OUTARRAY;" +
            "\nEND COPYTOINDEXEDARRAYFUNC;" +
            "\nFUNCTION COPYFROMINDEXEDARRAYFUNC(INARRAY IN ASSO_ARRAY) RETURN NONASSO_ARRAY AS" +
            "\nOUTARRAY NONASSO_ARRAY;" +
            "\nBEGIN" +
                "\nOUTARRAY := NONASSO_ARRAY();" +
                "\nFOR I IN INARRAY.FIRST .. INARRAY.LAST" +
                "\nLOOP" +
                    "\nOUTARRAY.EXTEND;" +
                    "\nOUTARRAY(I) := INARRAY(I);" +
                "\nEND LOOP;" +
                "\nRETURN OUTARRAY;" +
            "\nEND COPYFROMINDEXEDARRAYFUNC;" +
        "\nEND NONASSOC_PACKAGE;" ;
    static final String CREATE_NONASSO_ARRAY_TYPE =
        "CREATE OR REPLACE TYPE NONASSOC_PACKAGE_NONASSO_ARRAY AS TABLE OF VARCHAR2(20)";
    static final String CREATE_ASSO_ARRAY_TYPE =
        "CREATE OR REPLACE TYPE NONASSOC_PACKAGE_ASSO_ARRAY AS TABLE OF VARCHAR2(20)";

    static final String DROP_PACKAGE_NONASSOC_PACKAGE =
        "DROP PACKAGE NONASSOC_PACKAGE";
    static final String DROP_NONASSO_ARRAY_TYPE =
        "DROP TYPE NONASSOC_PACKAGE_NONASSO_ARRAY";
    static final String DROP_ASSO_ARRAY_TYPE =
        "DROP TYPE NONASSOC_PACKAGE_ASSO_ARRAY";

    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_NONASSOC_PACKAGE, ddlDebug);
            runDdl(conn, CREATE_NONASSOC_PACKAGE_BODY, ddlDebug);
            runDdl(conn, CREATE_NONASSO_ARRAY_TYPE, ddlDebug);
            runDdl(conn, CREATE_ASSO_ARRAY_TYPE, ddlDebug);
        }
        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\">NonAssociativePLSQLCollection</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>" +
              "<plsql-procedure " +
                  "name=\"GetArrayCountTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"GETARRAYCOUNT\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"GetItemCountForIndexTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"GETITEMCOUNTFORINDEX\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"CreateArrayTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"CREATEARRAY\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"CopyArrayTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"COPYARRAY\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"CopyToIndexedArrayTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"COPYTOINDEXEDARRAY\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"CopyFromIndexedArrayTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"COPYFROMINDEXEDARRAY\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"AddNameToArrayTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"ADDNAMETOARRAY\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"GetArrayCountFuncTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"GETARRAYCOUNTFUNC\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"CreateArrayFuncTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"CREATEARRAYFUNC\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"CopyArrayFuncTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"COPYARRAYFUNC\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"CopyToIndexedArrayFuncTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"COPYTOINDEXEDARRAYFUNC\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"CopyFromIndexedArrayFuncTest\" " +
                  "catalogPattern=\"NONASSOC_PACKAGE\" " +
                  "procedurePattern=\"COPYFROMINDEXEDARRAYFUNC\" " +
              "/>" +
            "</dbws-builder>";
          builder = null;
          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_NONASSOC_PACKAGE, ddlDebug);
            runDdl(conn, DROP_NONASSO_ARRAY_TYPE, ddlDebug);
            runDdl(conn, DROP_ASSO_ARRAY_TYPE, ddlDebug);
        }
    }

    @Test
    public void getArrayCountTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object inputArray = unmarshaller.unmarshal(new StringReader(NON_ASSOC_ARRAY_XML));
        Invocation invocation = new Invocation("GetArrayCountTest");
        invocation.setParameter("NAMES", inputArray);
        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(COUNT_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    @Test
    public void getItemCountForIndexTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object inputArray = unmarshaller.unmarshal(new StringReader(NON_ASSOC_ARRAY_XML));
        Invocation invocation = new Invocation("GetItemCountForIndexTest");
        invocation.setParameter("NAMES", inputArray);
        invocation.setParameter("CNT", 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(COUNT_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String NON_ASSOC_ARRAY_XML =
        STANDALONE_XML_HEADER +
        "<nonassoc_package_nonasso_arrayType xmlns=\"urn:NonAssociativePLSQLCollection\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
        "<item>Jim</item>" +
        "<item>Jack</item>" +
        "<item>John</item>" +
        "</nonassoc_package_nonasso_arrayType>";
    public static final String COUNT_XML =
        STANDALONE_XML_HEADER +
        "<value>3</value>";

    @Test
    public void createArrayTest() {
        Invocation invocation = new Invocation("CreateArrayTest");
        invocation.setParameter("ITEM1", "Some item");
        invocation.setParameter("ITEM2", "Another item");
        invocation.setParameter("ITEM3", "The last item");
        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(NON_ASSOC_ITEMS_ARRAY_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String NON_ASSOC_ITEMS_ARRAY_XML =
        STANDALONE_XML_HEADER +
        "<nonassoc_package_nonasso_arrayType xmlns=\"urn:NonAssociativePLSQLCollection\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
        "<item>Some item</item>" +
        "<item>Another item</item>" +
        "<item>The last item</item>" +
        "</nonassoc_package_nonasso_arrayType>";

    @Test
    public void copyArrayTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object inputArray = unmarshaller.unmarshal(new StringReader(NON_ASSOC_ARRAY_XML));
        Invocation invocation = new Invocation("CopyArrayTest");
        invocation.setParameter("INARRAY", inputArray);
        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(NON_ASSOC_ARRAY_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }

    @Test
    public void copyToIndexedArrayTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object inputArray = unmarshaller.unmarshal(new StringReader(NON_ASSOC_ARRAY_XML));
        Invocation invocation = new Invocation("CopyToIndexedArrayTest");
        invocation.setParameter("INARRAY", inputArray);
        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(ASSOC_ARRAY_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }

    @Test
    public void copyFromIndexedArrayTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object inputArray = unmarshaller.unmarshal(new StringReader(ASSOC_ARRAY_XML));
        Invocation invocation = new Invocation("CopyFromIndexedArrayTest");
        invocation.setParameter("INARRAY", inputArray);
        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(NON_ASSOC_ARRAY_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String ASSOC_ARRAY_XML =
        STANDALONE_XML_HEADER +
        "<nonassoc_package_asso_arrayType xmlns=\"urn:NonAssociativePLSQLCollection\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
        "<item>Jim</item>" +
        "<item>Jack</item>" +
        "<item>John</item>" +
        "</nonassoc_package_asso_arrayType>";

    @Test
    public void addNameToArrayTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object inputArray = unmarshaller.unmarshal(new StringReader(NON_ASSOC_ARRAY_XML));
        Invocation invocation = new Invocation("AddNameToArrayTest");
        invocation.setParameter("NAMETOADD", "Fred");
        invocation.setParameter("NAMES", inputArray);
        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(NON_ASSOC_ARRAY2_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String NON_ASSOC_ARRAY2_XML =
        STANDALONE_XML_HEADER +
        "<nonassoc_package_nonasso_arrayType xmlns=\"urn:NonAssociativePLSQLCollection\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
        "<item>Jim</item>" +
        "<item>Jack</item>" +
        "<item>John</item>" +
        "<item>Fred</item>" +
        "</nonassoc_package_nonasso_arrayType>";

    @Test
    public void getArrayCountFuncTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object inputArray = unmarshaller.unmarshal(new StringReader(NON_ASSOC_ARRAY_XML));
        Invocation invocation = new Invocation("GetArrayCountFuncTest");
        invocation.setParameter("NAMES", inputArray);
        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(COUNT_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }

    @Test
    public void createArrayFuncTest() {
        Invocation invocation = new Invocation("CreateArrayFuncTest");
        invocation.setParameter("ITEM1", "Some item");
        invocation.setParameter("ITEM2", "Another item");
        invocation.setParameter("ITEM3", "The last item");
        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(NON_ASSOC_ITEMS_ARRAY_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }

    @Test
    public void copyArrayFuncTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object inputArray = unmarshaller.unmarshal(new StringReader(NON_ASSOC_ITEMS_ARRAY_XML));
        Invocation invocation = new Invocation("CopyArrayFuncTest");
        invocation.setParameter("INARRAY", inputArray);
        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(NON_ASSOC_ITEMS_ARRAY_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }

    @Test
    public void copyToIndexedArrayFuncTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object inputArray = unmarshaller.unmarshal(new StringReader(NON_ASSOC_ARRAY_XML));
        Invocation invocation = new Invocation("CopyToIndexedArrayFuncTest");
        invocation.setParameter("INARRAY", inputArray);
        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(ASSOC_ARRAY_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }

    @Test
    public void copyFromIndexedArrayFuncTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object inputArray = unmarshaller.unmarshal(new StringReader(ASSOC_ARRAY_XML));
        Invocation invocation = new Invocation("CopyFromIndexedArrayFuncTest");
        invocation.setParameter("INARRAY", inputArray);
        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(NON_ASSOC_ARRAY_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
}
