Clean up XmlElementTest
[netconf.git] / protocol / netconf-api / src / test / java / org / opendaylight / netconf / api / xml / XmlElementTest.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.netconf.api.xml;
9
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;
15
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;
22
23 public class XmlElementTest {
24     private static final String ELEMENT_AS_STRING = """
25         <top xmlns="namespace" xmlns:a="attrNamespace" a:attr1="value1" attr2="value2">
26           <inner>
27             <deepInner>deepValue</deepInner>
28           </inner>
29           <innerNamespace xmlns="innerNamespace">innerNamespaceValue</innerNamespace>
30           <innerPrefixed xmlns:b="prefixedValueNamespace">b:valueWithPrefix</innerPrefixed>
31         </top>""";
32     private Document document;
33     private Element element;
34     private XmlElement xmlElement;
35
36     @Before
37     public void setUp() throws Exception {
38         document = XmlUtil.readXmlToDocument(ELEMENT_AS_STRING);
39         element = document.getDocumentElement();
40         xmlElement = XmlElement.fromDomElement(element);
41     }
42
43     @Test
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");
51
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"));
56     }
57
58     @Test
59     public void testGetters() throws Exception {
60         assertEquals(element, xmlElement.getDomElement());
61         assertEquals(element.getElementsByTagName("inner").getLength(),
62                 xmlElement.getElementsByTagName("inner").getLength());
63
64         assertEquals("top", xmlElement.getName());
65         assertTrue(xmlElement.hasNamespace());
66         assertEquals("namespace", xmlElement.getNamespace());
67         assertEquals("namespace", xmlElement.getNamespaceAttribute());
68
69         assertEquals("value1", xmlElement.getAttribute("attr1", "attrNamespace"));
70         assertEquals("value2", xmlElement.getAttribute("attr2"));
71         assertEquals(2 + 2/*Namespace definition*/, xmlElement.getAttributes().size());
72
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());
82
83         final var noNamespaceElement = XmlElement.fromString("<noNamespace/>");
84         assertFalse(noNamespaceElement.hasNamespace());
85
86         assertThrows(MissingNameSpaceException.class, () -> noNamespaceElement.getNamespace());
87
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());
95     }
96
97     @Test
98     public void testExtractNamespaces() throws Exception {
99         final var innerPrefixed = xmlElement.getOnlyChildElement("innerPrefixed");
100         var namespaceOfTextContent = innerPrefixed.findNamespaceOfTextContent();
101
102         assertNotNull(namespaceOfTextContent);
103         assertEquals("b", namespaceOfTextContent.getKey());
104         assertEquals("prefixedValueNamespace", namespaceOfTextContent.getValue());
105         final var innerNamespace = xmlElement.getOnlyChildElement("innerNamespace");
106         namespaceOfTextContent = innerNamespace.findNamespaceOfTextContent();
107
108         assertEquals("", namespaceOfTextContent.getKey());
109         assertEquals("innerNamespace", namespaceOfTextContent.getValue());
110     }
111 }