blob: daf7574e1dfd65f16ce581a3e3d1f4da34a13bcc [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dom.checkin;
import dom.common.NodeWithChildrenTest;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.*;
import xmlcursor.common.Common;
import static org.junit.Assert.*;
public class ElementTest extends NodeWithChildrenTest {
public ElementTest() {
String sDTD =
"<?xml version=\"1.0\"?>" +
"<!DOCTYPE bardoc [" +
"<!ELEMENT bar>" +
"<!ELEMENT foo>" +
"<!ATTLIST bar at_spec CDATA \"0\">" +
"]>";
sXmlNS =
"<bar xmlns:other=\"uri:other\" xmlns:myns=\"uri:foo\">" +
"<foo myns:at0=\"val01\" myns:at2=\"at2\" at2=\"val2\" myns:at3=\"val3\" at4=\"val4\">" +
"txt0<foo>nestedfoo</foo><myns:yana/>" +
"</foo>" +
"<myns:foo>nstext<ZeD/></myns:foo>" +
"</bar>";
if (bDTD)
sXmlNS = sDTD + sXmlNS;
sXml = Common.XML_FOO_BAR_NESTED_SIBLINGS;
}
@Test
public void testNodeName() {
assertEquals("zed", m_node.getNodeName());
}
@Test
public void testNodeType() {
assertEquals(Node.ELEMENT_NODE, m_node.getNodeType());
}
@Test
public void testNodeValue() {
assertNull(m_node.getNodeValue());
}
@Test
public void testNextSibling() {
assertNull(m_node.getNextSibling());
}
@Test
public void testPreviousSibling() {
Node prSib = m_node.getPreviousSibling();
assertEquals("text0", prSib.getNodeValue());
}
@Test
public void testParent() {
Node parent = m_node.getParentNode();
assertEquals("bar", parent.getLocalName());
assertEquals(m_doc.getFirstChild().getFirstChild(), parent);
}
@Test
public void testPrefix() {
assertEquals("", m_node.getPrefix());
m_node = m_docNS.getDocumentElement().getChildNodes().item(1);
assertEquals("myns:foo", m_node.getNodeName());
assertEquals("myns", m_node.getPrefix());
}
@Test
public void testNamespaceUri() {
assertEquals("", m_node.getNamespaceURI());
}
@Test
public void testCloneNode() {
super.testCloneNode();
}
/**
* Clone node with atts
*/
@Test
public void testCloneNodeAttrs() {
Node toClone = m_docNS.getFirstChild(); //the foo elt
/* Node clone1=toClone.cloneNode(false);
NamedNodeMap attrSet1=toClone.getAttributes();
assertEquals(true,DomUtils.compareNamedNodeMaps(attrSet1,clone1.getAttributes()));
*/
Node clone2 = toClone.cloneNode(true);
}
@Test
public void testHasAttributes() {
super.testHasAttributes();
m_node = m_doc.getFirstChild();
assertTrue(m_node.hasAttributes());
}
@Test
public void testGetAttribute() {
m_node = m_docNS.getFirstChild();
if (bDTD)
assertEquals("0", ((Element) m_node).getAttribute("at_spec"));
assertEquals("val2",
((Element) m_node.getFirstChild()).getAttribute("at2"));
}
@Test
public void testGetAttributeDNE() {
m_node = m_docNS.getFirstChild();
assertEquals("", ((Element) m_node).getAttribute("at3"));
assertEquals("", ((Element) m_node).getAttribute("foobar"));
String sNull = null;
assertEquals("", ((Element) m_node).getAttribute(sNull));
}
@Test
public void testGetAttributeNode() {
m_node = m_docNS.getFirstChild();
assertEquals("bar", ((Element) m_node).getTagName());
//assertEquals("uri:foo",((Attr)((Element)m_node).getAttributeNodeNS("xmlns","myns")).getNodeValue());
m_node = m_node.getFirstChild();
assertEquals("val2",
((Element) m_node).getAttributeNode("at2").getNodeValue());
if (bDTD)
assertEquals("0",
((Element) m_node).getAttributeNode("at_spec").getNodeValue());
}
@Test
public void testGetAttributeNodeDNE() {
m_node = m_docNS.getFirstChild();
assertNull(((Element) m_node).getAttributeNode("at3"));
assertNull(((Element) m_node).getAttributeNode("foobar"));
String sNull = null;
assertEquals("", ((Element) m_node).getAttribute(sNull));
}
@Test
public void getAttributeNodeNS() {
m_node = m_docNS.getFirstChild().getFirstChild();
if (bDTD) {
assertEquals("0",
((Element) m_node).getAttributeNodeNS("", "at_spec").getNodeValue());
}
assertEquals("val01",
((Element) m_node).getAttributeNodeNS("uri:foo", "at0").getNodeValue());
assertEquals("val2",
((Element) m_node).getAttributeNodeNS(null, "at2").getNodeValue());
assertEquals("val3",
((Element) m_node).getAttributeNodeNS("uri:foo", "at3").getNodeValue());
}
@Test
public void testGetAttributeNodeNS_DNE() {
m_node = m_docNS.getFirstChild();
assertNull(((Element) m_node).getAttributeNodeNS("", "at3"));
assertNull(((Element) m_node).getAttributeNodeNS("uri:foo", "at1"));
String sNull = null;
assertNull(((Element) m_node).getAttributeNodeNS("uri:foo", sNull));
}
@Test
public void testGetAttributeNS() {
m_node = m_docNS.getFirstChild().getFirstChild();
if (bDTD)
assertEquals("0",
((Element) m_node).getAttributeNS(null, "at_spec"));
assertEquals("val01",
((Element) m_node).getAttributeNS("uri:foo", "at0"));
assertEquals("val2", ((Element) m_node).getAttributeNS("", "at2"));
}
@Test
public void testGetAttributeNS_DNE() {
m_node = m_docNS.getFirstChild();
assertEquals("", ((Element) m_node).getAttributeNS("", "at3"));
assertEquals("", ((Element) m_node).getAttributeNS("uri:foo", "at1"));
String sNull = null;
assertEquals("", ((Element) m_node).getAttributeNS("uri:foo", sNull));
}
@Test
public void testGetElementsByTagName() {
//move node @ foo
m_node = m_node.getParentNode().getParentNode();
NodeList result = ((Element) m_node).getElementsByTagName("*");
int nEltCount = 5;//num elts in the XML
assertEquals(nEltCount - 1, result.getLength());
result = ((Element) m_node).getElementsByTagName("zed");
assertEquals(2, result.getLength());
assertEquals("nested0", result.item(0).getFirstChild().getNodeValue());
assertEquals("nested1", result.item(1).getFirstChild().getNodeValue());
}
@Test
public void testGetElementsByTagNameDNE() {
NodeList result = ((Element) m_node.getParentNode()).getElementsByTagName(
"foobar");
assertEquals(0, result.getLength());
}
//elts need to come out in preorder order
@Test
public void testGetElementsByTagNamePreorder() {
m_node = m_docNS.getFirstChild();
NodeList result = ((Element) m_node).getElementsByTagName("foo");
assertEquals(2, result.getLength());
assertEquals("txt0", result.item(0).getFirstChild().getNodeValue());
assertEquals("nestedfoo",
result.item(1).getFirstChild().getNodeValue());
}
@Test
public void testGetElementsByTagNameDescendant() {
m_node = m_docNS.getFirstChild().getFirstChild();
NodeList result = ((Element) m_node).getElementsByTagName("foo");//self should not be selected
assertEquals(1, result.getLength());
assertEquals("nestedfoo",
result.item(0).getFirstChild().getNodeValue());
}
@Test
public void testGetElementsByTagNameNS() {
m_node = m_docNS.getFirstChild();
NodeList result = ((Element) m_node).getElementsByTagNameNS("*", "*");
int nEltCount = 6;
assertEquals(nEltCount - 1, result.getLength());
result = ((Element) m_node).getElementsByTagNameNS("*", "foo");
nEltCount = 3;
assertEquals(nEltCount, result.getLength());
assertEquals("txt0", result.item(0).getFirstChild().getNodeValue());
assertEquals("nestedfoo",
result.item(1).getFirstChild().getNodeValue());
assertEquals("nstext", result.item(2).getFirstChild().getNodeValue());
result = ((Element) m_node).getElementsByTagNameNS("uri:foo", "foo");
assertEquals(1, result.getLength());
assertEquals("nstext", result.item(0).getFirstChild().getNodeValue());
result = ((Element) m_node).getElementsByTagNameNS(null, "foo");
assertEquals("txt0", result.item(0).getFirstChild().getNodeValue());
assertEquals("nestedfoo",
result.item(1).getFirstChild().getNodeValue());
NodeList result1 = ((Element) m_node).getElementsByTagNameNS("", "foo");
assertTrue(compareNodeList(result, result1));
result = ((Element) m_node).getElementsByTagNameNS(null, "*");
assertEquals(3, result.getLength());
assertEquals("ZeD", ((Element) result.item(2)).getTagName());
}
@Test
public void testGetElementsByTagNameNS_DNE() {
m_node = m_docNS.getFirstChild();
NodeList result = ((Element) m_node).getElementsByTagNameNS("uri:foo",
"zed");
assertEquals(0, result.getLength());
result =
((Element) m_node).getElementsByTagNameNS("foo:uri_DNE", "foo");
assertEquals(0, result.getLength());
}
@Test
public void testGetTagName() {
m_node =
m_docNS.getFirstChild().getChildNodes().item(1).getChildNodes()
.item(1);
assertEquals("ZeD", ((Element) m_node).getTagName());
}
@Test
public void testHasAttribute() {
m_node = m_docNS.getFirstChild();
if (bDTD)
assertTrue(((Element) m_node).hasAttribute("at_spec"));
m_node = m_docNS.getFirstChild();
assertFalse(((Element) m_node).hasAttribute("at3"));
assertFalse(((Element) m_node).hasAttribute("at0"));
}
@Test
public void testHasAttributeNS() {
m_node = m_docNS.getFirstChild();
if (bDTD)
assertTrue(((Element) m_node).hasAttributeNS(null, "at_spec"));
m_node = m_node.getFirstChild();
assertTrue(((Element) m_node).hasAttributeNS("uri:foo", "at3"));
assertFalse(((Element) m_node).hasAttributeNS("uri:foo:org", "at0"));
assertFalse(((Element) m_node).hasAttributeNS("uri:foo", null));
}
@Test
public void testRemoveAttribute() {
m_node = m_docNS.getFirstChild();
//remove default
if (bDTD) {
((Element) m_node).removeAttribute("at_spec");
assertEquals(1, m_node.getAttributes().getLength());
}
m_node = m_node.getFirstChild();
assertEquals("foo", m_node.getNodeName());
assertEquals(5, m_node.getAttributes().getLength());
((Element) m_node).removeAttribute("at2");
assertEquals(4, m_node.getAttributes().getLength());
//DNE
((Element) m_node).removeAttribute("at3");
assertEquals(4, m_node.getAttributes().getLength());
}
@Test
public void testRemoveAttributeNode() {
Node removed;
//remove default
m_node = m_docNS.getFirstChild();
if (bDTD) {
((Element) m_node).removeAttributeNode(
((Element) m_node).getAttributeNode("at_spec"));
assertEquals(1, m_node.getAttributes().getLength());
}
m_node = m_node.getFirstChild();
assertEquals("foo", m_node.getNodeName());
assertEquals(5, m_node.getAttributes().getLength());
Attr remove = ((Element) m_node).getAttributeNode("at2");
removed = ((Element) m_node).removeAttributeNode(remove);
assertNotNull(removed);
assertEquals(4, m_node.getAttributes().getLength());
assertEquals(removed, remove);
}
@Test
public void testRemoveAttributeNode_DNE() {
//DNE
Node removed;
Attr remove = ((Element) m_node).getAttributeNode("at3");
try {
removed = ((Element) m_node).removeAttributeNode(remove);
fail("removing Non existing attr");
} catch (DOMException de) {
assertEquals(DOMException.NOT_FOUND_ERR, de.code);
}
remove = null;
try {
removed = ((Element) m_node).removeAttributeNode(remove);
fail("removing Non existing attr");
} catch (DOMException de) {
assertEquals(DOMException.NOT_FOUND_ERR, de.code);
}
//differentParent
remove = m_doc.getDocumentElement().getAttributeNode("attr0");
try {
removed = ((Element) m_node).removeAttributeNode(remove);
fail("removing Non existing attr");
} catch (DOMException de) {
assertEquals(DOMException.NOT_FOUND_ERR, de.code);
}
}
@Test
public void testRemoveAttributeNS() {
//remove default
m_node = m_docNS.getFirstChild();
if (bDTD) {
((Element) m_node).removeAttributeNS(null, "at_spec");
assertEquals(1, m_node.getAttributes().getLength());
}
m_node = ((Element) m_node).getFirstChild();
((Element) m_node).removeAttributeNS("uri:foo", "at0");
assertEquals(4, m_node.getAttributes().getLength());
//DNE
((Element) m_node).removeAttributeNS(null, "at3");
assertEquals(4, m_node.getAttributes().getLength());
((Element) m_node).removeAttributeNS("uri:foo", null);
assertEquals(4, m_node.getAttributes().getLength());
}
@Test
public void testSetAttribute() {
m_node = m_doc.getDocumentElement();
try {
((Element) m_node).setAttribute("invalid<", "0");
fail("Invalid attr name");
} catch (DOMException de) {
assertEquals(DOMException.INVALID_CHARACTER_ERR, de.code);
}
((Element) m_node).setAttribute("attr0", "newval");
assertEquals("newval", ((Element) m_node).getAttribute("attr0"));
((Element) m_node).setAttribute("attr1", "newval");
assertEquals("newval", ((Element) m_node).getAttribute("attr1"));
assertEquals(2, m_node.getAttributes().getLength());
}
@Test
public void testSetAttributeNode() {
Attr result;
Attr newAttr = m_doc.createAttribute("attr0");
Attr oldAttr = ((Element) m_node).getAttributeNode("attr0");
newAttr.setValue("newval");
result = ((Element) m_node).setAttributeNode(newAttr);
assertEquals(oldAttr, result);
assertEquals("newval",
((Element) m_node).getAttributeNode("attr0").getNodeValue());
//insert self
try {
Attr at0 = ((Element) m_node).getAttributeNode("attr0");
String v1 = at0.getNodeValue();
((Element) m_node).setAttributeNode(at0);
assertEquals(v1, ((Element) m_node).getAttribute("attr0"));
} catch (DOMException de) {
assertEquals(de.code, DOMException.INUSE_ATTRIBUTE_ERR);
}
//insert new
newAttr = m_doc.createAttribute("attr1");
newAttr.setValue("newval");
result = ((Element) m_node).setAttributeNode(newAttr);
assertNull(result);
assertEquals("newval",
((Element) m_node).getAttributeNode("attr1").getNodeValue());
assertEquals(2, m_node.getAttributes().getLength());
}
@Test
public void testSetAttributeNodeDiffDoc() {
Attr result;
Attr newAttr = m_docNS.createAttribute("attr0");
try {
result = ((Element) m_node).setAttributeNode(newAttr);
fail("Attr Node diff doc in use");
} catch (DOMException de) {
assertEquals(DOMException.WRONG_DOCUMENT_ERR, de.code);
}
}
@Test
public void testSetAttributeNodeInUse() {
//insert new
m_node = m_node.getParentNode().getParentNode();
Attr newAttr = ((Element) m_node).getAttributeNode("attr0");
m_node = m_node.getFirstChild();
try {
((Element) m_node).setAttributeNode(newAttr);
fail("Attr Node in use");
} catch (DOMException de) {
assertEquals(DOMException.INUSE_ATTRIBUTE_ERR, de.code);
}
}
@Test
public void testSetAttributeNodeNS() {
m_node = m_docNS.getFirstChild().getFirstChild();
Attr result;
Attr newAttr = m_docNS.createAttributeNS("uri:foo", "at0");
Attr oldAttr = ((Element) m_node).getAttributeNodeNS("uri:foo", "at0");
assertNotNull(oldAttr);
newAttr.setValue("newval");
result = ((Element) m_node).setAttributeNodeNS(newAttr);
assertEquals(oldAttr, result);
Attr insertedAtt = ((Element) m_node).getAttributeNodeNS("uri:foo",
"at0");
assertNotNull(insertedAtt);
assertEquals("newval", insertedAtt.getNodeValue());
//insert new
int nAttrCnt = m_node.getAttributes().getLength();
newAttr = m_docNS.createAttributeNS("uri:foo", "attr1");
newAttr.setValue("newval");
result = ((Element) m_node).setAttributeNode(newAttr);
assertNull(result);
assertEquals("newval",
((Element) m_node).getAttributeNS("uri:foo", "attr1"));
assertEquals(nAttrCnt + 1, m_node.getAttributes().getLength());
//insert new
newAttr = m_docNS.createAttributeNS("uri:foo:org", "attr1");
newAttr.setValue("newURIval");
result = ((Element) m_node).setAttributeNodeNS(newAttr);
assertNull(result);
assertEquals("newURIval",
((Element) m_node).getAttributeNS("uri:foo:org", "attr1"));
assertEquals(nAttrCnt + 2, m_node.getAttributes().getLength());
}
@Test
public void testSetAttributeNS() {
m_node = m_docNS.getFirstChild().getFirstChild();
//overwrite
((Element) m_node).setAttributeNS("uri:foo", "at0", "newval");
assertEquals("newval",
((Element) m_node).getAttributeNS("uri:foo", "at0"));
((Element) m_node).setAttributeNS("uri:foo:org", "attr1", "newval");
assertEquals("newval",
((Element) m_node).getAttributeNS("uri:foo:org", "attr1"));
assertEquals(6, m_node.getAttributes().getLength());
}
@Test
public void testSetAttributeNSBadNS() {
//qualifiedName is malformed
try {
((Element) m_node).setAttributeNS("foo:org", "invalid<", "0");
fail("Invalid attr name");
} catch (DOMException de) {
assertEquals(DOMException.INVALID_CHARACTER_ERR, de.code);
}
//the qualifiedName has a prefix and the namespaceURI is null
try {
String sNull = null;
((Element) m_node).setAttributeNS(sNull, "myfoo:at", "0");
fail("Invalid attr name");
} catch (DOMException de) {
assertEquals(DOMException.NAMESPACE_ERR, de.code);
}
}
@Test
public void testSetAttributeNSBadNS_xmlns() {
//the qualifiedName, or its prefix, is "xmlns" and the namespaceURI is different from " http://www.w3.org/2000/xmlns/".
try {
((Element) m_node).setAttributeNS("foo:org:uri", "xmlns", "0");
fail("Invalid attr name");
} catch (DOMException de) {
assertEquals(DOMException.NAMESPACE_ERR, de.code);
}
try {
((Element) m_node).setAttributeNS("foo:org:uri", "xmlns:foo", "0");
fail("Invalid attr name");
} catch (DOMException de) {
assertEquals(DOMException.NAMESPACE_ERR, de.code);
}
}
@Test
public void testSetAttributeNSBadNS_xml() {
//if the qualifiedName has a prefix that is "xml"
// and the namespaceURI is different from " http://www.w3.org/XML/1998/namespace"
try {
((Element) m_node).setAttributeNS("foo:org:uri", "xml:foo", "0");
fail("Invalid attr name");
} catch (DOMException de) {
assertEquals(DOMException.NAMESPACE_ERR, de.code);
}
}
@Test
public void testGetChildNodes() {
m_node = m_node.getParentNode();
assertEquals(2, m_node.getChildNodes().getLength());
}
@Test
public void testFirstChild() {
assertEquals("nested0", m_node.getFirstChild().getNodeValue());
}
@Test
public void testLastChild() {
assertEquals("nested0", m_node.getLastChild().getNodeValue());
}
//code coverage: need a node with penultimate elt and last text
@Test
public void testLastChildMixedContent() {
Node prevSibling = m_doc.createElement("penultimateNode");
m_node.insertBefore(prevSibling, m_node.getFirstChild());
assertEquals("nested0", m_node.getLastChild().getNodeValue());
}
@Test
public void testGetAttributes() {
assertEquals(0, m_node.getAttributes().getLength());
}
@Test
public void testLocalName() {
assertEquals("zed", m_node.getLocalName());
}
@Test
public void testSetPrefix() {
//set a null prefix
m_node =
m_docNS.getFirstChild().getFirstChild().getChildNodes().item(2);//<myns:yana/>
assertNotNull(m_node);
m_node.setPrefix(null);
assertEquals("", m_node.getPrefix());
m_node.setPrefix("other");
assertEquals("other:yana", m_node.getNodeName());
assertEquals("other:yana", ((Element) m_node).getTagName());
// assertEquals("uri:other",m_node.getNamespaceURI());--this is the URI @ creation--never changes
assertEquals(1,
((Element) m_docNS.getDocumentElement()).getElementsByTagName(
"other:yana")
.getLength());
}
@Test
public void testNormalizeNode() throws Exception {
m_node = m_node.getParentNode();
m_node.replaceChild(m_doc.createTextNode("txt1"),
m_node.getLastChild());
assertEquals(2, m_node.getChildNodes().getLength());
m_node.normalize();
assertEquals(1, m_node.getChildNodes().getLength());
}
@Test
public void testNormalizeNodeNoChildren() throws Exception {
m_node = m_doc.createElement("foobar");
assertEquals(0, m_node.getChildNodes().getLength());
m_node.normalize();
assertEquals(0, m_node.getChildNodes().getLength());
}
@Test
public void testNormalizeNodeOneChild() throws Exception {
m_node = m_doc.createElement("foobar");
m_node.appendChild(m_doc.createElement("foobar"));
assertEquals(1, m_node.getChildNodes().getLength());
m_node.normalize();
assertEquals(1, m_node.getChildNodes().getLength());
}
@Test
public void testAppendChildExisting() {
m_node = m_docNS.getFirstChild().getLastChild();
Node child = m_docNS.getFirstChild().getFirstChild();
super.testAppendChildExisting(child);
}
@Test
public void testInsertExisitingNode() {
m_node = m_docNS.getFirstChild().getLastChild();
Node child = m_docNS.getFirstChild().getFirstChild();
super.testAppendChildExisting(child);
}
@Test
public void testDomLevel1() {
Element elt = m_doc.createElement("foobar");
assertNull("L1 prefix null", elt.getPrefix());
assertNull("L1 LocalName null", elt.getLocalName());
assertNull("L1 Uri null", elt.getNamespaceURI());
try {
elt.setPrefix("foo");
fail("L1 prefix null");
} catch (DOMException de) {
assertEquals(DOMException.NAMESPACE_ERR, de.code);
}
}
public void moveToNode() {
m_node = m_doc.getFirstChild().getFirstChild().getChildNodes().item(1);//zed node;
assertNotNull(m_node);
}
@Before
public void setUp() throws Exception {
super.setUp();
moveToNode();
}
}