/*******************************************************************************
 * 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 9, 2011 - 2.4 - Initial implementation
 ******************************************************************************/
package dbws.testing.toplevelsimpleplsqlsp;

//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.tools.dbws.DBWSBuilder;

//test imports
import dbws.testing.DBWSTestSuite;

/**
 * Tests top-level procedures with PL/SQL arguments.
 *
 */
public class TopLevelSimplePLSQLSPTestSuite extends DBWSTestSuite {

    static final String CREATE_BOOL_PROC =
        "CREATE OR REPLACE PROCEDURE TOPLEVEL_BOOL_TEST(X IN BOOLEAN, Y OUT VARCHAR2) AS" +
        "\nBEGIN" +
            "\nIF X = TRUE THEN" +
                "\nY := 'true';" +
            "\nELSE" +
                "\nY := 'false';" +
            "\nEND IF;"+
        "\nEND TOPLEVEL_BOOL_TEST;";
    static final String CREATE_BOOL_IN_PROC =
        "CREATE OR REPLACE PROCEDURE TOPLEVEL_BOOL_IN_TEST(X IN BOOLEAN) AS" +
        "\nBEGIN" +
            "\nNULL;"+
        "\nEND TOPLEVEL_BOOL_IN_TEST;";
    static final String CREATE_BINARY_INT_PROC =
        "CREATE OR REPLACE PROCEDURE TOPLEVEL_BINARY_INT_TEST(X IN BINARY_INTEGER, Y OUT BINARY_INTEGER) AS" +
        "\nBEGIN" +
            "\nY := X;" +
        "\nEND TOPLEVEL_BINARY_INT_TEST;";
    static final String CREATE_PLS_INT_PROC =
        "CREATE OR REPLACE PROCEDURE TOPLEVEL_PLS_INT_TEST(X IN PLS_INTEGER, Y OUT PLS_INTEGER) AS" +
        "\nBEGIN" +
            "\nY := X;" +
        "\nEND TOPLEVEL_PLS_INT_TEST;";
    static final String CREATE_NATURAL_PROC =
        "CREATE OR REPLACE PROCEDURE TOPLEVEL_NATURAL_TEST(X IN NATURAL, Y OUT NATURAL) AS" +
        "\nBEGIN" +
            "\nY := X;" +
        "\nEND TOPLEVEL_NATURAL_TEST;";
    static final String CREATE_POSITIVE_PROC =
        "CREATE OR REPLACE PROCEDURE TOPLEVEL_POSITIVE_TEST(X IN POSITIVE, Y OUT POSITIVE) AS" +
        "\nBEGIN" +
            "\nY := X;" +
        "\nEND TOPLEVEL_POSITIVE_TEST;";
    static final String CREATE_SIGNTYPE_PROC =
        "CREATE OR REPLACE PROCEDURE TOPLEVEL_SIGNTYPE_TEST(X IN SIGNTYPE, Y OUT VARCHAR2) AS" +
        "\nBEGIN" +
	        "\nIF X = -1 THEN" +
		        "\nY := 'negative';" +
		    "\nELSIF X = 1 THEN" +
		        "\nY := 'positive';" +
		    "\nELSE" +
		        "\nY := 'zero';" +
		    "\nEND IF;"+
        "\nEND TOPLEVEL_SIGNTYPE_TEST;";
    static final String CREATE_ECHOTEST_PROC =
        "CREATE OR REPLACE PROCEDURE TOPLEVEL_ECHO_TEST(T IN VARCHAR2, U OUT VARCHAR2) AS" +
        "\nBEGIN" +
            "\nU := CONCAT('test-' , T);"+
        "\nEND TOPLEVEL_ECHO_TEST;";
    static final String DROP_BOOL_PROC =
        "DROP PROCEDURE TOPLEVEL_BOOL_TEST";
    static final String DROP_BOOL_IN_PROC =
        "DROP PROCEDURE TOPLEVEL_BOOL_IN_TEST";
    static final String DROP_BINARY_INT_PROC =
        "DROP PROCEDURE TOPLEVEL_BINARY_INT_TEST";
    static final String DROP_PLS_INT_PROC =
        "DROP PROCEDURE TOPLEVEL_PLS_INT_TEST";
    static final String DROP_NATURAL_PROC =
        "DROP PROCEDURE TOPLEVEL_NATURAL_TEST";
    static final String DROP_POSITIVE_PROC =
        "DROP PROCEDURE TOPLEVEL_POSITIVE_TEST";
    static final String DROP_SIGNTYPE_PROC =
        "DROP PROCEDURE TOPLEVEL_SIGNTYPE_TEST";
    static final String DROP_ECHOTEST_PROC =
        "DROP PROCEDURE TOPLEVEL_ECHO_TEST";

    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_BOOL_PROC, ddlDebug);
            runDdl(conn, CREATE_BOOL_IN_PROC, ddlDebug);
            runDdl(conn, CREATE_BINARY_INT_PROC, ddlDebug);
            runDdl(conn, CREATE_PLS_INT_PROC, ddlDebug);
            runDdl(conn, CREATE_NATURAL_PROC, ddlDebug);
            runDdl(conn, CREATE_POSITIVE_PROC, ddlDebug);
            runDdl(conn, CREATE_SIGNTYPE_PROC, ddlDebug);
            runDdl(conn, CREATE_ECHOTEST_PROC, 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\">TopLevelSimplePLSQLSP</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=\"testBoolean\" " +
                  "catalogPattern=\"TOPLEVEL\" " +
                  "procedurePattern=\"TOPLEVEL_BOOL_TEST\" " +
                  "isSimpleXMLFormat=\"true\" " +
               "/>" +
               "<plsql-procedure " +
                   "name=\"testBooleanIn\" " +
                   "catalogPattern=\"TOPLEVEL\" " +
                   "procedurePattern=\"TOPLEVEL_BOOL_IN_TEST\" " +
                   "isSimpleXMLFormat=\"true\" " +
                "/>" +
               "<plsql-procedure " +
                   "name=\"testBinaryInt\" " +
                   "catalogPattern=\"TOPLEVEL\" " +
                   "procedurePattern=\"TOPLEVEL_BINARY_INT_TEST\" " +
                   "isSimpleXMLFormat=\"true\" " +
		       "/>" +
               "<plsql-procedure " +
                   "name=\"testPLSInt\" " +
                   "catalogPattern=\"TOPLEVEL\" " +
                   "procedurePattern=\"TOPLEVEL_PLS_INT_TEST\" " +
                   "isSimpleXMLFormat=\"true\" " +
		       "/>" +
               "<plsql-procedure " +
                   "name=\"testNatural\" " +
                   "catalogPattern=\"TOPLEVEL\" " +
                   "procedurePattern=\"TOPLEVEL_NATURAL_TEST\" " +
                   "isSimpleXMLFormat=\"true\" " +
		       "/>" +
               "<plsql-procedure " +
                   "name=\"testPositive\" " +
                   "catalogPattern=\"TOPLEVEL\" " +
                   "procedurePattern=\"TOPLEVEL_POSITIVE_TEST\" " +
                   "isSimpleXMLFormat=\"true\" " +
		       "/>" +
			   "<plsql-procedure " +
                   "name=\"testSignType\" " +
                   "catalogPattern=\"TOPLEVEL\" " +
                   "procedurePattern=\"TOPLEVEL_SIGNTYPE_TEST\" " +
                   "isSimpleXMLFormat=\"true\" " +
				"/>" +
               "<procedure " +
                   "name=\"echoTest\" " +
                   "catalogPattern=\"TOPLEVEL\" " +
                   "procedurePattern=\"TOPLEVEL_ECHO_TEST\" " +
                   "isSimpleXMLFormat=\"true\" " +
                "/>" +
            "</dbws-builder>";
          builder = new DBWSBuilder();
          DBWSTestSuite.setUp(".");
    }

    @AfterClass
    public static void tearDown() {
        if (ddlDrop) {
            runDdl(conn, DROP_BOOL_PROC, ddlDebug);
            runDdl(conn, DROP_BOOL_IN_PROC, ddlDebug);
            runDdl(conn, DROP_BINARY_INT_PROC, ddlDebug);
            runDdl(conn, DROP_PLS_INT_PROC, ddlDebug);
            runDdl(conn, DROP_NATURAL_PROC, ddlDebug);
            runDdl(conn, DROP_POSITIVE_PROC, ddlDebug);
            runDdl(conn, DROP_SIGNTYPE_PROC, ddlDebug);
            runDdl(conn, DROP_ECHOTEST_PROC, ddlDebug);
        }
    }

    @Test
    public void testBoolean() {
        Invocation invocation = new Invocation("testBoolean");
        invocation.setParameter("X", Integer.valueOf(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(TEST_BOOLEAN_RESULT));
        assertTrue("Control document not same as instance document. Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String TEST_BOOLEAN_RESULT =
        REGULAR_XML_HEADER +
        "<simple-xml-format>" +
            "<simple-xml>" +
                "<Y>false</Y>" +
            "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void testBooleanIn() {
        Invocation invocation = new Invocation("testBooleanIn");
        invocation.setParameter("X", Integer.valueOf(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(TEST_BOOLEAN_IN_RESULT));
        assertTrue("Control document not same as instance document. Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String TEST_BOOLEAN_IN_RESULT =
        REGULAR_XML_HEADER +
        "<simple-xml-format>" +
            "<simple-xml>" +
                "<result>1</result>" +
            "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void testBinaryInt() {
        Invocation invocation = new Invocation("testBinaryInt");
        invocation.setParameter("X", -1234567890);
        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(NEGATIVE_INTEGER_RESULT));
        assertTrue("Control document not same as instance document. Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    @Test
    public void testPLSInt() {
        Invocation invocation = new Invocation("testPLSInt");
        invocation.setParameter("X", -1234567890);
        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(NEGATIVE_INTEGER_RESULT));
        assertTrue("Control document not same as instance document. Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String NEGATIVE_INTEGER_RESULT =
        REGULAR_XML_HEADER +
        "<simple-xml-format>" +
            "<simple-xml>" +
                "<Y>-1234567890</Y>" +
            "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void testNatural() {
        Invocation invocation = new Invocation("testNatural");
        invocation.setParameter("X", 66);
        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(SIXTY_SIX_RESULT));
        assertTrue("Control document not same as instance document. Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }

    @Test
    public void testPositive() {
        Invocation invocation = new Invocation("testPositive");
        invocation.setParameter("X", 66);
        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(SIXTY_SIX_RESULT));
        assertTrue("Control document not same as instance document. Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String SIXTY_SIX_RESULT =
        REGULAR_XML_HEADER +
        "<simple-xml-format>" +
            "<simple-xml>" +
                "<Y>66</Y>" +
            "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void testSignType() {
        Invocation invocation = new Invocation("testSignType");
        invocation.setParameter("X", -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(NEGATIVE_SIGN_TYPE_RESULT));
        assertTrue("Control document not same as instance document. Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String NEGATIVE_SIGN_TYPE_RESULT =
        REGULAR_XML_HEADER +
        "<simple-xml-format>" +
            "<simple-xml>" +
                "<Y>negative</Y>" +
            "</simple-xml>" +
        "</simple-xml-format>";

    @Test
    public void echoTest() {
        Invocation invocation = new Invocation("echoTest");
        invocation.setParameter("T", "Hello");
        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_TEST_RESULT));
        assertTrue("Control document not same as instance document. Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    public static final String ECHO_TEST_RESULT =
        REGULAR_XML_HEADER +
        "<simple-xml-format>" +
            "<simple-xml>" +
                "<result>test-Hello</result>" +
            "</simple-xml>" +
        "</simple-xml-format>";
}