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.Navigator;
61 import org.jaxen.XPath;
62 import org.jaxen.dom.DOMXPath;
63 import org.jaxen.dom.DocumentNavigator;
64 import org.jaxen.function.NumberFunction;
65 import org.w3c.dom.Document;
66
67
68
69
70
71 public class NumberTest extends TestCase {
72
73 private Document doc;
74
75 public void setUp() throws ParserConfigurationException
76 {
77 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
78 factory.setNamespaceAware(true);
79 DocumentBuilder builder = factory.newDocumentBuilder();
80 doc = builder.newDocument();
81 }
82
83
84 public NumberTest(String name) {
85 super(name);
86 }
87
88
89 public void testNumberFunctionOperatesOnFirstNodeInDocumentOrder()
90 throws JaxenException {
91
92 XPath xpath = new DOMXPath("number(//x)");
93 org.w3c.dom.Element a = doc.createElementNS("", "a");
94 org.w3c.dom.Element b = doc.createElementNS("", "b");
95 doc.appendChild(a);
96 a.appendChild(b);
97 org.w3c.dom.Element x2 = doc.createElementNS("", "x");
98 org.w3c.dom.Element x3 = doc.createElementNS("", "x");
99 org.w3c.dom.Element x4 = doc.createElementNS("", "x");
100 a.appendChild(x4);
101 b.appendChild(x2);
102 b.appendChild(x3);
103 x2.appendChild(doc.createTextNode("2"));
104 x3.appendChild(doc.createTextNode("3"));
105 x4.appendChild(doc.createTextNode("4"));
106
107 List result = xpath.selectNodes(doc);
108 assertEquals(1, result.size());
109 assertEquals(Double.valueOf("2.0"), result.get(0));
110
111 }
112
113 public void testNumberFunctionOperatesOnContextNode()
114 throws JaxenException {
115
116 XPath xpath = new DOMXPath("number()");
117 org.w3c.dom.Element a = doc.createElementNS("", "a");
118 doc.appendChild(a);
119 a.appendChild(doc.createTextNode("2"));
120
121 Double result = (Double) xpath.evaluate(doc);
122 assertEquals(2, result.intValue());
123
124 }
125
126 public void testBooleanConvertedToNumber() {
127 double tolerance = 0.0000001;
128 Navigator navigator = new DocumentNavigator();
129 assertEquals(0.0, NumberFunction.evaluate(Boolean.FALSE, navigator ).doubleValue(), tolerance);
130 assertEquals(1.0, NumberFunction.evaluate(Boolean.TRUE, navigator).doubleValue(), tolerance);
131 assertEquals(0.0, NumberFunction.evaluate(new Boolean(false), navigator).doubleValue(), tolerance);
132 assertEquals(1.0, NumberFunction.evaluate(new Boolean(true), navigator).doubleValue(), tolerance);
133 }
134
135
136 public void testNumberFunctionRequiresAtMostOneArgument()
137 throws JaxenException {
138
139 XPath xpath = new DOMXPath("number('2.2', '1.2')");
140
141 try {
142 xpath.selectNodes(doc);
143 fail("Allowed number function with two arguments");
144 }
145 catch (FunctionCallException ex) {
146 assertNotNull(ex.getMessage());
147 }
148
149 }
150
151
152 public void testNumberFunctionAppliedToNonNumericString()
153 throws JaxenException {
154
155 XPath xpath = new DOMXPath("number('Marx')");
156
157 Double result = (Double) xpath.evaluate(doc);
158 assertEquals(new Double(Double.NaN), result);
159
160 }
161
162 public void testIsNan() {
163 assertTrue(NumberFunction.isNaN(0.0 / 0.0));
164 }
165
166 }