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.Iterator;
51 import java.util.List;
52
53 import javax.xml.parsers.DocumentBuilder;
54 import javax.xml.parsers.DocumentBuilderFactory;
55 import javax.xml.parsers.ParserConfigurationException;
56
57 import junit.framework.TestCase;
58
59 import org.jaxen.*;
60 import org.jaxen.dom.DOMXPath;
61 import org.jaxen.function.NumberFunction;
62 import org.jaxen.saxpath.SAXPathException;
63 import org.w3c.dom.Document;
64
65 /***
66 * @author Elliotte Rusty Harold
67 *
68 */
69 public class ExtensionFunctionTest 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 ExtensionFunctionTest(String name) {
83 super(name);
84 }
85
86 class MinFunction implements Function {
87
88 public Object call(Context context, List args) {
89
90 if (args.isEmpty()) return new Double(Double.NaN);
91
92 Navigator navigator = context.getNavigator();
93 double min = Double.MAX_VALUE;
94 Iterator iterator = args.iterator();
95 while (iterator.hasNext()) {
96 double next = NumberFunction.evaluate(iterator.next(), navigator).doubleValue();
97 min = Math.min(min, next);
98 }
99 return new Double(min);
100 }
101
102 }
103
104
105 public void testRegisterExtensionFunction() throws JaxenException {
106
107 SimpleFunctionContext fc = new XPathFunctionContext(false);
108 fc.registerFunction("http://exslt.org/math", "min", new MinFunction());
109
110 SimpleNamespaceContext nc = new SimpleNamespaceContext();
111 nc.addNamespace("math", "http://exslt.org/math");
112
113 BaseXPath xpath = new DOMXPath("math:min(//x)");
114
115 xpath.setFunctionContext(fc);
116 xpath.setNamespaceContext(nc);
117
118 org.w3c.dom.Element a = doc.createElementNS("", "a");
119 org.w3c.dom.Element b = doc.createElementNS("", "b");
120 doc.appendChild(a);
121 a.appendChild(b);
122 org.w3c.dom.Element x2 = doc.createElementNS("", "x");
123 org.w3c.dom.Element x3 = doc.createElementNS("", "x");
124 org.w3c.dom.Element x4 = doc.createElementNS("", "x");
125 a.appendChild(x4);
126 b.appendChild(x2);
127 b.appendChild(x3);
128 x2.appendChild(doc.createTextNode("2"));
129 x3.appendChild(doc.createTextNode("3"));
130 x4.appendChild(doc.createTextNode("4"));
131
132 Double result = (Double) xpath.evaluate(doc);
133 assertEquals(new Double(2), result);
134
135
136 }
137
138
139 public void testJaxen47() throws SAXPathException {
140 org.jaxen.dom.DocumentNavigator.getInstance().parseXPath("a:b()");
141 }
142
143 }