1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package libcore.java.lang;
19
20import java.util.Arrays;
21import java.util.IllegalFormatException;
22import java.util.Locale;
23import java.util.regex.PatternSyntaxException;
24
25public class OldStringTest extends junit.framework.TestCase {
26
27    String hw1 = "HelloWorld";
28
29    String hw2 = "HelloWorld";
30
31    String hwlc = "helloworld";
32
33    String hwuc = "HELLOWORLD";
34
35    String comp11 = "Test String";
36
37    char[] buf = { 'W', 'o', 'r', 'l', 'd' };
38
39    public void test_charAtI() {
40        // Test for method char java.lang.String.charAt(int)
41        assertTrue("Incorrect character returned", hw1.charAt(5) == 'W'
42                && (hw1.charAt(1) != 'Z'));
43
44        String testString = "Test String";
45        try {
46            testString.charAt(testString.length());
47            fail("IndexOutOfBoundsException was not thrown.");
48        } catch(IndexOutOfBoundsException iobe) {
49            //expected
50        }
51
52        try {
53            testString.charAt(Integer.MAX_VALUE);
54            fail("IndexOutOfBoundsException was not thrown.");
55        } catch(IndexOutOfBoundsException iobe) {
56            //expected
57        }
58
59        try {
60            testString.charAt(-1);
61            fail("IndexOutOfBoundsException was not thrown.");
62        } catch(IndexOutOfBoundsException iobe) {
63            //expected
64        }
65    }
66
67    public void test_endsWithLjava_lang_String() {
68        assertFalse("Doesn't return false value.", hw1.endsWith("ld "));
69        assertFalse("Doesn't return false value.", hw1.endsWith(" "));
70        assertTrue("Returned incorrect value for empty string.", hw1.endsWith(""));
71        try {
72            hw1.endsWith(null);
73            fail("NullPointerException is not thrown.");
74        } catch(NullPointerException npe) {
75            //expected
76        }
77    }
78
79    public void test_equalsLjava_lang_Object() {
80        assertTrue("String not equal", hw1.equals(hw2) && !(hw1.equals(comp11)));
81    }
82
83    public void test_equalsIgnoreCaseLjava_lang_String() {
84        assertTrue("Returned false for equals strings.", hwlc
85                .equalsIgnoreCase(hwlc));
86
87        assertFalse("Returned true for different strings.", hwlc
88                .equalsIgnoreCase(hwuc + " "));
89    }
90
91    @SuppressWarnings("deprecation")
92    public void test_getBytesII$BI() {
93        try {
94            "Hello World".getBytes(-1, 1, null, 0);
95            fail("Expected IndexOutOfBoundsException");
96        } catch (IndexOutOfBoundsException expected) {
97        } catch (NullPointerException expected) {
98        }
99
100        try {
101            "Hello World".getBytes(6, 2, null, 0);
102            fail("IndexOutOfBoundsException was not thrown.");
103        } catch (IndexOutOfBoundsException expected) {
104        } catch (NullPointerException expected) {
105        }
106
107        try {
108            "Hello World".getBytes(2, 10, new byte[10], 4);
109            fail("IndexOutOfBoundsException was not thrown.");
110        } catch (IndexOutOfBoundsException expected) {
111        }
112    }
113
114    public void test_getCharsII$CI() {
115        try {
116            "Hello World".getChars(-1, 1, null, 0);
117            fail("Expected IndexOutOfBoundsException");
118        } catch (IndexOutOfBoundsException expected) {
119        } catch (NullPointerException expected) {
120        }
121
122        try {
123            "Hello World".getChars(6, 2, null, 0);
124            fail("IndexOutOfBoundsException was not thrown.");
125        } catch (IndexOutOfBoundsException expected) {
126        } catch (NullPointerException expected) {
127        }
128
129        try {
130            "Hello World".getChars(2, 10, new char[10], 4);
131            fail("IndexOutOfBoundsException was not thrown.");
132        } catch (IndexOutOfBoundsException expected) {
133        }
134    }
135
136    public void test_regionMatchesILjava_lang_StringII() {
137        assertFalse("Returned true for negative offset.", hw1.regionMatches(-1,
138                hw2, 2, 5));
139        assertFalse("Returned true for negative offset.", hw1.regionMatches(2,
140                hw2, -1, 5));
141        assertFalse("Returned true for toffset+len is greater than the length.",
142                hw1.regionMatches(5, hw2, 2, 6));
143        assertFalse("Returned true for ooffset+len is greater than the length.",
144                hw1.regionMatches(2, hw2, 5, 6));
145    }
146
147    public void test_regionMatchesZILjava_lang_StringII() {
148        String bogusString = "xxcedkedkleiorem lvvwr e''' 3r3r 23r";
149
150        assertFalse("Returned true for negative offset.", hw1.regionMatches(true,
151                -1, hw2, 2, 5));
152        assertFalse("Returned true for negative offset.", hw1.regionMatches(false,
153                2, hw2, -1, 5));
154        assertFalse("Returned true for toffset+len is greater than the length.",
155                hw1.regionMatches(true, 5, hw2, 2, 6));
156        assertFalse("Returned true for ooffset+len is greater than the length.",
157                hw1.regionMatches(false, 2, hw2, 5, 6));
158
159        assertTrue("identical regions failed comparison", hwuc.regionMatches(
160                true, 0, hwlc, 0, hwuc.length()));
161        assertFalse("non identical regions failed comparison", hwuc.regionMatches(
162                false, 0, hwlc, 0, hwuc.length()));
163    }
164
165    public void test_replaceCC() {
166        assertEquals("Returned incorrect string.", hw1, hw1.replace("!", "."));
167    }
168
169    public void test_replaceAll() {
170        String str = "!'123123.123HelloWorld!123123helloworld#";
171        String [] patterns = {"[hw\\p{Upper}]", "(o|l){2,}", "([\'\"]?)(\\d+)",
172                              "^!.*#$"};
173
174        String [] results = {"!\'123123.123?ello?orld!123123?ello?orld#",
175                             "!\'123123.123He?World!123123he?world#",
176                             "!?.?HelloWorld!?helloworld#", "?"};
177
178        for(int i = 0; i < patterns.length; i++) {
179            assertEquals("Returned incorrect string",
180                                  results[i], str.replaceAll(patterns[i], "?"));
181        }
182
183        try {
184            str.replaceAll("[abc*", "?");
185            fail("PatternSyntaxException is not thrown.");
186        } catch(PatternSyntaxException pse) {
187            //expected
188        }
189    }
190
191    public void test_replaceFirst() {
192        String str = "!'123123.123HelloWorld!123123helloworld#";
193        String [] patterns = {"[hw\\p{Upper}]", "(o|l){2,}", "([\'\"]?)(\\d+)",
194                              "^!.*#$"};
195
196        String [] results = {"!'123123.123?elloWorld!123123helloworld#",
197                             "!'123123.123He?World!123123helloworld#",
198                             "!?.123HelloWorld!123123helloworld#", "?"};
199
200        for(int i = 0; i < patterns.length; i++) {
201            assertEquals("Returned incorrect string",
202                                  results[i], str.replaceFirst(patterns[i], "?"));
203        }
204
205        try {
206            str.replaceFirst("[abc*", "?");
207            fail("PatternSyntaxException is not thrown.");
208        } catch(PatternSyntaxException pse) {
209            //expected
210        }
211    }
212
213    public void test_splitLString() {
214        String str = "!'123123.123HelloWorld!123123helloworld#";
215        String [] patterns = {"[!.1]", "(\\d+).*e(l+)o.*orld"};
216        String [][] results = {{"", "'","23", "23", "", "23HelloWorld", "", "23",
217                               "23helloworld#"},
218                               {"!'", "#"}};
219
220        for(int i = 0; i < patterns.length; i++) {
221            assertTrue("Returned incorrect string array for pattern: " +
222                patterns[i], Arrays.equals(results[i], str.split(patterns[i])));
223        }
224
225        try {
226            str.split("[a}");
227            fail("PatternSyntaxException is not thrown.");
228        } catch(PatternSyntaxException pse) {
229            //expected
230        }
231    }
232
233    public void test_splitLStringLint() {
234        String str = "!'123123.123HelloWorld!123123helloworld#";
235        String pattern = "[!.1]";
236        String [][] results = {{"", "'","23", "23.123HelloWorld!123123helloworld#"},
237                               {"", "'","23", "23", "", "23HelloWorld", "", "23",
238                               "23helloworld#"}};
239
240        assertTrue("Returned incorrect string array for limit 4",
241                Arrays.equals(results[0], str.split(pattern, 4)));
242        assertTrue("Returned incorrect string array for limit 9",
243                Arrays.equals(results[1], str.split(pattern, 9)));
244        assertTrue("Returned incorrect string array for limit 0",
245                Arrays.equals(results[1], str.split(pattern, 0)));
246        assertTrue("Returned incorrect string array for limit -1",
247                Arrays.equals(results[1], str.split(pattern, -1)));
248        assertTrue("Returned incorrect string array for limit 10",
249                Arrays.equals(results[1], str.split(pattern, 10)));
250        assertTrue("Returned incorrect string array for limit Integer.MAX_VALUE",
251                Arrays.equals(results[1], str.split(pattern, Integer.MAX_VALUE)));
252
253        try {
254            str.split("[a}", 0);
255            fail("PatternSyntaxException is not thrown.");
256        } catch(PatternSyntaxException pse) {
257            //expected
258        }
259    }
260
261    public void test_replaceLjava_langCharSequenceLjava_langCharSequence() {
262        assertEquals("Failed replace", "aaccdd", "aabbdd".replace(
263            new StringBuffer("bb"), "cc"));
264        assertEquals("Failed replace by bigger seq", "cccbccc", "aba".replace(
265            "a", "ccc"));
266        assertEquals("Failed replace by smaller seq", "$bba^",
267            "$aaaaa^".replace(new StringBuilder("aa"), "b"));
268
269        try {
270            "".replace((CharSequence) null, "123".subSequence(0, 1));
271            fail("NullPointerException is not thrown.");
272        } catch(NullPointerException npe) {
273            //expected
274        }
275
276        try {
277            "".replace("123".subSequence(0, 1), (CharSequence) null);
278            fail("NullPointerException is not thrown.");
279        } catch(NullPointerException npe) {
280            //expected
281        }
282    }
283
284    public void test_substringI() {
285        try {
286            hw1.substring(-1);
287            fail("IndexOutOfBoundsException was not thrown.");
288        } catch(IndexOutOfBoundsException ioobe) {
289            //expected
290        }
291
292        try {
293            hw1.substring(hw1.length() + 1);
294            fail("IndexOutOfBoundsException was not thrown.");
295        } catch(IndexOutOfBoundsException ioobe) {
296            //expected
297        }
298
299        try {
300            hw1.substring(Integer.MAX_VALUE);
301            fail("IndexOutOfBoundsException was not thrown.");
302        } catch(IndexOutOfBoundsException ioobe) {
303            //expected
304        }
305    }
306
307    public void test_substringII() {
308        try {
309            hw1.substring(-1, hw1.length());
310            fail("IndexOutOfBoundsException was not thrown.");
311        } catch(IndexOutOfBoundsException ioobe) {
312            //expected
313        }
314
315        try {
316            hw1.substring(Integer.MAX_VALUE, hw1.length());
317            fail("IndexOutOfBoundsException was not thrown.");
318        } catch(IndexOutOfBoundsException ioobe) {
319            //expected
320        }
321
322        try {
323            hw1.substring(0, Integer.MAX_VALUE);
324            fail("IndexOutOfBoundsException was not thrown.");
325        } catch(IndexOutOfBoundsException ioobe) {
326            //expected
327        }
328    }
329
330    public void test_subSequence() {
331        // Test for method java.lang.String java.lang.String.substring(int, int)
332        assertTrue("Incorrect substring returned", hw1.subSequence(0, 5).equals(
333                      "Hello") && (hw1.subSequence(5, 10).equals("World")));
334        assertTrue("not identical", hw1.subSequence(0, hw1.length()) == hw1);
335
336        try {
337            hw1.subSequence(0, Integer.MAX_VALUE);
338            fail("IndexOutOfBoundsException was not thrown.");
339        } catch(IndexOutOfBoundsException ioobe) {
340            //expected
341        }
342
343        try {
344            hw1.subSequence(Integer.MAX_VALUE, hw1.length());
345            fail("IndexOutOfBoundsException was not thrown.");
346        } catch(IndexOutOfBoundsException ioobe) {
347            //expected
348        }
349
350        try {
351            hw1.subSequence(-1, hw1.length());
352            fail("IndexOutOfBoundsException was not thrown.");
353        } catch(IndexOutOfBoundsException ioobe) {
354            //expected
355        }
356    }
357
358    public void test_trim() {
359        assertEquals("Incorrect string returned", hw1, "  HelloWorld  ".trim());
360        assertTrue("Incorrect string returned", "   ".trim().equals(""));
361    }
362
363    public void test_valueOf$C() {
364        assertEquals("Returned incorrect String",
365                "World", String.valueOf(buf));
366        assertEquals("Returned incorrect String",
367                "", String.valueOf(new char[]{}));
368        try {
369            String.valueOf(null);
370            fail("NullPointerException was not thrown.");
371        } catch(NullPointerException npe) {
372            //expected
373        }
374    }
375
376    public void test_valueOf$CII() {
377        char[] t = { 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd' };
378
379        try {
380            String.valueOf(t, 0, t.length + 1);
381            fail("IndexOutOfBoundsException was not thrown.");
382        } catch(IndexOutOfBoundsException ioobe) {
383            //expected
384        }
385
386        try {
387            String.valueOf(t, 0, -1);
388            fail("IndexOutOfBoundsException was not thrown.");
389        } catch(IndexOutOfBoundsException ioobe) {
390            //expected
391        }
392
393        try {
394            String.valueOf(t, 0, Integer.MAX_VALUE);
395            fail("IndexOutOfBoundsException was not thrown.");
396        } catch(IndexOutOfBoundsException ioobe) {
397            //expected
398        }
399    }
400
401    public void test_valueOfLjava_lang_Object() {
402        assertEquals("Incorrect value was returned for null.",
403                 "null", String.valueOf((Object) null));
404    }
405
406    @SuppressWarnings("boxing")
407    public void test_format() {
408        assertEquals("3 2 1 4 3 2 1", String.format(
409                "%3$d %2$d %1$d %4$d %3$d %2$d %1$d", 1, 2, 3, 4));
410
411        assertEquals("empty format", "", String.format("", 123, this));
412        try {
413            String.format(null);
414            fail("NPE is expected on null format");
415        } catch (NullPointerException ok){}
416
417        try {
418            String.format("%d%% of %s is 0x%x", "123");
419            fail("IllegalFormatException was not thrown.");
420        } catch(IllegalFormatException ife) {
421            //expected
422        }
423
424        try {
425            String.format("%tu", "123");
426            fail("IllegalFormatException was not thrown.");
427        } catch(IllegalFormatException ife) {
428            //expected
429        }
430
431    }
432
433    @SuppressWarnings("boxing")
434    public void test_format_Locale() {
435        Locale l = new Locale("UK");
436        assertEquals("13% of sum is 0x11",
437                String.format(l, "%d%% of %s is 0x%x", 13, "sum", 17));
438        assertEquals("empty format", "", String.format("", 123, this));
439        try {
440            String.format(l, null, "");
441            fail("NPE is expected on null format");
442        } catch (NullPointerException ok){}
443
444        try {
445            String.format(l, "%d", "test");
446            fail("IllegalFormatException wasn't thrown.");
447        } catch(IllegalFormatException ife) {
448            //expected
449        }
450    }
451
452    public void test_matches() {
453        String[] patterns = {
454                "(a|b)*abb",
455                "(1*2*3*4*)*567",
456                "(a|b|c|d)*aab",
457                "(1|2|3|4|5|6|7|8|9|0)(1|2|3|4|5|6|7|8|9|0)*",
458                "(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)*",
459                "(a|b)*(a|b)*A(a|b)*lice.*",
460                "(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)(a|b|c|d|e|f|g|h|"
461                        + "i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)*(1|2|3|4|5|6|7|8|9|0)*|while|for|struct|if|do",
462
463       };
464
465        String[] patternsInc = {
466                "(ac)*bb",
467                "(1)*567",
468                "(c)*ab",
469                "(|8|9|0)(1|2|7|8|9|0)*",
470                "(z)",
471                "(a)*A(b)*lice.",
472                "(a|b|c|d|e)",
473
474       };
475
476        String[][] strings = {
477                { "abb", "ababb", "abababbababb", "abababbababbabababbbbbabb" },
478                { "213567", "12324567", "1234567", "213213567",
479                        "21312312312567", "444444567" },
480                { "abcdaab", "aab", "abaab", "cdaab", "acbdadcbaab" },
481                { "213234567", "3458", "0987654", "7689546432", "0398576",
482                        "98432", "5" },
483                {
484                        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
485                        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
486                                + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" },
487                { "ababbaAabababblice", "ababbaAliceababab", "ababbAabliceaaa",
488                        "abbbAbbbliceaaa", "Alice" },
489                { "a123", "bnxnvgds156", "for", "while", "if", "struct" },
490                { "xy" }, { "xy" }, { "xcy" }
491
492        };
493
494        for (int i = 0; i < patterns.length; i++) {
495            for (int j = 0; j < strings[i].length; j++) {
496                assertTrue("Incorrect match: " + patterns[i] + " vs "
497                        + strings[i][j], strings[i][j].matches(patterns[i]));
498                assertFalse("" + i, strings[i][j].matches(patternsInc[i]));
499            }
500        }
501    }
502
503    public void test_indexOfI() {
504        assertEquals("Doesn't return -1 if there is no such character.", -1,
505                hw1.indexOf('q'));
506    }
507
508    public void test_indexOfII() {
509        assertEquals("Doesn't return -1 if there is no such character.", -1,
510                hw1.indexOf('H', 2));
511
512    }
513
514    public void test_indexOfLjava_lang_String() {
515        assertEquals("Doesn't return -1 for unknown string.",
516                -1, hw1.indexOf("Heo"));
517    }
518}
519