1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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 /***
85 * @author Elliotte Rusty Harold
86 *
87 */
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193 public void testFindMultipleElementsByMultipleIDs()
194 throws JaxenException, SAXException, IOException {
195
196 BaseXPath xpath = new DOMXPath("id(//id)");
197 String text = "<!DOCTYPE root [<!ATTLIST a id ID #REQUIRED>]><root><id>p1</id><id>p2</id><id>p3</id><a id='p1'/><a id='p2'/></root>";
198 StringReader reader = new StringReader(text);
199 InputSource in = new InputSource(reader);
200 Document doc = builder.parse(in);
201 List result = xpath.selectNodes(doc);
202 assertEquals(2, result.size());
203 Element a1 = (Element) result.get(0);
204 Element a2 = (Element) result.get(1);
205 assertEquals("a", a1.getNodeName());
206 assertEquals("a", a2.getNodeName());
207
208 }
209
210 public void testIdReturnsFirstElementWithMatchingId()
211 throws JaxenException, SAXException, IOException {
212
213 BaseXPath xpath = new DOMXPath("id('p1')");
214 String text = "<!DOCTYPE root [<!ATTLIST a id ID #REQUIRED>" +
215 "<!ATTLIST b id ID #REQUIRED>]><root><a id='p1'/><b id='p1'/></root>";
216 StringReader reader = new StringReader(text);
217 InputSource in = new InputSource(reader);
218 Document doc = builder.parse(in);
219 List result = xpath.selectNodes(doc);
220 assertEquals(1, result.size());
221 Element a = (Element) result.get(0);
222 assertEquals("a", a.getNodeName());
223
224 }
225
226 }