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 javax.xml.parsers.DocumentBuilder;
51  import javax.xml.parsers.DocumentBuilderFactory;
52  import javax.xml.parsers.ParserConfigurationException;
53  
54  import junit.framework.TestCase;
55  
56  import org.jaxen.FunctionCallException;
57  import org.jaxen.JaxenException;
58  import org.jaxen.XPath;
59  import org.jaxen.dom.DOMXPath;
60  import org.w3c.dom.Document;
61  
62  /***
63   * @author Elliotte Rusty Harold
64   *
65   */
66  public class TranslateFunctionTest extends TestCase {
67  
68      private Document doc;
69      
70      protected void setUp() throws ParserConfigurationException
71      {
72          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
73          factory.setNamespaceAware(true);
74          DocumentBuilder builder = factory.newDocumentBuilder();
75          doc = builder.newDocument();
76          doc.appendChild(doc.createElement("root"));
77      }
78  
79      public void testTranslate() throws JaxenException
80      {
81          XPath xpath = new DOMXPath( "translate('abc', 'b', 'd')" );
82          String result = (String) xpath.evaluate( doc );
83          assertEquals("adc", result);
84      }    
85    
86      public void testTranslateIgnoresExtraArguments() throws JaxenException
87      {
88          XPath xpath = new DOMXPath( "translate('abc', 'b', 'dghf')" );
89          String result = (String) xpath.evaluate( doc );
90          assertEquals("adc", result);
91      }    
92    
93      public void testTranslateFunctionRequiresAtLeastThreeArguments() 
94        throws JaxenException {
95          
96          XPath xpath = new DOMXPath("translate('a', 'b')");
97          
98          try {
99              xpath.selectNodes(doc);
100             fail("Allowed translate function with two arguments");
101         }
102         catch (FunctionCallException ex) {
103             assertNotNull(ex.getMessage());
104         }
105         
106     }    
107 
108     public void testTranslateRequiresAtMostThreeArguments() 
109       throws JaxenException {
110         
111         XPath xpath = new DOMXPath("substring-after('a', 'a', 'a', 'a')");
112         
113         try {
114             xpath.selectNodes(doc);
115             fail("Allowed translate function with four arguments");
116         }
117         catch (FunctionCallException ex) {
118             assertNotNull(ex.getMessage());
119         }
120         
121     }   
122     
123     public void testTranslateStringThatContainsNonBMPChars() throws JaxenException
124     {
125         XPath xpath = new DOMXPath( "translate('ab\uD834\uDD00b', 'b', 'd')" );
126         String result = (String) xpath.evaluate( doc );
127         assertEquals("ad\uD834\uDD00d", result);
128     }
129     
130 
131     public void testTranslateNonBMPChars() throws JaxenException
132     {
133         XPath xpath = new DOMXPath( "translate('ab\uD834\uDD00b', '\uD834\uDD00', 'd')" );
134         String result = (String) xpath.evaluate( doc );
135         assertEquals("abdb", result);
136     }   
137     
138 
139     public void testTranslateNonBMPChars2() throws JaxenException
140     {
141         XPath xpath = new DOMXPath( "translate('ab\uD834\uDD00b', '\uD834\uDD00', 'da')" );
142         String result = (String) xpath.evaluate( doc );
143         assertEquals("abdb", result);
144     }   
145     
146 
147     public void testTranslateWithNonBMPChars() throws JaxenException
148     {
149         XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834\uDD00')" );
150         String result = (String) xpath.evaluate( doc );
151         assertEquals("ab\uD834\uDD00", result);
152     }   
153     
154 
155     public void testTranslateWithNonBMPChars2() throws JaxenException
156     {
157         XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834\uDD00b')" );
158         String result = (String) xpath.evaluate( doc );
159         assertEquals("ab\uD834\uDD00", result);
160     }   
161     
162 
163     public void testTranslateWithMalformedSurrogatePair() throws JaxenException
164     {
165         XPath xpath = new DOMXPath( "translate('abc', 'c', '\uD834X\uDD00b')" );
166         try {
167             xpath.evaluate( doc );
168             fail("Allowed malformed surrogate pair");
169         }
170         catch (FunctionCallException ex) {
171             assertNotNull(ex.getMessage());
172         }
173     }   
174     
175 
176     public void testTranslateWithMissingLowSurrogate() throws JaxenException
177     {
178         XPath xpath = new DOMXPath( "translate('abc', 'c', 'AB\uD834X')" );
179         try {
180             xpath.evaluate( doc );
181             fail("Allowed malformed surrogate pair");
182         }
183         catch (FunctionCallException ex) {
184             assertNotNull(ex.getMessage());
185         }
186     }   
187     
188 
189     public void testTranslateWithExtraCharsInReplacementString() throws JaxenException
190     {
191         XPath xpath = new DOMXPath( "translate('abc', 'c', 'def')" );
192         String result = (String) xpath.evaluate( doc );
193         assertEquals("abd", result);
194     }   
195     
196 
197 }