blob: 8ab87fa658d6c0fdefd2b79ebd845de64e86f8f2 [file] [log] [blame]
/*
* 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.
*/
#include "StringBuilderTest.h"
#include <decaf/lang/String.h>
#include <decaf/lang/StringBuilder.h>
#include <decaf/lang/StringBuffer.h>
#include <decaf/lang/Short.h>
#include <decaf/lang/Integer.h>
#include <decaf/lang/Long.h>
#include <decaf/lang/Float.h>
#include <decaf/lang/Double.h>
#include <decaf/lang/exceptions/IndexOutOfBoundsException.h>
#include <decaf/lang/exceptions/NegativeArraySizeException.h>
#include <decaf/lang/exceptions/NullPointerException.h>
#include <decaf/lang/exceptions/StringIndexOutOfBoundsException.h>
using namespace std;
using namespace decaf;
using namespace decaf::lang;
using namespace decaf::lang::exceptions;
////////////////////////////////////////////////////////////////////////////////
StringBuilderTest::StringBuilderTest() {
}
////////////////////////////////////////////////////////////////////////////////
StringBuilderTest::~StringBuilderTest() {
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testDefaultConstructor() {
StringBuilder builder;
CPPUNIT_ASSERT_EQUAL(16, builder.capacity());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testConstructorInt() {
StringBuilder sb(24);
CPPUNIT_ASSERT_EQUAL(24, sb.capacity());
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a NegativeArraySizeException",
StringBuilder(-1),
NegativeArraySizeException);
CPPUNIT_ASSERT_NO_THROW(StringBuilder(0));
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testConstructorString() {
StringBuilder sb("fixture");
CPPUNIT_ASSERT_EQUAL(String("fixture"), sb.toString());
CPPUNIT_ASSERT_EQUAL(String("fixture").length() + 16, sb.capacity());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendBoolean() {
StringBuilder sb;
sb.append(true);
CPPUNIT_ASSERT_EQUAL(String("true"), sb.toString());
sb.setLength(0);
sb.append(false);
CPPUNIT_ASSERT_EQUAL(String("false"), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendChar() {
StringBuilder sb;
sb.append('a');
CPPUNIT_ASSERT_EQUAL(String("a"), sb.toString());
sb.setLength(0);
sb.append('b');
CPPUNIT_ASSERT_EQUAL(String("b"), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendCharArray() {
StringBuilder sb;
sb.append("ab");
CPPUNIT_ASSERT_EQUAL(String("ab"), sb.toString());
sb.setLength(0);
sb.append("cd");
CPPUNIT_ASSERT_EQUAL(String("cd"), sb.toString());
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a NullPointerException",
sb.append((const char*) NULL),
NullPointerException);
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendCharArrayIntInt() {
StringBuilder sb;
sb.append("ab", 0, 2);
CPPUNIT_ASSERT_EQUAL(String("ab"), sb.toString());
sb.setLength(0);
sb.append("cd");
CPPUNIT_ASSERT_EQUAL(String("cd"), sb.toString());
sb.setLength(0);
sb.append("abcd", 0, 2);
CPPUNIT_ASSERT_EQUAL(String("ab"), sb.toString());
sb.setLength(0);
sb.append("abcd", 2, 2);
CPPUNIT_ASSERT_EQUAL(String("cd"), sb.toString());
sb.setLength(0);
sb.append("abcd", 2, 0);
CPPUNIT_ASSERT_EQUAL(String(""), sb.toString());
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a NullPointerException",
sb.append((const char*) NULL, 0, 2),
NullPointerException);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a IndexOutOfBoundsException",
sb.append("abcd", -1, 2),
IndexOutOfBoundsException);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a IndexOutOfBoundsException",
sb.append("abcd", 0, -1),
IndexOutOfBoundsException);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a IndexOutOfBoundsException",
sb.append("abcd", 2, 3),
IndexOutOfBoundsException);
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendCharSequence() {
String ab("ab");
String cd("cd");
StringBuilder sb;
sb.append(&ab);
CPPUNIT_ASSERT_EQUAL(String("ab"), sb.toString());
sb.setLength(0);
sb.append(&cd);
CPPUNIT_ASSERT_EQUAL(String("cd"), sb.toString());
sb.setLength(0);
sb.append((CharSequence*) NULL);
CPPUNIT_ASSERT_EQUAL(String("null"), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendCharSequenceIntInt() {
String ab("ab");
String cd("cd");
String abcd("abcd");
StringBuilder sb;
sb.append(&ab, 0, 2);
CPPUNIT_ASSERT_EQUAL(String("ab"), sb.toString());
sb.setLength(0);
sb.append(&cd, 0, 2);
CPPUNIT_ASSERT_EQUAL(String("cd"), sb.toString());
sb.setLength(0);
sb.append(&abcd, 0, 2);
CPPUNIT_ASSERT_EQUAL(String("ab"), sb.toString());
sb.setLength(0);
sb.append(&abcd, 2, 4);
CPPUNIT_ASSERT_EQUAL(String("cd"), sb.toString());
sb.setLength(0);
sb.append((CharSequence*) NULL, 0, 2);
CPPUNIT_ASSERT_EQUAL(String("nu"), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendShort() {
short a = 1;
short b = 0;
short c = -1;
StringBuilder sb;
sb.append(a);
CPPUNIT_ASSERT_EQUAL(String::valueOf(a), sb.toString());
sb.setLength(0);
sb.append(0);
CPPUNIT_ASSERT_EQUAL(String::valueOf(b), sb.toString());
sb.setLength(0);
sb.append(c);
CPPUNIT_ASSERT_EQUAL(String::valueOf(c), sb.toString());
sb.setLength(0);
sb.append(Short::MIN_VALUE);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Short::MIN_VALUE), sb.toString());
sb.setLength(0);
sb.append(Short::MAX_VALUE);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Short::MAX_VALUE), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendInt() {
int a = 1;
int b = 0;
int c = -1;
StringBuilder sb;
sb.append(a);
CPPUNIT_ASSERT_EQUAL(String::valueOf(a), sb.toString());
sb.setLength(0);
sb.append(0);
CPPUNIT_ASSERT_EQUAL(String::valueOf(b), sb.toString());
sb.setLength(0);
sb.append(c);
CPPUNIT_ASSERT_EQUAL(String::valueOf(c), sb.toString());
sb.setLength(0);
sb.append(Integer::MIN_VALUE);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Integer::MIN_VALUE), sb.toString());
sb.setLength(0);
sb.append(Integer::MAX_VALUE);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Integer::MAX_VALUE), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendLong() {
StringBuilder sb;
sb.append(1LL);
CPPUNIT_ASSERT_EQUAL(String::valueOf(1LL), sb.toString());
sb.setLength(0);
sb.append(0LL);
CPPUNIT_ASSERT_EQUAL(String::valueOf(0LL), sb.toString());
sb.setLength(0);
sb.append(-1LL);
CPPUNIT_ASSERT_EQUAL(String::valueOf(-1LL), sb.toString());
sb.setLength(0);
sb.append(Integer::MIN_VALUE);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Integer::MIN_VALUE), sb.toString());
sb.setLength(0);
sb.append(Integer::MAX_VALUE);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Integer::MAX_VALUE), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendDouble() {
StringBuilder sb;
sb.append(1.0);
CPPUNIT_ASSERT_EQUAL(String::valueOf(1.0), sb.toString());
sb.setLength(0);
sb.append(0.0);
CPPUNIT_ASSERT_EQUAL(String::valueOf(0.0), sb.toString());
sb.setLength(0);
sb.append(-1.0);
CPPUNIT_ASSERT_EQUAL(String::valueOf(-1.0), sb.toString());
sb.setLength(0);
sb.append(Double::NaN);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Double::NaN), sb.toString());
sb.setLength(0);
sb.append(Double::NEGATIVE_INFINITY);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Double::NEGATIVE_INFINITY), sb.toString());
sb.setLength(0);
sb.append(Double::POSITIVE_INFINITY);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Double::POSITIVE_INFINITY), sb.toString());
sb.setLength(0);
sb.append(Double::MIN_VALUE);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Double::MIN_VALUE), sb.toString());
sb.setLength(0);
sb.append(Double::MAX_VALUE);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Double::MAX_VALUE), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendFloat() {
StringBuilder sb;
sb.append(1.0f);
CPPUNIT_ASSERT_EQUAL(String::valueOf(1.0f), sb.toString());
sb.setLength(0);
sb.append(0.0f);
CPPUNIT_ASSERT_EQUAL(String::valueOf(0.0f), sb.toString());
sb.setLength(0);
sb.append(-1.0f);
CPPUNIT_ASSERT_EQUAL(String::valueOf(-1.0f), sb.toString());
sb.setLength(0);
sb.append(Float::NaN);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Float::NaN), sb.toString());
sb.setLength(0);
sb.append(Float::NEGATIVE_INFINITY);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Float::NEGATIVE_INFINITY), sb.toString());
sb.setLength(0);
sb.append(Float::POSITIVE_INFINITY);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Float::POSITIVE_INFINITY), sb.toString());
sb.setLength(0);
sb.append(Float::MIN_VALUE);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Float::MIN_VALUE), sb.toString());
sb.setLength(0);
sb.append(Float::MAX_VALUE);
CPPUNIT_ASSERT_EQUAL(String::valueOf(Float::MAX_VALUE), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendString() {
StringBuilder sb;
sb.append(String("ab"));
CPPUNIT_ASSERT_EQUAL(String("ab"), sb.toString());
sb.setLength(0);
sb.append(String("cd"));
CPPUNIT_ASSERT_EQUAL(String("cd"), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendStringBuffer() {
// TODO
// StringBuilder sb;
// sb.append(StringBuffer("ab"));
// CPPUNIT_ASSERT_EQUAL(String("ab"), sb.toString());
// sb.setLength(0);
// sb.append(StringBuffer("cd"));
// CPPUNIT_ASSERT_EQUAL(String("cd"), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
namespace {
class MyObject {
public:
String toString() const {
return "MyObject";
}
};
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendRawPointer() {
MyObject obj;
StringBuilder sb;
sb.append(&obj);
CPPUNIT_ASSERT_EQUAL(String("MyObject"), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testAppendPointer() {
Pointer<MyObject> obj(new MyObject);
StringBuilder sb;
sb.append(obj);
CPPUNIT_ASSERT_EQUAL(String("MyObject"), sb.toString());
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testCapacity() {
StringBuilder sb;
CPPUNIT_ASSERT_EQUAL(16, sb.capacity());
sb.append("0123456789ABCDEF0123456789ABCDEF");
CPPUNIT_ASSERT(sb.capacity() > 16);
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testCharAt() {
String fixture = "0123456789";
StringBuilder sb(fixture);
for (int i = 0; i < fixture.length(); i++) {
CPPUNIT_ASSERT_EQUAL((char) ('0' + i), sb.charAt(i));
}
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a IndexOutOfBoundsException",
sb.charAt(-1),
IndexOutOfBoundsException);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a IndexOutOfBoundsException",
sb.charAt(fixture.length()),
IndexOutOfBoundsException);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a IndexOutOfBoundsException",
sb.charAt(fixture.length() + 1),
IndexOutOfBoundsException);
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testDeleteRange() {
String fixture = "0123456789";
StringBuilder sb(fixture);
sb.deleteRange(0, 0);
CPPUNIT_ASSERT_EQUAL(fixture, sb.toString());
sb.deleteRange(5, 5);
CPPUNIT_ASSERT_EQUAL(fixture, sb.toString());
sb.deleteRange(0, 1);
CPPUNIT_ASSERT_EQUAL(String("123456789"), sb.toString());
CPPUNIT_ASSERT_EQUAL(9, sb.length());
sb.deleteRange(0, sb.length());
CPPUNIT_ASSERT_EQUAL(String(""), sb.toString());
CPPUNIT_ASSERT_EQUAL(0, sb.length());
{
StringBuilder sb(fixture);
sb.deleteRange(0, 11);
CPPUNIT_ASSERT_EQUAL(String(""), sb.toString());
CPPUNIT_ASSERT_EQUAL(0, sb.length());
}
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a StringIndexOutOfBoundsException",
StringBuilder(fixture).deleteRange(-1, 2),
StringIndexOutOfBoundsException);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a StringIndexOutOfBoundsException",
StringBuilder(fixture).deleteRange(13, 12),
StringIndexOutOfBoundsException);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a StringIndexOutOfBoundsException",
StringBuilder(fixture).deleteRange(11, 12),
StringIndexOutOfBoundsException);
{
StringBuilder sb;
sb.append("abcde");
String str = sb.toString();
sb.deleteRange(0, sb.length());
sb.append("YY");
CPPUNIT_ASSERT_EQUAL(String("abcde"), str);
CPPUNIT_ASSERT_EQUAL(String("YY"), sb.toString());
}
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testDeleteCharAt() {
String fixture = "0123456789";
StringBuilder sb(fixture);
sb.deleteCharAt(0);
CPPUNIT_ASSERT_EQUAL(String("123456789"), sb.toString());
CPPUNIT_ASSERT_EQUAL(9, sb.length());
{
StringBuilder sb(fixture);
sb.deleteCharAt(5);
CPPUNIT_ASSERT_EQUAL(String("012346789"), sb.toString());
CPPUNIT_ASSERT_EQUAL(9, sb.length());
}
{
StringBuilder sb(fixture);
sb.deleteCharAt(9);
CPPUNIT_ASSERT_EQUAL(String("012345678"), sb.toString());
CPPUNIT_ASSERT_EQUAL(9, sb.length());
}
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a StringIndexOutOfBoundsException",
StringBuilder(fixture).deleteCharAt(-1),
StringIndexOutOfBoundsException);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a StringIndexOutOfBoundsException",
StringBuilder(fixture).deleteCharAt(fixture.length()),
StringIndexOutOfBoundsException);
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a StringIndexOutOfBoundsException",
StringBuilder(fixture).deleteCharAt(fixture.length() + 1),
StringIndexOutOfBoundsException);
}
////////////////////////////////////////////////////////////////////////////////
void StringBuilderTest::testEnsureCapacity() {
StringBuilder sb(5);
CPPUNIT_ASSERT_EQUAL(5, sb.capacity());
sb.ensureCapacity(10);
CPPUNIT_ASSERT_EQUAL(12, sb.capacity());
sb.ensureCapacity(26);
CPPUNIT_ASSERT_EQUAL(26, sb.capacity());
sb.ensureCapacity(55);
CPPUNIT_ASSERT_EQUAL(55, sb.capacity());
}