// main driver sample to test substring functionality.

#include <cassert>
#include <iostream>
#include "substring.h"

int main()
{
    std::string str = "abc";
    substring sub = str;

    assert( sub == "abc" );
    assert( "abc" == sub );

    sub.begin( 1 ); // reposition absolute offsets
    sub.end( 2 );
    assert( sub[ 0 ] == 'b' );
    assert( sub != str );
    assert( str != sub );

    sub = "HELLO";
    assert( sub == std::string( "HELLO" ) );
    assert( std::string( "HELLO" ) == sub );
    assert( str == "aHELLOc" );
    assert( sub.begin() == 1 );
    assert( sub.end() == 6 );
    assert( sub.size() == 5 );

    sub.clear();
    assert( sub == "" );
    assert( str == "ac" );
    assert( sub.begin() == 1 );
    assert( sub.end() == 1 );
    assert( sub.size() == 0 );

    sub.insert( "XYZ", sub.begin() );
    assert( str == "aXYZc" );

    sub.expand();
    assert( str == "aXYZc" );
    assert( sub.begin() == 0 );
    assert( sub.end() == str.size() );

    size_t result = sub.search( "YZc", sub.end() );
    assert( result == std::string::npos );

    result = sub.search( "YZc", sub.begin() );
    assert( result == 2 );
    assert( sub.begin() == 2 );
    assert( sub.end() == str.size() );
    assert( sub.size() == 3 );

    sub.fill( '?' );
    assert( sub.begin() == 2 );
    assert( sub.end() == str.size() );
    assert( sub[ 0 ] == '?' );
    assert( sub[ 1 ] == '?' );
    assert( sub[ 2 ] == '?' );
    sub[ 0 ] = '1';
    sub[ 1 ] = '2';
    sub[ 2 ] = '3';

    assert( str == "aX123" );

    sub.expand();
    sub.toupper();
    assert( sub == "AX123" );
    assert( str == "AX123" );
    assert( sub != "" );

    sub.tolower();
    assert( "ax123" == sub );
    assert( "ax123" == str );
    assert( sub == str );
    assert( str == sub );

    substring sub2 = sub; // invokes copy constructor
    result = sub2.search( "x1", sub.begin() );
    assert( sub2 == "x1" );
    assert( sub == "ax123" );
    assert( sub < sub2 );
    assert( sub2 > sub );

    sub2 += sub; // sub2 merges with sub
    assert( sub2 == "ax123" );
    assert( sub == sub2 );

    std::cout << sub << sub2; // prints ax123ax123

    return 0;
}

