1   /*
2    * $Header$
3    * $Revision$
4    * $Date$
5    *
6    * ====================================================================
7    *
8    * Copyright 2005 Elliotte Rusty Harold
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  package org.jaxen.test;
49  
50  import java.io.IOException;
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.FunctionCallException;
60  import org.jaxen.JaxenException;
61  import org.jaxen.XPath;
62  import org.jaxen.dom.DOMXPath;
63  import org.w3c.dom.Attr;
64  import org.w3c.dom.Comment;
65  import org.w3c.dom.Document;
66  import org.w3c.dom.ProcessingInstruction;
67  import org.w3c.dom.Text;
68  import org.xml.sax.SAXException;
69  
70  /***
71   * @author Elliotte Rusty Harold
72   *
73   */
74  public class LocalNameTest extends TestCase {
75  
76      private Document doc;
77      
78      public void setUp() throws ParserConfigurationException, SAXException, IOException
79      {
80          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
81          factory.setNamespaceAware(true);
82          DocumentBuilder builder = factory.newDocumentBuilder();
83          doc = builder.parse( "xml/basic.xml" );
84      }
85  
86  
87      public LocalNameTest(String name) {
88          super(name);
89      }
90  
91      public void testLocalNameOfNumber() throws JaxenException
92      {
93          try
94          {
95              XPath xpath = new DOMXPath( "local-name(3)" );
96              xpath.selectNodes( doc );
97              fail("local-name of non-node-set");
98          }
99          catch (FunctionCallException e) 
100         {
101            assertEquals("The argument to the local-name function must be a node-set", e.getMessage());
102         }
103     }    
104 
105     public void testLocalNameWithTwoArguments() throws JaxenException
106     {
107         try
108         {
109             XPath xpath = new DOMXPath( "local-name(/*, //*)" );
110             xpath.selectNodes( doc );
111             fail("local-name with two arguments");
112         }
113         catch (FunctionCallException e) 
114         {
115            assertEquals("local-name() requires zero or one argument.", e.getMessage());
116         }
117     }    
118 
119     public void testLocalNameAllowsNoArguments() throws JaxenException
120     {
121         XPath xpath = new DOMXPath( "local-name()" );
122         String result = (String) xpath.evaluate( doc.getDocumentElement() );
123         assertEquals("foo", result);
124     }    
125 
126     public void testLocalNameOfCommentIsEmptyString() throws JaxenException
127     {
128         XPath xpath = new DOMXPath( "local-name(/comment())" );
129         Comment c = doc.createComment("test");
130         doc.appendChild(c);
131         String result = (String) xpath.evaluate(doc);
132         assertEquals("", result);
133     }    
134 
135     public void testLocalNameOfEmptyNodeSetIsEmptyString() throws JaxenException
136     {
137         XPath xpath = new DOMXPath( "local-name(/aaa)" );
138         String result = (String) xpath.evaluate(doc);
139         assertEquals("", result);
140     }    
141 
142     public void testLocalNameOfProcessingInstructionIsTarget() throws JaxenException
143     {
144         XPath xpath = new DOMXPath( "local-name(/processing-instruction())" );
145         ProcessingInstruction pi = doc.createProcessingInstruction("target", "value");
146         doc.appendChild(pi);
147         String result = (String) xpath.evaluate(doc);
148         assertEquals("target", result);
149     }    
150 
151     public void testLocalNameOfAttribute() throws JaxenException
152     {
153         XPath xpath = new DOMXPath( "local-name(/*/@*)" );
154         Attr a = doc.createAttribute("name");
155         doc.getDocumentElement().setAttributeNode(a);
156         String result = (String) xpath.evaluate(doc);
157         assertEquals("name", result);
158     }    
159 
160     public void testLocalNameOfTextIsEmptyString() throws JaxenException
161     {
162         XPath xpath = new DOMXPath( "local-name(/*/text())" );
163         Text c = doc.createTextNode("test");
164         doc.getDocumentElement().appendChild(c);
165         String result = (String) xpath.evaluate(doc);
166         assertEquals("", result);
167     }    
168 
169     public void testLocalNameOfNamespaceIsPrefix() throws JaxenException
170     {
171         XPath xpath = new DOMXPath( "local-name(/*/namespace::node())" );
172         String result = (String) xpath.evaluate(doc);
173         assertEquals("xml", result);
174     }    
175 
176     public void testLocalNameNoArguments()
177     {
178         try
179         {
180             XPath xpath = new DOMXPath( "local-name()" );
181             List results = xpath.selectNodes( doc );
182             assertEquals("", results.get(0));
183        }
184        catch (Exception e)
185         {
186             e.printStackTrace();
187             fail( e.getMessage() );
188         }
189     }    
190 
191 }