    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 }