/** @file
$Id$
$Date$
$Author$
@copy © Marc Wäckerlin
@license LGPL, see file COPYING
$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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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<>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 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 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 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 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 s;
bool exc(false);
try {
s< 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 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 s;
s< 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(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: "<