package com.cedarsoftware.util; import org.junit.Test; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; import java.util.Random; import java.util.Set; import java.util.TreeSet; import static com.cedarsoftware.util.StringUtilities.hashCodeIgnoreCase; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; /** * @author Ken Partlow * @author John DeRegnaucourt (john@cedarsoftware.com) * <br> * Copyright (c) Cedar Software LLC * <br><br> * Licensed 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 * <br><br> * http://www.apache.org/licenses/LICENSE-2.0 * <br><br> * 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. */ public class TestStringUtilities { @Test public void testConstructorIsPrivate() throws Exception { Class c = StringUtilities.class; assertEquals(Modifier.FINAL, c.getModifiers() & Modifier.FINAL); Constructor<StringUtilities> con = c.getDeclaredConstructor(); assertEquals(Modifier.PRIVATE, con.getModifiers() & Modifier.PRIVATE); con.setAccessible(true); assertNotNull(con.newInstance()); } @Test public void testIsEmpty() { assertTrue(StringUtilities.isEmpty(null)); assertTrue(StringUtilities.isEmpty("")); assertFalse(StringUtilities.isEmpty("foo")); } @Test public void testHasContent() { assertFalse(StringUtilities.hasContent(null)); assertFalse(StringUtilities.hasContent("")); assertTrue(StringUtilities.hasContent("foo")); } @Test public void testTrimLength() { assertEquals(0, StringUtilities.trimLength(null)); assertEquals(0, StringUtilities.trimLength("")); assertEquals(3, StringUtilities.trimLength(" abc ")); assertTrue(StringUtilities.equalsIgnoreCaseWithTrim("abc", " Abc ")); assertTrue(StringUtilities.equalsWithTrim("abc", " abc ")); assertEquals(2, StringUtilities.count("abcabc", 'a')); } @Test public void testEqualsWithTrim() { assertTrue(StringUtilities.equalsWithTrim("abc", " abc ")); assertTrue(StringUtilities.equalsWithTrim(" abc ", "abc")); assertFalse(StringUtilities.equalsWithTrim("abc", " AbC ")); assertFalse(StringUtilities.equalsWithTrim(" AbC ", "abc")); assertFalse(StringUtilities.equalsWithTrim(null, "")); assertFalse(StringUtilities.equalsWithTrim("", null)); assertTrue(StringUtilities.equalsWithTrim("", "\t\n\r")); } @Test public void testEqualsIgnoreCaseWithTrim() { assertTrue(StringUtilities.equalsIgnoreCaseWithTrim("abc", " abc ")); assertTrue(StringUtilities.equalsIgnoreCaseWithTrim(" abc ", "abc")); assertTrue(StringUtilities.equalsIgnoreCaseWithTrim("abc", " AbC ")); assertTrue(StringUtilities.equalsIgnoreCaseWithTrim(" AbC ", "abc")); assertFalse(StringUtilities.equalsIgnoreCaseWithTrim(null, "")); assertFalse(StringUtilities.equalsIgnoreCaseWithTrim("", null)); assertTrue(StringUtilities.equalsIgnoreCaseWithTrim("", "\t\n\r")); } @Test public void testCount() { assertEquals(2, StringUtilities.count("abcabc", 'a')); assertEquals(0, StringUtilities.count("foo", 'a')); assertEquals(0, StringUtilities.count(null, 'a')); assertEquals(0, StringUtilities.count("", 'a')); } @Test public void testString() { assertTrue(StringUtilities.isEmpty(null)); assertFalse(StringUtilities.hasContent(null)); assertEquals(0, StringUtilities.trimLength(null)); assertTrue(StringUtilities.equalsIgnoreCaseWithTrim("abc", " Abc ")); assertTrue(StringUtilities.equalsWithTrim("abc", " abc ")); assertEquals("1A", StringUtilities.encode(new byte[]{0x1A})); assertArrayEquals(new byte[]{0x1A}, StringUtilities.decode("1A")); assertEquals(2, StringUtilities.count("abcabc", 'a')); } @Test public void testEncode() { assertEquals("1A", StringUtilities.encode(new byte[]{0x1A})); assertEquals("", StringUtilities.encode(new byte[]{})); } @Test(expected=NullPointerException.class) public void testEncodeWithNull() { StringUtilities.encode(null); } @Test public void testDecode() { assertArrayEquals(new byte[]{0x1A}, StringUtilities.decode("1A")); assertArrayEquals(new byte[]{}, StringUtilities.decode("")); assertNull(StringUtilities.decode("1AB")); } @Test(expected=NullPointerException.class) public void testDecodeWithNull() { StringUtilities.decode(null); } @Test public void testEquals() { assertTrue(StringUtilities.equals(null, null)); assertFalse(StringUtilities.equals(null, "")); assertFalse(StringUtilities.equals("", null)); assertFalse(StringUtilities.equals("foo", "bar")); assertFalse(StringUtilities.equals("Foo", "foo")); assertTrue(StringUtilities.equals("foo", "foo")); } @Test public void testEqualsIgnoreCase() { assertTrue(StringUtilities.equalsIgnoreCase(null, null)); assertFalse(StringUtilities.equalsIgnoreCase(null, "")); assertFalse(StringUtilities.equalsIgnoreCase("", null)); assertFalse(StringUtilities.equalsIgnoreCase("foo", "bar")); assertTrue(StringUtilities.equalsIgnoreCase("Foo", "foo")); assertTrue(StringUtilities.equalsIgnoreCase("foo", "foo")); } @Test public void testLastIndexOf() { assertEquals(-1, StringUtilities.lastIndexOf(null, 'a')); assertEquals(-1, StringUtilities.lastIndexOf("foo", 'a')); assertEquals(1, StringUtilities.lastIndexOf("bar", 'a')); } @Test public void testLength() { assertEquals(0, StringUtilities.length("")); assertEquals(0, StringUtilities.length(null)); assertEquals(3, StringUtilities.length("abc")); } @Test public void testLevenshtein() { assertEquals(3, StringUtilities.levenshteinDistance("example", "samples")); assertEquals(6, StringUtilities.levenshteinDistance("sturgeon", "urgently")); assertEquals(6, StringUtilities.levenshteinDistance("levenshtein", "frankenstein")); assertEquals(5, StringUtilities.levenshteinDistance("distance", "difference")); assertEquals(7, StringUtilities.levenshteinDistance("java was neat", "scala is great")); assertEquals(0, StringUtilities.levenshteinDistance(null, "")); assertEquals(0, StringUtilities.levenshteinDistance("", null)); assertEquals(0, StringUtilities.levenshteinDistance(null, null)); assertEquals(0, StringUtilities.levenshteinDistance("", "")); assertEquals(1, StringUtilities.levenshteinDistance(null, "1")); assertEquals(1, StringUtilities.levenshteinDistance("1", null)); assertEquals(1, StringUtilities.levenshteinDistance("", "1")); assertEquals(1, StringUtilities.levenshteinDistance("1", "")); assertEquals(3, StringUtilities.levenshteinDistance("schill", "thrill")); assertEquals(2, StringUtilities.levenshteinDistance("abcdef", "bcdefa")); } @Test public void testDamerauLevenshtein() throws Exception { assertEquals(3, StringUtilities.damerauLevenshteinDistance("example", "samples")); assertEquals(6, StringUtilities.damerauLevenshteinDistance("sturgeon", "urgently")); assertEquals(6, StringUtilities.damerauLevenshteinDistance("levenshtein", "frankenstein")); assertEquals(5, StringUtilities.damerauLevenshteinDistance("distance", "difference")); assertEquals(9, StringUtilities.damerauLevenshteinDistance("java was neat", "groovy is great")); assertEquals(0, StringUtilities.damerauLevenshteinDistance(null, "")); assertEquals(0, StringUtilities.damerauLevenshteinDistance("", null)); assertEquals(0, StringUtilities.damerauLevenshteinDistance(null, null)); assertEquals(0, StringUtilities.damerauLevenshteinDistance("", "")); assertEquals(1, StringUtilities.damerauLevenshteinDistance(null, "1")); assertEquals(1, StringUtilities.damerauLevenshteinDistance("1", null)); assertEquals(1, StringUtilities.damerauLevenshteinDistance("", "1")); assertEquals(1, StringUtilities.damerauLevenshteinDistance("1", "")); assertEquals(3, StringUtilities.damerauLevenshteinDistance("schill", "thrill")); assertEquals(2, StringUtilities.damerauLevenshteinDistance("abcdef", "bcdefa")); int d1 = StringUtilities.levenshteinDistance("neat", "naet"); int d2 = StringUtilities.damerauLevenshteinDistance("neat", "naet"); assertEquals(d1, 2); assertEquals(d2, 1); } @Test public void testRandomString() { Random random = new Random(42); Set<String> strings = new TreeSet<String>(); for (int i=0; i < 100000; i++) { String s = StringUtilities.getRandomString(random, 3, 9); strings.add(s); } for (String s : strings) { assertTrue(s.length() >= 3 && s.length() <= 9); } } @Test(expected=IllegalArgumentException.class) public void testGetBytesWithInvalidEncoding() { StringUtilities.getBytes("foo", "foo"); } @Test public void testGetBytes() { assertArrayEquals(new byte[]{102, 111, 111}, StringUtilities.getBytes("foo", "UTF-8")); } @Test public void testGetUTF8Bytes() { assertArrayEquals(new byte[]{102, 111, 111}, StringUtilities.getUTF8Bytes("foo")); } @Test public void testGetBytesWithNull() { assertNull(null, StringUtilities.getBytes(null, "UTF-8")); } @Test public void testGetBytesWithEmptyString() { assert DeepEquals.deepEquals(new byte[]{}, StringUtilities.getBytes("", "UTF-8")); } @Test public void testWildcard() { String name = "George Washington"; assertTrue(name.matches(StringUtilities.wildcardToRegexString("*"))); assertTrue(name.matches(StringUtilities.wildcardToRegexString("G*"))); assertTrue(name.matches(StringUtilities.wildcardToRegexString("*on"))); assertFalse(name.matches(StringUtilities.wildcardToRegexString("g*"))); name = "com.acme.util.string"; assertTrue(name.matches(StringUtilities.wildcardToRegexString("com.*"))); assertTrue(name.matches(StringUtilities.wildcardToRegexString("com.*.util.string"))); name = "com.acme.util.string"; assertTrue(name.matches(StringUtilities.wildcardToRegexString("com.????.util.string"))); assertFalse(name.matches(StringUtilities.wildcardToRegexString("com.??.util.string"))); } @Test public void testCreateString() { assertEquals("foo", StringUtilities.createString(new byte[]{102, 111, 111}, "UTF-8")); } @Test public void testCreateUTF8String() { assertEquals("foo", StringUtilities.createUTF8String(new byte[]{102, 111, 111})); } @Test public void testCreateStringWithNull() { assertNull(null, StringUtilities.createString(null, "UTF-8")); } @Test public void testCreateStringWithEmptyArray() { assertEquals("", StringUtilities.createString(new byte[]{}, "UTF-8")); } @Test public void testCreateUTF8StringWithEmptyArray() { assertEquals("", StringUtilities.createUTF8String(new byte[]{})); } @Test(expected=IllegalArgumentException.class) public void testCreateStringWithInvalidEncoding() { StringUtilities.createString(new byte[] {102, 111, 111}, "baz"); } @Test public void testCreateUtf8String() { assertEquals("foo", StringUtilities.createUtf8String(new byte[] {102, 111, 111})); } @Test public void testCreateUtf8StringWithNull() { assertNull(null, StringUtilities.createUtf8String(null)); } @Test public void testCreateUtf8StringWithEmptyArray() { assertEquals("", StringUtilities.createUtf8String(new byte[]{})); } @Test public void testHashCodeIgnoreCase() { String s = "Hello"; String t = "HELLO"; assert hashCodeIgnoreCase(s) == hashCodeIgnoreCase(t); s = "Hell0"; assert hashCodeIgnoreCase(s) != hashCodeIgnoreCase(t); assert hashCodeIgnoreCase(null) == 0; assert hashCodeIgnoreCase("") == 0; } }