/* -*- c++ -*- */
/*
 * Copyright (C) 2009 The Android Open Source Project
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include "../include/string"
#ifndef ANDROID_ASTL_STRING__
#error "Wrong header included!!"
#endif
#include <climits>
#include <cstring>
#include <algorithm>
#include "common.h"


namespace android {
using std::string;

bool testConstructorCString()
{
    string empty_str1;
    EXPECT_TRUE(empty_str1.size() == 0);
    EXPECT_TRUE(empty_str1.capacity() == 0);

    string empty_str2("");
    EXPECT_TRUE(empty_str2.size() == 0);

    const char empty_as_array[] = "";
    string empty_str3(empty_as_array);
    EXPECT_TRUE(empty_str3.size() == 0);

    const char literal[] = "scott mills cracks me up";
    string str1(literal);
    EXPECT_TRUE(strcmp(literal, str1.c_str()) == 0);

    string str2(literal, 11);
    EXPECT_TRUE(strcmp("scott mills", str2.c_str()) == 0);

    string str3(literal, sizeof(literal));
    EXPECT_TRUE(strcmp(literal, str3.c_str()) == 0);

    // Pass the end of the string => still ok, there is \0
    string str4(literal, sizeof(literal) + 1);
    EXPECT_TRUE(str4.size() == sizeof(literal) + 1);

    string str5(literal, literal + 11);
    EXPECT_TRUE(strcmp("scott mills", str5.c_str()) == 0);

    const char text[] = {'l','a','d','y',' ','g','a','g','a'};

    string str6(text, ARRAYSIZE(text));
    EXPECT_TRUE(str6 == "lady gaga");

    string str7(NULL);
    EXPECT_TRUE(empty_str1.size() == 0);
    EXPECT_TRUE(empty_str1.empty());
    return true;
}

bool testConstructorString()
{
    string empty_str1;
    string empty_str2;
    EXPECT_TRUE(empty_str1.c_str() == empty_str2.c_str());

    string empty_str3(empty_str2);
    EXPECT_TRUE(empty_str3.size() == 0);

    const char string_with_nulls[] = "contains 2 \0 bytes \0.";
    string str1 (string_with_nulls, 21);
    EXPECT_TRUE(str1.size() == 21);

    string str2 (str1);
    EXPECT_TRUE(str1.size() == 21);

    const string str3("scott mills cracks me up");
    string str4(str3, 12);
    EXPECT_TRUE(strcmp("cracks me up", str4.c_str()) == 0);

    string str5(str3, 12, 6);
    EXPECT_TRUE(strcmp("cracks", str5.c_str()) == 0);

    string str6(str3, 23);
    EXPECT_TRUE(strcmp("p", str6.c_str()) == 0);

    string str7(str3, 24);
    EXPECT_TRUE(strcmp("", str7.c_str()) == 0);

    string str8(str3, 23, 1);
    EXPECT_TRUE(strcmp("p", str8.c_str()) == 0);

    string str9(str3, 24, 1);
    EXPECT_TRUE(strcmp("", str9.c_str()) == 0);

    return true;
}

bool testConstructorPointers()
{
    const string empty;
    char data[] = "a 16 char string";

    string str01(data, data + 0);
    EXPECT_TRUE(str01.c_str() == empty.c_str());

    string str02(data, data + 1);
    EXPECT_TRUE(str02 == "a");

    string str03(data + 2, data + 16);
    EXPECT_TRUE(str03 == "16 char string");

    string str04(data + 15, data + 16);
    EXPECT_TRUE(str04 == "g");

    string str05(data + 16, data + 16);
    EXPECT_TRUE(str05 == "");

    return true;
}

bool testConstructorRepeatChar()
{
    string str01(0, 'c');

    EXPECT_TRUE(str01.empty());
    EXPECT_TRUE(str01.size() == 0);
    EXPECT_TRUE(str01.capacity() == 0);

    string str02(10, 'c');

    EXPECT_TRUE(!str02.empty());
    EXPECT_TRUE(str02.size() == 10);
    EXPECT_TRUE(str02.capacity() == 10);

    for (size_t i = 0; i < 100; ++i)
    {
        string str03(i, 'x');

        EXPECT_TRUE(str03[i] == '\0');
        EXPECT_TRUE(str03.length() == i);

        str03.reserve(i + 20);
        EXPECT_TRUE(str03.capacity() == i + 20);
        EXPECT_TRUE(str03.length() == i);
        EXPECT_TRUE(str03[i] == '\0');
    }

    return true;
}

bool testConstructorInvalidValues()
{
    const string empty;
    const string str01("a 16 char string");

    EXPECT_TRUE(str01.size() == 16);

    string str02(str01, 17, 1);  // invalid index
    EXPECT_TRUE(str02.c_str() == empty.c_str());

    string str03(str01, 17, 0);  // invalid index
    EXPECT_TRUE(str03.c_str() == empty.c_str());

    string str04(str01, -1, 0);  // invalid index
    EXPECT_TRUE(str04.c_str() == empty.c_str());

    string str05(str01, 0, 17);  // invalid length -> clamped
    EXPECT_TRUE(str05 == str01);

    string str06(str01, 17);  // invalid index
    EXPECT_TRUE(str06.c_str() == empty.c_str());

    char end[] = "a string";
    char *begin = end + 1;  // begin after end.

    string str07(begin, end);
    EXPECT_TRUE(str07.c_str() == empty.c_str());

    return true;
}

bool testSize()
{
    string str01;
    EXPECT_TRUE(str01.size() == 0);
    EXPECT_TRUE(str01.length() == 0);

    str01 += "a string.";

    EXPECT_TRUE(str01.size() == 9);
    EXPECT_TRUE(str01.length() == 9);

    return true;
}

bool testCString()
{
    string str01;
    string str02;

    // Should point to the same empty string.
    EXPECT_TRUE(str01.c_str() == str02.c_str());
    // c_str() == data()
    EXPECT_TRUE(str01.c_str() == str01.data());
    EXPECT_TRUE(str01.empty());

    const char text[] = "a string";
    str01 += text;
    EXPECT_TRUE(strcmp(str01.c_str(), text) == 0);
    EXPECT_TRUE(strcmp(str01.data(), text) == 0);
    EXPECT_TRUE(!str01.empty());

    // after a clear, points back to the original empty string.
    str01.clear();
    EXPECT_TRUE(str01.c_str() == str02.c_str());
    EXPECT_TRUE(str01.empty());

    return true;
}

bool testReserve()
{
    string str01;
    size_t capacity = str01.capacity();

    EXPECT_TRUE(0 == capacity);

    str01.reserve(5);
    EXPECT_TRUE(5 == str01.capacity());
    str01.reserve(0);
    EXPECT_TRUE(0 == str01.capacity());

    string str02("7 chars");
    EXPECT_TRUE(7 == str02.capacity());
    EXPECT_TRUE(7 == str02.size());

    str02.reserve(10);
    EXPECT_TRUE(str02 == "7 chars");
    EXPECT_TRUE(10 == str02.capacity());
    EXPECT_TRUE(7 == str02.size());

    str02.reserve(6); // no effect
    EXPECT_TRUE(str02 == "7 chars");
    EXPECT_TRUE(10 == str02.capacity());
    EXPECT_TRUE(7 == str02.size());

    string str03;
    const string str04;

    // Both point to kEmptyString.
    EXPECT_TRUE(str03.c_str() == str04.c_str());

    str03.reserve();
    EXPECT_TRUE(0 == str03.capacity());
    EXPECT_TRUE(str03.c_str() == str04.c_str());

    str03.reserve(10);
    EXPECT_TRUE(10 == str03.capacity());
    // Not pointing at the empty string anymore.
    EXPECT_TRUE(str03.c_str() != str04.c_str());

    str03.reserve();
    EXPECT_TRUE(0 == str03.capacity());
    // c_str() points back to the empty string.
    EXPECT_TRUE(str03.c_str() == str04.c_str());

    str03.reserve(10);
    str03.append("7 chars");
    EXPECT_TRUE(str03 == "7 chars");
    str03.reserve();  // shrink to fit.
    EXPECT_TRUE(7 == str03.capacity());

    string str05 = "twelve chars";
    string str06 = str05;
    str05.reserve(1);
    EXPECT_TRUE(str05.capacity() == 12);


    for (size_t i = 1; i <= 100; i *= 2)
    {
        string str(i, 'x');
        str.reserve(3 * i);
        EXPECT_TRUE(str.capacity() == 3 * i);

        str.reserve(2 * i);
        EXPECT_TRUE(str.capacity() == 2 * i);

        str.reserve();
        EXPECT_TRUE(str.capacity() == i);
    }

    // Check overflow.
    string str07;

    str07.reserve(10);
    EXPECT_TRUE(str07.capacity() == 10);

    str07.reserve(kMaxSizeT);

    EXPECT_TRUE(str07.capacity() == 10);

    return true;
}

bool testAppend()
{
    string str1;
    const char *text = "You spin my head right round.";

    str1.append(text);
    EXPECT_TRUE(str1 == text);

    str1.append(" Flo Rida.");
    EXPECT_TRUE(str1 == "You spin my head right round. Flo Rida.");

    string str2;
    str2.append(str1);
    EXPECT_TRUE(str2 == "You spin my head right round. Flo Rida.");

    string str3("You spin ");
    str3.append("my head right round.");
    EXPECT_TRUE(str3 == "You spin my head right round.");

    string str4("You spin ");
    string str5("my head right round.");
    str4.append(str5);
    EXPECT_TRUE(str4 == "You spin my head right round.");

    string str6("");
    string str7("");
    str6.append(str7);
    EXPECT_TRUE(str6 == "");
    EXPECT_TRUE(str6.empty());

    string str8;
    str8.append("a");
    EXPECT_TRUE(str8 == "a");

    const char more_text[] = {'l','a','d','y',' ','g','a','g','a'};

    string str9;
    str9.append(more_text, ARRAYSIZE(more_text));
    EXPECT_TRUE(str9 == string(more_text, ARRAYSIZE(more_text)));

    string str10;
    str10.append("", 0);
    EXPECT_TRUE(str10.size() == 0 );
    str10.append(text, strlen(text));
    EXPECT_TRUE(str10 == "You spin my head right round.");

    string str11;
    str11.append("You spin my head right round.", 5, 11);

    EXPECT_TRUE(str11 == "pin my head");

    // Append overflow
    string str12("original");
    char dummy[] = "unused";
    // We lie about the size but that is ok. Since the lenght of the new string
    // is going to be kMaxSizeT, the call will have not effect (there is no
    // space for the trailing '\0').
    str12.append(dummy, kMaxSizeT);
    EXPECT_TRUE(str12 == "original");

    return true;
}

bool testAppendOperator()
{
    string str1;
    const char *text = "You spin my head right round.";

    str1 += text;
    EXPECT_TRUE(str1 == text);

    str1 += " Flo Rida.";
    EXPECT_TRUE(str1 == "You spin my head right round. Flo Rida.");

    string str2;
    str2 += str1;
    EXPECT_TRUE(str2 == "You spin my head right round. Flo Rida.");

    string str3("You spin ");
    str3 += "my head right round.";
    EXPECT_TRUE(str3 == "You spin my head right round.");

    string str4("You spin ");
    string str5("my head right round.");
    str4 += str5;
    EXPECT_TRUE(str4 == "You spin my head right round.");

    string str6("");
    string str7("");
    str6 += str7;
    EXPECT_TRUE(str6 == "");
    EXPECT_TRUE(str6.empty());

    string str8;
    str8 += "a";
    EXPECT_TRUE(str8 == "a");

    const char more_text[] = {'l','a','d','y',' ','g','a','g','a'};

    string str9;
    for (size_t i = 0; i < ARRAYSIZE(more_text); ++i)
    {
        str9 += more_text[i];
    }
    EXPECT_TRUE(str9 == "lady gaga");

    str9 += (const char *)NULL;
    EXPECT_TRUE(str9 == "lady gaga");

    string str10(more_text, ARRAYSIZE(more_text));
    EXPECT_TRUE(str10 == "lady gaga");
    str10 += '\0';
    EXPECT_TRUE(str10 == "lady gaga");
    EXPECT_TRUE(str10 == string("lady gaga\0", 10));
    str10 += 'x';
    EXPECT_TRUE(str10 == string("lady gaga\0x", 11));
    EXPECT_TRUE(str10[11] == '\0');

    return true;
}


bool testCompare()
{
    string str01("bell helmet");
    string str02("bell moto");
    string str03("bell");
    string str04("bell pants");
    string str05;

    str05 = str01;
    // Compare with self.
    EXPECT_TRUE(str01 == str01);
    EXPECT_TRUE(!(str01 != str01));

    EXPECT_TRUE(str01 == str05);
    EXPECT_TRUE(str05 == str01);
    EXPECT_TRUE(!(str01 != str05));
    EXPECT_TRUE(!(str05 != str01));

    EXPECT_TRUE(str01 != str02);
    EXPECT_TRUE(str01 != str03);
    EXPECT_TRUE(str01 != str04);

    // Compare with literals.
    EXPECT_TRUE(str01 == "bell helmet");
    EXPECT_TRUE(!(str01 != "bell helmet"));
    EXPECT_TRUE("bell helmet" == str01);
    EXPECT_TRUE(!("bell helmet" != str01));

    // Compare with char array.
    char array[] = { 'a', ' ', 'b', 'u', 'g', '\0'};
    str01 = "a bug";
    EXPECT_TRUE(array == str01);

    EXPECT_TRUE(strcmp("a bug", "a bugg") < 0);

    char array2[] = { 'a', 'b', 'u', 'g', 'g' };
    EXPECT_TRUE(str01.compare(array2) < 0);

    string str06;
    EXPECT_TRUE(str06 != NULL);
    {
        string str_long("this is");
        string str_short("it");
        EXPECT_TRUE(str_long > str_short);
        EXPECT_TRUE(str_long >= str_short);
        EXPECT_FALSE(str_long < str_short);
        EXPECT_FALSE(str_long <= str_short);
    }
    {
        string str_lhs("this is");
        string str_rhs("this is");
        EXPECT_FALSE(str_lhs > str_rhs);
        EXPECT_TRUE(str_lhs >= str_rhs);
        EXPECT_FALSE(str_lhs < str_rhs);
        EXPECT_TRUE(str_lhs <= str_rhs);
    }
    return true;
}

bool testSwap()
{
    string str01;
    string str02("test");

    str01.swap(str02);
    EXPECT_TRUE(str02.empty());
    EXPECT_TRUE(str01 == "test");

    string str03("altima");
    string str04("versa");
    str03.swap(str04);
    EXPECT_TRUE(str03 == "versa");
    EXPECT_TRUE(str04 == "altima");

    {
        string empty;
        // swap can be used to clean strings
        str04.swap(empty);
    }
    EXPECT_TRUE(str04.empty());

    return true;
}

bool testAccessor()
{
    string str01 = "earmarks";

    EXPECT_TRUE(str01[0] == 'e');
    EXPECT_TRUE(str01[7] == 's');

    str01[0] = 'E';
    str01[7] = 'S';
    EXPECT_TRUE(str01 == "EarmarkS");

    for (int i = 0; i < 100; ++i)
    {
        string str02(i, 'x');

        str02.reserve(20);

        EXPECT_TRUE(str02[i] == '\0');

        const string str03(str02);
        EXPECT_TRUE(str03[i] == '\0');
    }

    string str05;
    str05.reserve(100);
    str05[99] = 'a';

    // 'at'
    EXPECT_TRUE(str01.at(0) == 'E');
    EXPECT_TRUE(str01.at(7) == 'S');
    EXPECT_TRUE(str01.at(8) == 'X');  // 'X' is the dummy value returned.

    str01.at(1) = 'A';
    str01.at(6) = 'K';
    EXPECT_TRUE(str01 == "EArmarKS");
    return true;
}


bool testAssignment()
{
    const char *literal = "Need to buy a full face helmet for Lilie.";
    const string str01 = literal;

    EXPECT_TRUE(str01.length() == strlen(literal));
    EXPECT_TRUE(str01.size() == strlen(literal));
    EXPECT_TRUE(str01.capacity() == strlen(literal));
    EXPECT_TRUE(str01 == literal);

    string str02;

    str02.assign(str01, 8, 33);
    EXPECT_TRUE(str02 == "buy a full face helmet for Lilie.");

    str02.assign(str01, 8, 0);
    EXPECT_TRUE(str02 == "");

    str02.assign(str01, 0, 7);
    EXPECT_TRUE(str02 == "Need to");

    str02.assign("unchanged");
    str02.assign(str01, 35, 1000);
    EXPECT_TRUE(str02 == "unchanged");

    str02.assign(str01, 35, 6);
    EXPECT_TRUE(str02 == "Lilie.");


    str02.assign(str01, 35, 5);
    EXPECT_TRUE(str02 == "Lilie");

    string str03;

    str03.assign(literal);
    EXPECT_TRUE(str03 == "Need to buy a full face helmet for Lilie.");

    string str04;

    str04.assign(str03.c_str());
    EXPECT_TRUE(str04 == "Need to buy a full face helmet for Lilie.");

    str04.assign(str03.c_str() + 5, 10);
    EXPECT_TRUE(str04 == "to buy a f");

    str04.assign("noop");
    str04.assign(NULL);
    EXPECT_TRUE(str04 == "noop");

    str04.assign(str01, str01.size() - 1, 1);
    EXPECT_TRUE(str04 == ".");

    str04.assign("unchanged");
    str04.assign(str01, str01.size(), 1);
    str04.assign(NULL, 4, 1);
    str04.assign(NULL, 4);
    EXPECT_TRUE(str04 == "unchanged");

    return true;
}

bool testCopy()
{
    string data[] = {"one", "two", "three", "four", "five", "six"};
    std::copy(data + 2, data + 5, data);
    EXPECT_TRUE(data[0] == "three");
    EXPECT_TRUE(data[1] == "four");
    EXPECT_TRUE(data[2] == "five");
    EXPECT_TRUE(data[3] == "four");
    EXPECT_TRUE(data[4] == "five");
    EXPECT_TRUE(data[5] == "six");
    return true;
}


bool testConcat()
{
    string str01("The full");
    string str02(" sentence.");
    string str03;

    str03 = str01 + str02;
    EXPECT_TRUE(str03 == "The full sentence.");

    str03 = str02 + str01;
    EXPECT_TRUE(str03 == " sentence.The full");


    str03 = str01 + " sentence.";
    EXPECT_TRUE(str03 == "The full sentence.");

    str03 = "The full" + str02;
    EXPECT_TRUE(str03 == "The full sentence.");

    str03 = 'l' + str02;
    str03 = 'l' + str03;
    str03 = 'u' + str03;
    str03 = 'f' + str03;
    str03 = ' ' + str03;
    str03 = 'e' + str03;
    str03 = 'h' + str03;
    str03 = 'T' + str03;
    EXPECT_TRUE(str03 == "The full sentence.");

    str03 = "The full ";
    str03 = str03 + 's';
    str03 = str03 + 'e';
    str03 = str03 + 'n';
    str03 = str03 + 't';
    str03 = str03 + 'e';
    str03 = str03 + 'n';
    str03 = str03 + 'c';
    str03 = str03 + 'e';
    str03 = str03 + '.';
    EXPECT_TRUE(str03 == "The full sentence.");

    // Check the new string buffer is not the same as the original one.
    string str04("left and");
    string str05(" right");
    string str06(str04 + str05);

    EXPECT_TRUE(str06 == "left and right");
    EXPECT_TRUE(str06.c_str() != str04.c_str());
    EXPECT_TRUE(str06.c_str() != str05.c_str());

    str06 = str04 + str05;
    EXPECT_TRUE(str06 == "left and right");
    EXPECT_TRUE(str06.c_str() != str04.c_str());
    EXPECT_TRUE(str06.c_str() != str05.c_str());
    return true;
}

bool testPushBack()
{
    string str01;

    str01.push_back('a');
    EXPECT_TRUE(str01 == "a");
    EXPECT_TRUE(str01.capacity() == 1);

    str01.reserve(10);
    str01.push_back('b');
    EXPECT_TRUE(str01 == "ab");
    EXPECT_TRUE(str01.capacity() == 10);
    EXPECT_TRUE(str01[2] == '\0');

    str01.reserve();
    EXPECT_TRUE(str01 == "ab");
    EXPECT_TRUE(str01.capacity() == 2);
    EXPECT_TRUE(str01[2] == '\0');

    return true;
}

bool testFind()
{
  string haystack("one two three one two three");

  // Don't die on null strings
  EXPECT_TRUE(haystack.find((char*)NULL) == string::npos);
  EXPECT_TRUE(haystack.find((char*)NULL, 10) == string::npos);

  // C strings.
  EXPECT_TRUE(haystack.find("one") == 0);
  EXPECT_TRUE(haystack.find("two") == 4);
  EXPECT_TRUE(haystack.find("t") == 4);
  EXPECT_TRUE(haystack.find("four") == string::npos);
  EXPECT_TRUE(haystack.find("one", string::npos) == string::npos);

  // with offset
  EXPECT_TRUE(haystack.find("one", 13) == 14);
  EXPECT_TRUE(haystack.find("one", 14) == 14);
  EXPECT_TRUE(haystack.find("one", 15) == string::npos);
  EXPECT_TRUE(haystack.find("e", haystack.size() - 1) == haystack.size() - 1);
  EXPECT_TRUE(haystack.find("e", haystack.size()) == string::npos);
  EXPECT_TRUE(haystack.find("one", string::npos) == string::npos);

  // std::string
  EXPECT_TRUE(haystack.find(string("one")) == 0);
  EXPECT_TRUE(haystack.find(string("two")) == 4);
  EXPECT_TRUE(haystack.find(string("t")) == 4);
  EXPECT_TRUE(haystack.find(string("four")) == string::npos);
  EXPECT_TRUE(haystack.find(string("one"), string::npos) == string::npos);

  // with offset
  EXPECT_TRUE(haystack.find(string("one"), 13) == 14);
  EXPECT_TRUE(haystack.find(string("one"), 14) == 14);
  EXPECT_TRUE(haystack.find(string("one"), 15) == string::npos);
  EXPECT_TRUE(haystack.find(string("e"), haystack.size() - 1) == haystack.size() - 1);
  EXPECT_TRUE(haystack.find(string("e"), haystack.size()) == string::npos);
  EXPECT_TRUE(haystack.find(string("one"), string::npos) == string::npos);

  // Emtpy string should be found at every position in a string except
  // past the end.
  EXPECT_TRUE(string().find("", 0) == 0);
  EXPECT_TRUE(string().find(string(), 0) == 0);
  EXPECT_TRUE(string().find(string(), 10) == string::npos);

  string foo = "foo";
  EXPECT_TRUE(foo.find("", 0) == 0);
  EXPECT_TRUE(foo.find(string(), 0) == 0);
  EXPECT_TRUE(foo.find(string(""), 0) == 0);

  EXPECT_TRUE(foo.find("", 1) == 1);
  EXPECT_TRUE(foo.find(string(), 1) == 1);
  EXPECT_TRUE(foo.find(string(""), 1) == 1);

  EXPECT_TRUE(foo.find("", foo.size()) == foo.size());
  EXPECT_TRUE(foo.find(string(), foo.size()) == foo.size());
  EXPECT_TRUE(foo.find(string(""), foo.size()) == foo.size());

  EXPECT_TRUE(foo.find("", foo.size() + 1) == string::npos);
  EXPECT_TRUE(foo.find(string(), foo.size() + 1) == string::npos);
  EXPECT_TRUE(foo.find(string(""), foo.size() + 1) == string::npos);

  // Find on an empty string a non empty one should fail
  EXPECT_TRUE(string().find("f", 0) == string::npos);
  EXPECT_TRUE(string().find(string("f"), 0) == string::npos);
  return true;
}

bool testCapacity()
{
  string empty_string;

  EXPECT_TRUE(empty_string.capacity() == 0);
  EXPECT_TRUE(empty_string.size() == 0);

  const char *text = "non empty string";
  const size_t len = strlen(text);
  string str01(text);

  EXPECT_TRUE(str01.capacity() == len);
  EXPECT_TRUE(str01.size() == len);
  return true;
}

bool testClear()
{
  string empty_string;

  empty_string.clear();
  EXPECT_TRUE(empty_string.capacity() == 0);
  EXPECT_TRUE(empty_string.size() == 0);

  string str01("non empty string");

  str01.clear();
  EXPECT_TRUE(str01.capacity() == 0);
  EXPECT_TRUE(str01.size() == 0);
  EXPECT_TRUE(str01.empty());
  return true;
}

bool testErase()
{
  {
    string empty_string;

    empty_string.erase();
    EXPECT_TRUE(empty_string.capacity() == 0);
    EXPECT_TRUE(empty_string.size() == 0);

    empty_string.erase(kMaxSizeT);
    EXPECT_TRUE(empty_string.capacity() == 0);
    EXPECT_TRUE(empty_string.size() == 0);

    empty_string.erase(kMaxSizeT, kMaxSizeT);
    EXPECT_TRUE(empty_string.capacity() == 0);
    EXPECT_TRUE(empty_string.size() == 0);
  }

  {
    string str01("a");

    str01.erase();
    EXPECT_TRUE(str01.capacity() == 1);
    EXPECT_TRUE(str01.size() == 0);
  }

  {
    string str02("a");

    str02.erase(kMaxSizeT);
    EXPECT_TRUE(str02.capacity() == 1);
    EXPECT_TRUE(str02.size() == 1);
  }

  {
    string str03("a");

    str03.erase(0, kMaxSizeT);
    EXPECT_TRUE(str03.capacity() == 1);
    EXPECT_TRUE(str03.size() == 0);
  }

  {
    string str04("a");

    str04.erase(1, kMaxSizeT);
    EXPECT_TRUE(str04.capacity() == 1);
    EXPECT_TRUE(str04.size() == 1);
  }

  {
    string str05("abcd");

    str05.erase(1, 2);
    EXPECT_TRUE(str05.capacity() == 4);
    EXPECT_TRUE(str05.size() == 2);
    EXPECT_TRUE(str05 == "ad");
  }

  {
    string str06("abcd");

    str06.erase(0, 1);
    EXPECT_TRUE(str06.capacity() == 4);
    EXPECT_TRUE(str06.size() == 3);
    EXPECT_TRUE(str06 == "bcd");
  }

  {
    // overlap
    string str07("oh my god (You think I'm in control)");

    str07.erase(0, strlen("oh my god "));
    EXPECT_TRUE(str07.size() == 26);
    EXPECT_TRUE(str07 == "(You think I'm in control)");
  }

  return true;
}

// Checks an iterator can be cast to a const one.
bool testConstIterator()
{
    string s("a string");
    string::iterator i = s.begin();
    string::const_iterator ci = s.begin();
    return true;
}

bool testForwardIterator()
{
    string s("a string");
    char chars[] = "a string";
    string::iterator iter = s.begin();
    for (int i = 0; iter != s.end(); ++i) {
        EXPECT_TRUE(*iter == chars[i]);
        ++iter;
    }
    EXPECT_TRUE(iter == s.end());

    string empty;
    EXPECT_TRUE(empty.begin() == empty.end());
    return true;
}

bool testSubstr() {
    {
        string s;
        string res = s.substr(10, 1);
        EXPECT_TRUE(res.empty());
    }
    {
        string s = "pandora radio";
        string res = s.substr(string::npos, 1);
        EXPECT_TRUE(res.empty());
    }
    {
        string s = "pandora radio";
        string res = s.substr(5, 1000);
        EXPECT_TRUE(res == "ra radio");
    }
    {
        string s = "pandora radio";
        string res = s.substr(5, 0);
        EXPECT_TRUE(res.empty());
    }
    {
        string s = "pandora radio";
        string res = s.substr(5, 5);
        EXPECT_TRUE(res == "ra ra");
    }
    return true;
}

bool testCharSearch() {
    {
        string s;
        EXPECT_TRUE(s.find_first_of('a') == string::npos);
        s = "abracadabra";
        EXPECT_TRUE(s.find_first_of('a') == 0);
        EXPECT_TRUE(s.find_first_of('a', 0) == 0);
        EXPECT_TRUE(s.find_first_of('a', 1) == 3);
        EXPECT_TRUE(s.find_first_of('a', 8) == 10);
        s = "zzzzzzza";
        EXPECT_TRUE(s.find_first_of('a') == 7);
        EXPECT_TRUE(s.find_first_of('a', 8) == string::npos); // out of bound
    }
    // For char (set of size 1) find_first_of is equive to find(char, pos)
    {
        string s;
        EXPECT_TRUE(s.find('a') == string::npos);
        s = "abracadabra";
        EXPECT_TRUE(s.find('a') == 0);
        EXPECT_TRUE(s.find('a', 0) == 0);
        EXPECT_TRUE(s.find('a', 1) == 3);
        EXPECT_TRUE(s.find('a', 8) == 10);
        s = "zzzzzzza";
        EXPECT_TRUE(s.find('a') == 7);
        EXPECT_TRUE(s.find('a', 8) == string::npos); // out of bound
    }
    {
        string s;
        EXPECT_TRUE(s.find_last_of('a') == string::npos);
        EXPECT_TRUE(s.find_last_of('a', 0) == string::npos);
        EXPECT_TRUE(s.find_last_of('a', 10) == string::npos);
        s = "abracadabra";
        EXPECT_TRUE(s.find_last_of('a', 10) == 10);
        EXPECT_TRUE(s.find_last_of('a', 9) == 7);
        EXPECT_TRUE(s.find_last_of('a', 0) == 0);
        s = "azzzzzzz";
        EXPECT_TRUE(s.find_last_of('a') == 0);
    }
    // For char (set of size 1) find_last_of is equiv to rfind(char, pos).
    {
        string s;
        EXPECT_TRUE(s.rfind('a') == string::npos);
        EXPECT_TRUE(s.rfind('a', 0) == string::npos);
        EXPECT_TRUE(s.rfind('a', 10) == string::npos);
        s = "abracadabra";
        EXPECT_TRUE(s.rfind('a', 10) == 10);
        EXPECT_TRUE(s.rfind('a', 9) == 7);
        EXPECT_TRUE(s.rfind('a', 0) == 0);
        s = "azzzzzzz";
        EXPECT_TRUE(s.rfind('a') == 0);
    }
    {
        string s;
        EXPECT_TRUE(s.find_first_not_of('a') == string::npos);
        s = "abracadabra";
        EXPECT_TRUE(s.find_first_not_of('a') == 1);
        EXPECT_TRUE(s.find_first_not_of('a', 0) == 1);
        EXPECT_TRUE(s.find_first_not_of('a', 1) == 1);
        EXPECT_TRUE(s.find_first_not_of('a', 7) == 8);
        s = "zzzzzzza";
        EXPECT_TRUE(s.find_first_not_of('a') == 0);
        EXPECT_TRUE(s.find_first_not_of('a', 8) == string::npos); // out of bound
    }
    {
        string s;
        EXPECT_TRUE(s.find_last_not_of('a') == string::npos);
        EXPECT_TRUE(s.find_last_not_of('a', 0) == string::npos);
        EXPECT_TRUE(s.find_last_not_of('a', 10) == string::npos);
        s = "abracadabra";
        EXPECT_TRUE(s.find_last_not_of('a') == 9);
        EXPECT_TRUE(s.find_last_not_of('a', 10) == 9);
        EXPECT_TRUE(s.find_last_not_of('a', 9) == 9);
        EXPECT_TRUE(s.find_last_not_of('a', 0) == string::npos);
        s = "azzzzzzz";
        EXPECT_TRUE(s.find_last_not_of('a') == 7);
    }
    return true;
}


bool testInsert() {
    {
        string::iterator res;
        string str("zzzzzz");
        res = str.insert(str.begin(), 'a');
        EXPECT_TRUE(str == "azzzzzz");
        EXPECT_TRUE(*res == 'a');

        res = str.insert(str.begin() + 3, 'b');
        EXPECT_TRUE(str == "azzbzzzz");
        EXPECT_TRUE(*res == 'b');

        res = str.insert(str.end(), 'c');
        EXPECT_TRUE(str == "azzbzzzzc");
        EXPECT_TRUE(*res == 'c');
    }
    {
        string str;
        string::iterator res = str.insert(str.begin(), 'a');
        EXPECT_TRUE(str == "a");
        EXPECT_TRUE(*res == 'a');
    }
    return true;
}

}  // namespace android

int main(int argc, char **argv)
{
    FAIL_UNLESS(testConstructorCString);
    FAIL_UNLESS(testConstructorString);
    FAIL_UNLESS(testConstructorRepeatChar);
    FAIL_UNLESS(testConstructorPointers);
    FAIL_UNLESS(testConstructorInvalidValues);
    FAIL_UNLESS(testSize);
    FAIL_UNLESS(testCString);
    FAIL_UNLESS(testAppend);
    FAIL_UNLESS(testAppendOperator);
    FAIL_UNLESS(testConcat);
    FAIL_UNLESS(testAssignment);
    FAIL_UNLESS(testCopy);
    FAIL_UNLESS(testReserve);
    FAIL_UNLESS(testCompare);
    FAIL_UNLESS(testAccessor);
    FAIL_UNLESS(testSwap);
    FAIL_UNLESS(testPushBack);
    FAIL_UNLESS(testFind);
    FAIL_UNLESS(testCapacity);
    FAIL_UNLESS(testClear);
    FAIL_UNLESS(testErase);
    FAIL_UNLESS(testConstIterator);
    FAIL_UNLESS(testForwardIterator);
    FAIL_UNLESS(testSubstr);
    FAIL_UNLESS(testCharSearch);
    FAIL_UNLESS(testInsert);
    return kPassed;
}
