public void CompareTo()
        {
            // null string comparison
            String  nullString= null;
            AString aString= new AString(0);
            UT_TRUE( aString.CompareTo( nullString) == 0 );
            UT_TRUE( aString.Equals( nullString) );

            aString._( "" );
            UT_TRUE( aString.CompareTo( nullString) != 0 );
            UT_TRUE( !aString.Equals( nullString) );

            aString.SetBuffer( 0 );
            UT_TRUE( aString.CompareTo( nullString) == 0 );
            UT_TRUE( aString.Equals( nullString) );


            AString    ms= new AString();

            int result;

            String t= "abcde";
            ms._( t );
            result= ms.CompareTo( t      );                                      UT_EQ( t.CompareTo( t ),                              result );
            result= ms.CompareTo( t + "x"      );                                UT_EQ( t.CompareTo( t + "x" ),                        result );
            result= ms.CompareTo( t.Substring (0, t.Length -1 )  );              UT_EQ( t.CompareTo( t.Substring (0, t.Length -1 ) ),  result );
            result= ms.CompareTo( "pad" + t,  Case.Sensitive, 3      );                   UT_EQ( 0,                                             result );
            result= ms.CompareTo( "pad" + t,  Case.Sensitive, 3, 2   );                   UT_EQ( 1,                                             result );
            result= ms.CompareTo( "pad" + t,  Case.Sensitive, 3, 100, 0, 4 );             UT_EQ( -1,                                            result );
            result= ms.CompareTo( "pad" + t,  Case.Sensitive, 3, 100, 0, 5 );             UT_EQ( 0,                                             result );
            result= ms.CompareTo( t,          Case.Sensitive, 2,   2, 2, 2      );        UT_EQ( 0,                                             result );
            result= ms.CompareTo( t,          Case.Sensitive, 2,   2, 2, 1      );        UT_EQ( -1,                                            result );
            result= ms.CompareTo( t,          Case.Sensitive, 2,   2, 2, 3      );        UT_EQ( 1,                                             result );

            result= ms.CompareTo( t,          Case.Sensitive, -2,  5,-2, 5 );                             UT_EQ( 0,  result );
            result= ms.CompareTo( t,          Case.Sensitive,  2, int.MaxValue,    2, int.MaxValue );     UT_EQ( 0,  result );
            result= ms.CompareTo( t,          Case.Sensitive, -2, int.MaxValue,   -2, int.MaxValue );     UT_EQ( 0,  result );
            result= ms.CompareTo( t,          Case.Sensitive, -2, 100,            -2, 99 );               UT_EQ( 0,  result );
            result= ms.CompareTo( t,          Case.Sensitive, -2, 5,              -2, int.MaxValue );     UT_EQ( 1,  result );
            result= ms.CompareTo( t,          Case.Sensitive, -2, int.MaxValue,   -2, 5 );                UT_EQ(-1,  result );

            // greater/smaller strings
            int scRes;
            String greater=     "x";
            String greater2= "abcdef";
            String smaller=  "aaa";
            String smaller2= "abcd";
            result= ms.CompareTo( greater  );            scRes=    t.CompareTo( greater  );    UT_TRUE( (result==0 && scRes==0) || (result<0 && scRes<0) ||(result>0 && scRes>0)   );
            result= ms.CompareTo( greater2 );            scRes=    t.CompareTo( greater2 );    UT_TRUE( (result==0 && scRes==0) || (result<0 && scRes<0) ||(result>0 && scRes>0)   );
            result= ms.CompareTo( smaller  );            scRes=    t.CompareTo( smaller  );    UT_TRUE( (result==0 && scRes==0) || (result<0 && scRes<0) ||(result>0 && scRes>0)   );
            result= ms.CompareTo( smaller2 );            scRes=    t.CompareTo( smaller2 );    UT_TRUE( (result==0 && scRes==0) || (result<0 && scRes<0) ||(result>0 && scRes>0)   );

            // ignore case
            String ut= t.ToUpperInvariant();
            result= ms.CompareTo( ut );                              UT_TRUE( result >  0 );
            result= ms.CompareTo( ut, Case.Sensitive );                       UT_TRUE( result >  0 );
            result= ms.CompareTo( ut, Case.Ignore );                        UT_TRUE( result == 0 );
            result= ms.CompareTo( ut, Case.Sensitive, 2,2,   2,2      );      UT_TRUE( result >  0 );
            result= ms.CompareTo( ut, Case.Ignore,  2,2,   2,2      );      UT_TRUE( result == 0 );


            AString tMS= new AString(); tMS._( t );
            result= ms.CompareTo( tMS      );                            UT_EQ( 0,  result );
            result= ms.CompareTo( tMS, Case.Sensitive, -5, 100, -10, 100      );  UT_EQ( 0,  result );
            result= ms.CompareTo( tMS, Case.Sensitive,  2,   3,   2,   3      );  UT_EQ( 0,  result );

            // different ranges
            String r1=   "*ABCDEF*";
            String r2= "##*ABCDEF*##";
            ms.Clear()._( r1 );
            result= ms.CompareTo( r2, Case.Sensitive, 2,8          );             UT_EQ( 0,  result );
            result= ms.CompareTo( r2, Case.Sensitive, 3,6,   1,6   );             UT_EQ( 0,  result );
        }
        public void IsNull()
        {
            AString ms
            = new AString();    UT_TRUE( ms.Capacity() == 0 ); UT_TRUE(  ms.IsNull() );  UT_TRUE( !ms.IsNotNull() );  UT_TRUE(  ms.IsEmpty() );  UT_TRUE( !ms.IsNotEmpty() );
            ms._("");           UT_TRUE( ms.Capacity() != 0 ); UT_TRUE( !ms.IsNull() );  UT_TRUE(  ms.IsNotNull() );  UT_TRUE(  ms.IsEmpty() );  UT_TRUE( !ms.IsNotEmpty() );
            ms._("x");          UT_TRUE( ms.Capacity() != 0 ); UT_TRUE( !ms.IsNull() );  UT_TRUE(  ms.IsNotNull() );  UT_TRUE( !ms.IsEmpty() );  UT_TRUE(  ms.IsNotEmpty() );

            ms.SetNull();       UT_TRUE( ms.Capacity() == 0 ); UT_TRUE(  ms.IsNull() );  UT_TRUE( !ms.IsNotNull() );  UT_TRUE(  ms.IsEmpty() );  UT_TRUE( !ms.IsNotEmpty() );
            ms._("");           UT_TRUE( ms.Capacity() != 0 ); UT_TRUE( !ms.IsNull() );  UT_TRUE(  ms.IsNotNull() );  UT_TRUE(  ms.IsEmpty() );  UT_TRUE( !ms.IsNotEmpty() );
            ms._("x");          UT_TRUE( ms.Capacity() != 0 ); UT_TRUE( !ms.IsNull() );  UT_TRUE(  ms.IsNotNull() );  UT_TRUE( !ms.IsEmpty() );  UT_TRUE(  ms.IsNotEmpty() );

            ms.SetNull();       UT_TRUE( ms.Capacity() == 0 ); UT_TRUE(  ms.IsNull() );  UT_TRUE( !ms.IsNotNull() );  UT_TRUE(  ms.IsEmpty() );  UT_TRUE( !ms.IsNotEmpty() );
            ms.SetBuffer(5);    UT_TRUE( ms.Capacity() != 0 ); UT_TRUE( !ms.IsNull() );  UT_TRUE(  ms.IsNotNull() );  UT_TRUE(  ms.IsEmpty() );  UT_TRUE( !ms.IsNotEmpty() );
            ms._("x");          UT_TRUE( ms.Capacity() != 0 ); UT_TRUE( !ms.IsNull() );  UT_TRUE(  ms.IsNotNull() );  UT_TRUE( !ms.IsEmpty() );  UT_TRUE(  ms.IsNotEmpty() );
        }
        public void CapacityLength()
        {
            // null-allocated
            {
                String nullString= null;
                AString ms= new AString();              UT_EQ( ms.Capacity(), 0 );
                        ms= new AString( 0 );           UT_EQ( ms.Capacity(), 0 );
                        ms= new AString( nullString );  UT_EQ( ms.Capacity(), 0 );
                ms._( "" );        UT_TRUE( ms.Capacity() > 0 );
            }

            {
                AString ms= new AString( 5 );
                ms._( 'a' );        UT_TRUE ( ms.Capacity() == 5 );
                ms._( 'b' );        UT_TRUE ( ms.Capacity() == 5 );
                ms._( 'c' );        UT_TRUE ( ms.Capacity() == 5 );
                ms._( 'd' );        UT_TRUE ( ms.Capacity() == 5 );
                ms._( 'e' );        UT_TRUE ( ms.Capacity() == 5 );
                ms._( 'x' );
                UT_TRUE ( ms.Capacity() >= 6 );
                UT_EQ( "abcdex", ms );

                ms.EnsureRemainingCapacity( 2000 ); UT_TRUE ( ms.Capacity() >= 2000 );
            }

            {
                AString   ms= new AString();
                int asize;
                ms._( "0123456789" );      UT_EQ    ( ms.Length(), 10 );     UT_TRUE    ( ms.Capacity() >= 10 );

                asize= ms.Capacity();

                Report.GetDefault().PushHaltFlags( false, false );
                    Console.WriteLine( "A warning should follow" );
                    ms.SetLength(20);               UT_EQ    ( ms.Length(), 10 );     UT_EQ  ( ms.Capacity(), asize );    UT_EQ( ms, "0123456789" );

                    ms.SetLength(5);                UT_EQ    ( ms.Length(), 5 );      UT_EQ  ( ms.Capacity(), asize );    UT_EQ( ms, "01234" );
                    ms.SetBuffer(3);            UT_EQ    ( ms.Length(), 3 );      UT_EQ  ( ms.Capacity(), 3  );       UT_EQ( ms, "012" );
                    ms._("ABC");               UT_EQ    ( ms.Length(), 6 );      UT_TRUE( ms.Capacity() >= 6);       UT_EQ( ms, "012ABC" );
                Report.GetDefault().PopHaltFlags();
            }
        }
        public void ConvertIntegers()

        {
            AString a= new AString();
            int pos;
            int posOrig;

            // parse on empty
            a.Clear();
            {
                posOrig= pos= 0;
                UT_EQ(   0,  a.ToInt( posOrig, out pos )  );    UT_EQ( pos, posOrig );
                posOrig= pos= -5;
                UT_EQ(   0,  a.ToInt( posOrig, out pos )  );    UT_EQ( pos, posOrig );
            }

            // parse on non number
            a.Clear()._( "Hello");
            {
                posOrig= pos= 0;    UT_EQ(   0,  a.ToInt( posOrig, out pos )  );    UT_EQ( pos, posOrig );
                posOrig= pos= -5;   UT_EQ(   0,  a.ToInt( posOrig, out pos )  );    UT_EQ( pos, posOrig );
                posOrig= pos= 2;    UT_EQ(   0,  a.ToInt( posOrig, out pos )  );    UT_EQ( pos, posOrig );
            }

            // check that leading whitespaces do not move pointer
            a.Clear()._( "   Hello");
            {
                posOrig= pos= 0;    UT_EQ(   0,  a.ToInt( posOrig, out pos )  );    UT_EQ( pos, posOrig );
                posOrig= pos= -5;   UT_EQ(   0,  a.ToInt( posOrig, out pos )  );    UT_EQ( pos, posOrig );
                posOrig= pos= 2;    UT_EQ(   0,  a.ToInt( posOrig, out pos )  );    UT_EQ( pos, posOrig );
            }

            // parse integers
            {
                a.Clear()._( "123456789");     UT_EQ( 123456789,  a.ToInt  ( 0, out pos ) );      UT_EQ(  0  + a.Length() , pos );
                a.Clear()._( "  123");         UT_EQ( 123,        a.ToInt  ( 0, out pos ) );      UT_EQ(  0  + a.Length() , pos );
                a.Clear()._( "  -23  ");       UT_EQ( -23,        a.ToInt  ( 0, out pos ) );      UT_EQ( -2  + a.Length() , pos );
                a.Clear()._(   "123  ");       UT_EQ( 123,        a.ToInt  ( 0, out pos ) );      UT_EQ( -2  + a.Length() , pos );

                a.Clear()._( "xxx123456789");  UT_EQ( 123456789,  a.ToInt  ( 3, out pos ) );      UT_EQ(  0  + a.Length() , pos );
                a.Clear()._( "xxx  123");      UT_EQ( 123,        a.ToInt  ( 3, out pos ) );      UT_EQ(  0  + a.Length() , pos );
                a.Clear()._( "xxx  123  ");    UT_EQ( 123,        a.ToInt  ( 3, out pos ) );      UT_EQ( -2  + a.Length() , pos );
                a.Clear()._(   "xxx123  ");    UT_EQ( 123,        a.ToInt  ( 3, out pos ) );      UT_EQ( -2  + a.Length() , pos );
            }

                                                                                                            // append int32
            {
                AString ms= new AString();

                uint ui;
                int   i;

                ms.Clear(); ui= 0;              ms._( ui     );   UT_EQ(                    "0",  ms );
                ms.Clear(); ui= 0;              ms._( ui, 1  );   UT_EQ(                    "0",  ms );
                ms.Clear(); ui= 0;              ms._( ui, 3  );   UT_EQ(                  "000",  ms );
                ms.Clear(); ui= 10;             ms._( ui     );   UT_EQ(                   "10",  ms );
                ms.Clear(); ui= 100;            ms._( ui, 1  );   UT_EQ(                  "100",  ms );
                ms.Clear(); ui= 100;            ms._( ui, 3  );   UT_EQ(                  "100",  ms );
                ms.Clear(); ui= 100;            ms._( ui, 4  );   UT_EQ(                 "0100",  ms );
                ms.Clear(); ui= 23;             ms._( ui     );   UT_EQ(                   "23",  ms );
                ms.Clear(); ui= 99;             ms._( ui, 5  );   UT_EQ(                "00099",  ms );
                ms.Clear();  i= 49;             ms._( i      );   UT_EQ(                   "49",  ms );
                ms.Clear();  i= -5;             ms._( i, 5   );   UT_EQ(               "-00005",  ms );
                ms.Clear();  i= -5324;          ms._( i, 2   );   UT_EQ(                "-5324",  ms );
                ms.Clear(); ui= uint.MaxValue;  ms._( ui     );   UT_EQ(           "4294967295",  ms );
                ms.Clear(); ui= uint.MinValue;  ms._( ui     );   UT_EQ(                    "0",  ms );
                ms.Clear();  i=  int.MaxValue;  ms._( i      );   UT_EQ(           "2147483647",  ms );
                ms.Clear();  i=  int.MinValue;  ms._( i      );   UT_EQ(          "-2147483648",  ms );
                ms.Clear(); ui= uint.MaxValue;  ms._( ui, 12 );   UT_EQ(         "004294967295",  ms );
                ms.Clear(); ui= uint.MinValue;  ms._( ui, 12 );   UT_EQ(         "000000000000",  ms );
                ms.Clear();  i=  int.MaxValue;  ms._( i , 12 );   UT_EQ(         "002147483647",  ms );
                ms.Clear();  i=  int.MinValue;  ms._( i , 12 );   UT_EQ(        "-002147483648",  ms );
            }

            // append int64
            {
                AString ms= new AString();

                ulong ui;
                 long  i;

                ms.Clear(); ui= 0;              ms._( ui     );   UT_EQ(                    "0",  ms );
                ms.Clear(); ui= 0;              ms._( ui, 1  );   UT_EQ(                    "0",  ms );
                ms.Clear(); ui= 0;              ms._( ui, 3  );   UT_EQ(                  "000",  ms );
                ms.Clear(); ui= 10;             ms._( ui     );   UT_EQ(                   "10",  ms );
                ms.Clear(); ui= 100;            ms._( ui, 1  );   UT_EQ(                  "100",  ms );
                ms.Clear(); ui= 100;            ms._( ui, 3  );   UT_EQ(                  "100",  ms );
                ms.Clear(); ui= 100;            ms._( ui, 4  );   UT_EQ(                 "0100",  ms );
                ms.Clear(); ui= 23;             ms._( ui     );   UT_EQ(                   "23",  ms );
                ms.Clear(); ui= 99;             ms._( ui, 5  );   UT_EQ(                "00099",  ms );
                ms.Clear();  i= 49;             ms._( i      );   UT_EQ(                   "49",  ms );
                ms.Clear();  i= -5;             ms._( i, 5   );   UT_EQ(               "-00005",  ms );
                ms.Clear();  i= -5324;          ms._( i, 2   );   UT_EQ(                "-5324",  ms );
                ms.Clear(); ui= uint.MaxValue;  ms._( ui     );   UT_EQ(           "4294967295",  ms );
                ms.Clear(); ui= uint.MinValue;  ms._( ui     );   UT_EQ(                    "0",  ms );
                ms.Clear();  i= int.MaxValue;   ms._( i      );   UT_EQ(           "2147483647",  ms );
                ms.Clear();  i= int.MinValue;   ms._( i      );   UT_EQ(          "-2147483648",  ms );
                ms.Clear(); ui= uint.MaxValue;  ms._( ui, 12 );   UT_EQ(         "004294967295",  ms );
                ms.Clear(); ui= uint.MinValue;  ms._( ui, 12 );   UT_EQ(         "000000000000",  ms );
                ms.Clear();  i= int.MaxValue;   ms._( i , 12 );   UT_EQ(         "002147483647",  ms );
                ms.Clear();  i= int.MinValue;   ms._( i , 12 );   UT_EQ(        "-002147483648",  ms );

                ms.Clear(); ui= ulong.MaxValue; ms._( ui     );   UT_EQ( "18446744073709551615",  ms );
                ms.Clear(); ui= ulong.MinValue; ms._( ui     );   UT_EQ(                    "0",  ms );
                ms.Clear();  i= long.MaxValue;  ms._( i      );   UT_EQ(  "9223372036854775807",  ms );
                ms.Clear(); ms.SetBuffer(20);
                             i= long.MinValue;  ms._( i      );   UT_EQ( "-9223372036854775808",  ms );
                ms.Clear();  i= long.MinValue
                                + 75008;        ms._( i      );   UT_EQ( "-9223372036854700800",  ms );
            }

        }