/** @file
$ Id $
$ Date $
$ Author $
@ copy & copy ; Marc W & auml ; ckerlin
@ license LGPL , see file < a href = " license.html " > COPYING < / a >
$ Log $
Revision 1.3 2004 / 12 / 20 13 : 23 : 00 marc
new tests for string exceptions
Revision 1.2 2004 / 10 / 13 11 : 19 : 22 marc
remove stdout , print stack trace
Revision 1.1 2004 / 10 / 07 09 : 31 : 30 marc
new feature
*/
# include <mrw/string.hxx>
# include <mrw/list.hxx>
# include <mrw/vector.hxx>
# include <mrw/deque.hxx>
# include <mrw/set.hxx>
# include <mrw/map.hxx>
# include <mrw/multiset.hxx>
# include <mrw/multimap.hxx>
# include <mrw/stacktrace.hxx>
# include <cppunit/TestFixture.h>
# include <cppunit/ui/text/TestRunner.h>
# include <cppunit/extensions/HelperMacros.h>
# include <cppunit/extensions/TestFactoryRegistry.h>
class StdExtTest : public CppUnit : : TestFixture {
public :
void StringConv ( ) {
std : : string s ( " Integer= " ) ;
int i ( 4 ) ;
CPPUNIT_ASSERT ( s + mrw : : string ( i ) = = " Integer=4 " ) ;
}
void StringShift ( ) {
std : : string s ( " Integer= " ) ;
int i ( 4 ) ;
CPPUNIT_ASSERT ( ( s < < i < < " test " < < 4 < < ( long ) 5 < < " xx " ) = = " Integer=4 test 45 xx " ) ;
int i2 = 0 ;
std : : string s2 , s3 ;
s > > s2 > > s3 > > i2 ;
CPPUNIT_ASSERT ( s2 = = " Integer=4 " ) ;
CPPUNIT_ASSERT ( s3 = = " test " ) ;
CPPUNIT_ASSERT ( i2 = = 45 ) ;
CPPUNIT_ASSERT ( s = = " xx " ) ;
s2 = " " ; s3 = " " ;
s > > s2 ;
CPPUNIT_ASSERT ( s2 = = " xx " ) ;
CPPUNIT_ASSERT ( s = = " " ) ;
}
void StringAdd ( ) {
std : : string s ;
s = s + ( signed short ) 1 + ( signed int ) 2 + ( signed long ) 3 + ( signed char ) ' A ' +
( unsigned short ) 1 + ( unsigned int ) 2 + ( unsigned long ) 3 + ( unsigned char ) ' A ' + ' c ' ;
CPPUNIT_ASSERT ( s = = " 1236512365c " ) ;
s = ( signed short ) - 4 + s ;
s = ( signed int ) 5 + s ;
s = ( signed long ) 6 + s ;
s = ( signed char ) 8 + s ;
s = ( unsigned short ) 4 + s ;
s = ( unsigned int ) 5 + s ;
s = ( unsigned long ) 6 + s ;
s = ( unsigned char ) 8 + s ;
s = ' a ' + s ;
CPPUNIT_ASSERT ( s = = " a8654865-41236512365c " ) ;
s + = ( signed short ) - 4 ;
s + = ( signed int ) 5 ;
s + = ( signed long ) 6 ;
s + = ( signed char ) 8 ;
s + = ( unsigned short ) 4 ;
s + = ( unsigned int ) 5 ;
s + = ( unsigned long ) 6 ;
s + = ( unsigned char ) 8 ;
s + = ' a ' ;
CPPUNIT_ASSERT ( s = = " a8654865-41236512365c-45684568a " ) ;
}
void ListShift ( ) {
std : : list < int > l ;
l < < 1 < < 2 < < 3 < < 4 < < 5 < < 6 < < 7 < < 8 ;
int i1 ( 0 ) , i2 ( 0 ) , i3 ( 0 ) , i4 ( 0 ) ;
l > > i1 > > i2 > > i3 > > i4 ;
// now: i1==1 i2==2 i3==3 i4==4 l=={5, 6, 7, 8}
CPPUNIT_ASSERT ( i1 = = 1 & & i2 = = 2 & & i3 = = 3 & & i4 = = 4 ) ;
CPPUNIT_ASSERT ( l . size ( ) = = 4 ) ;
for ( int i = 0 ; i < 4 ; ( l . pop_front ( ) , + + i ) ) {
CPPUNIT_ASSERT ( l . front ( ) = = i + 5 ) ;
}
bool exc ( false ) ;
try {
l > > i1 ;
} catch ( mrw : : length_error & ) {
exc = true ;
}
CPPUNIT_ASSERT ( exc ) ;
}
void VectorShift ( ) {
std : : vector < int > l ;
l < < 1 < < 2 < < 3 < < 4 < < 5 < < 6 < < 7 < < 8 ;
int i1 ( 0 ) , i2 ( 0 ) , i3 ( 0 ) , i4 ( 0 ) ;
l > > i1 > > i2 > > i3 > > i4 ;
// now: i1==1 i2==2 i3==3 i4==4 l=={5, 6, 7, 8}
CPPUNIT_ASSERT ( i1 = = 1 & & i2 = = 2 & & i3 = = 3 & & i4 = = 4 ) ;
CPPUNIT_ASSERT ( l . size ( ) = = 4 ) ;
for ( int i = 0 ; i < 4 ; ( l . erase ( l . begin ( ) ) , + + i ) ) {
CPPUNIT_ASSERT ( l . front ( ) = = i + 5 ) ;
}
bool exc ( false ) ;
try {
l > > i1 ;
} catch ( mrw : : length_error & ) {
exc = true ;
}
CPPUNIT_ASSERT ( exc ) ;
}
void DequeShift ( ) {
std : : deque < int > l ;
l < < 1 < < 2 < < 3 < < 4 < < 5 < < 6 < < 7 < < 8 ;
int i1 ( 0 ) , i2 ( 0 ) , i3 ( 0 ) , i4 ( 0 ) ;
l > > i1 > > i2 > > i3 > > i4 ;
// now: i1==1 i2==2 i3==3 i4==4 l=={5, 6, 7, 8}
CPPUNIT_ASSERT ( i1 = = 1 & & i2 = = 2 & & i3 = = 3 & & i4 = = 4 ) ;
CPPUNIT_ASSERT ( l . size ( ) = = 4 ) ;
for ( int i = 0 ; i < 4 ; ( l . erase ( l . begin ( ) ) , + + i ) ) {
CPPUNIT_ASSERT ( l . front ( ) = = i + 5 ) ;
}
bool exc ( false ) ;
try {
l > > i1 ;
} catch ( mrw : : length_error & ) {
exc = true ;
}
CPPUNIT_ASSERT ( exc ) ;
}
void SetShift ( ) {
std : : set < int > s ;
bool exc ( false ) ;
try {
s < < 1 < < 2 < < 3 < < 4 < < 5 < < 6 < < 7 < < 8 < < 8 ;
} catch ( mrw : : invalid_argument & e ) {
mrw : : StackTrace : : createSymtable ( ) ;
exc = true ;
}
CPPUNIT_ASSERT ( exc ) ;
int i1 ( 0 ) , i2 ( 0 ) , i3 ( 0 ) , i4 ( 0 ) ;
s > > i1 > > i2 > > i3 > > i4 ;
// now: i1==1 i2==2 i3==3 i4==4 s=={5, 6, 7, 8}
CPPUNIT_ASSERT ( i1 = = 1 & & i2 = = 2 & & i3 = = 3 & & i4 = = 4 ) ;
CPPUNIT_ASSERT ( s . size ( ) = = 4 ) ;
for ( int i = 0 ; i < 4 ; + + i ) {
CPPUNIT_ASSERT ( s . find ( i + 5 ) ! = s . end ( ) ) ;
}
s . erase ( s . begin ( ) , s . end ( ) ) ;
exc = false ;
try {
s > > i1 ;
} catch ( mrw : : length_error & ) {
exc = true ;
}
CPPUNIT_ASSERT ( exc ) ;
}
void MapShift ( ) {
std : : map < int , std : : string > s ;
bool exc ( false ) ;
try {
s < < std : : make_pair ( 1 , std : : string ( " one " ) )
< < std : : make_pair ( 2 , std : : string ( " two " ) )
< < std : : make_pair ( 2 , std : : string ( " two " ) ) ;
} catch ( mrw : : invalid_argument & e ) {
exc = true ;
}
CPPUNIT_ASSERT ( exc ) ;
std : : pair < int , std : : string > i1 , i2 ;
s > > i1 > > i2 ;
// now: i1==1 i2==2 i3==3 i4==4 s=={5, 6, 7, 8}
CPPUNIT_ASSERT ( i1 = = std : : make_pair ( 1 , std : : string ( " one " ) ) & &
i2 = = std : : make_pair ( 2 , std : : string ( " two " ) ) ) ;
CPPUNIT_ASSERT ( s . size ( ) = = 0 ) ;
exc = false ;
try {
s > > i1 ;
} catch ( mrw : : length_error & ) {
exc = true ;
}
CPPUNIT_ASSERT ( exc ) ;
}
void MultisetShift ( ) {
std : : multiset < int > s ;
s < < 1 < < 2 < < 3 < < 4 < < 5 < < 6 < < 7 < < 8 < < 9 ;
int i1 ( 0 ) , i2 ( 0 ) , i3 ( 0 ) , i4 ( 0 ) ;
s > > i1 > > i2 > > i3 > > i4 ;
// now: i1==1 i2==2 i3==3 i4==4 s=={5, 6, 7, 8}
CPPUNIT_ASSERT ( i1 = = 1 & & i2 = = 2 & & i3 = = 3 & & i4 = = 4 ) ;
CPPUNIT_ASSERT ( s . size ( ) = = 5 ) ;
for ( int i = 0 ; i < 5 ; + + i ) {
CPPUNIT_ASSERT ( s . find ( i + 5 ) ! = s . end ( ) ) ;
}
s . erase ( s . begin ( ) , s . end ( ) ) ;
bool exc ( false ) ;
try {
s > > i1 ;
} catch ( mrw : : length_error & ) {
exc = true ;
}
CPPUNIT_ASSERT ( exc ) ;
}
void MultimapShift ( ) {
std : : multimap < int , std : : string > s ;
s < < std : : make_pair ( 1 , std : : string ( " one " ) )
< < std : : make_pair ( 2 , std : : string ( " two " ) )
< < std : : make_pair ( 2 , std : : string ( " two " ) ) ;
std : : pair < int , std : : string > i1 , i2 ;
s > > i1 > > i2 ;
// now: i1==1 i2==2 i3==3 i4==4 s=={5, 6, 7, 8}
CPPUNIT_ASSERT ( i1 = = std : : make_pair ( 1 , std : : string ( " one " ) ) & &
i2 = = std : : make_pair ( 2 , std : : string ( " two " ) ) ) ;
CPPUNIT_ASSERT ( s . size ( ) = = 1 ) ;
s > > i1 ;
CPPUNIT_ASSERT ( i1 = = std : : make_pair ( 2 , std : : string ( " two " ) ) ) ;
bool exc ( false ) ;
try {
s > > i1 ;
} catch ( mrw : : length_error & ) {
exc = true ;
}
CPPUNIT_ASSERT ( exc ) ;
}
void StringException1 ( ) {
std : : string s ( " Hello World " ) ;
int hello ;
s > > hello ; // not an int, exception expected
}
void StringException2 ( ) {
std : : string s ( " Hello World " ) ;
mrw : : to < int > ( s ) ; // not an int, exception expected
}
CPPUNIT_TEST_SUITE ( StdExtTest ) ;
CPPUNIT_TEST ( StringConv ) ;
CPPUNIT_TEST ( StringShift ) ;
CPPUNIT_TEST ( StringAdd ) ;
CPPUNIT_TEST ( ListShift ) ;
CPPUNIT_TEST ( VectorShift ) ;
CPPUNIT_TEST ( DequeShift ) ;
CPPUNIT_TEST ( SetShift ) ;
CPPUNIT_TEST ( MapShift ) ;
CPPUNIT_TEST ( MultisetShift ) ;
CPPUNIT_TEST ( MultimapShift ) ;
CPPUNIT_TEST_EXCEPTION ( StringException1 , mrw : : invalid_argument ) ;
CPPUNIT_TEST_EXCEPTION ( StringException2 , mrw : : invalid_argument ) ;
CPPUNIT_TEST_SUITE_END ( ) ;
} ;
CPPUNIT_TEST_SUITE_REGISTRATION ( StdExtTest ) ;
int main ( int argc , char * * argv ) try {
std : : ofstream ofs ( ( * argv + std : : string ( " .xml " ) ) . c_str ( ) ) ;
CppUnit : : TextUi : : TestRunner runner ;
runner . setOutputter ( new CppUnit : : XmlOutputter ( & runner . result ( ) , ofs ) ) ;
runner . addTest ( CppUnit : : TestFactoryRegistry : : getRegistry ( ) . makeTest ( ) ) ;
return runner . run ( ) ? 0 : 1 ;
} catch ( std : : exception & e ) {
std : : cerr < < " ***Exception: " < < e . what ( ) < < std : : endl ;
return 1 ;
}