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 package org.jaxen.test;
49
50 import java.util.List;
51
52 import javax.xml.parsers.DocumentBuilder;
53 import javax.xml.parsers.DocumentBuilderFactory;
54 import javax.xml.parsers.ParserConfigurationException;
55
56 import junit.framework.TestCase;
57
58 import org.jaxen.FunctionCallException;
59 import org.jaxen.JaxenException;
60 import org.jaxen.XPath;
61 import org.jaxen.dom.DOMXPath;
62 import org.jaxen.function.NumberFunction;
63 import org.w3c.dom.Document;
64
65 /***
66 * @author Elliotte Rusty Harold
67 *
68 */
69 public class NumberTest extends TestCase {
70
71 private Document doc;
72
73 public void setUp() throws ParserConfigurationException
74 {
75 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
76 factory.setNamespaceAware(true);
77 DocumentBuilder builder = factory.newDocumentBuilder();
78 doc = builder.newDocument();
79 }
80
81
82 public NumberTest(String name) {
83 super(name);
84 }
85
86
87 public void testNumberFunctionOperatesOnFirstNodeInDocumentOrder()
88 throws JaxenException {
89
90 XPath xpath = new DOMXPath("number(//x)");
91 org.w3c.dom.Element a = doc.createElementNS("", "a");
92 org.w3c.dom.Element b = doc.createElementNS("", "b");
93 doc.appendChild(a);
94 a.appendChild(b);
95 org.w3c.dom.Element x2 = doc.createElementNS("", "x");
96 org.w3c.dom.Element x3 = doc.createElementNS("", "x");
97 org.w3c.dom.Element x4 = doc.createElementNS("", "x");
98 a.appendChild(x4);
99 b.appendChild(x2);
100 b.appendChild(x3);
101 x2.appendChild(doc.createTextNode("2"));
102 x3.appendChild(doc.createTextNode("3"));
103 x4.appendChild(doc.createTextNode("4"));
104
105 List result = xpath.selectNodes(doc);
106 assertEquals(1, result.size());
107 assertEquals(Double.valueOf("2.0"), result.get(0));
108
109 }
110
111 public void testNumberFunctionOperatesOnContextNode()
112 throws JaxenException {
113
114 XPath xpath = new DOMXPath("number()");
115 org.w3c.dom.Element a = doc.createElementNS("", "a");
116 doc.appendChild(a);
117 a.appendChild(doc.createTextNode("2"));
118
119 Double result = (Double) xpath.evaluate(doc);
120 assertEquals(2, result.intValue());
121
122 }
123
124
125 public void testNumberFunctionRequiresAtMostOneArgument()
126 throws JaxenException {
127
128 XPath xpath = new DOMXPath("number('2.2', '1.2')");
129
130 try {
131 xpath.selectNodes(doc);
132 fail("Allowed number function with two arguments");
133 }
134 catch (FunctionCallException ex) {
135 assertNotNull(ex.getMessage());
136 }
137
138 }
139
140
141 public void testNumberFunctionAppliedToNonNumericString()
142 throws JaxenException {
143
144 XPath xpath = new DOMXPath("number('Marx')");
145
146 Double result = (Double) xpath.evaluate(doc);
147 assertEquals(new Double(Double.NaN), result);
148
149 }
150
151 public void testIsNan() {
152 assertTrue(NumberFunction.isNaN(0.0 / 0.0));
153 }
154
155 }