1   package com.atlassian.core.util;
2   
3   import com.atlassian.core.util.StringUtils;
4   import junit.framework.TestCase;
5   
6   import java.util.Collection;
7   import java.util.ArrayList;
8   import java.util.Arrays;
9   import java.util.Collections;
10  
11  public class TestStringUtils extends TestCase
12  {
13      private final String UTF8_TEST_STRING = "" + (char) 8216 + "singlequotes" + (char) 8217 + " " +
14              (char) 8220 + "doublequotes" + (char) 8221 + " Elipsis: " + (char) 8230 + " Em-dash: " +
15              (char) 8211 + " bullet: " + (char) 183;
16  
17      private final String ISO88591_TEST_STRING = "" + (char) 145 + "singlequotes" + (char) 146 + " " +
18              (char) 147 + "doublequotes" + (char) 148 + " Elipsis: " + (char) 133 + " Em-dash: " +
19              (char) 150 + " bullet: " + (char) 183;
20  
21      private final String SIMPLIFIED_TEST_STRING = "'singlequotes' \"doublequotes\" Elipsis: ... Em-dash: - bullet: - ";
22  
23      public TestStringUtils(String s)
24      {
25          super(s);
26      }
27  
28      public void testUTF()
29      {
30          String escaped = StringUtils.escapeCP1252(UTF8_TEST_STRING, "UTF-8");
31          assertEquals(SIMPLIFIED_TEST_STRING, escaped);
32      }
33  
34      public void testISO8859()
35      {
36          String escaped = StringUtils.escapeCP1252(ISO88591_TEST_STRING, "ISO-8859-1");
37          assertEquals(SIMPLIFIED_TEST_STRING, escaped);
38      }
39  
40      public void testNormalString()
41      {
42          String escaped = StringUtils.escapeCP1252("normal string", "UTF-8");
43          assertEquals("normal string", escaped);
44      }
45  
46      public void testNull()
47      {
48          String escaped = StringUtils.escapeCP1252(null, "UTF-8");
49          assertEquals(null, escaped);
50      }
51  
52      public void testHighRangeStrings()
53      {
54          String highEndString = new String("This is a " + UTF8_TEST_STRING + " test String '" + ((char) 25628) + "' does it work?");
55          StringUtils.escapeCP1252(highEndString, "UTF-8");
56          StringUtils.escapeCP1252(highEndString, "ISO-8859-1");
57      }
58  
59      public void testInvalidControlCharacters()
60      {
61          String s = "start";
62          for (int i = 0; i <= 30; i++)
63          {
64              if (i == 9 || i == 10 || i == 13)
65              {
66                  continue; // 9, 10, 13 are line feed and carriage return chars
67              }
68              s += (char) i;
69          }
70          s += "end";
71          assertEquals("startend", StringUtils.escapeCP1252(s, "UTF-8"));
72          assertEquals("startend", StringUtils.escapeCP1252(s, "ISO-8859-1"));
73      }
74  
75      public void testOnlyControlCharacters()
76      {
77          String s = "";
78          for (int i = 0; i <= 30; i++)
79          {
80              if (i == 9 || i == 10 || i == 13)
81              {
82                  continue; // 9, 10, 13 are line feed and carriage return chars
83              }
84              s += (char) i;
85          }
86          assertEquals("", StringUtils.escapeCP1252(s, "UTF-8"));
87          assertEquals("", StringUtils.escapeCP1252(s, "ISO-8859-1"));
88      }
89  
90      public void testReplaceAll()
91      {
92          assertEquals("no change", StringUtils.replaceAll("no change", "foo", "bar"));
93          assertEquals("no change", StringUtils.replaceAll("no change", "", ""));
94          assertEquals("", StringUtils.replaceAll("deleteme", "deleteme", ""));
95          assertEquals(null, StringUtils.replaceAll(null, "&", "X"));
96          assertEquals("", StringUtils.replaceAll("", "&", "X"));
97          assertEquals("no change", StringUtils.replaceAll("no change", null, ""));
98          assertEquals("hello%26world%26sad", StringUtils.replaceAll("hello&world&sad", "&", "%26"));
99          assertEquals("Xhello", StringUtils.replaceAll("&hello", "&", "X"));
100         assertEquals("helloX", StringUtils.replaceAll("hello&", "&", "X"));
101         assertEquals("XhelloXworld", StringUtils.replaceAll("&%hello&%world", "&%", "X"));
102         assertEquals("goodbye world", StringUtils.replaceAll("hello world", "hello", "goodbye"));
103         assertEquals("doo dum dum diddly dum", StringUtils.replaceAll("doo da da diddly da", "da", "dum"));
104         assertEquals("normal", StringUtils.replaceAll("normal", "&", "X"));
105     }
106 
107     public void testReplaceAllDips()
108     {
109         String str = "hello'world";
110         String str2 = "'foo'bar'";
111 
112         assertEquals("hello''world", StringUtils.replaceAll(str, "\'", "\'\'"));
113         assertEquals("''foo''bar''", StringUtils.replaceAll(str2, "\'", "\'\'"));
114     }
115 
116     public void testStringAllASCII()
117     {
118         assertTrue(StringUtils.isStringAllASCII(null));
119         assertTrue(StringUtils.isStringAllASCII(""));
120         assertTrue(StringUtils.isStringAllASCII("abc"));
121         assertTrue(StringUtils.isStringAllASCII("abc\tgr"));
122         assertTrue(StringUtils.isStringAllASCII("?/\\@#$"));
123         assertFalse(StringUtils.isStringAllASCII("?/\u00fd#"));
124         assertFalse(StringUtils.isStringAllASCII("\\@\u00ff$"));
125         assertFalse(StringUtils.isStringAllASCII("a\u0129ngr"));
126     }
127 
128     public void testStringISO_8859_1()
129     {
130         assertTrue(StringUtils.isStringISO_8859_1(null));
131         assertTrue(StringUtils.isStringISO_8859_1(""));
132         assertTrue(StringUtils.isStringISO_8859_1("abc"));
133         assertTrue(StringUtils.isStringISO_8859_1("abc\tgr"));
134         assertTrue(StringUtils.isStringISO_8859_1("?/\\@#$"));
135         assertTrue(StringUtils.isStringISO_8859_1("?/\u00fd#"));
136         assertTrue(StringUtils.isStringISO_8859_1("\\@\u00ff$"));
137         assertFalse(StringUtils.isStringISO_8859_1("a\u0129ngr"));
138     }
139 
140     public void testEqualsIgnoreLineTerminators()
141     {
142         // Test That null and empty string is treated as equal
143         assertTrue(StringUtils.equalsIgnoreLineTerminators(null, null));
144         assertTrue(StringUtils.equalsIgnoreLineTerminators(null, ""));
145         assertTrue(StringUtils.equalsIgnoreLineTerminators("", null));
146         assertTrue(StringUtils.equalsIgnoreLineTerminators("", ""));
147 
148         // Test that comparing a string to no string
149         assertFalse(StringUtils.equalsIgnoreLineTerminators(null, "a"));
150         assertFalse(StringUtils.equalsIgnoreLineTerminators("", "a"));
151         assertFalse(StringUtils.equalsIgnoreLineTerminators("a", null));
152         assertFalse(StringUtils.equalsIgnoreLineTerminators("a", ""));
153 
154         // Test that line terminators are not ignored (they do matter)
155         assertFalse(StringUtils.equalsIgnoreLineTerminators("a\na", "aa"));
156         assertFalse(StringUtils.equalsIgnoreLineTerminators("aa", "a\ra"));
157         assertFalse(StringUtils.equalsIgnoreLineTerminators("aa", "a\r\na"));
158 
159         // Check that all line terminators are treated equaly
160         assertTrue(StringUtils.equalsIgnoreLineTerminators("a\na", "a\na"));
161         assertTrue(StringUtils.equalsIgnoreLineTerminators("a\r\na", "a\r\na"));
162         assertTrue(StringUtils.equalsIgnoreLineTerminators("a\na", "a\r\na"));
163         assertTrue(StringUtils.equalsIgnoreLineTerminators("a\na", "a\ra"));
164         assertTrue(StringUtils.equalsIgnoreLineTerminators("a\ra", "a\ra"));
165 
166         // Same more random tests
167         assertTrue(StringUtils.equalsIgnoreLineTerminators("abc", "abc"));
168         assertFalse(StringUtils.equalsIgnoreLineTerminators("a\na", "a\na\n"));
169         assertFalse(StringUtils.equalsIgnoreLineTerminators("a\ra", "a\na\r"));
170         assertTrue(StringUtils.equalsIgnoreLineTerminators("a\ra\r\n", "a\na\r"));
171     }
172 
173     public void testSplitCommaSeperatedString()
174     {
175         String[] namesExpected = new String[]{"bob","fred","john"};
176         String[] names;
177         
178         // Test a simple String
179         names = StringUtils.splitCommaSeparatedString("bob,fred,john");
180         assertArrayContentEquals(names, namesExpected);
181 
182         // Test String with spaces
183         names = StringUtils.splitCommaSeparatedString("bob, fred, john");
184         assertArrayContentEquals(names, namesExpected);
185 
186         // Test empty String
187         names = StringUtils.splitCommaSeparatedString("");
188         assertEquals(names.length, 1);
189     }
190 
191     public void testCreateCommaSeperatedString()
192     {
193         String[] namesExpected = new String[]{"bob","fred","john"};
194         Collection nameList = Arrays.asList(namesExpected);
195 
196         String nameString = "bob,fred,john";
197 
198         String names;
199 
200         names = StringUtils.createCommaSeperatedString(nameList);
201         assertEquals(names, nameString);
202 
203         names = StringUtils.createCommaSeperatedString(null);
204         assertNull(names);
205 
206         names = StringUtils.createCommaSeperatedString(Collections.EMPTY_LIST);
207         assertEquals(names, "");
208     }
209 
210 
211 
212 
213     private void assertArrayContentEquals(String[] array1, String[] array2)
214     {
215         assertEquals(array1.length, array2.length);
216         for (int i = 0; i < array1.length; i++)
217         {
218             String s1 = array1[i];
219             String s2 = array1[i];
220             assertEquals(s1, s2);
221         }
222     }
223 }