1   /*
2    * $Header$
3    * $Revision$
4    * $Date$
5    *
6    * ====================================================================
7    *
8    * Copyright 2000-2002 bob mcwhirter & James Strachan.
9    * All rights reserved.
10   *
11   * Redistribution and use in source and binary forms, with or without
12   * modification, are permitted provided that the following conditions are
13   * met:
14   * 
15   *   * Redistributions of source code must retain the above copyright
16   *     notice, this list of conditions and the following disclaimer.
17   * 
18   *   * Redistributions in binary form must reproduce the above copyright
19   *     notice, this list of conditions and the following disclaimer in the
20   *     documentation and/or other materials provided with the distribution.
21   * 
22   *   * Neither the name of the Jaxen Project nor the names of its
23   *     contributors may be used to endorse or promote products derived 
24   *     from this software without specific prior written permission.
25   * 
26   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
27   * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28   * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
29   * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
30   * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37   *
38   * ====================================================================
39   * This software consists of voluntary contributions made by many 
40   * individuals on behalf of the Jaxen Project and was originally 
41   * created by bob mcwhirter <bob@werken.com> and 
42   * James Strachan <jstrachan@apache.org>.  For more information on the 
43   * Jaxen Project, please see <http://www.jaxen.org/>.
44   * 
45   * $Id$
46   */
47  
48  
49  
50  package org.jaxen.test;
51  
52  import junit.framework.TestCase;
53  
54  import org.jaxen.JaxenHandler;
55  import org.jaxen.expr.DefaultXPathFactory;
56  import org.jaxen.expr.XPathExpr;
57  import org.jaxen.saxpath.SAXPathException;
58  import org.jaxen.saxpath.XPathReader;
59  import org.jaxen.saxpath.XPathSyntaxException;
60  import org.jaxen.saxpath.helpers.XPathReaderFactory;
61  
62  public class JaxenHandlerTest extends TestCase
63  {
64      
65      private String[] paths = {
66          "foo[.='bar']",
67          "foo[.!='bar']",
68          "/",
69          "*",
70          "//foo",
71          "/*",
72          "/.",
73          "/foo[/bar[/baz]]",
74          "/foo/bar/baz[(1 or 2) + 3 * 4 + 8 and 9]",
75          "/foo/bar/baz",
76          ".[1]",
77          "self::node()",
78          ".",
79          "count(/)",
80          "foo[1]",
81          "/baz[(1 or 2) + 3 * 4 + 8 and 9]",
82          "foo/bar[/baz[(1 or 2) - 3 mod 4 + 8 and 9 div 8]]",
83          "foo/bar/yeah:baz[a/b/c and toast]",
84          "/foo/bar[../x='123']",
85          "/foo[@bar='1234']",
86          "foo|bar",
87          "/foo|/bar[@id='1234']",
88          "count(//author/attribute::*)",
89          "$author",
90           "10 + $foo",
91          "10 + (count(descendant::author) * 5)",
92          "10 + count(descendant::author) * 5",
93          "2 + (2 * 5)",
94          "sum(count(//author), 5)",
95          "sum(count(//author),count(//author/attribute::*))",
96          "12 + sum(count(//author),count(//author/attribute::*)) div 2",
97          "text()[.='foo']",
98          "/*/*[@id='123']",
99          "/child::node()/child::node()[@id='_13563275']",
100         "$foo:bar",
101         "//foo:bar",
102         "/foo/bar[@a='1' and @c!='2']",
103     };
104 
105     private String[] bogusPaths = { "//:p" ,       
106         // this path is bogus because of a trailing /
107         "/foo/bar/",
108         
109         // This path is bogus because '/' is not division, but
110         // rather just the step separator.
111         "12 + sum(count(//author),count(//author/attribute::*)) / 2",
112         "id()/2",
113         "+"
114     };
115     
116     public JaxenHandlerTest(String name)
117     {
118         super( name );
119     }
120 
121     public void testValidPaths()
122     {
123             
124         String path = null;
125 
126         try
127         {
128             // XXX Jiffie solution?
129             XPathReader reader = XPathReaderFactory.createReader();
130             JaxenHandler handler = new JaxenHandler();
131             handler.setXPathFactory( new DefaultXPathFactory() );
132             reader.setXPathHandler( handler );
133 
134             for ( int i = 0; i < paths.length; i++ ) {
135                 path = paths[i];
136                 reader.parse(path);
137                 handler.getXPathExpr(false);
138                 handler.getXPathExpr();
139             }
140         }
141         catch (Exception e)
142         {
143             e.printStackTrace();
144             fail( path + " -> " + e.getMessage() );
145         }
146     }
147 
148     public void testBogusPaths() throws SAXPathException
149     {
150         XPathReader reader = XPathReaderFactory.createReader();
151         JaxenHandler handler = new JaxenHandler();
152         handler.setXPathFactory( new DefaultXPathFactory() );
153         reader.setXPathHandler( handler );
154         
155         for ( int i = 0; i < bogusPaths.length; i++ ) {
156             String path = bogusPaths[i];
157 
158             try
159             {                    
160                 reader.parse(path);
161                 XPathExpr xpath = handler.getXPathExpr(false);
162                 fail( "Parsed bogus path as: " + xpath );
163             }
164             catch (XPathSyntaxException e)
165             {
166             }
167         }
168     }
169 }