middle of porting; unstable, don't checkout; refs #1
This commit is contained in:
		
							
								
								
									
										92
									
								
								test/auto_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								test/auto_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.5  2005/04/07 20:55:21  marc
 | 
			
		||||
    Oops, there's a make distcheck...? Now it works.
 | 
			
		||||
 | 
			
		||||
    Revision 1.4  2004/11/25 18:27:03  marc
 | 
			
		||||
    additional test for release and reset
 | 
			
		||||
 | 
			
		||||
    Revision 1.3  2004/08/28 16:21:25  marc
 | 
			
		||||
    mrw-c++-0.92 (mrw)
 | 
			
		||||
    - new file: version.cxx
 | 
			
		||||
    - new file header for all sources
 | 
			
		||||
    - work around warning in mrw::auto<T>
 | 
			
		||||
    - possibility to compile without log4cxx
 | 
			
		||||
    - work around bugs in demangle.h and libiberty.h
 | 
			
		||||
    - corrections in documentation
 | 
			
		||||
    - added simple tracing mechanism
 | 
			
		||||
    - more warnings
 | 
			
		||||
    - small corrections in Auto<>::Free and a new test for it
 | 
			
		||||
    - possibility to compile without stack trace
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
#include <mrw/auto.hxx>
 | 
			
		||||
#include <mrw/stdext.hxx> // ifelse
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
#include <fcntl.h> // open
 | 
			
		||||
#include <string.h> // strncpy
 | 
			
		||||
#include <stdlib.h> // getenv
 | 
			
		||||
 | 
			
		||||
class AutoTest: public CppUnit::TestFixture { 
 | 
			
		||||
public: 
 | 
			
		||||
  void AutoFile() {
 | 
			
		||||
    char c(0);
 | 
			
		||||
    int i(-1);
 | 
			
		||||
    {
 | 
			
		||||
      mrw::AutoFile a;
 | 
			
		||||
      CPPUNIT_ASSERT(a==-1); // init as -1
 | 
			
		||||
      i = a = open((std::string(mrw::ifelse(getenv("srcdir"), "."))
 | 
			
		||||
                    +"/test.dat").c_str(), O_RDONLY);
 | 
			
		||||
      CPPUNIT_ASSERT(i==a && a>0); // file is now open
 | 
			
		||||
      mrw::AutoFile b(a);
 | 
			
		||||
      CPPUNIT_ASSERT(a==-1 && i==b); // b has taken ownership
 | 
			
		||||
      CPPUNIT_ASSERT(read(b, &c, 1)==1 && c=='H'); // file is good
 | 
			
		||||
      mrw::AutoFile cc(i);
 | 
			
		||||
      CPPUNIT_ASSERT(i==b && b==cc); // ooops, two owner!
 | 
			
		||||
      cc.release();
 | 
			
		||||
      CPPUNIT_ASSERT(i==b && cc==-1); // it's ok now
 | 
			
		||||
      b = open("test.dat", O_RDONLY);
 | 
			
		||||
      //close(i);
 | 
			
		||||
      CPPUNIT_ASSERT(read(i, &c, 1)==-1); // old file is closed
 | 
			
		||||
      i = b.reset();
 | 
			
		||||
      CPPUNIT_ASSERT(read(i, &c, 1)==-1); // new file is closed
 | 
			
		||||
      i = a = open("test.dat", O_RDONLY);
 | 
			
		||||
    }
 | 
			
		||||
    CPPUNIT_ASSERT(read(i, &c, 1)==-1); // file is closed now
 | 
			
		||||
  }
 | 
			
		||||
  void AutoFree() {
 | 
			
		||||
    const char C[] = "Hello World";
 | 
			
		||||
    mrw::Auto<char*>::Free c(malloc(sizeof(C)));
 | 
			
		||||
    CPPUNIT_ASSERT(c);
 | 
			
		||||
    strncpy(c, C, sizeof(C));
 | 
			
		||||
    CPPUNIT_ASSERT(std::string(c)==C);
 | 
			
		||||
    mrw::Auto<char*>::Free c2(c.release());
 | 
			
		||||
    CPPUNIT_ASSERT(c==0 && c2!=0);
 | 
			
		||||
    CPPUNIT_ASSERT(std::string(c2)==C);
 | 
			
		||||
    c2.reset();
 | 
			
		||||
    CPPUNIT_ASSERT(c2==0);
 | 
			
		||||
  }
 | 
			
		||||
  CPPUNIT_TEST_SUITE(AutoTest);
 | 
			
		||||
  CPPUNIT_TEST(AutoFile);
 | 
			
		||||
  CPPUNIT_TEST(AutoFree);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
};
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(AutoTest);
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										4
									
								
								test/configfile_check.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										4
									
								
								test/configfile_check.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
#! /bin/bash
 | 
			
		||||
 | 
			
		||||
test -z "`diff $srcdir/configfile2.ini $srcdir/configfile.ini.result`" \
 | 
			
		||||
  && rm configfile2.ini
 | 
			
		||||
							
								
								
									
										72
									
								
								test/configfile_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								test/configfile_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.2  2005/04/07 20:55:21  marc
 | 
			
		||||
    Oops, there's a make distcheck...? Now it works.
 | 
			
		||||
 | 
			
		||||
    Revision 1.1  2005/01/07 00:31:38  marc
 | 
			
		||||
    initial version
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <mrw/configfile.hxx>
 | 
			
		||||
#include <mrw/file.hxx>
 | 
			
		||||
#include <mrw/stdext.hxx> // ifelse
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
#include <stdlib.h> // getenv
 | 
			
		||||
 | 
			
		||||
class ConfigFileTest: public CppUnit::TestFixture { 
 | 
			
		||||
public:
 | 
			
		||||
  void CheckFile() {
 | 
			
		||||
    std::string srcdir(mrw::ifelse(getenv("srcdir"), "."));
 | 
			
		||||
    mrw::File::copy(srcdir+"/configfile.ini", "configfile2.ini");
 | 
			
		||||
    mrw::ConfigFileWriter config("configfile2.ini");
 | 
			
		||||
    CPPUNIT_ASSERT(config("", "xxx", ".")=="yyy");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Section", "abc", ".")=="");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Section", "def", ".")=="hallo welt");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Section", "ghi", ".")=="");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Section", "jkl", ".")=="mn\n      op qr\n      st");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Other Section", "1234", ".")=="5678=90");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Other Section", "here we are", ".")
 | 
			
		||||
                   =="some contents");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Other Section", "here", ".")=="");
 | 
			
		||||
    config("", "xxx", ".")="0";
 | 
			
		||||
    config("Section", "abc", ".")="1";
 | 
			
		||||
    CPPUNIT_ASSERT(config("New Section", "a first one", "sgadd")=="sgadd");
 | 
			
		||||
    config("Section", "def", ".")="Und=Tschuess";
 | 
			
		||||
    config("Section", "ghi", ".")="3";
 | 
			
		||||
    config("Section", "jkl", ".")="4";
 | 
			
		||||
    config("Other Section", "1234", ".")="5";
 | 
			
		||||
    config("Other Section", "here we are", ".")="6";
 | 
			
		||||
    config("Other Section", "here", ".")="7";
 | 
			
		||||
    CPPUNIT_ASSERT(config("Other Section", "no no", ".")==".");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Other Section", "no no no", ".")==".");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Other Section", "yes", ".")==".");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Section", "guguseli", "dadaa")=="dadaa");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Section", "guguseli zwei", "dadaa")=="dadaa");
 | 
			
		||||
    CPPUNIT_ASSERT(config("Section", "guguseli drei", "dadaa")=="dadaa");
 | 
			
		||||
    CPPUNIT_ASSERT(config("New Section", "one more", ".")==".");
 | 
			
		||||
  }
 | 
			
		||||
  CPPUNIT_TEST_SUITE(ConfigFileTest);
 | 
			
		||||
  CPPUNIT_TEST(CheckFile);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
};
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(ConfigFileTest);
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										47
									
								
								test/dynamiclibrary_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								test/dynamiclibrary_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.1  2005/02/18 15:53:56  marc
 | 
			
		||||
    initial release
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
         1         2         3         4         5         6         7         8
 | 
			
		||||
    5678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <mrw/dynamiclibrary.hxx>
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
 | 
			
		||||
