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.util.List;
51  
52  import javax.xml.parsers.DocumentBuilder;
53  import javax.xml.parsers.DocumentBuilderFactory;
54  import javax.xml.parsers.ParserConfigurationException;
55  
56  import junit.framework.TestCase;
57  
58  import org.jaxen.BaseXPath;
59  import org.jaxen.FunctionCallException;
60  import org.jaxen.JaxenException;
61  import org.jaxen.dom.DOMXPath;
62  import org.w3c.dom.Document;
63  
64  /***
65   * @author Elliotte Rusty Harold
66   *
67   */
68  public class NotTest extends TestCase {
69  
70      private Document doc;
71      
72      public void setUp() throws ParserConfigurationException
73      {
74          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
75          factory.setNamespaceAware(true);
76          DocumentBuilder builder = factory.newDocumentBuilder();
77          doc = builder.newDocument();
78          doc.appendChild(doc.createElement("root"));
79      }
80  
81  
82      public NotTest(String name) {
83          super(name);
84      }
85  
86      public void testZeroIsFalse() 
87        throws JaxenException {
88          
89          BaseXPath xpath = new DOMXPath("not(0)");
90          
91          List result = xpath.selectNodes(doc);
92          assertEquals(1, result.size());
93          assertEquals(Boolean.TRUE, result.get(0));
94          
95      }    
96  
97      public void testOneIsTrue() 
98        throws JaxenException {
99          
100         BaseXPath xpath = new DOMXPath("not(1)");
101         
102         List result = xpath.selectNodes(doc);
103         assertEquals(1, result.size());
104         assertEquals(Boolean.FALSE, result.get(0));
105         
106     }    
107 
108     public void testEmptyStringIsFalse() 
109       throws JaxenException {
110         
111         BaseXPath xpath = new DOMXPath("not('')");
112         
113         List result = xpath.selectNodes(doc);
114         assertEquals(1, result.size());
115         assertEquals(Boolean.TRUE, result.get(0));
116         
117     }    
118 
119     public void testNaNIsFalse() 
120       throws JaxenException {
121         
122         BaseXPath xpath = new DOMXPath("not(0 div 0)");
123         Object result = xpath.evaluate(null);
124         assertEquals(Boolean.TRUE, result);
125         
126     }    
127 
128     public void testNonEmptyStringIsTrue() 
129       throws JaxenException {
130         
131         BaseXPath xpath = new DOMXPath("not('false')");
132         
133         List result = xpath.selectNodes(doc);
134         assertEquals(1, result.size());
135         assertEquals(Boolean.FALSE, result.get(0));
136         
137     }    
138 
139     public void testNotFunctionRequiresOneArgument() 
140       throws JaxenException {
141         
142         BaseXPath xpath = new DOMXPath("not()");
143         
144         try {
145             xpath.selectNodes(doc);
146             fail("Allowed not() function with no arguments");
147         }
148         catch (FunctionCallException ex) {
149             assertNotNull(ex.getMessage());
150         }
151         
152     }    
153 
154     public void testNotFunctionRequiresExactlyOneArgument() 
155       throws JaxenException {
156         
157         BaseXPath xpath = new DOMXPath("not('', '')");
158         
159         try {
160             xpath.selectNodes(doc);
161             fail("Allowed not() function with two arguments");
162         }
163         catch (FunctionCallException ex) {
164             assertNotNull(ex.getMessage());
165         }
166         
167     }    
168 
169 }