/*
 * 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:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.oxm.mappings.directtofield.defaultnullvalue.xmlelement;

import junit.textui.TestRunner;

import org.eclipse.persistence.oxm.XMLRoot;
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.testing.oxm.OXTestCase.Metadata;
import org.eclipse.persistence.testing.oxm.OXTestCase.Platform;
import org.eclipse.persistence.testing.oxm.mappings.XMLMappingTestCases;
import org.eclipse.persistence.testing.oxm.mappings.directtofield.defaultnullvalue.Employee;

import org.w3c.dom.Document;

public class EmptyElementTestCases extends XMLMappingTestCases {

    private final static String XML_RESOURCE = "org/eclipse/persistence/testing/oxm/mappings/directtofield/defaultnullvalue/xmlelement/EmptyElement.xml";
    private final static String XML_WRITE_RESOURCE = "org/eclipse/persistence/testing/oxm/mappings/directtofield/defaultnullvalue/xmlelement/EmptyElementWrite.xml";

    /**
     * Empty Element single tag With nullValue=EMPTY_STRING "<employee/>", "<employee/>",
     * true, false); // Expected result "<employee><first-name/></employee>", true, false); // Input document
     */

    public EmptyElementTestCases(String name) throws Exception {
        super(name);
        setControlDocument(XML_RESOURCE);
        //setWriteControlDocument(XML_WRITE_RESOURCE);
        Project aProject = new DefaultNullValueElementProject();
        setProject(aProject);
        // Force empty element marshalling
        XMLDirectMapping firstNameMapping = (XMLDirectMapping) aProject
                .getDescriptor(Employee.class)//
                .getMappingForAttributeName("firstName");
        // firstNameMapping.getNullPolicy().setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
        XMLDirectMapping numericNoNullValueMapping = (XMLDirectMapping) aProject
                .getDescriptor(Employee.class)//
                .getMappingForAttributeName("numericNoNullValue");
        // numericNoNullValueMapping.getNullPolicy().setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
        XMLDirectMapping idMapping = (XMLDirectMapping) aProject.getDescriptor(
                Employee.class)//
                .getMappingForAttributeName("id");
        // idMapping.getNullPolicy().setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
    }

    @Override
    protected Object getControlObject() {
        Employee employee = new Employee();
        // We currently have different behavior when using XMLProjectReader
          if(platform==Platform.DOM && metadata==Metadata.XML_ECLIPSELINK) {
            employee.setID(DefaultNullValueElementProject.CONTROL_ID);
            // See bug#209398 - current behavior for deployment xml is to not preserve the nullValue of ""
            //employee.setFirstName(DefaultNullValueElementProject.CONTROL_FIRSTNAME);
        } else {
            employee.setID(DefaultNullValueElementProject.CONTROL_ID);
            // See bug#209398 - current behavior for deployment xml is to not preserve the nullValue of ""
            employee    .setFirstName(DefaultNullValueElementProject.CONTROL_FIRSTNAME);
        }
        return employee;
    }

    @Override
    public Object getWriteControlObject() {
        Employee employee = new Employee();
        // We currently have different behavior when using XMLProjectReader
          if(platform==Platform.DOM && metadata==Metadata.XML_ECLIPSELINK) {
            employee.setID(DefaultNullValueElementProject.CONTROL_ID);
            // See bug#209398 - current behavior for deployment xml is to not
            // preserve the nullValue of ""
            //employee.setFirstName(DefaultNullValueElementProject.CONTROL_FIRSTNAME);
        } else {
            employee.setID(DefaultNullValueElementProject.CONTROL_ID);
            // See bug#209398 - current behavior for deployment xml is to not preserve the nullValue of ""
            employee    .setFirstName(DefaultNullValueElementProject.CONTROL_FIRSTNAME);
        }
        return employee;
    }

    // public void testObjectToXMLDocument() throws Exception { }

    public void testObjectToXMLDocumentToObjectRoundTrip() throws Exception {
        // Object to XMLDocument
        Document testDocument = xmlMarshaller.objectToXML(getWriteControlObject());
        objectToXMLDocumentTest(testDocument);

        // XMLDocument to Object
        Object testObject = xmlUnmarshaller.unmarshal(testDocument);
        log("Expected:");
        log(getReadControlObject().toString());
        log("Actual:");
        log(testObject.toString());
        if ((getReadControlObject() instanceof XMLRoot)
                && (testObject instanceof XMLRoot)) {
            XMLRoot controlObj = (XMLRoot) getReadControlObject();
            XMLRoot testObj = (XMLRoot) testObject;
            compareXMLRootObjects(controlObj, testObj);
        } else {
            assertEquals(getReadControlObject(), testObject);
        }
    }

    public static void main(String[] args) {
        String[] arguments = {
                "-c",
                "oracle.toplink.testing.ox.mappings.directtofield.defaultnullvalue.xmlelement.EmptyElementTestCases" };
        TestRunner.main(arguments);
    }
}
