/*
 * 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 java.io.InputStream;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.eclipse.persistence.oxm.NamespaceResolver;
import org.eclipse.persistence.platform.xml.XMLPlatform;
import org.eclipse.persistence.platform.xml.XMLPlatformFactory;

public class PlatformAdvancedXPathTestCases extends org.eclipse.persistence.testing.oxm.XMLTestCase {
    private static final String XML_RESOURCE = "org/eclipse/persistence/testing/oxm/platform/advanced_xpath.xml";
    private static final String XML_RESOURCE_NS = "org/eclipse/persistence/testing/oxm/platform/advanced_xpath_ns.xml";

    private XMLPlatform xmlPlatform;

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

    @Override
    public void setUp() {
        xmlPlatform = XMLPlatformFactory.getInstance().getXMLPlatform();
    }

    public void testSelectSingleNodeAdvancedWithoutNamespace() {
        InputStream inputStream = ClassLoader.getSystemResourceAsStream(XML_RESOURCE);
        Document document = xmlPlatform.newXMLParser().parse(inputStream);
        Node node = xmlPlatform.selectSingleNodeAdvanced(document.getDocumentElement(), "employee[@a='1']", null);
        Attr idAttr = (Attr) node.getAttributes().getNamedItem("id");
        assertEquals("1", idAttr.getValue());
    }

    public void testSelectSingleNodeAdvancedWithNamespace() {
        InputStream inputStream = ClassLoader.getSystemResourceAsStream(XML_RESOURCE_NS);
        Document document = xmlPlatform.newXMLParser().parse(inputStream);
        NamespaceResolver namespaceResolver = new NamespaceResolver();
        namespaceResolver.put("ns", "urn:example");
        Node node = xmlPlatform.selectSingleNodeAdvanced(document.getDocumentElement(), "ns:employee[@a='1']", namespaceResolver);
        Attr idAttr = (Attr) node.getAttributes().getNamedItem("id");
        assertEquals("1", idAttr.getValue());
    }

    public void testSelectNodesAdvancedWithoutNamespace() {
        InputStream inputStream = ClassLoader.getSystemResourceAsStream(XML_RESOURCE);
        Document document = xmlPlatform.newXMLParser().parse(inputStream);
        NodeList nodeList = xmlPlatform.selectNodesAdvanced(document.getDocumentElement(), "employee[@a='1']", null);
        assertEquals(2, nodeList.getLength());
    }

    public void testSelectNodesAdvancedWithNamespace() {
        InputStream inputStream = ClassLoader.getSystemResourceAsStream(XML_RESOURCE_NS);
        Document document = xmlPlatform.newXMLParser().parse(inputStream);
        NamespaceResolver namespaceResolver = new NamespaceResolver();
        namespaceResolver.put("ns", "urn:example");
        NodeList nodeList = xmlPlatform.selectNodesAdvanced(document.getDocumentElement(), "ns:employee[@a='1']", namespaceResolver);
        assertEquals(2, nodeList.getLength());
    }

}
