middle of porting; unstable, don't checkout; refs #1

This commit is contained in:
Marc Wäckerlin
2011-12-11 09:35:56 +00:00
parent 3bda8f9e64
commit e5441e3465
32 changed files with 0 additions and 14 deletions

92
test/auto_test.cxx Normal file
View 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
View 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
View File

@@ -0,0 +1,72 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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;
}

View File

@@ -0,0 +1,47 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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;
}

View File

@@ -0,0 +1,24 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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
View File

@@ -0,0 +1,134 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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
View File

@@ -0,0 +1,133 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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;
}

View File

@@ -0,0 +1,244 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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;
}

View File

@@ -0,0 +1,93 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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;
}

View File

@@ -0,0 +1,91 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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
View File

@@ -0,0 +1,63 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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
View File

@@ -0,0 +1,162 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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
View File

@@ -0,0 +1,83 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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
View File

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

49
test/string_test.cxx Normal file
View File

@@ -0,0 +1,49 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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
View File

@@ -0,0 +1 @@
Hallo Welt

74
test/tokenizer_test.cxx Normal file
View File

@@ -0,0 +1,74 @@
/** @file
$Id$
$Date$
$Author$
@copy &copy; Marc W&auml;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;
}