You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
arts/tests/test.h

131 lines
3.7 KiB

/*
Copyright (C) 2000 Stefan Westerfeld
stefan@space.twc.de
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef ARTS_TESTS_H
#define ARTS_TESTS_H
#include <string>
#include <list>
#include <iostream>
#include <stdio.h>
const char *noTest = "noTest";
const char *noClass = "noClass";
const char *currentClass = noClass;
const char *currentTest = noTest;
#define testCaption() \
fprintf (stderr,"\n %s::%s (%s:%d)\n", \
currentClass, currentTest, __FILE__, __LINE__);
#define testAssert(expr) \
if (!(expr)) { \
testCaption(); \
fprintf (stderr," => test assertion failed: (%s)\n", #expr); \
exit(1); \
}
template<typename T1, typename T2>
inline void testEqualsCheck(const T1& expected, const T2& got,
const char *file, int line, const char *expr, const char *expr2)
{
if(! (static_cast<T2>(expected) == got) ) {
std::cerr << std::endl
<< " " << currentClass << "::" << currentTest
<< " (" << file << ":" << line << ")" << std::endl
<< " => test assertion failed:"
<< " (" << expr << " == " << expr2 << ")" << std::endl
<< " => expected '" << expected << "'" << " got "
<< "'" << got << "'." << std::endl;
exit(1);
}
}
#define testEquals(expr, expr2) \
testEqualsCheck(expr, expr2, __FILE__, __LINE__, #expr, #expr2)
#define TEST(func) \
struct t ## func : TestClass \
{ \
t ## func() { \
if(!tests) tests = new list<TestClass *>; \
tests->push_back(this); \
} \
void invoke() { \
currentTest = #func; \
instance->func(); \
currentTest = noTest; \
} \
} i ## func; \
void func()
struct TestClass {
virtual void invoke() = 0;
};
struct TestCase {
virtual void setUp() { };
virtual void tearDown() { };
virtual ~TestCase() { };
};
#define TESTCASE(name) \
static list<TestClass *> *tests; \
static name *instance; \
name () { \
instance = this; \
} \
void testAll() { \
currentClass = #name; \
list<TestClass *>::iterator i; \
for(i = tests->begin(); i != tests->end(); i++) \
{ \
setUp(); \
(*i)->invoke(); \
tearDown(); \
} \
currentClass = noClass; \
} \
int count() { \
return tests->size(); \
}
#define TESTMAINFUNC(name,func) \
name *name::instance = 0; \
list<TestClass *> *name::tests = 0; \
int func() \
{ \
name tb; \
fprintf(stderr,"%-20s: %5d test methods - ", \
#name,tb.count()); \
tb.testAll(); \
return 0; \
}
#define TESTMAIN(name) TESTMAINFUNC(name,main)
#endif // ARTS_TESTS_H