1   /*
2    * $Header$
3    * $Revision$
4    * $Date$
5    *
6    * ====================================================================
7    *
8    * Copyright 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 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  
49  
50  package org.jaxen.test;
51  
52  import java.io.ByteArrayOutputStream;
53  import java.io.IOException;
54  import java.io.NotSerializableException;
55  import java.io.ObjectOutputStream;
56  
57  import javax.xml.parsers.DocumentBuilderFactory;
58  import javax.xml.parsers.ParserConfigurationException;
59  
60  import org.jaxen.FunctionContext;
61  import org.jaxen.JaxenException;
62  import org.jaxen.SimpleNamespaceContext;
63  import org.jaxen.UnresolvableException;
64  import org.jaxen.dom.DOMXPath;
65  import org.w3c.dom.Document;
66  import org.w3c.dom.Element;
67  
68  import junit.framework.TestCase;
69  
70  /***
71   * <p>
72   *  Test for function context.
73   * </p>
74   * 
75   * @author Elliotte Rusty Harold
76   * @version 1.1b9
77   *
78   */
79  public class FunctionContextTest extends TestCase
80  {
81  
82      private Document doc;
83      
84      public void setUp() throws ParserConfigurationException {
85          
86          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
87          factory.setNamespaceAware(true);
88          doc = factory.newDocumentBuilder().newDocument();
89          Element root = doc.createElementNS("http://www.example.org/", "root");
90          doc.appendChild(root);
91          root.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "http://www.example.org/");
92                
93      }
94      
95      public void testJAXEN50() throws JaxenException {
96          
97          DOMXPath xpath = new DOMXPath("true()");
98          
99          SimpleNamespaceContext nsContext = new SimpleNamespaceContext();
100         // Add all namespace declarations from the node
101         nsContext.addElementNamespaces(xpath.getNavigator(), doc);
102         xpath.setNamespaceContext(nsContext);
103         
104         boolean result = xpath.booleanValueOf(doc);
105         assertTrue(result);
106         
107     }
108  
109     public void testUnresolvableFunction() throws JaxenException {
110         
111         DOMXPath xpath = new DOMXPath("nonesuch()");
112         
113         try {
114             xpath.evaluate(doc);
115             fail("Evaluated nonexistent function");
116         }
117         catch (UnresolvableException ex) {
118             assertNotNull(ex.getMessage());
119         }
120         
121     }
122  
123     public void testUnresolvableFunctionExceptionMessage() throws JaxenException {
124         
125         DOMXPath xpath = new DOMXPath("nonesuch()");
126         
127         try {
128             xpath.evaluate(doc);
129             fail("Evaluated nonexistent function");
130         }
131         catch (UnresolvableException ex) {
132             assertEquals(-1, ex.getMessage().indexOf(':'));
133         }
134         
135     }
136  
137     public void testGetFunctionContext() throws JaxenException {      
138         DOMXPath xpath = new DOMXPath("/root/child");
139         assertNotNull(xpath.getFunctionContext());
140     }
141  
142     public void testSerializeFunctionContext() throws JaxenException, IOException { 
143         
144         DOMXPath xpath = new DOMXPath("/root/child");
145         FunctionContext context = xpath.getFunctionContext();
146         ByteArrayOutputStream out = new ByteArrayOutputStream();
147         ObjectOutputStream oout = new ObjectOutputStream(out);
148         try {
149             oout.writeObject(context);
150             fail("serialized function context");
151         }
152         catch (NotSerializableException ex) {
153             assertNotNull(ex.getMessage());
154         }
155         
156     }
157  
158 }