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 org.apache.harmony.tests.java.lang;
19
20public class StringBuffer2Test extends junit.framework.TestCase {
21
22    StringBuffer testBuffer;
23
24    /**
25     * java.lang.StringBuffer#StringBuffer()
26     */
27    public void test_Constructor() {
28        // Test for method java.lang.StringBuffer()
29        new StringBuffer();
30        assertTrue("Invalid buffer created", true);
31    }
32
33    /**
34     * java.lang.StringBuffer#StringBuffer(int)
35     */
36    public void test_ConstructorI() {
37        // Test for method java.lang.StringBuffer(int)
38        StringBuffer sb = new StringBuffer(8);
39        assertEquals("Newly constructed buffer is of incorrect length", 0, sb
40                .length());
41    }
42
43    /**
44     * java.lang.StringBuffer#StringBuffer(java.lang.String)
45     */
46    public void test_ConstructorLjava_lang_String() {
47        // Test for method java.lang.StringBuffer(java.lang.String)
48
49        StringBuffer sb = new StringBuffer("HelloWorld");
50
51        assertTrue("Invalid buffer created", sb.length() == 10
52                && (sb.toString().equals("HelloWorld")));
53
54        boolean pass = false;
55        try {
56            new StringBuffer(null);
57        } catch (NullPointerException e) {
58            pass = true;
59        }
60        assertTrue("Should throw NullPointerException", pass);
61    }
62
63    /**
64     * java.lang.StringBuffer#append(char[])
65     */
66    public void test_append$C() {
67        // Test for method java.lang.StringBuffer
68        // java.lang.StringBuffer.append(char [])
69        char buf[] = new char[4];
70        "char".getChars(0, 4, buf, 0);
71        testBuffer.append(buf);
72        assertEquals("Append of char[] failed",
73                "This is a test bufferchar", testBuffer.toString());
74    }
75
76    /**
77     * java.lang.StringBuffer#append(char[], int, int)
78     */
79    public void test_append$CII() {
80        // Test for method java.lang.StringBuffer
81        // java.lang.StringBuffer.append(char [], int, int)
82        StringBuffer sb = new StringBuffer();
83        char[] buf1 = { 'H', 'e', 'l', 'l', 'o' };
84        char[] buf2 = { 'W', 'o', 'r', 'l', 'd' };
85        sb.append(buf1, 0, buf1.length);
86        assertEquals("Buffer is invalid length after append", 5, sb.length());
87        sb.append(buf2, 0, buf2.length);
88        assertEquals("Buffer is invalid length after append", 10, sb.length());
89        assertTrue("Buffer contains invalid chars", (sb.toString()
90                .equals("HelloWorld")));
91    }
92
93    /**
94     * java.lang.StringBuffer#append(char)
95     */
96    public void test_appendC() {
97        // Test for method java.lang.StringBuffer
98        // java.lang.StringBuffer.append(char)
99        StringBuffer sb = new StringBuffer();
100        char buf1 = 'H';
101        char buf2 = 'W';
102        sb.append(buf1);
103        assertEquals("Buffer is invalid length after append", 1, sb.length());
104        sb.append(buf2);
105        assertEquals("Buffer is invalid length after append", 2, sb.length());
106        assertTrue("Buffer contains invalid chars",
107                (sb.toString().equals("HW")));
108    }
109
110    /**
111     * java.lang.StringBuffer#append(double)
112     */
113    public void test_appendD() {
114        // Test for method java.lang.StringBuffer
115        // java.lang.StringBuffer.append(double)
116        StringBuffer sb = new StringBuffer();
117        sb.append(Double.MAX_VALUE);
118        assertEquals("Buffer is invalid length after append", 22, sb.length());
119        assertEquals("Buffer contains invalid characters",
120                "1.7976931348623157E308", sb.toString());
121    }
122
123    /**
124     * java.lang.StringBuffer#append(float)
125     */
126    public void test_appendF() {
127        // Test for method java.lang.StringBuffer
128        // java.lang.StringBuffer.append(float)
129        StringBuffer sb = new StringBuffer();
130        final float floatNum = 900.87654F;
131        sb.append(floatNum);
132        assertTrue("Buffer is invalid length after append: " + sb.length(), sb
133                .length() == String.valueOf(floatNum).length());
134        assertTrue("Buffer contains invalid characters", sb.toString().equals(
135                String.valueOf(floatNum)));
136    }
137
138    /**
139     * java.lang.StringBuffer#append(int)
140     */
141    public void test_appendI() {
142        // Test for method java.lang.StringBuffer
143        // java.lang.StringBuffer.append(int)
144        StringBuffer sb = new StringBuffer();
145        sb.append(9000);
146        assertEquals("Buffer is invalid length after append", 4, sb.length());
147        sb.append(1000);
148        assertEquals("Buffer is invalid length after append", 8, sb.length());
149        assertEquals("Buffer contains invalid characters",
150                "90001000", sb.toString());
151    }
152
153    /**
154     * java.lang.StringBuffer#append(long)
155     */
156    public void test_appendJ() {
157        // Test for method java.lang.StringBuffer
158        // java.lang.StringBuffer.append(long)
159
160        StringBuffer sb = new StringBuffer();
161        long t = 927654321098L;
162        sb.append(t);
163        assertEquals("Buffer is of invlaid length", 12, sb.length());
164        assertEquals("Buffer contains invalid characters",
165                "927654321098", sb.toString());
166    }
167
168    /**
169     * java.lang.StringBuffer#append(java.lang.Object)
170     */
171    public void test_appendLjava_lang_Object() {
172        // Test for method java.lang.StringBuffer
173        // java.lang.StringBuffer.append(java.lang.Object)
174        StringBuffer sb = new StringBuffer();
175        Object obj1 = new Object();
176        Object obj2 = new Object();
177        sb.append(obj1);
178        sb.append(obj2);
179        assertTrue("Buffer contains invalid characters", sb.toString().equals(
180                obj1.toString() + obj2.toString()));
181    }
182
183    /**
184     * java.lang.StringBuffer#append(java.lang.String)
185     */
186    public void test_appendLjava_lang_String() {
187        // Test for method java.lang.StringBuffer
188        // java.lang.StringBuffer.append(java.lang.String)
189        StringBuffer sb = new StringBuffer();
190        String buf1 = "Hello";
191        String buf2 = "World";
192        sb.append(buf1);
193        assertEquals("Buffer is invalid length after append", 5, sb.length());
194        sb.append(buf2);
195        assertEquals("Buffer is invalid length after append", 10, sb.length());
196        assertTrue("Buffer contains invalid chars", (sb.toString()
197                .equals("HelloWorld")));
198    }
199
200    /**
201     * java.lang.StringBuffer#append(boolean)
202     */
203    public void test_appendZ() {
204        // Test for method java.lang.StringBuffer
205        // java.lang.StringBuffer.append(boolean)
206        StringBuffer sb = new StringBuffer();
207        sb.append(false);
208        assertEquals("Buffer is invalid length after append", 5, sb.length());
209        sb.append(true);
210        assertEquals("Buffer is invalid length after append", 9, sb.length());
211        assertTrue("Buffer is invalid length after append", (sb.toString()
212                .equals("falsetrue")));
213    }
214
215    /**
216     * java.lang.StringBuffer#capacity()
217     */
218    public void test_capacity() {
219        // Test for method int java.lang.StringBuffer.capacity()
220        StringBuffer sb = new StringBuffer(10);
221        assertEquals("Returned incorrect capacity", 10, sb.capacity());
222        sb.ensureCapacity(100);
223        assertTrue("Returned incorrect capacity", sb.capacity() >= 100);
224    }
225
226    /**
227     * java.lang.StringBuffer#charAt(int)
228     */
229    public void test_charAtI() {
230        // Test for method char java.lang.StringBuffer.charAt(int)
231        assertEquals("Returned incorrect char", 's', testBuffer.charAt(3));
232
233        // Test for StringIndexOutOfBoundsException
234        boolean exception = false;
235        try {
236            testBuffer.charAt(-1);
237        } catch (StringIndexOutOfBoundsException e) {
238            exception = true;
239        } catch (ArrayIndexOutOfBoundsException e) {
240        }
241        assertTrue("Should throw StringIndexOutOfBoundsException", exception);
242    }
243
244    /**
245     * java.lang.StringBuffer#delete(int, int)
246     */
247    public void test_deleteII() {
248        // Test for method java.lang.StringBuffer
249        // java.lang.StringBuffer.delete(int, int)
250        testBuffer.delete(7, 7);
251        assertEquals("Deleted chars when start == end", "This is a test buffer", testBuffer.toString()
252        );
253        testBuffer.delete(4, 14);
254        assertEquals("Deleted incorrect chars",
255                "This buffer", testBuffer.toString());
256
257        testBuffer = new StringBuffer("This is a test buffer");
258        String sharedStr = testBuffer.toString();
259        testBuffer.delete(0, testBuffer.length());
260        assertEquals("Didn't clone shared buffer", "This is a test buffer", sharedStr
261        );
262        assertTrue("Deleted incorrect chars", testBuffer.toString().equals(""));
263        testBuffer.append("more stuff");
264        assertEquals("Didn't clone shared buffer 2", "This is a test buffer", sharedStr
265        );
266        assertEquals("Wrong contents", "more stuff", testBuffer.toString());
267        try {
268            testBuffer.delete(-5, 2);
269        } catch (IndexOutOfBoundsException e) {
270        }
271        assertEquals("Wrong contents 2",
272                "more stuff", testBuffer.toString());
273    }
274
275    /**
276     * java.lang.StringBuffer#deleteCharAt(int)
277     */
278    public void test_deleteCharAtI() {
279        // Test for method java.lang.StringBuffer
280        // java.lang.StringBuffer.deleteCharAt(int)
281        testBuffer.deleteCharAt(3);
282        assertEquals("Deleted incorrect char",
283                "Thi is a test buffer", testBuffer.toString());
284    }
285
286    /**
287     * java.lang.StringBuffer#ensureCapacity(int)
288     */
289    public void test_ensureCapacityI() {
290        // Test for method void java.lang.StringBuffer.ensureCapacity(int)
291        StringBuffer sb = new StringBuffer(10);
292
293        sb.ensureCapacity(100);
294        assertTrue("Failed to increase capacity", sb.capacity() >= 100);
295    }
296
297    /**
298     * java.lang.StringBuffer#getChars(int, int, char[], int)
299     */
300    public void test_getCharsII$CI() {
301        // Test for method void java.lang.StringBuffer.getChars(int, int, char
302        // [], int)
303
304        char[] buf = new char[10];
305        testBuffer.getChars(4, 8, buf, 2);
306        assertTrue("Returned incorrect chars", new String(buf, 2, 4)
307                .equals(testBuffer.toString().substring(4, 8)));
308
309        boolean exception = false;
310        try {
311            StringBuffer buf2 = new StringBuffer("");
312            buf2.getChars(0, 0, new char[5], 2);
313        } catch (IndexOutOfBoundsException e) {
314            exception = true;
315        }
316        assertTrue("did not expect IndexOutOfBoundsException", !exception);
317    }
318
319    /**
320     * java.lang.StringBuffer#insert(int, char[])
321     */
322    public void test_insertI$C() {
323        // Test for method java.lang.StringBuffer
324        // java.lang.StringBuffer.insert(int, char [])
325        char buf[] = new char[4];
326        "char".getChars(0, 4, buf, 0);
327        testBuffer.insert(15, buf);
328        assertEquals("Insert test failed",
329                "This is a test charbuffer", testBuffer.toString());
330
331        boolean exception = false;
332        StringBuffer buf1 = new StringBuffer("abcd");
333        try {
334            buf1.insert(-1, (char[]) null);
335        } catch (StringIndexOutOfBoundsException e) {
336            exception = true;
337        } catch (NullPointerException e) {
338        }
339        assertTrue("Should throw StringIndexOutOfBoundsException", exception);
340    }
341
342    /**
343     * java.lang.StringBuffer#insert(int, char[], int, int)
344     */
345    public void test_insertI$CII() {
346        // Test for method java.lang.StringBuffer
347        // java.lang.StringBuffer.insert(int, char [], int, int)
348        char[] c = new char[] { 'n', 'o', 't', ' ' };
349        testBuffer.insert(8, c, 0, 4);
350        assertEquals("This is not a test buffer", testBuffer.toString());
351
352        StringBuffer buf1 = new StringBuffer("abcd");
353        try {
354            buf1.insert(-1, (char[]) null, 0, 0);
355            fail();
356        } catch (NullPointerException expected) {
357        } catch (StringIndexOutOfBoundsException expected) {
358        }
359
360        try {
361            testBuffer.insert(testBuffer.length() - 1, c, -1, 1);
362        } catch (StringIndexOutOfBoundsException e) {
363            //expected
364        }
365
366    }
367
368    /**
369     * java.lang.StringBuffer#insert(int, char)
370     */
371    public void test_insertIC() {
372        // Test for method java.lang.StringBuffer
373        // java.lang.StringBuffer.insert(int, char)
374        testBuffer.insert(15, 'T');
375        assertEquals("Insert test failed",
376                "This is a test Tbuffer", testBuffer.toString());
377    }
378
379    /**
380     * java.lang.StringBuffer#insert(int, double)
381     */
382    public void test_insertID() {
383        // Test for method java.lang.StringBuffer
384        // java.lang.StringBuffer.insert(int, double)
385        testBuffer.insert(15, Double.MAX_VALUE);
386        assertTrue("Insert test failed", testBuffer.toString().equals(
387                "This is a test " + Double.MAX_VALUE + "buffer"));
388    }
389
390    /**
391     * java.lang.StringBuffer#insert(int, float)
392     */
393    public void test_insertIF() {
394        // Test for method java.lang.StringBuffer
395        // java.lang.StringBuffer.insert(int, float)
396        testBuffer.insert(15, Float.MAX_VALUE);
397        String testBufferString = testBuffer.toString();
398        String expectedResult = "This is a test "
399                + String.valueOf(Float.MAX_VALUE) + "buffer";
400        assertTrue("Insert test failed, got: " + "\'" + testBufferString + "\'"
401                + " but wanted: " + "\'" + expectedResult + "\'",
402                testBufferString.equals(expectedResult));
403    }
404
405    /**
406     * java.lang.StringBuffer#insert(int, int)
407     */
408    public void test_insertII() {
409        // Test for method java.lang.StringBuffer
410        // java.lang.StringBuffer.insert(int, int)
411        testBuffer.insert(15, 100);
412        assertEquals("Insert test failed",
413                "This is a test 100buffer", testBuffer.toString());
414    }
415
416    /**
417     * java.lang.StringBuffer#insert(int, long)
418     */
419    public void test_insertIJ() {
420        // Test for method java.lang.StringBuffer
421        // java.lang.StringBuffer.insert(int, long)
422        testBuffer.insert(15, 88888888888888888L);
423        assertEquals("Insert test failed",
424                "This is a test 88888888888888888buffer", testBuffer.toString());
425    }
426
427    /**
428     * java.lang.StringBuffer#insert(int, java.lang.Object)
429     */
430    public void test_insertILjava_lang_Object() {
431        // Test for method java.lang.StringBuffer
432        // java.lang.StringBuffer.insert(int, java.lang.Object)
433        Object obj1 = new Object();
434        testBuffer.insert(15, obj1);
435        assertTrue("Insert test failed", testBuffer.toString().equals(
436                "This is a test " + obj1.toString() + "buffer"));
437    }
438
439    /**
440     * java.lang.StringBuffer#insert(int, java.lang.String)
441     */
442    public void test_insertILjava_lang_String() {
443        // Test for method java.lang.StringBuffer
444        // java.lang.StringBuffer.insert(int, java.lang.String)
445
446        testBuffer.insert(15, "STRING ");
447        assertEquals("Insert test failed",
448                "This is a test STRING buffer", testBuffer.toString());
449    }
450
451    /**
452     * java.lang.StringBuffer#insert(int, boolean)
453     */
454    public void test_insertIZ() {
455        // Test for method java.lang.StringBuffer
456        // java.lang.StringBuffer.insert(int, boolean)
457        testBuffer.insert(15, true);
458        assertEquals("Insert test failed",
459                "This is a test truebuffer", testBuffer.toString());
460    }
461
462    /**
463     * java.lang.StringBuffer#length()
464     */
465    public void test_length() {
466        // Test for method int java.lang.StringBuffer.length()
467        assertEquals("Incorrect length returned", 21, testBuffer.length());
468    }
469
470    /**
471     * java.lang.StringBuffer#replace(int, int, java.lang.String)
472     */
473    public void test_replaceIILjava_lang_String() {
474        // Test for method java.lang.StringBuffer
475        // java.lang.StringBuffer.replace(int, int, java.lang.String)
476        testBuffer.replace(5, 9, "is a replaced");
477        assertTrue("Replace failed, wanted: " + "\'"
478                + "This is a replaced test buffer" + "\'" + " but got: " + "\'"
479                + testBuffer.toString() + "\'", testBuffer.toString().equals(
480                "This is a replaced test buffer"));
481        assertEquals("insert1", "text", new StringBuffer().replace(0, 0, "text")
482                .toString());
483        assertEquals("insert2", "123text", new StringBuffer("123").replace(3, 3, "text")
484                .toString());
485        assertEquals("insert2", "1text23", new StringBuffer("123").replace(1, 1, "text")
486                .toString());
487    }
488
489    private String writeString(String in) {
490        StringBuffer result = new StringBuffer();
491        result.append("\"");
492        for (int i = 0; i < in.length(); i++) {
493            result.append(" 0x" + Integer.toHexString(in.charAt(i)));
494        }
495        result.append("\"");
496        return result.toString();
497    }
498
499    private void reverseTest(String id, String org, String rev, String back) {
500        // create non-shared StringBuffer
501        StringBuffer sb = new StringBuffer(org);
502        sb.reverse();
503        String reversed = sb.toString();
504        assertTrue("reversed surrogate " + id + ": " + writeString(reversed),
505                reversed.equals(rev));
506        // create non-shared StringBuffer
507        sb = new StringBuffer(reversed);
508        sb.reverse();
509        reversed = sb.toString();
510        assertTrue("reversed surrogate " + id + "a: " + writeString(reversed),
511                reversed.equals(back));
512
513        // test algorithm when StringBuffer is shared
514        sb = new StringBuffer(org);
515        String copy = sb.toString();
516        assertEquals(org, copy);
517        sb.reverse();
518        reversed = sb.toString();
519        assertTrue("reversed surrogate " + id + ": " + writeString(reversed),
520                reversed.equals(rev));
521        sb = new StringBuffer(reversed);
522        copy = sb.toString();
523        assertEquals(rev, copy);
524        sb.reverse();
525        reversed = sb.toString();
526        assertTrue("reversed surrogate " + id + "a: " + writeString(reversed),
527                reversed.equals(back));
528
529    }
530
531    /**
532     * java.lang.StringBuffer#reverse()
533     */
534    public void test_reverse() {
535        // Test for method java.lang.StringBuffer
536        // java.lang.StringBuffer.reverse()
537        String org;
538        org = "a";
539        reverseTest("0", org, org, org);
540
541        org = "ab";
542        reverseTest("1", org, "ba", org);
543
544        org = "abcdef";
545        reverseTest("2", org, "fedcba", org);
546
547        org = "abcdefg";
548        reverseTest("3", org, "gfedcba", org);
549
550    }
551
552    /**
553     * java.lang.StringBuffer#setCharAt(int, char)
554     */
555    public void test_setCharAtIC() {
556        // Test for method void java.lang.StringBuffer.setCharAt(int, char)
557        StringBuffer s = new StringBuffer("HelloWorld");
558        s.setCharAt(4, 'Z');
559        assertEquals("Returned incorrect char", 'Z', s.charAt(4));
560    }
561
562    /**
563     * java.lang.StringBuffer#setLength(int)
564     */
565    public void test_setLengthI() {
566        // Test for method void java.lang.StringBuffer.setLength(int)
567        testBuffer.setLength(1000);
568        assertEquals("Failed to increase length", 1000, testBuffer.length());
569        assertTrue("Increase in length trashed buffer", testBuffer.toString()
570                .startsWith("This is a test buffer"));
571        testBuffer.setLength(2);
572        assertEquals("Failed to decrease length", 2, testBuffer.length());
573        assertEquals("Decrease in length failed",
574                "Th", testBuffer.toString());
575    }
576
577    /**
578     * java.lang.StringBuffer#substring(int)
579     */
580    public void test_substringI() {
581        // Test for method java.lang.String
582        // java.lang.StringBuffer.substring(int)
583        assertEquals("Returned incorrect substring", "is a test buffer", testBuffer.substring(5)
584        );
585    }
586
587    /**
588     * java.lang.StringBuffer#substring(int, int)
589     */
590    public void test_substringII() {
591        // Test for method java.lang.String
592        // java.lang.StringBuffer.substring(int, int)
593        assertEquals("Returned incorrect substring", "is", testBuffer.substring(5, 7)
594        );
595    }
596
597    /**
598     * java.lang.StringBuffer#toString()
599     */
600    public void test_toString() {
601        // Test for method java.lang.String java.lang.StringBuffer.toString()
602        assertEquals("Incorrect string value returned", "This is a test buffer", testBuffer.toString()
603        );
604    }
605
606    @Override
607    protected void setUp() {
608        testBuffer = new StringBuffer("This is a test buffer");
609    }
610}
611