1 61 62 package org.jaxen.function; 63 64 import java.io.IOException ; 65 import java.io.StringReader ; 66 import java.util.List ; 67 68 import javax.xml.parsers.DocumentBuilder ; 69 import javax.xml.parsers.DocumentBuilderFactory ; 70 import javax.xml.parsers.ParserConfigurationException ; 71 72 import junit.framework.TestCase; 73 74 import org.jaxen.BaseXPath; 75 import org.jaxen.FunctionCallException; 76 import org.jaxen.JaxenException; 77 import org.jaxen.dom.DOMXPath; 78 import org.w3c.dom.Attr ; 79 import org.w3c.dom.Document ; 80 import org.w3c.dom.Element ; 81 import org.xml.sax.InputSource ; 82 import org.xml.sax.SAXException ; 83 84 88 public class IdTest extends TestCase { 89 90 private Document doc; 91 private DocumentBuilder builder; 92 93 public void setUp() throws ParserConfigurationException 94 { 95 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 96 factory.setNamespaceAware(true); 97 builder = factory.newDocumentBuilder(); 98 doc = builder.newDocument(); 99 } 100 101 public IdTest(String name) { 102 super(name); 103 } 104 105 public void testIDFunctionSelectsNothingInDocumentWithNoIds() 106 throws JaxenException { 107 108 BaseXPath xpath = new DOMXPath("id('p1')"); 109 org.w3c.dom.Element a = doc.createElementNS("", "a"); 110 org.w3c.dom.Element b = doc.createElementNS("", "b"); 111 doc.appendChild(a); 112 a.appendChild(b); 113 org.w3c.dom.Element x2 = doc.createElementNS("", "x"); 114 org.w3c.dom.Element x3 = doc.createElementNS("", "x"); 115 org.w3c.dom.Element x4 = doc.createElementNS("", "x"); 116 a.appendChild(x4); 117 b.appendChild(x2); 118 b.appendChild(x3); 119 x2.appendChild(doc.createTextNode("2")); 120 x3.appendChild(doc.createTextNode("3")); 121 x4.appendChild(doc.createTextNode("4")); 122 Attr id = doc.createAttribute("id"); 123 id.setNodeValue("p1"); 124 x2.setAttributeNode(id); 125 126 List result = xpath.selectNodes(doc); 127 assertEquals(0, result.size()); 128 129 } 130 131 public void testIDFunctionRequiresAtLeastOneArgument() 132 throws JaxenException { 133 134 try { 135 BaseXPath xpath = new DOMXPath("id()"); 136 org.w3c.dom.Element a = doc.createElementNS("", "a"); 137 doc.appendChild(a); 138 xpath.selectNodes(doc); 139 fail("Allowed empty id() function"); 140 } 141 catch (FunctionCallException success) { 142 assertNotNull(success.getMessage()); 143 } 144 145 } 146 147 public void testIDFunctionRequiresAtMostOneArgument() 148 throws JaxenException { 149 150 try { 151 BaseXPath xpath = new DOMXPath("id('p', 'q')"); 152 org.w3c.dom.Element a = doc.createElementNS("", "a"); 153 doc.appendChild(a); 154 xpath.selectNodes(doc); 155 fail("Allowed two-argument id() function"); 156 } 157 catch (FunctionCallException success) { 158 assertNotNull(success.getMessage()); 159 } 160 161 } 162 163 public void testFindElementById() 164 throws JaxenException, SAXException , IOException { 165 166 BaseXPath xpath = new DOMXPath("id('p1')"); 167 String text = "<!DOCTYPE root [<!ATTLIST a id ID #REQUIRED>]><root><a id='p1'/></root>"; 168 StringReader reader = new StringReader (text); 169 InputSource in = new InputSource (reader); 170 Document doc = builder.parse(in); 171 List result = xpath.selectNodes(doc); 172 assertEquals(1, result.size()); 173 Element a = (Element ) result.get(0); 174 assertEquals("a", a.getNodeName()); 175 176 } 177 178 public void testIdReturnsFirstElementWithMatchingId() 179 throws JaxenException, SAXException , IOException { 180 181 BaseXPath xpath = new DOMXPath("id('p1')"); 182 String text = "<!DOCTYPE root [<!ATTLIST a id ID #REQUIRED>" + 183 "<!ATTLIST b id ID #REQUIRED>]><root><a id='p1'/><b id='p1'/></root>"; 184 StringReader reader = new StringReader (text); 185 InputSource in = new InputSource (reader); 186 Document doc = builder.parse(in); 187 List result = xpath.selectNodes(doc); 188 assertEquals(1, result.size()); 189 Element a = (Element ) result.get(0); 190 assertEquals("a", a.getNodeName()); 191 192 } 193 194 } 195 | Popular Tags |