/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. */ package org.apache.harmony.tests.java.lang; import java.io.Serializable; import junit.framework.TestCase; import org.apache.harmony.testframework.serialization.SerializationTest; import org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert; public class StringBufferTest extends TestCase { /** * java.lang.StringBuffer#setLength(int) */ public void test_setLengthI() { // Regression for HARMONY-90 StringBuffer buffer = new StringBuffer("abcde"); try { buffer.setLength(-1); fail("Assert 0: IndexOutOfBoundsException must be thrown"); } catch (IndexOutOfBoundsException e) { // expected } assertEquals("abcde", buffer.toString()); buffer.setLength(1); buffer.append('f'); assertEquals("af", buffer.toString()); buffer = new StringBuffer("abcde"); assertEquals("cde", buffer.substring(2)); buffer.setLength(3); buffer.append('f'); assertEquals("abcf", buffer.toString()); buffer = new StringBuffer("abcde"); buffer.setLength(2); try { buffer.charAt(3); fail("should throw IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException e) { // Expected } buffer = new StringBuffer(); buffer.append("abcdefg"); buffer.setLength(2); buffer.setLength(5); for (int i = 2; i < 5; i++) { assertEquals(0, buffer.charAt(i)); } buffer = new StringBuffer(); buffer.append("abcdefg"); buffer.delete(2, 4); buffer.setLength(7); assertEquals('a', buffer.charAt(0)); assertEquals('b', buffer.charAt(1)); assertEquals('e', buffer.charAt(2)); assertEquals('f', buffer.charAt(3)); assertEquals('g', buffer.charAt(4)); for (int i = 5; i < 7; i++) { assertEquals(0, buffer.charAt(i)); } buffer = new StringBuffer(); buffer.append("abcdefg"); buffer.replace(2, 5, "z"); buffer.setLength(7); for (int i = 5; i < 7; i++) { assertEquals(0, buffer.charAt(i)); } } /** * java.lang.StringBuffer#toString() */ public void test_toString() throws Exception { StringBuffer buffer = new StringBuffer(); assertEquals("", buffer.toString()); buffer.append("abcde"); assertEquals("abcde", buffer.toString()); buffer.setLength(1000); byte[] bytes = buffer.toString().getBytes("GB18030"); for (int i = 5; i < bytes.length; i++) { assertEquals(0, bytes[i]); } buffer.setLength(5); buffer.append("fghij"); assertEquals("abcdefghij", buffer.toString()); } /** * StringBuffer.StringBuffer(CharSequence); */ public void test_constructorLjava_lang_CharSequence() { try { new StringBuffer((CharSequence) null); fail("Assert 0: NPE must be thrown."); } catch (NullPointerException e) { } assertEquals("Assert 1: must equal 'abc'.", "abc", new StringBuffer((CharSequence) "abc").toString()); } public void test_trimToSize() { StringBuffer buffer = new StringBuffer(25); buffer.append("abc"); int origCapacity = buffer.capacity(); buffer.trimToSize(); int trimCapacity = buffer.capacity(); assertTrue("Assert 0: capacity must be smaller.", trimCapacity < origCapacity); assertEquals("Assert 1: length must still be 3", 3, buffer.length()); assertEquals("Assert 2: value must still be 'abc'.", "abc", buffer.toString()); } /** * java.lang.StringBuffer.append(CharSequence) */ public void test_appendLjava_lang_CharSequence() { StringBuffer sb = new StringBuffer(); assertSame(sb, sb.append((CharSequence) "ab")); assertEquals("ab", sb.toString()); sb.setLength(0); assertSame(sb, sb.append((CharSequence) "cd")); assertEquals("cd", sb.toString()); sb.setLength(0); assertSame(sb, sb.append((CharSequence) null)); assertEquals("null", sb.toString()); } /** * java.lang.StringBuffer.append(CharSequence, int, int) */ @SuppressWarnings("cast") public void test_appendLjava_lang_CharSequenceII() { StringBuffer sb = new StringBuffer(); assertSame(sb, sb.append((CharSequence) "ab", 0, 2)); assertEquals("ab", sb.toString()); sb.setLength(0); assertSame(sb, sb.append((CharSequence) "cd", 0, 2)); assertEquals("cd", sb.toString()); sb.setLength(0); assertSame(sb, sb.append((CharSequence) "abcd", 0, 2)); assertEquals("ab", sb.toString()); sb.setLength(0); assertSame(sb, sb.append((CharSequence) "abcd", 2, 4)); assertEquals("cd", sb.toString()); sb.setLength(0); assertSame(sb, sb.append((CharSequence) null, 0, 2)); assertEquals("nu", sb.toString()); } /** * java.lang.StringBuffer.append(char[], int, int) */ public void test_append$CII_2() { StringBuffer obj = new StringBuffer(); try { obj.append(new char[0], -1, -1); fail("ArrayIndexOutOfBoundsException expected"); } catch (ArrayIndexOutOfBoundsException e) { // expected } } /** * java.lang.StringBuffer.append(char[], int, int) */ public void test_append$CII_3() throws Exception { StringBuffer obj = new StringBuffer(); try { obj.append((char[]) null, -1, -1); fail("NullPointerException expected"); } catch (NullPointerException e) { // expected } } /** * java.lang.StringBuffer.insert(int, CharSequence) */ public void test_insertILjava_lang_CharSequence() { final String fixture = "0000"; StringBuffer sb = new StringBuffer(fixture); assertSame(sb, sb.insert(0, (CharSequence) "ab")); assertEquals("ab0000", sb.toString()); assertEquals(6, sb.length()); sb = new StringBuffer(fixture); assertSame(sb, sb.insert(2, (CharSequence) "ab")); assertEquals("00ab00", sb.toString()); assertEquals(6, sb.length()); sb = new StringBuffer(fixture); assertSame(sb, sb.insert(4, (CharSequence) "ab")); assertEquals("0000ab", sb.toString()); assertEquals(6, sb.length()); sb = new StringBuffer(fixture); assertSame(sb, sb.insert(4, (CharSequence) null)); assertEquals("0000null", sb.toString()); assertEquals(8, sb.length()); try { sb = new StringBuffer(fixture); sb.insert(-1, (CharSequence) "ab"); fail("no IOOBE, negative index"); } catch (IndexOutOfBoundsException e) { // Expected } try { sb = new StringBuffer(fixture); sb.insert(5, (CharSequence) "ab"); fail("no IOOBE, index too large index"); } catch (IndexOutOfBoundsException e) { // Expected } } /** * java.lang.StringBuffer.insert(int, CharSequence, int, int) */ @SuppressWarnings("cast") public void test_insertILjava_lang_CharSequenceII() { final String fixture = "0000"; StringBuffer sb = new StringBuffer(fixture); assertSame(sb, sb.insert(0, (CharSequence) "ab", 0, 2)); assertEquals("ab0000", sb.toString()); assertEquals(6, sb.length()); sb = new StringBuffer(fixture); assertSame(sb, sb.insert(0, (CharSequence) "ab", 0, 1)); assertEquals("a0000", sb.toString()); assertEquals(5, sb.length()); sb = new StringBuffer(fixture); assertSame(sb, sb.insert(2, (CharSequence) "ab", 0, 2)); assertEquals("00ab00", sb.toString()); assertEquals(6, sb.length()); sb = new StringBuffer(fixture); assertSame(sb, sb.insert(2, (CharSequence) "ab", 0, 1)); assertEquals("00a00", sb.toString()); assertEquals(5, sb.length()); sb = new StringBuffer(fixture); assertSame(sb, sb.insert(4, (CharSequence) "ab", 0, 2)); assertEquals("0000ab", sb.toString()); assertEquals(6, sb.length()); sb = new StringBuffer(fixture); assertSame(sb, sb.insert(4, (CharSequence) "ab", 0, 1)); assertEquals("0000a", sb.toString()); assertEquals(5, sb.length()); sb = new StringBuffer(fixture); assertSame(sb, sb.insert(4, (CharSequence) null, 0, 2)); assertEquals("0000nu", sb.toString()); assertEquals(6, sb.length()); try { sb = new StringBuffer(fixture); sb.insert(-1, (CharSequence) "ab", 0, 2); fail("no IOOBE, negative index"); } catch (IndexOutOfBoundsException e) { // Expected } try { sb = new StringBuffer(fixture); sb.insert(5, (CharSequence) "ab", 0, 2); fail("no IOOBE, index too large index"); } catch (IndexOutOfBoundsException e) { // Expected } try { sb = new StringBuffer(fixture); sb.insert(5, (CharSequence) "ab", -1, 2); fail("no IOOBE, negative offset"); } catch (IndexOutOfBoundsException e) { // Expected } try { sb = new StringBuffer(fixture); sb.insert(5, new char[] { 'a', 'b' }, 0, -1); fail("no IOOBE, negative length"); } catch (IndexOutOfBoundsException e) { // Expected } try { sb = new StringBuffer(fixture); sb.insert(5, new char[] { 'a', 'b' }, 0, 3); fail("no IOOBE, too long"); } catch (IndexOutOfBoundsException e) { // Expected } } /** * java.lang.StringBuffer.insert(int, char) */ public void test_insertIC() { StringBuffer obj = new StringBuffer(); try { obj.insert(-1, ' '); fail("ArrayIndexOutOfBoundsException expected"); } catch (ArrayIndexOutOfBoundsException e) { // expected } } /** * java.lang.StringBuffer.appendCodePoint(int)' */ public void test_appendCodePointI() { StringBuffer sb = new StringBuffer(); sb.appendCodePoint(0x10000); assertEquals("\uD800\uDC00", sb.toString()); sb.append("fixture"); assertEquals("\uD800\uDC00fixture", sb.toString()); sb.appendCodePoint(0x00010FFFF); assertEquals("\uD800\uDC00fixture\uDBFF\uDFFF", sb.toString()); } /** * java.lang.StringBuffer.codePointAt(int) */ public void test_codePointAtI() { StringBuffer sb = new StringBuffer("abc"); assertEquals('a', sb.codePointAt(0)); assertEquals('b', sb.codePointAt(1)); assertEquals('c', sb.codePointAt(2)); sb = new StringBuffer("\uD800\uDC00"); assertEquals(0x10000, sb.codePointAt(0)); assertEquals('\uDC00', sb.codePointAt(1)); try { sb.codePointAt(-1); fail("No IOOBE on negative index."); } catch (IndexOutOfBoundsException e) { } try { sb.codePointAt(sb.length()); fail("No IOOBE on index equal to length."); } catch (IndexOutOfBoundsException e) { } try { sb.codePointAt(sb.length() + 1); fail("No IOOBE on index greater than length."); } catch (IndexOutOfBoundsException e) { } } /** * java.lang.StringBuffer.codePointBefore(int) */ public void test_codePointBeforeI() { StringBuffer sb = new StringBuffer("abc"); assertEquals('a', sb.codePointBefore(1)); assertEquals('b', sb.codePointBefore(2)); assertEquals('c', sb.codePointBefore(3)); sb = new StringBuffer("\uD800\uDC00"); assertEquals(0x10000, sb.codePointBefore(2)); assertEquals('\uD800', sb.codePointBefore(1)); try { sb.codePointBefore(0); fail("No IOOBE on zero index."); } catch (IndexOutOfBoundsException e) { } try { sb.codePointBefore(-1); fail("No IOOBE on negative index."); } catch (IndexOutOfBoundsException e) { } try { sb.codePointBefore(sb.length() + 1); fail("No IOOBE on index greater than length."); } catch (IndexOutOfBoundsException e) { } } /** * java.lang.StringBuffer.codePointCount(int, int) */ public void test_codePointCountII() { assertEquals(1, new StringBuffer("\uD800\uDC00").codePointCount(0, 2)); assertEquals(1, new StringBuffer("\uD800\uDC01").codePointCount(0, 2)); assertEquals(1, new StringBuffer("\uD801\uDC01").codePointCount(0, 2)); assertEquals(1, new StringBuffer("\uDBFF\uDFFF").codePointCount(0, 2)); assertEquals(3, new StringBuffer("a\uD800\uDC00b").codePointCount(0, 4)); assertEquals(4, new StringBuffer("a\uD800\uDC00b\uD800").codePointCount(0, 5)); StringBuffer sb = new StringBuffer("abc"); try { sb.codePointCount(-1, 2); fail("No IOOBE for negative begin index."); } catch (IndexOutOfBoundsException e) { } try { sb.codePointCount(0, 4); fail("No IOOBE for end index that's too large."); } catch (IndexOutOfBoundsException e) { } try { sb.codePointCount(3, 2); fail("No IOOBE for begin index larger than end index."); } catch (IndexOutOfBoundsException e) { } } /** * java.lang.StringBuffer.getChars(int, int, char[], int) */ public void test_getCharsII$CI() { StringBuffer obj = new StringBuffer(); try { obj.getChars(0, 0, new char[0], -1); fail("ArrayIndexOutOfBoundsException expected"); } catch (ArrayIndexOutOfBoundsException e) { // expected } } /** * java.lang.StringBuffer.offsetByCodePoints(int, int)' */ public void test_offsetByCodePointsII() { int result = new StringBuffer("a\uD800\uDC00b").offsetByCodePoints(0, 2); assertEquals(3, result); result = new StringBuffer("abcd").offsetByCodePoints(3, -1); assertEquals(2, result); result = new StringBuffer("a\uD800\uDC00b").offsetByCodePoints(0, 3); assertEquals(4, result); result = new StringBuffer("a\uD800\uDC00b").offsetByCodePoints(3, -1); assertEquals(1, result); result = new StringBuffer("a\uD800\uDC00b").offsetByCodePoints(3, 0); assertEquals(3, result); result = new StringBuffer("\uD800\uDC00bc").offsetByCodePoints(3, 0); assertEquals(3, result); result = new StringBuffer("a\uDC00bc").offsetByCodePoints(3, -1); assertEquals(2, result); result = new StringBuffer("a\uD800bc").offsetByCodePoints(3, -1); assertEquals(2, result); StringBuffer sb = new StringBuffer("abc"); try { sb.offsetByCodePoints(-1, 1); fail("No IOOBE for negative index."); } catch (IndexOutOfBoundsException e) { } try { sb.offsetByCodePoints(0, 4); fail("No IOOBE for offset that's too large."); } catch (IndexOutOfBoundsException e) { } try { sb.offsetByCodePoints(3, -4); fail("No IOOBE for offset that's too small."); } catch (IndexOutOfBoundsException e) { } try { sb.offsetByCodePoints(3, 1); fail("No IOOBE for index that's too large."); } catch (IndexOutOfBoundsException e) { } try { sb.offsetByCodePoints(4, -1); fail("No IOOBE for index that's too large."); } catch (IndexOutOfBoundsException e) { } } /** * {@link java.lang.StringBuffer#indexOf(String, int)} */ @SuppressWarnings("nls") public void test_IndexOfStringInt() { final String fixture = "0123456789"; StringBuffer sb = new StringBuffer(fixture); assertEquals(0, sb.indexOf("0")); assertEquals(0, sb.indexOf("012")); assertEquals(-1, sb.indexOf("02")); assertEquals(8, sb.indexOf("89")); assertEquals(0, sb.indexOf("0"), 0); assertEquals(0, sb.indexOf("012"), 0); assertEquals(-1, sb.indexOf("02"), 0); assertEquals(8, sb.indexOf("89"), 0); assertEquals(-1, sb.indexOf("0"), 5); assertEquals(-1, sb.indexOf("012"), 5); assertEquals(-1, sb.indexOf("02"), 0); assertEquals(8, sb.indexOf("89"), 5); try { sb.indexOf(null, 0); fail("Should throw a NullPointerExceptionE"); } catch (NullPointerException e) { // Expected } } /** * {@link java.lang.StringBuffer#lastIndexOf(String, int)} */ @SuppressWarnings("nls") public void test_lastIndexOfLjava_lang_StringI() { final String fixture = "0123456789"; StringBuffer sb = new StringBuffer(fixture); assertEquals(0, sb.lastIndexOf("0")); assertEquals(0, sb.lastIndexOf("012")); assertEquals(-1, sb.lastIndexOf("02")); assertEquals(8, sb.lastIndexOf("89")); assertEquals(0, sb.lastIndexOf("0"), 0); assertEquals(0, sb.lastIndexOf("012"), 0); assertEquals(-1, sb.lastIndexOf("02"), 0); assertEquals(8, sb.lastIndexOf("89"), 0); assertEquals(-1, sb.lastIndexOf("0"), 5); assertEquals(-1, sb.lastIndexOf("012"), 5); assertEquals(-1, sb.lastIndexOf("02"), 0); assertEquals(8, sb.lastIndexOf("89"), 5); try { sb.lastIndexOf(null, 0); fail("Should throw a NullPointerException"); } catch (NullPointerException e) { // Expected } } // comparator for StringBuffer objects private static final SerializableAssert STRING_BUFFER_COMPARATOR = new SerializableAssert() { public void assertDeserialized(Serializable initial, Serializable deserialized) { StringBuffer init = (StringBuffer) initial; StringBuffer desr = (StringBuffer) deserialized; // serializable fields are: 'count', 'shared', 'value' // serialization of 'shared' is not verified // 'count' + 'value' should result in required string assertEquals("toString", init.toString(), desr.toString()); } }; /** * serialization/deserialization. */ public void testSerializationSelf() throws Exception { SerializationTest.verifySelf(new StringBuffer("0123456789"), STRING_BUFFER_COMPARATOR); } /** * serialization/deserialization compatibility with RI. */ public void testSerializationCompatibility() throws Exception { SerializationTest.verifyGolden(this, new StringBuffer("0123456789"), STRING_BUFFER_COMPARATOR); } }