class DynamicLibraryTest: public CppUnit::TestFixture { 
 | 
			
		||||
  public:
 | 
			
		||||
    void Load() {
 | 
			
		||||
      mrw::DynamicLibrary lib("libdynamiclibrary_testlib");
 | 
			
		||||
      int(*test1)(int) = (int(*)(int))lib.symbol("test1");
 | 
			
		||||
      CPPUNIT_ASSERT((*test1)(2)==4);
 | 
			
		||||
    }
 | 
			
		||||
    void LoadError() {
 | 
			
		||||
      mrw::DynamicLibrary lib("DASist-Sicher_Keine_DynamischePHIPLIOTEEK!!!");
 | 
			
		||||
    }
 | 
			
		||||
    CPPUNIT_TEST_SUITE(DynamicLibraryTest);
 | 
			
		||||
    CPPUNIT_TEST(Load);
 | 
			
		||||
    CPPUNIT_TEST_EXCEPTION(LoadError, mrw::DynamicLibrary::failure);
 | 
			
		||||
    CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
};
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(DynamicLibraryTest);
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								test/dynamiclibrary_testlib.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								test/dynamiclibrary_testlib.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.1  2005/02/18 15:53:55  marc
 | 
			
		||||
    initial release
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
         1         2         3         4         5         6         7         8
 | 
			
		||||
    5678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
