/*
 * Copyright (c) 1998, 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:
//     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);
    }

    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));
    }
}
