/*
 * Copyright (c) 1998, 2021 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:
//     rbarkhouse - 2009-06-16 10:40:00 - initial implementation
package org.eclipse.persistence.testing.jaxb.simpledocument;


import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;

/**
 * Tests the various combinations of absent/empty elements and their corresponding null/empty string
 * values when unmarshalled.
 */
public class SimpleDocumentWhitespaceNullTestCases extends JAXBWithJSONTestCases{

    private final static String ELEMENT_WITH_VALUE      = "org/eclipse/persistence/testing/jaxb/simpledocument/elemWithValue.xml";
    private final static String ABSENT_ELEMENT          = "org/eclipse/persistence/testing/jaxb/simpledocument/absentElem.xml";
    private final static String EMPTY_ELEMENT           = "org/eclipse/persistence/testing/jaxb/simpledocument/emptyElem.xml";
    private final static String ELEMENT_WITH_WHITESPACE = "org/eclipse/persistence/testing/jaxb/simpledocument/elemWithWhitespace.xml";
    private final static String JSON_ELEMENT_WITH_VALUE      = "org/eclipse/persistence/testing/jaxb/simpledocument/elemWithValue.json";
    private final static String JSON_ABSENT_ELEMENT          = "org/eclipse/persistence/testing/jaxb/simpledocument/absentElem.json";
    private final static String JSON_EMPTY_ELEMENT           = "org/eclipse/persistence/testing/jaxb/simpledocument/emptyElem.json";
    private final static String JSON_ELEMENT_WITH_WHITESPACE = "org/eclipse/persistence/testing/jaxb/simpledocument/elemWithWhitespace.json";
    private final static int TEST_ELEM_WITH_VALUE       = 1;
    private final static int TEST_ABSENT_ELEM           = 2;
    private final static int TEST_EMPTY_ELEM            = 3;
    private final static int TEST_ELEM_WITH_WHITESPACE  = 4;

    private int state = TEST_ELEM_WITH_VALUE;

    public SimpleDocumentWhitespaceNullTestCases(String name) throws Exception {
        super(name);
        setControlDocument(ELEMENT_WITH_VALUE);
        setControlJSON(JSON_ELEMENT_WITH_VALUE);
        Class[] classes = new Class[1];
        classes[0] = Root.class;
        setClasses(classes);
    }

    @Override
    protected Object getControlObject() {
        Root controlRoot = new Root();
        switch (state) {
            case TEST_ELEM_WITH_VALUE:
                controlRoot.id = "123";
                break;
            case TEST_ABSENT_ELEM:
                controlRoot.id = null;
                break;
            case TEST_EMPTY_ELEM:
                controlRoot.id = "";
                break;
            case TEST_ELEM_WITH_WHITESPACE:
                controlRoot.id = "     ";
                break;
        }
        return controlRoot;
    }

    public void testElemWithValue() throws Exception {
        this.state = TEST_ELEM_WITH_VALUE;
        this.resourceName = ELEMENT_WITH_VALUE;
        super.testXMLToObjectFromURL();

        this.state = TEST_ELEM_WITH_VALUE;
    }

    public void testAbsentElem() throws Exception {
        this.state = TEST_ABSENT_ELEM;
        this.resourceName = ABSENT_ELEMENT;

        super.testXMLToObjectFromURL();

        this.state = TEST_ELEM_WITH_VALUE;
    }

    public void testEmptyElem() throws Exception {
        this.state = TEST_EMPTY_ELEM;
        this.resourceName = EMPTY_ELEMENT;

        super.testXMLToObjectFromURL();

        this.state = TEST_ELEM_WITH_VALUE;
    }

    public void testElemWithWhitespace() throws Exception {
        this.state = TEST_ELEM_WITH_WHITESPACE;
        this.resourceName = ELEMENT_WITH_WHITESPACE;
        super.testXMLToObjectFromURL();

        this.state = TEST_ELEM_WITH_VALUE;
    }

    public void testElemWithValueJSON() throws Exception {
        this.state = TEST_ELEM_WITH_VALUE;
        this.controlJSONLocation = JSON_ELEMENT_WITH_VALUE;
        super.testJSONUnmarshalFromURL();

        this.state = TEST_ELEM_WITH_VALUE;
    }

    public void testAbsentElemJSON() throws Exception {
        this.state = TEST_ABSENT_ELEM;

        this.controlJSONLocation = JSON_ABSENT_ELEMENT;
        super.testJSONUnmarshalFromURL();

        this.state = TEST_ELEM_WITH_VALUE;
    }

    public void testEmptyElemJSON() throws Exception {
        this.state = TEST_EMPTY_ELEM;

        this.controlJSONLocation = JSON_EMPTY_ELEMENT;
        super.testJSONUnmarshalFromURL();
        this.state = TEST_ELEM_WITH_VALUE;
    }

    public void testElemWithWhitespaceJSON() throws Exception {
        this.state = TEST_ELEM_WITH_WHITESPACE;

        this.controlJSONLocation = JSON_ELEMENT_WITH_WHITESPACE;
        super.testJSONUnmarshalFromURL();

        this.state = TEST_ELEM_WITH_VALUE;
    }
}
