package org.limewire.util; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Locale; import junit.framework.Test; /** * Tests StringUtils. */ public class StringUtilsTest extends BaseTestCase { public StringUtilsTest(String name) { super(name); } public static Test suite() { return buildTestSuite(StringUtilsTest.class); } /** * Tests the method for getting the index of a substring from within * another string, ignoring case. */ public void testIndexOfIgnoreCase() throws Exception { int index = StringUtils.indexOfIgnoreCase("test", "t"); assertEquals("unexpected index", 0, index); index = StringUtils.indexOfIgnoreCase("test", "p"); assertEquals("unexpected index", -1, index); index = StringUtils.indexOfIgnoreCase("test", "st"); assertEquals("unexpected index", 2, index); } public void testIndexOfIgnoreCaseLocale() throws Exception { int index = StringUtils.indexOfIgnoreCase("TITle", "t\u0131tlE", new Locale("tr")); assertEquals("unexpected index", 0, index); } public void testCase() { //Case methods. Test all boundary conditions. //See ASCII table for further justification. assertEquals('\0', StringUtils.toOtherCase('\0')); assertEquals('0',StringUtils.toOtherCase('0')); assertEquals('@',StringUtils.toOtherCase('@')); assertEquals('a',StringUtils.toOtherCase('A')); assertEquals('h',StringUtils.toOtherCase('H')); assertEquals('z',StringUtils.toOtherCase('Z')); assertEquals('[',StringUtils.toOtherCase('[')); assertEquals('`',StringUtils.toOtherCase('`')); assertEquals('A',StringUtils.toOtherCase('a')); assertEquals('H',StringUtils.toOtherCase('h')); assertEquals('Z',StringUtils.toOtherCase('z')); assertEquals('{',StringUtils.toOtherCase('{')); } public void testContains1() { //Wildcards assertTrue(StringUtils.contains("", "") ); assertTrue(StringUtils.contains("abc", "") ); assertTrue(StringUtils.contains("abc", "b") ); assertFalse(StringUtils.contains("abc", "d") ); assertTrue(StringUtils.contains("abcd", "a*d")); assertTrue(StringUtils.contains("abcd", "*a**d*") ); assertFalse(StringUtils.contains("abcd", "d*a") ); assertFalse(StringUtils.contains("abcd", "*.*") ); assertTrue(StringUtils.contains("abc.d", "*.*") ); assertTrue(StringUtils.contains("abc.", "*.*") ); } public void testContains2() { //Spaces and wildcards assertFalse(StringUtils.contains("abcd", "x") ); assertTrue(StringUtils.contains("abcd", "a b")); assertFalse(StringUtils.contains("abcd", "a x") ); assertTrue(StringUtils.contains("abcd", "a c") ); assertTrue(StringUtils.contains("abcd", "a+c") ); assertTrue(StringUtils.contains("abcd", "d a")); assertTrue(StringUtils.contains("abcd", "a d+c") ); assertFalse(StringUtils.contains("abcd", "a dc") ); assertTrue(StringUtils.contains("abcd", "a b*c") ); assertFalse(StringUtils.contains("abcd", "a c*b") ); assertTrue(StringUtils.contains("abcd", " ab+") ); assertFalse(StringUtils.contains("abcd", "+x+") ); assertTrue(StringUtils.contains("abcde", "ab bcd") ); assertFalse(StringUtils.contains("abcde", "ab bd") ); assertTrue(StringUtils.contains("abcdefghj", "+*+*ab*d+def*g c ") ); } public void testContainsCase() { //Cases assertTrue(StringUtils.contains("aBcDd", "bCD", true)); assertFalse(StringUtils.contains("aBcDd", "bCD", false)); assertTrue(StringUtils.contains("....", "..", true)); assertTrue(StringUtils.contains("....", "..", false)); } public void testContainsClip2() { //Clip2 compatibility assertTrue(StringUtils.contains("abcd", " ")); assertTrue(StringUtils.contains("abcd", " ")); } public void testSplit() { //split tests String in; String[] expected; String[] result; in="a//b/ c /"; expected=new String[] {"a","b"," c "}; result=StringUtils.split(in, '/'); assertTrue(Arrays.equals(expected, result)); in="a b"; expected=new String[] {"a b"}; result=StringUtils.split(in, '/'); assertTrue(Arrays.equals(expected, result)); in="///"; expected=new String[] {}; result=StringUtils.split(in, '/'); assertTrue(Arrays.equals(expected, result)); in="a+b|c|+d+|"; expected=new String[] {"a", "b", "c", "d"}; result=StringUtils.split(in, "+|"); assertTrue(Arrays.equals(expected, result)); in=""; expected=new String[] {}; result=StringUtils.split(in, '/'); assertTrue(Arrays.equals(expected, result)); } public void testSplitNoCoalesce() { //split tests String in; String[] expected; String[] result; in="a//b/ c "; expected=new String[] {"a","","b"," c "}; result=StringUtils.splitNoCoalesce(in, '/'); assertTrue(Arrays.equals(expected, result)); in="a//b/ c /"; expected=new String[] {"a","","b"," c ",""}; result=StringUtils.splitNoCoalesce(in, '/'); assertTrue(Arrays.equals(expected, result)); in="/a//b/ c "; expected=new String[] {"","a","","b"," c "}; result=StringUtils.splitNoCoalesce(in, '/'); assertTrue(Arrays.equals(expected, result)); in="a b"; expected=new String[] {"a b"}; result=StringUtils.splitNoCoalesce(in, '/'); assertTrue(Arrays.equals(expected, result)); in="///"; expected=new String[] {"", "", "", ""}; result=StringUtils.splitNoCoalesce(in, '/'); assertTrue(Arrays.equals(expected, result)); in="a+b|c|+d+|"; expected=new String[] {"a", "b", "c", "", "d", "", ""}; result=StringUtils.splitNoCoalesce(in, "+|"); assertTrue(Arrays.equals(expected, result)); in=""; expected=new String[] {}; result=StringUtils.splitNoCoalesce(in, '/'); assertTrue(Arrays.equals(expected, result)); } public void testStartsWithIgnoreCase() { assertTrue(StringUtils.startsWithIgnoreCase("abcd", "a")); assertTrue(StringUtils.startsWithIgnoreCase("aBcd", "Ab")); assertTrue(StringUtils.startsWithIgnoreCase("abcd", "")); assertTrue(StringUtils.startsWithIgnoreCase("a", "")); assertTrue(StringUtils.startsWithIgnoreCase("", "")); assertTrue(! StringUtils.startsWithIgnoreCase("abcd", "x")); assertTrue(! StringUtils.startsWithIgnoreCase("a", "ab")); assertTrue(! StringUtils.startsWithIgnoreCase("", "a")); } /** * Tests the method that replaces sections of a string with a new * string. */ public void testStringUtilsReplace() { String _testString = "test_"; String[] old_strs = { "old0", "old1", "old2", "old3", "old4", }; String[] new_strs = { "new0", "new1", "new2", "new3", "new4", }; for(int i=0; i<old_strs.length; i++) { String str = StringUtils.replace(_testString+old_strs[i], old_strs[i], new_strs[i]); assertEquals("unexpected string", _testString+new_strs[i], str); } } //tests method contains with non-ascii chars... (japanese to be exact) public void testContainsNonAscii() throws Exception { String miyamoto = "\u5bae\u672c\u6b66\u8535\u69d8"; assertTrue(StringUtils.contains(miyamoto, "\u5bae\u672c")); assertFalse(StringUtils.contains(miyamoto, "\uff2e")); assertTrue(StringUtils.contains(miyamoto, "\u672c+\u8535")); assertTrue(StringUtils.contains(miyamoto, "\u5bae*\u69d8")); assertTrue(StringUtils.contains(miyamoto, "\u672c \u8535")); assertFalse(StringUtils.contains(miyamoto, "\uff2d \u8535")); assertTrue(StringUtils.contains(miyamoto, "\u5bae \u6b66+\u69d8")); } //tests the collator comparisions... public void testCompareFullPrimary() throws Exception { String s1 = "cafe"; String s2 = "caf\u00e9"; assertEquals("these should be considered the same", 0, StringUtils.compareFullPrimary(s1, s2)); String s3 = "limewire"; String s4 = "\uff2c\uff29\uff2d\uff25\uff37\uff29\uff32\uff25"; assertEquals("these should be considered the same", 0, StringUtils.compareFullPrimary(s3, s4)); String a1 = "test"; String a2 = "tist"; String a3 = "\uff34\uff29\uff33\uff34"; //tist in FULLWIDTH //comparing ascii so should be same as compareIgnoreCase //the important thing is that they are both negative, or positive assertEquals("expected to be the same as compareIignoreCase", a1.compareToIgnoreCase(a2) < 0, StringUtils.compareFullPrimary(a1, a2) < 0); assertEquals("expected to be the same (FULLWIDTH)", StringUtils.compareFullPrimary(a1, a2), StringUtils.compareFullPrimary(a1, a3)); assertEquals("should of returned zero", 0, StringUtils.compareFullPrimary(a2, a3)); } public void testExplode() { String[] in = new String[] {"a" , "b", " c "}; assertEquals("a/b/ c ", StringUtils.explode(in, "/")); in = new String[] {}; assertEquals("", StringUtils.explode(in, "/")); in = new String[] {}; assertEquals("", StringUtils.explode(in, "")); in = new String[] {"a", "b"}; assertEquals("a b", StringUtils.explode(in, " ")); in = new String[] {"a", "b"}; assertEquals("ab", StringUtils.explode(in, "")); } public void testIterableExplode() { Collection<?> in = Arrays.asList("a" , "b", " c "); assertEquals("a/b/ c ", StringUtils.explode(in, "/")); in = Collections.emptyList(); assertEquals("", StringUtils.explode(in, "/")); in = Collections.emptyList(); assertEquals("", StringUtils.explode(in, "")); in = Arrays.asList("a", "b"); assertEquals("a b", StringUtils.explode(in, " ")); in = Arrays.asList("a", "b"); assertEquals("ab", StringUtils.explode(in, "")); // single element in = Collections.singletonList("h"); assertEquals("h", StringUtils.explode(in, "kfkdf")); in = Arrays.asList(5, 4, 4, 4); assertEquals("5,4,4,4", StringUtils.explode(in, ",")); } public void testToString() { AllFields fields = new AllFields(); String result = fields.toString(); assertEquals("AllFields {a=a, i=2147483647, n=null, thiz=circular structure}", result); SomeFields someFields = new SomeFields(); result = someFields.toString(); assertEquals("SomeFields {a=a, n=null}", result); } public void testToStringBlacklist() { BlacklistFields someFields = new BlacklistFields(); String result = someFields.toString(); assertEquals("BlacklistFields {i=2147483647, thiz=circular structure}", result); } public void testToStringWithArrayFields() { ArrayFields fields = new ArrayFields(); assertEquals("ArrayFields {objs=[null, hello], ints=[4, 4]}", fields.toString()); } public void testReplace() { assertEquals("mimimi", StringUtils.replace("mamama", "ma", "mi")); } public void testIsAsciiOnly() { assertTrue(StringUtils.isAsciiOnly("abcdefghijklmnopqrstuvwxyz")); assertFalse(StringUtils.isAsciiOnly("\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0")); assertFalse(StringUtils.isAsciiOnly("\u30e0")); for (char c = 0; c <= Byte.MAX_VALUE; c++) { // ensure msb is not set assertEquals(0, (c & 0xF0) >> 7); assertTrue(StringUtils.isAsciiOnly(new String(new char[] { c }))); } for (int i = -1; i >= Byte.MIN_VALUE; i--) { // ensure msb is set assertEquals(1, (i & 0xF0) >> 7); assertFalse(StringUtils.isAsciiOnly(new String(new char[] { (char)i }))); } } public void testCountOccurrences() { assertEquals(0, StringUtils.countOccurrences("", 'f')); assertEquals(0, StringUtils.countOccurrences("fdfdfdfdf", 'e')); assertEquals(6, StringUtils.countOccurrences("ffffff", 'f')); assertEquals(1, StringUtils.countOccurrences("fddddd", 'f')); assertEquals(1, StringUtils.countOccurrences("dddddf", 'f')); assertEquals(2, StringUtils.countOccurrences("fdddddf", 'f')); } private static class AllFields { String a = "a"; int i = Integer.MAX_VALUE; Object n = null; AllFields thiz = this; @Override public String toString() { return StringUtils.toString(this); } } private static class SomeFields { String a = "a"; int i = Integer.MAX_VALUE; Object n = null; SomeFields thiz = this; @Override public String toString() { return StringUtils.toString(this, a, n); } } private static class ArrayFields { Object[] objs = new Object[] { null, "hello" }; int[] ints = new int[] { 4 , 4 }; @Override public String toString() { return StringUtils.toString(this); } } private static class BlacklistFields { String a = "a"; int i = Integer.MAX_VALUE; Object n = null; BlacklistFields thiz = this; @Override public String toString() { return StringUtils.toStringBlacklist(this, a, n); } } }