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