2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.netconf.api.xml;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertThrows;
14 import static org.junit.Assert.assertTrue;
16 import java.util.Optional;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.opendaylight.netconf.api.DocumentedException;
20 import org.w3c.dom.Document;
21 import org.w3c.dom.Element;
23 public class XmlElementTest {
24 private static final String ELEMENT_AS_STRING = """
25 <top xmlns="namespace" xmlns:a="attrNamespace" a:attr1="value1" attr2="value2">
27 <deepInner>deepValue</deepInner>
29 <innerNamespace xmlns="innerNamespace">innerNamespaceValue</innerNamespace>
30 <innerPrefixed xmlns:b="prefixedValueNamespace">b:valueWithPrefix</innerPrefixed>
32 private Document document;
33 private Element element;
34 private XmlElement xmlElement;
37 public void setUp() throws Exception {
38 document = XmlUtil.readXmlToDocument(ELEMENT_AS_STRING);
39 element = document.getDocumentElement();
40 xmlElement = XmlElement.fromDomElement(element);
44 public void testConstruct() throws Exception {
45 final XmlElement fromString = XmlElement.fromString(ELEMENT_AS_STRING);
46 assertEquals(fromString, xmlElement);
47 XmlElement.fromDomDocument(document);
48 XmlElement.fromDomElement(element);
49 XmlElement.fromDomElementWithExpected(element, "top");
50 XmlElement.fromDomElementWithExpected(element, "top", "namespace");
52 assertThrows(DocumentedException.class, () -> XmlElement.fromString("notXml"));
53 assertThrows(DocumentedException.class, () -> XmlElement.fromDomElementWithExpected(element, "notTop"));
54 assertThrows(DocumentedException.class,
55 () -> XmlElement.fromDomElementWithExpected(element, "top", "notNamespace"));
59 public void testGetters() throws Exception {
60 assertEquals(element, xmlElement.getDomElement());
61 assertEquals(element.getElementsByTagName("inner").getLength(),
62 xmlElement.getElementsByTagName("inner").getLength());
64 assertEquals("top", xmlElement.getName());
65 assertTrue(xmlElement.hasNamespace());
66 assertEquals("namespace", xmlElement.getNamespace());
67 assertEquals("namespace", xmlElement.getNamespaceAttribute());
69 assertEquals("value1", xmlElement.getAttribute("attr1", "attrNamespace"));
70 assertEquals("value2", xmlElement.getAttribute("attr2"));
71 assertEquals(2 + 2/*Namespace definition*/, xmlElement.getAttributes().size());
73 assertEquals(3, xmlElement.getChildElements().size());
74 assertEquals(1, xmlElement.getChildElements("inner").size());
75 assertTrue(xmlElement.getOnlyChildElementOptionally("inner").isPresent());
76 assertTrue(xmlElement.getOnlyChildElementWithSameNamespaceOptionally("inner").isPresent());
77 assertEquals(0, xmlElement.getChildElements("unknown").size());
78 assertFalse(xmlElement.getOnlyChildElementOptionally("unknown").isPresent());
79 assertEquals(1, xmlElement.getChildElementsWithinNamespace("innerNamespace", "innerNamespace").size());
80 assertTrue(xmlElement.getOnlyChildElementOptionally("innerNamespace", "innerNamespace").isPresent());
81 assertFalse(xmlElement.getOnlyChildElementOptionally("innerNamespace", "unknownNamespace").isPresent());
83 final var noNamespaceElement = XmlElement.fromString("<noNamespace/>");
84 assertFalse(noNamespaceElement.hasNamespace());
86 assertThrows(MissingNameSpaceException.class, () -> noNamespaceElement.getNamespace());
88 final var inner = xmlElement.getOnlyChildElement("inner");
89 final var deepInner = inner.getOnlyChildElementWithSameNamespaceOptionally().orElseThrow();
90 assertEquals(deepInner, inner.getOnlyChildElementWithSameNamespace());
91 assertEquals(Optional.empty(), xmlElement.getOnlyChildElementOptionally("unknown"));
92 assertEquals("deepValue", deepInner.getTextContent());
93 assertEquals("deepValue", deepInner.getOnlyTextContentOptionally().orElseThrow());
94 assertEquals("deepValue", deepInner.getOnlyTextContentOptionally().orElseThrow());
98 public void testExtractNamespaces() throws Exception {
99 final var innerPrefixed = xmlElement.getOnlyChildElement("innerPrefixed");
100 var namespaceOfTextContent = innerPrefixed.findNamespaceOfTextContent();
102 assertNotNull(namespaceOfTextContent);
103 assertEquals("b", namespaceOfTextContent.getKey());
104 assertEquals("prefixedValueNamespace", namespaceOfTextContent.getValue());
105 final var innerNamespace = xmlElement.getOnlyChildElement("innerNamespace");
106 namespaceOfTextContent = innerNamespace.findNamespaceOfTextContent();
108 assertEquals("", namespaceOfTextContent.getKey());
109 assertEquals("innerNamespace", namespaceOfTextContent.getValue());