extern "C" {
 | 
			
		||||
  int test1(int i) {
 | 
			
		||||
    return i*i;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										134
									
								
								test/exec_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								test/exec_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,134 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.9  2005/04/19 18:48:00  marc
 | 
			
		||||
    new feature PartialExec
 | 
			
		||||
 | 
			
		||||
    Revision 1.8  2005/04/07 20:55:21  marc
 | 
			
		||||
    Oops, there's a make distcheck...? Now it works.
 | 
			
		||||
 | 
			
		||||
    Revision 1.7  2004/12/20 13:21:21  marc
 | 
			
		||||
    exception tests: each exception must be in an own test case
 | 
			
		||||
 | 
			
		||||
    Revision 1.6  2004/12/14 20:30:10  marc
 | 
			
		||||
    added possibility to pass string to stdin of child process
 | 
			
		||||
 | 
			
		||||
    Revision 1.5  2004/10/13 10:43:11  marc
 | 
			
		||||
    test for bad exception specification
 | 
			
		||||
 | 
			
		||||
    Revision 1.4  2004/08/28 16:21:25  marc
 | 
			
		||||
    mrw-c++-0.92 (mrw)
 | 
			
		||||
    - new file: version.cxx
 | 
			
		||||
    - new file header for all sources
 | 
			
		||||
    - work around warning in mrw::auto<T>
 | 
			
		||||
    - possibility to compile without log4cxx
 | 
			
		||||
    - work around bugs in demangle.h and libiberty.h
 | 
			
		||||
    - corrections in documentation
 | 
			
		||||
    - added simple tracing mechanism
 | 
			
		||||
    - more warnings
 | 
			
		||||
    - small corrections in Auto<>::Free and a new test for it
 | 
			
		||||
    - possibility to compile without stack trace
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
#include <mrw/exec.hxx>
 | 
			
		||||
#include <mrw/stacktrace.hxx>
 | 
			
		||||
#include <mrw/stdext.hxx>
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#ifdef __GNUG__
 | 
			
		||||
#define LOG std::clog<<__PRETTY_FUNCTION__<<'@'<<__FILE__<<':'<<__LINE__;
 | 
			
		||||
#else
 | 
			
		||||
#define LOG std::clog<<__FUNCTION__<<'@'<<__FILE__<<':'<<__LINE__;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
class ExecTest: public CppUnit::TestFixture {
 | 
			
		||||
public:
 | 
			
		||||
  void lsTest() {
 | 
			
		||||
    LOG;
 | 
			
		||||
    std::string res = (mrw::Cmd("/bin/ls"), "-l",
 | 
			
		||||
                       std::string(getenv("srcdir"))+"/..").execute();
 | 
			
		||||
    CPPUNIT_ASSERT(res.find("COPYING")<res.size());
 | 
			
		||||
  }
 | 
			
		||||
  void catTest() {
 | 
			
		||||
    LOG;
 | 
			
		||||
    std::string res = mrw::Cmd("/bin/cat").execute("This is a test");
 | 
			
		||||
    CPPUNIT_ASSERT(res=="This is a test");
 | 
			
		||||
  }
 | 
			
		||||
  void excTest1() {
 | 
			
		||||
    LOG;
 | 
			
		||||
    std::string res = (mrw::Cmd("/bin/false")).execute().result();
 | 
			
		||||
  }
 | 
			
		||||
  void excTest2() {
 | 
			
		||||
    LOG;
 | 
			
		||||
    std::string res = (mrw::Cmd("/bin/false")).execute("").result();
 | 
			
		||||
  }
 | 
			
		||||
  void unexpectedExc() throw(std::bad_exception) {
 | 
			
		||||
    LOG;
 | 
			
		||||
    std::string res = (mrw::Cmd("/bin/false")).execute().result();
 | 
			
		||||
  }
 | 
			
		||||
  void lsTest2() {
 | 
			
		||||
    LOG;
 | 
			
		||||
    std::string res;
 | 
			
		||||
    mrw::PartialExec exec = (mrw::Cmd("/bin/ls"), "-l",
 | 
			
		||||
                             std::string(getenv("srcdir"))+"/..").start();
 | 
			
		||||
    while (!exec.finished()) res+=exec.read().first;
 | 
			
		||||
    CPPUNIT_ASSERT(res.find("COPYING")<res.size());
 | 
			
		||||
  }
 | 
			
		||||
  void catTest2() {
 | 
			
		||||
    LOG;
 | 
			
		||||
    mrw::PartialExec exec = mrw::Cmd("/bin/cat").start(true);
 | 
			
		||||
    std::string res = exec.read("This is a test\n").first;
 | 
			
		||||
    res += exec.read("More to come...\n").first;
 | 
			
		||||
    exec.finish();
 | 
			
		||||
    while (!exec.finished()) res+=exec.read().first;
 | 
			
		||||
    CPPUNIT_ASSERT(res=="This is a test\nMore to come...\n");
 | 
			
		||||
  }
 | 
			
		||||
  void excTest12() {
 | 
			
		||||
    LOG;
 | 
			
		||||
    mrw::PartialExec exec = (mrw::Cmd("/bin/false")).start();
 | 
			
		||||
    while (!exec.finished()) exec.read();
 | 
			
		||||
  }
 | 
			
		||||
  void excTest22() {
 | 
			
		||||
    LOG;
 | 
			
		||||
    mrw::PartialExec exec = (mrw::Cmd("/bin/false")).start(true);
 | 
			
		||||
    while (!exec.finished()) exec.read("xxx");
 | 
			
		||||
  }
 | 
			
		||||
  void unexpectedExc2() throw(std::bad_exception) {
 | 
			
		||||
    LOG;
 | 
			
		||||
    mrw::PartialExec exec = (mrw::Cmd("/bin/false")).start();
 | 
			
		||||
    while (!exec.finished()) exec.read();
 | 
			
		||||
  }
 | 
			
		||||
  CPPUNIT_TEST_SUITE(ExecTest);
 | 
			
		||||
  CPPUNIT_TEST(lsTest);
 | 
			
		||||
  CPPUNIT_TEST(catTest);
 | 
			
		||||
  CPPUNIT_TEST_EXCEPTION(excTest1, mrw::ExecutionFailedExc);
 | 
			
		||||
  CPPUNIT_TEST_EXCEPTION(excTest2, mrw::ExecutionFailedExc);
 | 
			
		||||
  CPPUNIT_TEST_EXCEPTION(unexpectedExc, std::bad_exception);
 | 
			
		||||
  CPPUNIT_TEST(lsTest2);
 | 
			
		||||
  CPPUNIT_TEST(catTest2);
 | 
			
		||||
  CPPUNIT_TEST_EXCEPTION(excTest12, mrw::ExecutionFailedExc);
 | 
			
		||||
  CPPUNIT_TEST_EXCEPTION(excTest22, mrw::ExecutionFailedExc);
 | 
			
		||||
  CPPUNIT_TEST_EXCEPTION(unexpectedExc2, std::bad_exception);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
};
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(ExecTest);
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										133
									
								
								test/functiontrace_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								test/functiontrace_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,133 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.3  2005/04/07 20:55:21  marc
 | 
			
		||||
    Oops, there's a make distcheck...? Now it works.
 | 
			
		||||
 | 
			
		||||
    Revision 1.2  2005/03/11 23:18:02  marc
 | 
			
		||||
    bugfix: linenumbers change at checkin...
 | 
			
		||||
 | 
			
		||||
    Revision 1.1  2005/03/11 21:07:55  marc
 | 
			
		||||
    initial version
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
         1         2         3         4         5         6         7         8
 | 
			
		||||
    5678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <mrw/functiontrace.hxx>
 | 
			
		||||
#include <mrw/regexp.hxx>
 | 
			
		||||
#include <mrw/file.hxx>
 | 
			
		||||
#include <log4cxx/propertyconfigurator.h>
 | 
			
		||||
#include <log4cxx/helpers/properties.h>
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
 | 
			
		||||
class A {
 | 
			
		||||
  public:
 | 
			
		||||
    A() {
 | 
			
		||||
      MRW_METHOD("A::A()");
 | 
			
		||||
    }
 | 
			
		||||
    ~A() {
 | 
			
		||||
      MRW_METHOD("A::~A()");
 | 
			
		||||
    }
 | 
			
		||||
    void fn1() {
 | 
			
		||||
      MRW_METHOD("A::fn1()");
 | 
			
		||||
      fn2();
 | 
			
		||||
    }
 | 
			
		||||
    void fn2() {
 | 
			
		||||
      MRW_METHOD("A::fn2()");
 | 
			
		||||
      fn3();
 | 
			
		||||
      fn4();
 | 
			
		||||
    }
 | 
			
		||||
    void fn3() {
 | 
			
		||||
      MRW_METHOD("A::fn3()");
 | 
			
		||||
      fn4();
 | 
			
		||||
    }
 | 
			
		||||
    void fn4(bool flag=true) {
 | 
			
		||||
      MRW_METHOD("A::fn4()");
 | 
			
		||||
      if (flag) fn4(false);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void fn(A a) {
 | 
			
		||||
  MRW_FUNCTION("fn(A)");
 | 
			
		||||
  a.fn1();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class FunctionTraceTest: public CppUnit::TestFixture { 
 | 
			
		||||
  public:
 | 
			
		||||
    void Init() {
 | 
			
		||||
      try {mrw::File::remove("functiontrace_test.log");} catch (...) {}
 | 
			
		||||
      log4cxx::helpers::Properties properties;
 | 
			
		||||
      std::string name, cont;
 | 
			
		||||
      properties.setProperty((name="log4j.rootLogger",
 | 
			
		||||
                              log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                             (cont="DEBUG, A1",
 | 
			
		||||
                              log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
      properties.setProperty((name="log4j.appender.A1",
 | 
			
		||||
                              log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                             (cont="org.apache.log4j.FileAppender",
 | 
			
		||||
                              log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
      properties.setProperty((name="log4j.appender.A1.layout",
 | 
			
		||||
                              log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                             (cont="org.apache.log4j.PatternLayout",
 | 
			
		||||
                              log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
      properties.setProperty((name="log4j.appender.A1.layout.ConversionPattern",
 | 
			
		||||
                              log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                             (cont="%F:%L - %m%n",
 | 
			
		||||
                              log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
      properties.setProperty((name="log4j.appender.A1.filename",
 | 
			
		||||
                              log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                             (cont="functiontrace_test.log",
 | 
			
		||||
                              log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
      log4cxx::PropertyConfigurator::configure(properties);
 | 
			
		||||
    }
 | 
			
		||||
    void Calls() {
 | 
			
		||||
      fn(A());
 | 
			
		||||
      mrw::RegExp match
 | 
			
		||||
        (".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+: \\\\ A::A\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+: / A::A\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ -                  \\\\ fn\\(A\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:  \\\\ A::fn1\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:   \\\\ A::fn2\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:    \\\\ A::fn3\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:     \\\\ A::fn4\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:      \\\\ A::fn4\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:      / A::fn4\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:     / A::fn4\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:    / A::fn3\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:    \\\\ A::fn4\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:     \\\\ A::fn4\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:     / A::fn4\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:    / A::fn4\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:   / A::fn2\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+:  / A::fn1\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ -                  / fn\\(A\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+: \\\\ A::~A\\(\\)\n"
 | 
			
		||||
         ".*functiontrace_test.cxx:[0-9]+ - *0x[0-9a-fA-F]+: / A::~A\\(\\)\n");
 | 
			
		||||
      CPPUNIT_ASSERT(match(mrw::File::read("functiontrace_test.log")));
 | 
			
		||||
      mrw::File::remove("functiontrace_test.log");
 | 
			
		||||
    }
 | 
			
		||||
    CPPUNIT_TEST_SUITE(FunctionTraceTest);
 | 
			
		||||
    CPPUNIT_TEST(Init);
 | 
			
		||||
    CPPUNIT_TEST(Calls);
 | 
			
		||||
    CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
};
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(FunctionTraceTest);
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										244
									
								
								test/mrwautofunctiontracelog4cxx_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								test/mrwautofunctiontracelog4cxx_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,244 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.3  2005/11/29 12:39:42  marc
 | 
			
		||||
    make it compilable with gcc 4.0.2 and newer doxygen
 | 
			
		||||
 | 
			
		||||
    Revision 1.2  2005/04/07 20:42:38  marc
 | 
			
		||||
    renamed loggerhierarchy from mrw.gccfunctiontrace to mrw.fn
 | 
			
		||||
 | 
			
		||||
    Revision 1.1  2005/03/11 21:07:55  marc
 | 
			
		||||
    initial version
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
         1         2         3         4         5         6         7         8
 | 
			
		||||
    5678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <log4cxx/propertyconfigurator.h>
 | 
			
		||||
#include <log4cxx/helpers/properties.h>
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
#include <mrw/file.hxx>
 | 
			
		||||
#include <mrw/regexp.hxx>
 | 
			
		||||
#include <mrw/string.hxx>
 | 
			
		||||
#include <mrw/stacktrace.hxx>
 | 
			
		||||
#include <map>
 | 
			
		||||
 | 
			
		||||
#if (__GNUC__==3 && __GNUC_MINOR__<4 || __GNUC__<3) \
 | 
			
		||||
  && defined(_REENTRANT) && !defined(_MT)
 | 
			
		||||
#define _MT
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace HalloWelt {
 | 
			
		||||
  
 | 
			
		||||
  class A {
 | 
			
		||||
    public:
 | 
			
		||||
      void method() {
 | 
			
		||||
      }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  void fn(int) {
 | 
			
		||||
    A().method();
 | 
			
		||||
    A().method();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void fn1() {
 | 
			
		||||
    fn(1);
 | 
			
		||||
    fn(2);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void anotherFunction() {
 | 
			
		||||
  HalloWelt::fn1();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef _MT
 | 
			
		||||
#include <boost/thread/thread.hxx>
 | 
			
		||||
//#include <unistd.h> // sleep, the one from boost::thread does not work!
 | 
			
		||||
class Thread {
 | 
			
		||||
  public:
 | 
			
		||||
    void operator()() {
 | 
			
		||||
      anotherFunction();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace mrw {
 | 
			
		||||
  class AutoFunctionTraceLog4CxxTest: public CppUnit::TestFixture {
 | 
			
		||||
    public:
 | 
			
		||||
      void testcase() {
 | 
			
		||||
        mrw::StackTrace::createSymtable();
 | 
			
		||||
#ifdef _MT
 | 
			
		||||
        try {mrw::File::remove("mrwautofunctiontracelog4cxx_test-mt.log");}
 | 
			
		||||
#else
 | 
			
		||||
        try {mrw::File::remove("mrwautofunctiontracelog4cxx_test.log");}
 | 
			
		||||
#endif
 | 
			
		||||
        catch (...) {}
 | 
			
		||||
        log4cxx::helpers::Properties properties;
 | 
			
		||||
        std::string name, cont;
 | 
			
		||||
        properties.setProperty((name="log4j.rootLogger",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF, A1",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="DEBUG",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn.global",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn.allocator",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn.std.*",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn.log4cxx",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn.boost",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn.Thread",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn.mrw",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn.std",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn.new",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn.CppUnit",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.logger.mrw.fn.__gnu_cxx",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="OFF",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.appender.A1",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="org.apache.log4j.FileAppender",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.appender.A1.layout",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="org.apache.log4j.PatternLayout",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
#ifdef _MT
 | 
			
		||||
        properties.setProperty((name="log4j.appender.A1.layout.ConversionPattern",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="%t-%-27c%m%n",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.appender.A1.filename",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="mrwautofunctiontracelog4cxx_test-mt.log",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
#else
 | 
			
		||||
        properties.setProperty((name="log4j.appender.A1.layout.ConversionPattern",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="%-27c%m%n",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
        properties.setProperty((name="log4j.appender.A1.filename",
 | 
			
		||||
                                log4cxx::String(name.begin(), name.end())),
 | 
			
		||||
                               (cont="mrwautofunctiontracelog4cxx_test.log",
 | 
			
		||||
                                log4cxx::String(cont.begin(), cont.end())));
 | 
			
		||||
#endif
 | 
			
		||||
        log4cxx::PropertyConfigurator::configure(properties);
 | 
			
		||||
#ifdef _MT
 | 
			
		||||
        // sleep(4); // to be reproducable, wait for "main" flag
 | 
			
		||||
        Thread threadFunction;
 | 
			
		||||
        boost::thread::thread thread1(threadFunction);
 | 
			
		||||
        boost::thread::thread thread2(threadFunction);
 | 
			
		||||
        boost::thread::thread thread3(threadFunction);
 | 
			
		||||
#endif
 | 
			
		||||
        anotherFunction();
 | 
			
		||||
#ifdef _MT
 | 
			
		||||
        thread1.join();
 | 
			
		||||
        thread2.join();
 | 
			
		||||
        thread3.join();
 | 
			
		||||
#endif
 | 
			
		||||
      }
 | 
			
		||||
      void checkfile() {
 | 
			
		||||
        mrw::RegExp match
 | 
			
		||||
          ("^mrw\\.fn\\.anotherFunction     ( ? ? ?)\\\\ anotherFunction\\(\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.fn1       \\1 \\\\ HalloWelt::fn1\\(\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.fn        \\1  \\\\ HalloWelt::fn\\(int\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.A\\.method  \\1   \\\\ HalloWelt::A::method\\(\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.A\\.method  \\1   / HalloWelt::A::method\\(\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.A\\.method  \\1   \\\\ HalloWelt::A::method\\(\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.A\\.method  \\1   / HalloWelt::A::method\\(\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.fn        \\1  / HalloWelt::fn\\(int\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.fn        \\1  \\\\ HalloWelt::fn\\(int\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.A\\.method  \\1   \\\\ HalloWelt::A::method\\(\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.A\\.method  \\1   / HalloWelt::A::method\\(\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.A\\.method  \\1   \\\\ HalloWelt::A::method\\(\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.A\\.method  \\1   / HalloWelt::A::method\\(\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.fn        \\1  / HalloWelt::fn\\(int\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.HalloWelt\\.fn1       \\1 / HalloWelt::fn1\\(\\)\n"
 | 
			
		||||
           "mrw\\.fn\\.anotherFunction     \\1/ anotherFunction\\(\\)\n$");
 | 
			
		||||
#ifdef _MT
 | 
			
		||||
        std::string log(mrw::File::read("mrwautofunctiontracelog4cxx_test-mt.log"));
 | 
			
		||||
        typedef std::map<unsigned long, std::string> Logs;
 | 
			
		||||
        Logs logs;
 | 
			
		||||
        for (std::string::size_type pos(0), last(0);
 | 
			
		||||
             (pos=log.find('\n', pos+1))!=std::string::npos; last=pos) {
 | 
			
		||||
          std::string::size_type dash(log.find('-', last));
 | 
			
		||||
          CPPUNIT_ASSERT_MESSAGE("\"-\" not found",
 | 
			
		||||
                                 dash!=std::string::npos);
 | 
			
		||||
          logs[mrw::to<unsigned long>(log.substr(last, dash-last))] +=
 | 
			
		||||
            log.substr(dash+1, pos-dash);
 | 
			
		||||
        }
 | 
			
		||||
        CPPUNIT_ASSERT_EQUAL((Logs::size_type)4, logs.size()); // 4 threads
 | 
			
		||||
        for (Logs::iterator it(logs.begin()); it!=logs.end(); ++it)
 | 
			
		||||
          CPPUNIT_ASSERT_MESSAGE("The following text does not match the "
 | 
			
		||||
                                 "Expectation:\n--------------------\n"
 | 
			
		||||
                                 +it->second+"--------------------",
 | 
			
		||||
                                 match(it->second));
 | 
			
		||||
        mrw::File::remove("mrwautofunctiontracelog4cxx_test-mt.log");
 | 
			
		||||
#else
 | 
			
		||||
        CPPUNIT_ASSERT_MESSAGE
 | 
			
		||||
          ("The following text does not match the "
 | 
			
		||||
           "Expectation:\n--------------------\n"
 | 
			
		||||
           +mrw::File::read("mrwautofunctiontracelog4cxx_test.log")
 | 
			
		||||
           +"--------------------",
 | 
			
		||||
           match(mrw::File::read("mrwautofunctiontracelog4cxx_test.log")));
 | 
			
		||||
        mrw::File::remove("mrwautofunctiontracelog4cxx_test.log");
 | 
			
		||||
#endif
 | 
			
		||||
      }
 | 
			
		||||
      CPPUNIT_TEST_SUITE(AutoFunctionTraceLog4CxxTest);
 | 
			
		||||
      CPPUNIT_TEST(testcase);
 | 
			
		||||
      CPPUNIT_TEST(checkfile);
 | 
			
		||||
      CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
  };
 | 
			
		||||
  CPPUNIT_TEST_SUITE_REGISTRATION(AutoFunctionTraceLog4CxxTest);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										93
									
								
								test/mrwexclog4cxx_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								test/mrwexclog4cxx_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.2  2004/08/28 16:21:25  marc
 | 
			
		||||
    mrw-c++-0.92 (mrw)
 | 
			
		||||
    - new file: version.cxx
 | 
			
		||||
    - new file header for all sources
 | 
			
		||||
    - work around warning in mrw::auto<T>
 | 
			
		||||
    - possibility to compile without log4cxx
 | 
			
		||||
    - work around bugs in demangle.h and libiberty.h
 | 
			
		||||
    - corrections in documentation
 | 
			
		||||
    - added simple tracing mechanism
 | 
			
		||||
    - more warnings
 | 
			
		||||
    - small corrections in Auto<>::Free and a new test for it
 | 
			
		||||
    - possibility to compile without stack trace
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
#include <mrw/exception.hxx>
 | 
			
		||||
#include <log4cxx/basicconfigurator.h>
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
 | 
			
		||||
namespace mrw {
 | 
			
		||||
  class AutoExcLog4CxxTest: public CppUnit::TestFixture {
 | 
			
		||||
  private:
 | 
			
		||||
    bool enter_unexpectedThrow;
 | 
			
		||||
    bool exit_unexpectedThrow;
 | 
			
		||||
    bool enter_passUnexpected;
 | 
			
		||||
    bool exit_passUnexpected;
 | 
			
		||||
    bool enter_catchUnexpected;
 | 
			
		||||
    bool exit_catchUnexpected;
 | 
			
		||||
  public:
 | 
			
		||||
    void setUp() {
 | 
			
		||||
      enter_unexpectedThrow = false;
 | 
			
		||||
      exit_unexpectedThrow = false;
 | 
			
		||||
      enter_passUnexpected = false;
 | 
			
		||||
      exit_passUnexpected = false;
 | 
			
		||||
      enter_catchUnexpected = false;
 | 
			
		||||
      exit_catchUnexpected = false;
 | 
			
		||||
    }
 | 
			
		||||
    void unexpectedThrow() throw(std::bad_exception) {
 | 
			
		||||
      enter_unexpectedThrow = true;
 | 
			
		||||
      throw mrw::exception();
 | 
			
		||||
      exit_unexpectedThrow = true;
 | 
			
		||||
    }
 | 
			
		||||
    void passUnexpected() throw(std::bad_exception) {
 | 
			
		||||
      enter_passUnexpected = true;
 | 
			
		||||
      unexpectedThrow();
 | 
			
		||||
      exit_passUnexpected = true;
 | 
			
		||||
    }
 | 
			
		||||
    void catchUnexpected() throw() {
 | 
			
		||||
      enter_catchUnexpected = true;
 | 
			
		||||
      bool caught(false);
 | 
			
		||||
      try {
 | 
			
		||||
        passUnexpected();
 | 
			
		||||
      } catch (std::bad_exception&) {
 | 
			
		||||
        caught = true;
 | 
			
		||||
      }
 | 
			
		||||
      CPPUNIT_ASSERT(caught);
 | 
			
		||||
      exit_catchUnexpected = true;
 | 
			
		||||
    }
 | 
			
		||||
    void testcase() {
 | 
			
		||||
      catchUnexpected();
 | 
			
		||||
      CPPUNIT_ASSERT(enter_catchUnexpected &&
 | 
			
		||||
                     enter_passUnexpected &&
 | 
			
		||||
                     enter_unexpectedThrow &&
 | 
			
		||||
                     exit_catchUnexpected &&
 | 
			
		||||
                     !exit_passUnexpected &&
 | 
			
		||||
                     !exit_unexpectedThrow);
 | 
			
		||||
    }
 | 
			
		||||
    CPPUNIT_TEST_SUITE(AutoExcLog4CxxTest);
 | 
			
		||||
    CPPUNIT_TEST(testcase);
 | 
			
		||||
    CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
  };
 | 
			
		||||
  CPPUNIT_TEST_SUITE_REGISTRATION(AutoExcLog4CxxTest);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  log4cxx::BasicConfigurator::configure();
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										91
									
								
								test/mrwexcstderr_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								test/mrwexcstderr_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.2  2004/08/28 16:21:25  marc
 | 
			
		||||
    mrw-c++-0.92 (mrw)
 | 
			
		||||
    - new file: version.cxx
 | 
			
		||||
    - new file header for all sources
 | 
			
		||||
    - work around warning in mrw::auto<T>
 | 
			
		||||
    - possibility to compile without log4cxx
 | 
			
		||||
    - work around bugs in demangle.h and libiberty.h
 | 
			
		||||
    - corrections in documentation
 | 
			
		||||
    - added simple tracing mechanism
 | 
			
		||||
    - more warnings
 | 
			
		||||
    - small corrections in Auto<>::Free and a new test for it
 | 
			
		||||
    - possibility to compile without stack trace
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
#include <mrw/exception.hxx>
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
 | 
			
		||||
namespace mrw {
 | 
			
		||||
  class AutoExcStderrTest: public CppUnit::TestFixture {
 | 
			
		||||
  private:
 | 
			
		||||
    bool enter_unexpectedThrow;
 | 
			
		||||
    bool exit_unexpectedThrow;
 | 
			
		||||
    bool enter_passUnexpected;
 | 
			
		||||
    bool exit_passUnexpected;
 | 
			
		||||
    bool enter_catchUnexpected;
 | 
			
		||||
    bool exit_catchUnexpected;
 | 
			
		||||
  public:
 | 
			
		||||
    void setUp() {
 | 
			
		||||
      enter_unexpectedThrow = false;
 | 
			
		||||
      exit_unexpectedThrow = false;
 | 
			
		||||
      enter_passUnexpected = false;
 | 
			
		||||
      exit_passUnexpected = false;
 | 
			
		||||
      enter_catchUnexpected = false;
 | 
			
		||||
      exit_catchUnexpected = false;
 | 
			
		||||
    }
 | 
			
		||||
    void unexpectedThrow() throw(std::bad_exception) {
 | 
			
		||||
      enter_unexpectedThrow = true;
 | 
			
		||||
      throw mrw::exception();
 | 
			
		||||
      exit_unexpectedThrow = true;
 | 
			
		||||
    }
 | 
			
		||||
    void passUnexpected() throw(std::bad_exception) {
 | 
			
		||||
      enter_passUnexpected = true;
 | 
			
		||||
      unexpectedThrow();
 | 
			
		||||
      exit_passUnexpected = true;
 | 
			
		||||
    }
 | 
			
		||||
    void catchUnexpected() throw() {
 | 
			
		||||
      enter_catchUnexpected = true;
 | 
			
		||||
      bool caught(false);
 | 
			
		||||
      try {
 | 
			
		||||
        passUnexpected();
 | 
			
		||||
      } catch (std::bad_exception&) {
 | 
			
		||||
        caught = true;
 | 
			
		||||
      }
 | 
			
		||||
      CPPUNIT_ASSERT(caught);
 | 
			
		||||
      exit_catchUnexpected = true;
 | 
			
		||||
    }
 | 
			
		||||
    void testcase() {
 | 
			
		||||
      catchUnexpected();
 | 
			
		||||
      CPPUNIT_ASSERT(enter_catchUnexpected &&
 | 
			
		||||
                     enter_passUnexpected &&
 | 
			
		||||
                     enter_unexpectedThrow &&
 | 
			
		||||
                     exit_catchUnexpected &&
 | 
			
		||||
                     !exit_passUnexpected &&
 | 
			
		||||
                     !exit_unexpectedThrow);
 | 
			
		||||
    }
 | 
			
		||||
    CPPUNIT_TEST_SUITE(AutoExcStderrTest);
 | 
			
		||||
    CPPUNIT_TEST(testcase);
 | 
			
		||||
    CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
  };
 | 
			
		||||
  CPPUNIT_TEST_SUITE_REGISTRATION(AutoExcStderrTest);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								test/regexp_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								test/regexp_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.2  2004/12/16 13:09:31  marc
 | 
			
		||||
    possibility to evaluate and extract sub expressions
 | 
			
		||||
 | 
			
		||||
    Revision 1.1  2004/12/14 20:20:30  marc
 | 
			
		||||
    initial version
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <mrw/regexp.hxx>
 | 
			
		||||
#include <mrw/exception.hxx>
 | 
			
		||||
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
 | 
			
		||||
class RegExpTest: public CppUnit::TestFixture { 
 | 
			
		||||
public:
 | 
			
		||||
  void CheckRegExp() {
 | 
			
		||||
    mrw::RegExp findHalloWelt("^Hallo.*Welt$");
 | 
			
		||||
    CPPUNIT_ASSERT(findHalloWelt("Hallo Meine Welt"));
 | 
			
		||||
    CPPUNIT_ASSERT(!findHalloWelt("xxx"));
 | 
			
		||||
    CPPUNIT_ASSERT(!findHalloWelt(""));
 | 
			
		||||
    CPPUNIT_ASSERT(!findHalloWelt(" Hallo Welt "));
 | 
			
		||||
    CPPUNIT_ASSERT(findHalloWelt("HalloWelt"));
 | 
			
		||||
    mrw::RegExp extractTest("^Guten (.*) (Herr|Frau) (.*)$", true);
 | 
			
		||||
    CPPUNIT_ASSERT(extractTest("Guten Tag Frau Zuercher"));
 | 
			
		||||
    CPPUNIT_ASSERT(extractTest[1]=="Tag" &&
 | 
			
		||||
                   extractTest[2]=="Frau" &&
 | 
			
		||||
                   extractTest[3]=="Zuercher");
 | 
			
		||||
  }
 | 
			
		||||
  void ExceptionTest() {
 | 
			
		||||
    mrw::RegExp extractTest("^Guten (.*) (Herr|Frau) (.*)$", true);
 | 
			
		||||
    CPPUNIT_ASSERT(extractTest("Guten Tag Herr Schweizer"));
 | 
			
		||||
    CPPUNIT_ASSERT(extractTest[1]=="Tag" &&
 | 
			
		||||
                   extractTest[2]=="Herr" &&
 | 
			
		||||
                   extractTest[3]=="Schweizer");
 | 
			
		||||
    std::string s = extractTest[4];
 | 
			
		||||
  }
 | 
			
		||||
  CPPUNIT_TEST_SUITE(RegExpTest);
 | 
			
		||||
  CPPUNIT_TEST(CheckRegExp);
 | 
			
		||||
  CPPUNIT_TEST_EXCEPTION(ExceptionTest, mrw::invalid_argument);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
};
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(RegExpTest);
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										162
									
								
								test/smartpointer_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								test/smartpointer_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,162 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.1  2004/08/28 16:13:42  marc
 | 
			
		||||
    mrw-c++-0.92 (mrw)
 | 
			
		||||
    - new file: version.cxx
 | 
			
		||||
    - new file header for all sources
 | 
			
		||||
    - work around warning in mrw::auto<T>
 | 
			
		||||
    - possibility to compile without log4cxx
 | 
			
		||||
    - work around bugs in demangle.h and libiberty.h
 | 
			
		||||
    - corrections in documentation
 | 
			
		||||
    - added simple tracing mechanism
 | 
			
		||||
    - more warnings
 | 
			
		||||
    - small corrections in Auto<>::Free and a new test for it
 | 
			
		||||
    - possibility to compile without stack trace
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
#include <mrw/smartpointer.hxx>
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
class Content {
 | 
			
		||||
private:
 | 
			
		||||
  int& _drop;
 | 
			
		||||
  Content();
 | 
			
		||||
public:
 | 
			
		||||
  Content(int& drop): _drop(drop) {}
 | 
			
		||||
  virtual ~Content() {++_drop;}
 | 
			
		||||
};
 | 
			
		||||
class A: public Content {public: A(int& d): Content(d) {} virtual void fn() {}};
 | 
			
		||||
class B: public A {public: B(int& d): A(d) {}};
 | 
			
		||||
class C: public A {public: C(int& d): A(d) {}};
 | 
			
		||||
class SmartPointerTest:
 | 
			
		||||
  public mrw::SmartPointerParent, public CppUnit::TestFixture {
 | 
			
		||||
public:
 | 
			
		||||
  void SimpleConstructor() {
 | 
			
		||||
    mrw::SmartPointer<Content> p1;
 | 
			
		||||
    CPPUNIT_ASSERT(!(getPointer(p1) || getCounter(p1)));
 | 
			
		||||
  }
 | 
			
		||||
  void CopyConstructor() {
 | 
			
		||||
    mrw::SmartPointer<Content> p1;
 | 
			
		||||
    mrw::SmartPointer<Content> p2(p1);
 | 
			
		||||
    CPPUNIT_ASSERT(!(getPointer(p1) || getCounter(p1) ||
 | 
			
		||||
                     getPointer(p2) || getCounter(p2)));
 | 
			
		||||
  }
 | 
			
		||||
  void PointerConstructor() {
 | 
			
		||||
    int drops(0);
 | 
			
		||||
    mrw::SmartPointer<Content> p1(0);
 | 
			
		||||
    mrw::SmartPointer<Content> p2(new Content(drops));
 | 
			
		||||
    CPPUNIT_ASSERT(!(getPointer(p1) || getCounter(p1) ||
 | 
			
		||||
                     drops!=0 || !getPointer(p2) || !getCounter(p2) ||
 | 
			
		||||
                     getCounter(p2)->get()!=1));
 | 
			
		||||
  }
 | 
			
		||||
  void CastConstructor() {
 | 
			
		||||
    int drops1(0);
 | 
			
		||||
    mrw::SmartPointer<A> pa(new B(drops1));
 | 
			
		||||
    mrw::SmartPointer<B> pb(pa);
 | 
			
		||||
    mrw::SmartPointer<C> pc(pa);
 | 
			
		||||
    mrw::SmartPointer<A> pa2(pb);
 | 
			
		||||
    CPPUNIT_ASSERT(!(drops1!=0 || !getPointer(pa) || !getCounter(pa) ||
 | 
			
		||||
                     getPointer(pb)!=getPointer(pa) ||
 | 
			
		||||
                     getCounter(pb)!=getCounter(pa) ||
 | 
			
		||||
                     getPointer(pc) || getCounter(pc) ||
 | 
			
		||||
                     getCounter(pa)->get()!=3 ||
 | 
			
		||||
                     getPointer(pa2)!=getPointer(pa) ||
 | 
			
		||||
                     getCounter(pa2)!=getCounter(pa)));
 | 
			
		||||
  }
 | 
			
		||||
  void Destructor() {
 | 
			
		||||
    int drops(0);
 | 
			
		||||
    mrw::SmartPointer<Content>* p1 =
 | 
			
		||||
      new mrw::SmartPointer<Content>(new Content(drops));
 | 
			
		||||
    delete p1;
 | 
			
		||||
    CPPUNIT_ASSERT(!(drops!=1));
 | 
			
		||||
  }
 | 
			
		||||
  void CopyAssign() {
 | 
			
		||||
    int drops1(0);
 | 
			
		||||
    int drops2(0);
 | 
			
		||||
    mrw::SmartPointer<Content> p1(new Content(drops1));
 | 
			
		||||
    mrw::SmartPointer<Content> p2(new Content(drops2));
 | 
			
		||||
    p2 = p1;
 | 
			
		||||
    p1 = p2;
 | 
			
		||||
    CPPUNIT_ASSERT(!(drops1!=0 || !getPointer(p1) || !getCounter(p1) ||
 | 
			
		||||
                     getCounter(p1)->get()!=2 ||
 | 
			
		||||
                     getPointer(p1)!=getPointer(p2) ||
 | 
			
		||||
                     drops2!=1 || !getPointer(p2) || !getCounter(p2) ||
 | 
			
		||||
                     getCounter(p2)->get()!=2 ||
 | 
			
		||||
                     getCounter(p1)!=getCounter(p2)));
 | 
			
		||||
  }
 | 
			
		||||
  void PointerAssign() {
 | 
			
		||||
    int drops1(0);
 | 
			
		||||
    int drops2(0);
 | 
			
		||||
    int drops3(0);
 | 
			
		||||
    mrw::SmartPointer<Content> p1(new Content(drops1));
 | 
			
		||||
    mrw::SmartPointer<Content> p2(0);
 | 
			
		||||
    p1 = new Content(drops2);
 | 
			
		||||
    p1 = 0;
 | 
			
		||||
    p2 = new Content(drops3);
 | 
			
		||||
    CPPUNIT_ASSERT(!(drops1!=1 || getPointer(p1) || getCounter(p1) ||
 | 
			
		||||
                     drops2!=1 || !getPointer(p2) || !getCounter(p2) ||
 | 
			
		||||
                     drops3!=0 || getCounter(p2)->get()!=1));
 | 
			
		||||
  }
 | 
			
		||||
  void CastAssign() {
 | 
			
		||||
    int drops1(0);
 | 
			
		||||
    int drops2(0);
 | 
			
		||||
    int drops3(0);
 | 
			
		||||
    mrw::SmartPointer<A> pa(new B(drops1));
 | 
			
		||||
    mrw::SmartPointer<B> pb(new B(drops2));
 | 
			
		||||
    mrw::SmartPointer<C> pc(new C(drops3));
 | 
			
		||||
    pa = pa;
 | 
			
		||||
    pa = pb;
 | 
			
		||||
    pa = pc;
 | 
			
		||||
    pb = pa;
 | 
			
		||||
    pc = pa;
 | 
			
		||||
    CPPUNIT_ASSERT(!(drops1!=1 || drops2!=1 || drops3!=0 ||
 | 
			
		||||
                     !getPointer(pa) || getPointer(pa)!=getPointer(pc) ||
 | 
			
		||||
                     !getCounter(pa) || getCounter(pa)!=getCounter(pc) ||
 | 
			
		||||
                     getCounter(pa)->get()!=2 || getPointer(pb) ||
 | 
			
		||||
                     getCounter(pb)));
 | 
			
		||||
  }
 | 
			
		||||
  void PointerAccess() {
 | 
			
		||||
    mrw::SmartPointer<std::string> p1(new std::string);
 | 
			
		||||
    mrw::SmartPointer<std::string> p2;
 | 
			
		||||
    *p1 = "Hallo Welt!";
 | 
			
		||||
    CPPUNIT_ASSERT(!(p1.operator->()!=&*p1 || p1->find("Welt")!=6 ||
 | 
			
		||||
                     p2.operator->()));
 | 
			
		||||
  }
 | 
			
		||||
  void OperatorBool() {
 | 
			
		||||
    mrw::SmartPointer<std::string> p1(new std::string);
 | 
			
		||||
    mrw::SmartPointer<std::string> p2;
 | 
			
		||||
    CPPUNIT_ASSERT(!(!p1 || p2));
 | 
			
		||||
  }
 | 
			
		||||
  CPPUNIT_TEST_SUITE(SmartPointerTest);
 | 
			
		||||
  CPPUNIT_TEST(SimpleConstructor);
 | 
			
		||||
  CPPUNIT_TEST(CopyConstructor);
 | 
			
		||||
  CPPUNIT_TEST(PointerConstructor);
 | 
			
		||||
  CPPUNIT_TEST(CastConstructor);
 | 
			
		||||
  CPPUNIT_TEST(Destructor);
 | 
			
		||||
  CPPUNIT_TEST(CopyAssign);
 | 
			
		||||
  CPPUNIT_TEST(PointerAssign);
 | 
			
		||||
  CPPUNIT_TEST(CastAssign);
 | 
			
		||||
  CPPUNIT_TEST(PointerAccess);
 | 
			
		||||
  CPPUNIT_TEST(OperatorBool);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
};
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(SmartPointerTest);
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										83
									
								
								test/stacktrace_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								test/stacktrace_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
         1         2         3         4         5         6         7         8
 | 
			
		||||
    5678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <mrw/stacktrace.hxx>
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
 | 
			
		||||
namespace mrw {
 | 
			
		||||
  class StackTraceTest: public CppUnit::TestFixture { 
 | 
			
		||||
  public:
 | 
			
		||||
    /// test if symbols are correctely evaluated
 | 
			
		||||
    void StackTrace() {
 | 
			
		||||
      bool init(mrw::StackTrace::createSymtable());
 | 
			
		||||
      CPPUNIT_ASSERT_MESSAGE("createSymtable() failed! ERROR="
 | 
			
		||||
                             +mrw::StackTrace::error(),
 | 
			
		||||
                             init
 | 
			
		||||
                             ||
 | 
			
		||||
                             mrw::StackTrace::error().find("/valgrind/")
 | 
			
		||||
                             !=std::string::npos);
 | 
			
		||||
      mrw::StackTrace s; int l(__LINE__); std::string f(__FILE__);
 | 
			
		||||
      std::stringstream ss;
 | 
			
		||||
      ss<<f<<':'<<l;
 | 
			
		||||
      std::string st(s);
 | 
			
		||||
      mrw::StackTrace::BinFiles files(mrw::StackTrace::filename());
 | 
			
		||||
      std::string msg("----------------------------------------\n"
 | 
			
		||||
                      "Stacktrace:\n-----------\n"+st+
 | 
			
		||||
                      "Files:\n------\n");
 | 
			
		||||
      for (mrw::StackTrace::BinFiles::iterator it(files.begin());
 | 
			
		||||
           it!=files.end(); ++it)
 | 
			
		||||
        msg += " - \""+it->first+"\"\n";
 | 
			
		||||
      msg += "----------------------------------------\n";
 | 
			
		||||
      std::string::size_type pos(st.find("mrw::StackTraceTest::StackTrace()"));
 | 
			
		||||
      CPPUNIT_ASSERT_MESSAGE("\"mrw::StackTraceTest::StackTrace()\""
 | 
			
		||||
                             " not found!\n"+msg, pos!=std::string::npos);
 | 
			
		||||
      CPPUNIT_ASSERT_MESSAGE('"'+ss.str()+"\" not found!\n"+msg,
 | 
			
		||||
                             st.find(ss.str(), pos) < st.size());
 | 
			
		||||
      CPPUNIT_ASSERT_MESSAGE("\"CppUnit::TestCaller<mrw::StackTraceTest>"
 | 
			
		||||
                             "::runTest()\" not found!\n"+msg,
 | 
			
		||||
                             st.find("CppUnit::TestCaller<mrw::StackTraceTest>"
 | 
			
		||||
                                     "::runTest()")<st.size());
 | 
			
		||||
      // The following test case does not work any more!
 | 
			
		||||
      // Probable reason: The library has been stripped:
 | 
			
		||||
      //     > nm /usr/lib/libcppunit-1.10.so.2.0.0
 | 
			
		||||
      //     nm: /usr/lib/libcppunit-1.10.so.2.0.0: no symbols
 | 
			
		||||
      //     > file /usr/lib/libcppunit-1.10.so.2.0.0
 | 
			
		||||
      //     /usr/lib/libcppunit-1.10.so.2.0.0:
 | 
			
		||||
      //         ELF 32-bit LSB shared object, Intel 80386,
 | 
			
		||||
      //         version 1 (SYSV), stripped
 | 
			
		||||
      //CPPUNIT_ASSERT_MESSAGE("\"CppUnit::TestCase::run\" not found!\n"+msg,
 | 
			
		||||
      //                       st.find("CppUnit::TestCase::run")<st.size());
 | 
			
		||||
      // The folowing test is probably wrong, because the syntax should be
 | 
			
		||||
      // different:
 | 
			
		||||
      //   "????                                                   ????:0"
 | 
			
		||||
      // Anyway, with the problem of stripped libraries, as above, it doesn't
 | 
			
		||||
      // pass anymore, if it is tested correctly...
 | 
			
		||||
      //CPPUNIT_ASSERT_MESSAGE("\"????:0 ????\" should not be in stack!\n"+msg,
 | 
			
		||||
      //                       st.find("????:0 ????")>=st.size());
 | 
			
		||||
    }
 | 
			
		||||
    CPPUNIT_TEST_SUITE(StackTraceTest);
 | 
			
		||||
    CPPUNIT_TEST(StackTrace);
 | 
			
		||||
    CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
  };
 | 
			
		||||
  CPPUNIT_TEST_SUITE_REGISTRATION(StackTraceTest);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										266
									
								
								test/stdext_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								test/stdext_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,266 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wä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() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										49
									
								
								test/string_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								test/string_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
 | 
			
		||||
         1         2         3         4         5         6         7         8
 | 
			
		||||
    5678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
			
		||||
*/
 | 
			
		||||
#include <mrw/string.hxx>
 | 
			
		||||
#include <mrw/list.hxx>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
 | 
			
		||||
class StringTest: public CppUnit::TestFixture { 
 | 
			
		||||
  public:
 | 
			
		||||
    void Join() {
 | 
			
		||||
      std::list<std::string> l;
 | 
			
		||||
      l<<"Hello"<<"World"<<"here"<<"I"<<"am";
 | 
			
		||||
      CPPUNIT_ASSERT(mrw::join(l)=="Hello World here I am");
 | 
			
		||||
    }
 | 
			
		||||
    void Split() {
 | 
			
		||||
      std::string text("Hello World here I am");
 | 
			
		||||
      std::list<std::string> a(mrw::split(text)), b;
 | 
			
		||||
      b<<"Hello"<<"World"<<"here"<<"I"<<"am";
 | 
			
		||||
      CPPUNIT_ASSERT(equal(a.begin(), a.end(), b.begin()));
 | 
			
		||||
    }
 | 
			
		||||
    CPPUNIT_TEST_SUITE(StringTest);
 | 
			
		||||
    CPPUNIT_TEST(Join);
 | 
			
		||||
    CPPUNIT_TEST(Split);
 | 
			
		||||
    CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
};
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(StringTest);
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								test/test.dat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/test.dat
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
Hallo Welt
 | 
			
		||||
							
								
								
									
										74
									
								
								test/tokenizer_test.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								test/tokenizer_test.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
/** @file
 | 
			
		||||
 | 
			
		||||
    $Id$
 | 
			
		||||
 | 
			
		||||
    $Date$
 | 
			
		||||
    $Author$
 | 
			
		||||
 | 
			
		||||
    @copy © Marc Wäckerlin
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.2  2005/01/07 00:35:17  marc
 | 
			
		||||
    initial version
 | 
			
		||||
 | 
			
		||||
    Revision 1.1  2004/12/17 16:26:58  marc
 | 
			
		||||
    initial version
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <mrw/tokenizer.hxx>
 | 
			
		||||
#include <mrw/list.hxx>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
			
		||||
 | 
			
		||||
class TokenizerTest: public CppUnit::TestFixture { 
 | 
			
		||||
public:
 | 
			
		||||
  void CheckNonGreedy() {
 | 
			
		||||
    const std::string aux[] = {"first", "second", "third", "", "fifth"};
 | 
			
		||||
    std::list<std::string> a(aux, aux+sizeof(aux)/sizeof(std::string)), b;
 | 
			
		||||
    mrw::Tokenizer token("first,second,third,,fifth", false, ",");
 | 
			
		||||
    while (token) b<<token();
 | 
			
		||||
    CPPUNIT_ASSERT(equal(a.begin(), a.end(), b.begin()));
 | 
			
		||||
  }
 | 
			
		||||
  void CheckGreedy() {
 | 
			
		||||
    const std::string aux[] = {"Hello", "world", "here", "I", "am"};
 | 
			
		||||
    std::list<std::string> a(aux, aux+sizeof(aux)/sizeof(std::string)), b;
 | 
			
		||||
    mrw::Tokenizer token("Hello world, here I am!", true, " \t\n,.?!");
 | 
			
		||||
    while (token) b<<token();
 | 
			
		||||
    CPPUNIT_ASSERT(equal(a.begin(), a.end(), b.begin()));
 | 
			
		||||
  }
 | 
			
		||||
  void CheckReset() {
 | 
			
		||||
    const std::string aux[] = {"first", "second", "third", "", "fifth"};
 | 
			
		||||
    std::list<std::string> a(aux, aux+sizeof(aux)/sizeof(std::string)), b;
 | 
			
		||||
    mrw::Tokenizer token("first,second,third,,fifth", false, ",");
 | 
			
		||||
    while (token) b<<token();
 | 
			
		||||
    CPPUNIT_ASSERT(equal(a.begin(), a.end(), b.begin()));
 | 
			
		||||
    const std::string aux2[] = {"a", "b", "c", "d", "e"};
 | 
			
		||||
    std::list<std::string> a2(aux2, aux2+sizeof(aux2)/sizeof(std::string)),
 | 
			
		||||
      b2, b3;
 | 
			
		||||
    token.reset("a,b,c,d,e");
 | 
			
		||||
    while (token) b2<<token();
 | 
			
		||||
    CPPUNIT_ASSERT(equal(a2.begin(), a2.end(), b2.begin()));
 | 
			
		||||
    token.reset();
 | 
			
		||||
    while (token) b3<<token();
 | 
			
		||||
    CPPUNIT_ASSERT(equal(a2.begin(), a2.end(), b3.begin()));
 | 
			
		||||
  }
 | 
			
		||||
  CPPUNIT_TEST_SUITE(TokenizerTest);
 | 
			
		||||
  CPPUNIT_TEST(CheckNonGreedy);
 | 
			
		||||
  CPPUNIT_TEST(CheckGreedy);
 | 
			
		||||
  CPPUNIT_TEST(CheckReset);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
};
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(TokenizerTest);
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  CppUnit::TextUi::TestRunner runner;
 | 
			
		||||
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
			
		||||
  return runner.run() ? 0 : 1;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user