1   /*
2    * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
3    *
4    * This software is open source.
5    * See the bottom of this file for the licence.
6    */
7   
8   package org.dom4j;
9   
10  import junit.textui.TestRunner;
11  
12  import java.util.List;
13  
14  /***
15   * A test harness to test XPath expression evaluation in DOM4J
16   * 
17   * @author <a href="mailto:james.strachan@metastuff.com">James Strachan </a>
18   * @version $Revision: 1.4 $
19   */
20  public class XPathBugTest extends AbstractTestCase {
21      public static void main(String[] args) {
22          TestRunner.run(XPathBugTest.class);
23      }
24  
25      // Test case(s)
26      // -------------------------------------------------------------------------
27      public void testXPaths() throws Exception {
28          Document document = getDocument("/xml/rabo1ae.xml");
29          Element root = (Element) document
30                  .selectSingleNode("/m:Msg/m:Contents/m:Content");
31  
32          assertTrue("root is not null", root != null);
33  
34          Namespace ns = root.getNamespaceForPrefix("ab");
35  
36          assertTrue("Found namespace", ns != null);
37  
38          System.out.println("Found: " + ns.getURI());
39  
40          Element element = (Element) root
41                  .selectSingleNode("ab:RaboPayLoad[@id='1234123']");
42  
43          assertTrue("element is not null", element != null);
44  
45          String value = element.valueOf("ab:AccountingEntry/ab:RateType");
46  
47          assertEquals("RateType is correct", "CRRNT", value);
48      }
49  
50      /***
51       * A bug found by Rob Lebowitz
52       * 
53       * @throws Exception
54       *             DOCUMENT ME!
55       */
56      public void testRobLebowitz() throws Exception {
57          String text = "<ul>" + "    <ul>" + "        <li/>"
58                  + "            <ul>" + "                <li/>"
59                  + "            </ul>" + "        <li/>" + "    </ul>" + "</ul>";
60  
61          Document document = DocumentHelper.parseText(text);
62          List lists = document.selectNodes("//ul | //ol");
63  
64          int count = 0;
65  
66          for (int i = 0; i < lists.size(); i++) {
67              Element list = (Element) lists.get(i);
68              List nodes = list.selectNodes("ancestor::ul");
69  
70              if ((nodes != null) && (nodes.size() > 0)) {
71                  continue;
72              }
73  
74              nodes = list.selectNodes("ancestor::ol");
75  
76              if ((nodes != null) && (nodes.size() > 0)) {
77                  continue;
78              }
79          }
80      }
81  
82      /***
83       * A bug found by Stefan which results in IndexOutOfBoundsException for
84       * empty results
85       * 
86       * @throws Exception
87       *             DOCUMENT ME!
88       */
89      public void testStefan() throws Exception {
90          String text = "<foo>hello</foo>";
91          Document document = DocumentHelper.parseText(text);
92          XPath xpath = DocumentHelper.createXPath("/x");
93          Object value = xpath.evaluate(document);
94      }
95  
96      /***
97       * Test found by Mike Skells
98       * 
99       * @throws Exception
100      *             DOCUMENT ME!
101      */
102     public void testMikeSkells() throws Exception {
103         Document top = DocumentFactory.getInstance().createDocument();
104         Element root = top.addElement("root");
105         root.addElement("child1").addElement("child11");
106         root.addElement("child2").addElement("child21");
107         System.out.println(top.asXML());
108 
109         XPath test1 = top.createXPath("/root/child1/child11");
110         XPath test2 = top.createXPath("/root/child2/child21");
111         Node position1 = test1.selectSingleNode(root);
112         Node position2 = test2.selectSingleNode(root);
113 
114         System.out.println("test1= " + test1);
115         System.out.println("test2= " + test2);
116         System.out.println("Position1 Xpath = " + position1.getUniquePath());
117         System.out.println("Position2 Xpath = " + position2.getUniquePath());
118 
119         System.out.println("test2.matches(position1) : "
120                 + test2.matches(position1));
121 
122         assertTrue("test1.matches(position1)", test1.matches(position1));
123         assertTrue("test2.matches(position2)", test2.matches(position2));
124 
125         assertTrue("test2.matches(position1) should be false", !test2
126                 .matches(position1));
127     }
128 }
129 
130 /*
131  * Redistribution and use of this software and associated documentation
132  * ("Software"), with or without modification, are permitted provided that the
133  * following conditions are met:
134  * 
135  * 1. Redistributions of source code must retain copyright statements and
136  * notices. Redistributions must also contain a copy of this document.
137  * 
138  * 2. Redistributions in binary form must reproduce the above copyright notice,
139  * this list of conditions and the following disclaimer in the documentation
140  * and/or other materials provided with the distribution.
141  * 
142  * 3. The name "DOM4J" must not be used to endorse or promote products derived
143  * from this Software without prior written permission of MetaStuff, Ltd. For
144  * written permission, please contact dom4j-info@metastuff.com.
145  * 
146  * 4. Products derived from this Software may not be called "DOM4J" nor may
147  * "DOM4J" appear in their names without prior written permission of MetaStuff,
148  * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
149  * 
150  * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
151  * 
152  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
153  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
154  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
155  * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
156  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
157  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
158  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
159  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
160  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
161  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
162  * POSSIBILITY OF SUCH DAMAGE.
163  * 
164  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
165  */