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.Document;
65  import org.w3c.dom.ProcessingInstruction;
66  import org.w3c.dom.Text;
67  import org.xml.sax.SAXException;
68  
69  /***
70   * @author Elliotte Rusty Harold
71   *
72   */
73  public class NamespaceURITest extends TestCase {
74  
75      private Document doc;
76      private DocumentBuilder builder;
77      
78      public void setUp() throws ParserConfigurationException, SAXException, IOException
79      {
80          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
81          factory.setNamespaceAware(true);
82          builder = factory.newDocumentBuilder();
83          doc = builder.parse( "xml/basic.xml" );
84      }
85  
86  
87      public NamespaceURITest(String name) {
88          super(name);
89      }
90  
91      public void testNamespaceURIOfNumber() throws JaxenException
92      {
93          try
94          {
95              XPath xpath = new DOMXPath( "namespace-uri(3)" );
96              xpath.selectNodes( doc );
97              fail("namespace-uri of non-node-set");
98          }
99          catch (FunctionCallException e) 
100         {
101            assertEquals("The argument to the namespace-uri function must be a node-set", e.getMessage());
102         }
103     }    
104 
105     public void testNamespaceURINoArguments() throws JaxenException
106     {
107         XPath xpath = new DOMXPath( "namespace-uri()" );
108         List results = xpath.selectNodes( doc );
109         assertEquals("", results.get(0));
110     }    
111     
112     public void testNamespaceURIOfEmptyNodeSetIsEmptyString() throws JaxenException
113     {
114         XPath xpath = new DOMXPath( "namespace-uri(/aaa)" );
115         String result = (String) xpath.evaluate(doc);
116         assertEquals("", result);
117     }    
118 
119     public void testNamespaceURIOfProcessingInstructionIsEmptyString() throws JaxenException
120     {
121         XPath xpath = new DOMXPath( "namespace-uri(/processing-instruction())" );
122         ProcessingInstruction pi = doc.createProcessingInstruction("target", "value");
123         doc.appendChild(pi);
124         String result = (String) xpath.evaluate(doc);
125         assertEquals("", result);
126     }    
127 
128     public void testNamespaceURIOfAttribute() throws JaxenException
129     {
130         XPath xpath = new DOMXPath( "namespace-uri(/*/@*)" );
131         Attr a = doc.createAttribute("name");
132         doc.getDocumentElement().setAttributeNode(a);
133         Object result = xpath.evaluate(doc);
134         assertEquals("", result);
135     }    
136 
137     public void testNamespaceURIOfAttributeInNamespace() throws JaxenException
138     {
139         XPath xpath = new DOMXPath( "namespace-uri(/*/@*)" );
140         Attr a = doc.createAttributeNS("http://www.w3.org/", "pre:name");
141         doc.getDocumentElement().setAttributeNode(a);
142         Object result = xpath.evaluate(doc);
143         assertEquals("http://www.w3.org/", result);
144     }    
145 
146     public void testNamespaceURIOfTextIsEmptyString() throws JaxenException
147     {
148         XPath xpath = new DOMXPath( "namespace-uri(/*/text())" );
149         Text c = doc.createTextNode("test");
150         doc.getDocumentElement().appendChild(c);
151         String result = (String) xpath.evaluate(doc);
152         assertEquals("", result);
153     }    
154 
155     public void testNamespaceURIRequiresAtMostOneArgument() throws JaxenException
156     {
157         XPath xpath = new DOMXPath( "namespace-uri(/*, /*)" );
158         try {
159             xpath.evaluate(doc);
160             fail("Allowed namespace-uri function with no arguments");
161         }
162         catch (FunctionCallException ex) {
163             assertNotNull(ex.getMessage());
164         }
165     }    
166 
167     public void testNamespaceURIOfNamespaceIsNull() throws JaxenException
168     {
169         XPath xpath = new DOMXPath( "namespace-uri(/*/namespace::node())" );
170         String result = (String) xpath.evaluate(doc);
171         assertEquals("", result);
172     }
173     
174     public void testNamespaceURIOfComment() 
175       throws JaxenException {
176         
177         XPath xpath = new DOMXPath("namespace-uri(/a/comment())");
178         Document document = builder.getDOMImplementation().createDocument(null, "a", null);
179         document.getDocumentElement().appendChild(document.createComment("data"));
180         
181         String result = (String) xpath.evaluate(document);
182         assertEquals("", result);
183         
184     }
185 
186 }