/** @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 #include class StdExtTest: public CppUnit::TestFixture { public: void StringConv() { std::string s("Integer="); int i(-7382); CPPUNIT_ASSERT_EQUAL(std::string("Integer=-7382"), s+mrw::string(i)); CPPUNIT_ASSERT_EQUAL(i, mrw::to(mrw::string(i))); } void StringShift() { std::string s("Integer="); int i(4); CPPUNIT_ASSERT_EQUAL(std::string("Integer=4 test 45 xx"), (s<>s2>>s3>>i2); CPPUNIT_ASSERT_EQUAL(std::string("Integer=4"), s2); CPPUNIT_ASSERT_EQUAL(std::string("test"), s3); CPPUNIT_ASSERT_EQUAL(45, i2); CPPUNIT_ASSERT_EQUAL(std::string(" xx"), s); s2=""; s3=""; s>>s2; CPPUNIT_ASSERT_EQUAL(std::string("xx"), s2); CPPUNIT_ASSERT_EQUAL(std::string(), 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_EQUAL(std::string("1236512365c"), s); 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_EQUAL(std::string("a8654865-41236512365c"), s); 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_EQUAL(std::string("a8654865-41236512365c-45684568a"), s); } 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_EQUAL(std::list::size_type(4), l.size()); for (int i=0; i<4; (l.pop_front(), ++i)) { CPPUNIT_ASSERT_EQUAL(i+5, l.front()); } bool exc(false); try { l>>i1; } catch (mrw::length_error&) { exc=true; } CPPUNIT_ASSERT(exc); } void VectorShift() { std::vector l; CPPUNIT_ASSERT_NO_THROW(l<<1<<2<<3<<4<<5<<6<<7<<8); CPPUNIT_ASSERT_EQUAL(std::vector::size_type(8), l.size()); int i1(0), i2(0), i3(0), i4(0); CPPUNIT_ASSERT_NO_THROW(l>>i1>>i2>>i3>>i4); CPPUNIT_ASSERT_EQUAL(std::vector::size_type(4), l.size()); // 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; CPPUNIT_ASSERT_NO_THROW(l<<1<<2<<3<<4<<5<<6<<7<<8); int i1(0), i2(0), i3(0), i4(0); CPPUNIT_ASSERT_NO_THROW(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_EQUAL(std::deque::size_type(4), l.size()); for (int i=0; i<4; (l.erase(l.begin()), ++i)) { CPPUNIT_ASSERT_EQUAL(i+5, l.front()); } 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_EQUAL(std::set::size_type(4), s.size()); 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() { typedef std::map Map; 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_EQUAL(Map::size_type(0), s.size()); 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_EQUAL(std::multiset::size_type(5), s.size()); 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() { typedef std::multimap Map; Map 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_EQUAL(Map::size_type(1), s.size()); s>>i1; CPPUNIT_ASSERT(std::make_pair(2, std::string("two"))==i1); 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 } void Max() { int a1(3), a2(23), a3(2), a4(432), a5(73), a6(32); CPPUNIT_ASSERT_EQUAL(432, mrw::max(a1, a2, a3, a4, a5, a6)); CPPUNIT_ASSERT_EQUAL(432, mrw::max(a1, a2, a3, a4, a5, a6)); CPPUNIT_ASSERT_EQUAL(73, mrw::max(a1, a2, a3, a5, a6)); CPPUNIT_ASSERT_EQUAL(32, mrw::max(a1, a2, a3, a6)); CPPUNIT_ASSERT_EQUAL(23, mrw::max(a1, a2, a3)); CPPUNIT_ASSERT_EQUAL(3, mrw::max(a1, a3)); CPPUNIT_ASSERT_EQUAL(42, mrw::max(3, 42, 6, 1)); } void Min() { int a1(3), a2(23), a3(2), a4(432), a5(73), a6(32); CPPUNIT_ASSERT_EQUAL(2, mrw::min(a1, a2, a3, a4, a5, a6)); CPPUNIT_ASSERT_EQUAL(3, mrw::min(a1, a2, a4, a5, a6)); CPPUNIT_ASSERT_EQUAL(23, mrw::min(a2, a4, a5, a6)); CPPUNIT_ASSERT_EQUAL(32, mrw::min(a4, a5, a6)); CPPUNIT_ASSERT_EQUAL(73, mrw::min(a4, a5)); CPPUNIT_ASSERT_EQUAL(42, mrw::min(323, 42, 126, 91)); } 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(Max); CPPUNIT_TEST(Min); 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: "<