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 NameTest 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 NameTest(String name) {
88          super(name);
89      }
90  
91      public void testNameOfNumber() throws JaxenException
92      {
93          try
94          {
95              XPath xpath = new DOMXPath( "name(3)" );
96              xpath.selectNodes( doc );
97              fail("name of non-node-set");
98          }
99          catch (FunctionCallException e) 
100         {
101            assertEquals("The argument to the name function must be a node-set", e.getMessage());
102         }
103     }    
104 
105     public void testNameWithTwoArguments() throws JaxenException
106     {
107         try
108         {
109             XPath xpath = new DOMXPath( "name(/*, //*)" );
110             xpath.selectNodes( doc );
111             fail("name with two arguments");
112         }
113         catch (FunctionCallException e) 
114         {
115            assertEquals("name() requires zero or one argument.", e.getMessage());
116         }
117     }    
118 
119     public void testNameAllowsNoArguments() throws JaxenException
120     {
121         XPath xpath = new DOMXPath( "name()" );
122         String result = (String) xpath.evaluate( doc.getDocumentElement() );
123         assertEquals("foo", result);
124     }    
125 
126     public void testNameOfCommentIsEmptyString() throws JaxenException
127     {
128         XPath xpath = new DOMXPath( "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 testNameOfProcessingInstructionIsTarget() throws JaxenException
136     {
137         XPath xpath = new DOMXPath( "name(/processing-instruction())" );
138         ProcessingInstruction pi = doc.createProcessingInstruction("target", "value");
139         doc.appendChild(pi);
140         String result = (String) xpath.evaluate(doc);
141         assertEquals("target", result);
142     }    
143 
144     public void testNameOfAttribute() throws JaxenException
145     {
146         XPath xpath = new DOMXPath( "name(/*/@*)" );
147         Attr a = doc.createAttribute("name");
148         doc.getDocumentElement().setAttributeNode(a);
149         String result = (String) xpath.evaluate(doc);
150         assertEquals("name", result);
151     }    
152 
153     public void testNameOfTextIsEmptyString() throws JaxenException
154     {
155         XPath xpath = new DOMXPath( "name(/*/text())" );
156         Text c = doc.createTextNode("test");
157         doc.getDocumentElement().appendChild(c);
158         String result = (String) xpath.evaluate(doc);
159         assertEquals("", result);
160     }    
161 
162     public void testNameOfNamespaceIsPrefix() throws JaxenException
163     {
164         XPath xpath = new DOMXPath( "name(/*/namespace::node())" );
165         String result = (String) xpath.evaluate(doc);
166         assertEquals("xml", result);
167     }    
168 
169     public void testNameNoArguments()
170     {
171         try
172         {
173             XPath xpath = new DOMXPath( "name()" );
174             List results = xpath.selectNodes( doc );
175             assertEquals("", results.get(0));
176        }
177        catch (Exception e)
178         {
179             e.printStackTrace();
180             fail( e.getMessage() );
181         }
182     }    
183 
184 }