/*
 * 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.platform;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.eclipse.persistence.platform.xml.XMLComparer;
import org.eclipse.persistence.testing.oxm.OXTestCase;
import org.w3c.dom.Attr;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.DocumentType;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.ProcessingInstruction;
import org.w3c.dom.Text;

public class XMLComparerTestCases extends OXTestCase {
    private XMLComparer xmlComparer;
    private DocumentBuilder documentBuilder;
    private Document document;

    public XMLComparerTestCases(String name) {
        super(name);
    }

    @Override
    public void setUp() throws Exception {
        xmlComparer = new XMLComparer();
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        documentBuilder = dbf.newDocumentBuilder();
        document = documentBuilder.newDocument();
    }

    public void testNode_BothNull() {
        assertTrue(xmlComparer.isNodeEqual(null, null));
    }

    public void testNode_controlNull() {
        assertFalse(xmlComparer.isNodeEqual(null, document));
    }

    public void testNode_testNull() {
        assertFalse(xmlComparer.isNodeEqual(document, null));
    }

    public void testNode_differentTypes() {
        Text test = document.createTextNode("a");
        assertFalse(xmlComparer.isNodeEqual(document, test));
    }

    public void testAttribute_same1() {
        Attr control = document.createAttribute("a");
        Attr test = document.createAttribute("a");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_same2() {
        Attr control = document.createAttributeNS("a", "b");
        Attr test = document.createAttributeNS("a", "b");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_same3() {
        Attr control = document.createAttribute("a");
        control.setValue("c");
        Attr test = document.createAttribute("a");
        test.setValue("c");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_same4() {
        Attr control = document.createAttributeNS("a", "b");
        control.setValue("c");
        Attr test = document.createAttributeNS("a", "b");
        test.setValue("c");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_same5() {
        Attr control = document.createAttributeNS("ns1:a", "b");
        control.setValue("c");
        Attr test = document.createAttributeNS("ns1:a", "b");
        test.setValue("c");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_diff1() {
        Attr control = document.createAttribute("a");
        Attr test = document.createAttribute("x");
        assertFalse(xmlComparer.isNodeEqual(control, test));

    }

    public void testAttribute_diff2a() {
        Attr control = document.createAttributeNS("a", "b");
        Attr test = document.createAttribute("a");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_diff2b() {
        Attr control = document.createAttributeNS("a", "b");
        Attr test = document.createAttributeNS("a", "y");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_diff2c() {
        Attr control = document.createAttributeNS("a", "b");
        Attr test = document.createAttributeNS("x", "b");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_diff3a() {
        Attr control = document.createAttribute("a");
        control.setValue("c");
        Attr test = document.createAttribute("a");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_diff3b() {
        Attr control = document.createAttribute("a");
        control.setValue("c");
        Attr test = document.createAttribute("a");
        test.setValue("z");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_diff4a() {
        Attr control = document.createAttributeNS("a", "b");
        control.setValue("c");
        Attr test = document.createAttributeNS("a", "b");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_diff4b() {
        Attr control = document.createAttributeNS("a", "b");
        control.setValue("c");
        Attr test = document.createAttributeNS("a", "b");
        test.setValue("z");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_diff5a() {
        Attr control = document.createAttributeNS("ns1:a", "b");
        control.setValue("c");
        Attr test = document.createAttributeNS("a", "b");
        test.setValue("c");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testAttribute_diff5b() {
        Attr control = document.createAttributeNS("ns1:a", "b");
        control.setValue("c");
        Attr test = document.createAttributeNS("ns2:a", "b");
        test.setValue("c");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testCDATASection_same() {
        CDATASection control = document.createCDATASection("a");
        CDATASection test = document.createCDATASection("a");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testCDATASection_diff() {
        CDATASection control = document.createCDATASection("a");
        CDATASection test = document.createCDATASection("x");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testComment_same() {
        Comment control = document.createComment("a");
        Comment test = document.createComment("a");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testComment_diff() {
        Comment control = document.createComment("a");
        Comment test = document.createComment("b");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocument_same1() {
        Document control = documentBuilder.newDocument();
        Document test = documentBuilder.newDocument();
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocument_same2() {
        DOMImplementation domImpl = documentBuilder.getDOMImplementation();
        DocumentType controlDocumentType = domImpl.createDocumentType("a", "b", "c");
        Document control = domImpl.createDocument(null, "a", controlDocumentType);
        DocumentType testDocumentType = domImpl.createDocumentType("a", "b", "c");
        Document test = domImpl.createDocument(null, "a", testDocumentType);
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocument_diff2a() {
        DOMImplementation domImpl = documentBuilder.getDOMImplementation();
        DocumentType controlDocumentType = domImpl.createDocumentType("a", "b", "c");
        Document control = domImpl.createDocument(null, "a", controlDocumentType);
        Document test = documentBuilder.newDocument();
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocument_diff2b() {
        DOMImplementation domImpl = documentBuilder.getDOMImplementation();
        DocumentType controlDocumentType = domImpl.createDocumentType("a", "b", "c");
        Document control = domImpl.createDocument(null, "a", controlDocumentType);
        DocumentType testDocumentType = domImpl.createDocumentType("x", "y", "z");
        Document test = domImpl.createDocument(null, "x", testDocumentType);
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocument_diff3() {
        Document control = documentBuilder.newDocument();
        Element child = control.createElement("theroot");
        control.appendChild(child);
        Document test = documentBuilder.newDocument();
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentFragment_same() {
        DocumentFragment control = document.createDocumentFragment();
        control.appendChild(document.createElement("a1"));
        control.appendChild(document.createElement("a2"));
        DocumentFragment test = document.createDocumentFragment();
        test.appendChild(document.createElement("a1"));
        test.appendChild(document.createElement("a2"));
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentFragment_diffa() {
        DocumentFragment control = document.createDocumentFragment();
        control.appendChild(document.createElement("a1"));
        control.appendChild(document.createElement("a2"));
        DocumentFragment test = document.createDocumentFragment();
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentFragment_diffb() {
        DocumentFragment control = document.createDocumentFragment();
        control.appendChild(document.createElement("a1"));
        control.appendChild(document.createElement("a2"));
        DocumentFragment test = document.createDocumentFragment();
        test.appendChild(document.createElement("a1"));
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentFragment_diffc() {
        DocumentFragment control = document.createDocumentFragment();
        control.appendChild(document.createElement("a1"));
        control.appendChild(document.createElement("a2"));
        DocumentFragment test = document.createDocumentFragment();
        test.appendChild(document.createElement("a2"));
        test.appendChild(document.createElement("a1"));
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentType_same1() {
        DOMImplementation domImpl = documentBuilder.getDOMImplementation();
        DocumentType control = domImpl.createDocumentType("a", null, null);
        DocumentType test = domImpl.createDocumentType("a", null, null);
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentType_same2() {
        DOMImplementation domImpl = documentBuilder.getDOMImplementation();
        DocumentType control = domImpl.createDocumentType("a", "b", null);
        DocumentType test = domImpl.createDocumentType("a", "b", null);
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentType_same3() {
        DOMImplementation domImpl = documentBuilder.getDOMImplementation();
        DocumentType control = domImpl.createDocumentType("a", "b", "c");
        DocumentType test = domImpl.createDocumentType("a", "b", "c");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentType_diff1() {
        DOMImplementation domImpl = documentBuilder.getDOMImplementation();
        DocumentType control = domImpl.createDocumentType("a", null, null);
        DocumentType test = domImpl.createDocumentType("x", null, null);
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentType_diff2a() {
        DOMImplementation domImpl = documentBuilder.getDOMImplementation();
        DocumentType control = domImpl.createDocumentType("a", "b", null);
        DocumentType test = domImpl.createDocumentType("a", null, null);
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentType_diff2b() {
        DOMImplementation domImpl = documentBuilder.getDOMImplementation();
        DocumentType control = domImpl.createDocumentType("a", "b", null);
        DocumentType test = domImpl.createDocumentType("a", "y", null);
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentType_diff3a() {
        DOMImplementation domImpl = documentBuilder.getDOMImplementation();
        DocumentType control = domImpl.createDocumentType("a", "b", "c");
        DocumentType test = domImpl.createDocumentType("a", "b", null);
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testDocumentType_diff3b() {
        DOMImplementation domImpl = documentBuilder.getDOMImplementation();
        DocumentType control = domImpl.createDocumentType("a", "b", "c");
        DocumentType test = domImpl.createDocumentType("a", "b", "z");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_same1() {
        Element control = document.createElement("a");
        Element test = document.createElement("a");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_same2() {
        Element control = document.createElementNS("a", "b");
        Element test = document.createElementNS("a", "b");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_same3() {
        Element control = document.createElement("a");
        control.setAttribute("a1", "c1");
        control.setAttribute("a2", "c2");
        Element test = document.createElement("a");
        test.setAttribute("a1", "c1");
        test.setAttribute("a2", "c2");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_same4() {
        Element control = document.createElement("a");
        control.appendChild(document.createElement("a1"));
        control.appendChild(document.createElement("a2"));
        Element test = document.createElement("a");
        test.appendChild(document.createElement("a1"));
        test.appendChild(document.createElement("a2"));
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_same5() {
        Element control = document.createElementNS("ns1:a", "b");
        Element test = document.createElementNS("ns1:a", "b");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_same6() {
        Element control = document.createElementNS("ns1", "ns1:a");
        control.setAttributeNS("ns1", "ns1:a1", "c1");
        control.setAttributeNS("ns1", "ns1:a2", "c2");
        Element test = document.createElementNS("ns1", "ns1:a");
        test.setAttributeNS("ns1", "ns1:a1", "c1");
        test.setAttributeNS("ns1", "ns1:a2", "c2");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff1() {
        Element control = document.createElement("a");
        Element test = document.createElement("x");
        assertFalse(xmlComparer.isNodeEqual(control, test));

    }

    public void testElement_diff2a() {
        Element control = document.createElementNS("a", "b");
        Element test = document.createElement("a");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff2b() {
        Element control = document.createElementNS("a", "b");
        Element test = document.createElementNS("a", "y");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff2c() {
        Element control = document.createElementNS("a", "b");
        Element test = document.createElementNS("x", "b");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff3a() {
        Element control = document.createElement("a");
        control.setAttribute("a1", "c1");
        control.setAttribute("a2", "c2");
        Element test = document.createElement("a");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff3b() {
        Element control = document.createElement("a");
        control.setAttribute("a1", "c1");
        control.setAttribute("a2", "c2");
        Element test = document.createElement("a");
        test.setAttribute("a1", "c1");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff3c() {
        Element control = document.createElement("a");
        control.setAttribute("a1", "c1");
        control.setAttribute("a2", "c2");
        Element test = document.createElement("a");
        test.setAttribute("a2", "c2");
        test.setAttribute("a1", "c1");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff4a() {
        Element control = document.createElement("a");
        control.appendChild(document.createElement("a1"));
        control.appendChild(document.createElement("a2"));
        Element test = document.createElement("a");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff4b() {
        Element control = document.createElement("a");
        control.appendChild(document.createElement("a1"));
        control.appendChild(document.createElement("a2"));
        Element test = document.createElement("a");
        test.appendChild(document.createElement("a1"));
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff4c() {
        Element control = document.createElement("a");
        control.appendChild(document.createElement("a1"));
        control.appendChild(document.createElement("a2"));
        Element test = document.createElement("a");
        test.appendChild(document.createElement("a2"));
        test.appendChild(document.createElement("a1"));
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff5a() {
        Element control = document.createElementNS("ns1:a", "b");
        Element test = document.createElementNS("a", "b");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff5b() {
        Element control = document.createElementNS("ns1:a", "b");
        Element test = document.createElementNS("ns2:a", "b");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff6a() {
        Element control = document.createElementNS("ns1", "ns1:a");
        control.setAttributeNS("ns1", "ns1:a1", "c1");
        control.setAttributeNS("ns1", "ns1:a2", "c2");
        Element test = document.createElementNS("ns1", "ns1:a");
        test.setAttributeNS("ns1", "ns1:a2", "c2");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff6b() {
        Element control = document.createElementNS("ns1", "ns1:a");
        control.setAttributeNS("ns1", "ns1:a1", "c1");
        control.setAttributeNS("ns1", "ns1:a2", "c2");
        Element test = document.createElementNS("ns1", "ns1:a");
        test.setAttributeNS("ns1", "ns1:a1", "c2");
        test.setAttributeNS("ns1", "ns1:a2", "c2");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testElement_diff6c() {
        Element control = document.createElementNS("ns1", "ns1:a");
        control.setAttributeNS("ns1", "ns1:a1", "c1");
        control.setAttributeNS("ns1", "ns1:a2", "c2");
        Element test = document.createElementNS("ns1", "ns1:a");
        test.setAttributeNS("ns1", "ns1:a2", "c2");
        test.setAttributeNS("ns1", "ns1:a3", "c3");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testEntityReference_same() {
        EntityReference control = document.createEntityReference("a");
        EntityReference test = document.createEntityReference("a");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testEntityReference_diff() {
        EntityReference control = document.createEntityReference("a");
        EntityReference test = document.createEntityReference("x");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testProcessingInstruction_same() {
        ProcessingInstruction control = document.createProcessingInstruction("a", "b");
        ProcessingInstruction test = document.createProcessingInstruction("a", "b");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testProcessingInstruction_diffa() {
        ProcessingInstruction control = document.createProcessingInstruction("a", "b");
        ProcessingInstruction test = document.createProcessingInstruction("a", "y");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testProcessingInstruction_diffb() {
        ProcessingInstruction control = document.createProcessingInstruction("a", "b");
        ProcessingInstruction test = document.createProcessingInstruction("x", "b");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }

    public void testText_same() {
        Text control = document.createTextNode("a");
        Text test = document.createTextNode("a");
        assertTrue(xmlComparer.isNodeEqual(control, test));
    }

    public void testText_diff() {
        Text control = document.createTextNode("a");
        Text test = document.createTextNode("b");
        assertFalse(xmlComparer.isNodeEqual(control, test));
    }
}
