/*
* Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.controller.netconf.util.xml;
import static org.hamcrest.CoreMatchers.both;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import com.google.common.base.Optional;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
import org.opendaylight.controller.netconf.util.exception.MissingNameSpaceException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class XmlElementTest {
private final String elementAsString = "" +
"" +
"deepValue" +
"" +
"innerNamespaceValue" +
"b:valueWithPrefix" +
"";
private Document document;
private Element element;
private XmlElement xmlElement;
@Before
public void setUp() throws Exception {
document = XmlUtil.readXmlToDocument(elementAsString);
element = document.getDocumentElement();
xmlElement = XmlElement.fromDomElement(element);
}
@Test
public void testConstruct() throws Exception {
final XmlElement fromString = XmlElement.fromString(elementAsString);
assertEquals(fromString, xmlElement);
XmlElement.fromDomDocument(document);
XmlElement.fromDomElement(element);
XmlElement.fromDomElementWithExpected(element, "top");
XmlElement.fromDomElementWithExpected(element, "top", "namespace");
try {
XmlElement.fromString("notXml");
fail();
} catch (final NetconfDocumentedException e) {}
try {
XmlElement.fromDomElementWithExpected(element, "notTop");
fail();
} catch (final NetconfDocumentedException e) {}
try {
XmlElement.fromDomElementWithExpected(element, "top", "notNamespace");
fail();
} catch (final NetconfDocumentedException e) {}
}
@Test
public void testGetters() throws Exception {
assertEquals(element, xmlElement.getDomElement());
assertEquals(element.getElementsByTagName("inner").getLength(), xmlElement.getElementsByTagName("inner").getLength());
assertEquals("top", xmlElement.getName());
assertTrue(xmlElement.hasNamespace());
assertEquals("namespace", xmlElement.getNamespace());
assertEquals("namespace", xmlElement.getNamespaceAttribute());
assertEquals(Optional.of("namespace"), xmlElement.getNamespaceOptionally());
assertEquals("value1", xmlElement.getAttribute("attr1", "attrNamespace"));
assertEquals("value2", xmlElement.getAttribute("attr2"));
assertEquals(2 + 2/*Namespace definition*/, xmlElement.getAttributes().size());
assertEquals(3, xmlElement.getChildElements().size());
assertEquals(1, xmlElement.getChildElements("inner").size());
assertTrue(xmlElement.getOnlyChildElementOptionally("inner").isPresent());
assertTrue(xmlElement.getOnlyChildElementWithSameNamespaceOptionally("inner").isPresent());
assertEquals(0, xmlElement.getChildElements("unknown").size());
assertFalse(xmlElement.getOnlyChildElementOptionally("unknown").isPresent());
assertEquals(1, xmlElement.getChildElementsWithSameNamespace("inner").size());
assertEquals(0, xmlElement.getChildElementsWithSameNamespace("innerNamespace").size());
assertEquals(1, xmlElement.getChildElementsWithinNamespace("innerNamespace", "innerNamespace").size());
assertTrue(xmlElement.getOnlyChildElementOptionally("innerNamespace", "innerNamespace").isPresent());
assertFalse(xmlElement.getOnlyChildElementOptionally("innerNamespace", "unknownNamespace").isPresent());
final XmlElement noNamespaceElement = XmlElement.fromString("");
assertFalse(noNamespaceElement.hasNamespace());
try {
noNamespaceElement.getNamespace();
fail();
} catch (final MissingNameSpaceException e) {}
final XmlElement inner = xmlElement.getOnlyChildElement("inner");
final XmlElement deepInner = inner.getOnlyChildElementWithSameNamespaceOptionally().get();
assertEquals(deepInner, inner.getOnlyChildElementWithSameNamespace());
assertEquals(Optional.absent(), xmlElement.getOnlyChildElementOptionally("unknown"));
assertEquals("deepValue", deepInner.getTextContent());
assertEquals("deepValue", deepInner.getOnlyTextContentOptionally().get());
assertEquals("deepValue", deepInner.getOnlyTextContentOptionally().get());
}
@Test
public void testExtractNamespaces() throws Exception {
final XmlElement innerPrefixed = xmlElement.getOnlyChildElement("innerPrefixed");
Map.Entry namespaceOfTextContent = innerPrefixed.findNamespaceOfTextContent();
assertNotNull(namespaceOfTextContent);
assertEquals("b", namespaceOfTextContent.getKey());
assertEquals("prefixedValueNamespace", namespaceOfTextContent.getValue());
final XmlElement innerNamespace = xmlElement.getOnlyChildElement("innerNamespace");
namespaceOfTextContent = innerNamespace.findNamespaceOfTextContent();
assertEquals("", namespaceOfTextContent.getKey());
assertEquals("innerNamespace", namespaceOfTextContent.getValue());
}
@Test
public void testUnrecognisedElements() throws Exception {
xmlElement.checkUnrecognisedElements(xmlElement.getOnlyChildElement("inner"), xmlElement.getOnlyChildElement("innerPrefixed"), xmlElement.getOnlyChildElement("innerNamespace"));
try {
xmlElement.checkUnrecognisedElements(xmlElement.getOnlyChildElement("inner"));
fail();
} catch (final NetconfDocumentedException e) {
assertThat(e.getMessage(), both(containsString("innerNamespace")).and(containsString("innerNamespace")));
}
}
}