| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.jackrabbit.util; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import junit.framework.TestCase; |
| |
| /** |
| * Test cases for the Text utility class. |
| */ |
| public class TextTest extends TestCase { |
| |
| private void checkEscape(String name) { |
| String escaped = Text.escapeIllegalJcrChars(name); |
| assertEquals(name, Text.unescapeIllegalJcrChars(escaped)); |
| } |
| |
| public void testEscape() { |
| // Handling of normal names |
| checkEscape("foobar"); |
| // Handling of short names |
| checkEscape("x"); |
| checkEscape("xx"); |
| checkEscape("xxx"); |
| // Handling of spaces |
| checkEscape("x x"); |
| checkEscape("x x x"); |
| checkEscape(" "); |
| checkEscape(" x"); |
| checkEscape("x "); |
| checkEscape(" "); |
| checkEscape(" "); |
| checkEscape(" x "); |
| // Handling of dots within the first two characters |
| checkEscape("."); |
| checkEscape(".."); |
| checkEscape(".x"); |
| checkEscape("x."); |
| checkEscape(". "); |
| checkEscape(" ."); |
| // Handling of the special characters |
| checkEscape("%/:[]*'\"|\t\r\n"); |
| } |
| |
| public void testIsDescendant() { |
| String parent = "/"; |
| List descendants = new ArrayList(); |
| descendants.add("/a"); |
| descendants.add("/a/b"); |
| for (Iterator it = descendants.iterator(); it.hasNext();) { |
| String desc = it.next().toString(); |
| assertTrue(desc + " must be descendant of " + parent, Text.isDescendant(parent, desc)); |
| } |
| List nonDescendants = new ArrayList(); |
| nonDescendants.add("/"); |
| nonDescendants.add("a"); |
| for (Iterator it = nonDescendants.iterator(); it.hasNext();) { |
| String nonDesc = it.next().toString(); |
| assertFalse(nonDesc + " isn't a descendant of " + parent,Text.isDescendant(parent, nonDesc)); |
| } |
| |
| parent = "/a/b"; |
| descendants = new ArrayList(); |
| descendants.add("/a/b/c"); |
| descendants.add("/a/b/c/"); |
| for (Iterator it = descendants.iterator(); it.hasNext();) { |
| String desc = it.next().toString(); |
| assertTrue(desc + " must be descendant of " + parent, Text.isDescendant(parent, desc)); |
| } |
| nonDescendants = new ArrayList(); |
| nonDescendants.add("/"); |
| nonDescendants.add("/a"); |
| nonDescendants.add("/a/b"); |
| nonDescendants.add("/a/b/"); |
| nonDescendants.add("/d"); |
| nonDescendants.add("/d/b"); |
| for (Iterator it = nonDescendants.iterator(); it.hasNext();) { |
| String nonDesc = it.next().toString(); |
| assertFalse(nonDesc + " isn't a descendant of " + parent, Text.isDescendant(parent, nonDesc)); |
| } |
| } |
| |
| public void testGetName() { |
| List l = new ArrayList(); |
| l.add(new String[] {"/a/b/c", "c"}); |
| l.add(new String[] {"c", "c"}); |
| l.add(new String[] {null, null}); |
| l.add(new String[] {"", ""}); |
| l.add(new String[] {"/", ""}); |
| l.add(new String[] {"http://jackrabbit.apache.org/jackrabbit", "jackrabbit"}); |
| l.add(new String[] {"http://jackrabbit.apache.org/jackrabbit/", ""}); |
| |
| for (Iterator it = l.iterator(); it.hasNext();) { |
| String[] strs = (String[]) it.next(); |
| assertEquals(strs[1], Text.getName(strs[0])); |
| } |
| |
| // Text.getName(String path, boolean ignoreTrailingSlash) |
| l = new ArrayList(); |
| l.add(new String[] {"http://jackrabbit.apache.org/jackrabbit", "jackrabbit"}); |
| l.add(new String[] {"http://jackrabbit.apache.org/jackrabbit/", "jackrabbit"}); |
| |
| for (Iterator it = l.iterator(); it.hasNext();) { |
| String[] strs = (String[]) it.next(); |
| assertEquals(strs[1], Text.getName(strs[0], true)); |
| } |
| |
| // Text.getName(String path, char delim) |
| l = new ArrayList(); |
| l.add(new String[] {"/a=b/c", "b/c"}); |
| l.add(new String[] {"c", "c"}); |
| l.add(new String[] {null, null}); |
| l.add(new String[] {"", ""}); |
| l.add(new String[] {"http:/=jackrabbit.apache.org/jackrabbit", "jackrabbit.apache.org/jackrabbit"}); |
| l.add(new String[] {"http:=//jackrabbit.apache.org/jackrabbit/", "//jackrabbit.apache.org/jackrabbit/"}); |
| |
| for (Iterator it = l.iterator(); it.hasNext();) { |
| String[] strs = (String[]) it.next(); |
| assertEquals(strs[1], Text.getName(strs[0], '=')); |
| } |
| } |
| |
| public void testUrlEscape() { |
| String testString = "\u4e2d\u56fd\u7684\u7f51\u9875 $% \u20acuro %$ "; |
| |
| String escaped = testString |
| .replaceAll("%", "%25") |
| .replaceAll(" ", "%20"); |
| String unescaped = Text.unescape(escaped); |
| assertEquals(testString, unescaped); |
| |
| escaped = Text.escape(testString); |
| unescaped = Text.unescape(escaped); |
| assertEquals(testString, unescaped); |
| |
| assertEquals("%", Text.unescape("%25")); |
| assertEquals("", Text.unescape("")); |
| assertEquals("\u4e2d\u56fd\u7684\u7f51\u9875", Text.unescape("\u4e2d\u56fd\u7684\u7f51\u9875")); |
| } |
| |
| /** |
| * @see <a href="https://issues.apache.org/jira/browse/JCR-1926">JCR-1926</a> |
| */ |
| public void testUnescapeWithInvalidInput() { |
| assertInvalidUnescape("%"); // too short |
| assertInvalidUnescape("anything%"); // too short |
| assertInvalidUnescape("%%"); // too short |
| assertInvalidUnescape("anything%%"); // too short |
| assertInvalidUnescape("%1"); // too short |
| assertInvalidUnescape("anything%1"); // too short |
| assertInvalidUnescape("%%%"); // not a number |
| assertInvalidUnescape("%ag"); // not a number |
| assertInvalidUnescape("anything%%%"); // not a number |
| assertInvalidUnescape("anything%ag"); // not a number |
| assertInvalidUnescape("anything%%%anything"); // not a number |
| assertInvalidUnescape("anything%aganything"); // not a number |
| } |
| |
| private void assertInvalidUnescape(String string) { |
| try { |
| Text.unescape(string); |
| fail("Text.unescape(" + string + ") should throw IllegalArgumentException"); |
| } catch (IllegalArgumentException expected) { |
| } catch (RuntimeException unexpected) { |
| fail("Text.unescape(" + string + "): " + unexpected.getMessage()); |
| } |
| } |
| |
| public void testEscapeIllegalJcr10Chars() throws Exception { |
| // single and double quote are illegal in JCR 1.0 |
| assertEquals("local%27name", Text.escapeIllegalJcr10Chars("local'name")); |
| assertEquals("local%22name", Text.escapeIllegalJcr10Chars("local\"name")); |
| } |
| |
| public void testEscapeIllegalJcrChars() throws Exception { |
| // single and double quote are valid since JCR 2.0 |
| assertEquals("local'name", Text.escapeIllegalJcrChars("local'name")); |
| assertEquals("local\"name", Text.escapeIllegalJcrChars("local\"name")); |
| } |
| |
| public void testEscapeXML() { |
| assertEquals("&<>'"", Text.encodeIllegalXMLCharacters("&<>'\"")); |
| } |
| |
| public void testEscapeHTML() { |
| assertEquals("&<>'"", Text.encodeIllegalHTMLCharacters("&<>'\"")); |
| } |
| } |