2008-10-26 08:55:15 +01:00
|
|
|
/*
|
|
|
|
* c++check - c/c++ syntax checking
|
|
|
|
* Copyright (C) 2007 Daniel Marjamäki
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program 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 General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-10-13 08:42:40 +02:00
|
|
|
|
|
|
|
#include "testsuite.h"
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
#include <list>
|
|
|
|
|
2008-11-20 23:19:26 +01:00
|
|
|
std::ostringstream errout;
|
2008-10-13 08:42:40 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* TestRegistry
|
|
|
|
**/
|
|
|
|
|
|
|
|
class TestRegistry
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
std::list<TestFixture *> _tests;
|
|
|
|
|
|
|
|
public:
|
|
|
|
static TestRegistry &theInstance()
|
|
|
|
{
|
|
|
|
static TestRegistry testreg;
|
|
|
|
return testreg;
|
|
|
|
}
|
|
|
|
|
|
|
|
void addTest( TestFixture *t )
|
|
|
|
{
|
|
|
|
_tests.push_back( t );
|
|
|
|
}
|
|
|
|
|
|
|
|
const std::list<TestFixture *> &tests() const
|
|
|
|
{
|
|
|
|
return _tests;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* TestFixture
|
|
|
|
**/
|
|
|
|
|
|
|
|
std::ostringstream TestFixture::errmsg;
|
|
|
|
unsigned int TestFixture::countTests;
|
|
|
|
|
|
|
|
TestFixture::TestFixture(const std::string &_name) : classname(_name)
|
|
|
|
{
|
|
|
|
TestRegistry::theInstance().addTest(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool TestFixture::runTest(const char testname[])
|
|
|
|
{
|
|
|
|
countTests++;
|
|
|
|
std::cout << classname << "::" << testname << "\n";
|
|
|
|
return true;
|
|
|
|
}
|
2008-12-09 01:49:32 +01:00
|
|
|
|
|
|
|
static std::string writestr( const std::string &str )
|
|
|
|
{
|
|
|
|
std::ostringstream ostr;
|
|
|
|
ostr << "\"";
|
|
|
|
for (unsigned int i = 0; i < str.length(); ++i)
|
|
|
|
{
|
|
|
|
char ch = str[i];
|
|
|
|
if ( ch == '\n' )
|
|
|
|
ostr << "\\n";
|
|
|
|
else if ( ch == '\t' )
|
|
|
|
ostr << "\\t";
|
|
|
|
else if ( ch == '\"' )
|
|
|
|
ostr << "\\\"";
|
|
|
|
else
|
|
|
|
ostr << std::string(1, ch);
|
|
|
|
}
|
|
|
|
ostr << "\"";
|
|
|
|
return ostr.str();
|
|
|
|
}
|
2008-10-13 08:42:40 +02:00
|
|
|
|
2008-12-01 19:52:03 +01:00
|
|
|
void TestFixture::assertEquals(const char *filename, int linenr, const std::string &expected, const std::string &actual)
|
2008-12-09 01:49:32 +01:00
|
|
|
{
|
|
|
|
if ( expected != actual )
|
2008-12-01 19:52:03 +01:00
|
|
|
{
|
2008-12-09 01:49:32 +01:00
|
|
|
errmsg << "Assertion failed in " << filename << " at line " << linenr << std::endl
|
|
|
|
<< "Expected:" << std::endl
|
|
|
|
<< writestr(expected) << std::endl
|
|
|
|
<< "Actual:" << std::endl
|
|
|
|
<< writestr(actual) << std::endl;
|
2008-12-01 19:52:03 +01:00
|
|
|
}
|
2008-10-13 08:42:40 +02:00
|
|
|
}
|
|
|
|
|
2008-12-09 01:49:32 +01:00
|
|
|
void TestFixture::assertEquals(const char *filename, int linenr, unsigned int expected, unsigned int actual)
|
|
|
|
{
|
|
|
|
std::ostringstream ostr1;
|
|
|
|
ostr1 << expected;
|
|
|
|
std::ostringstream ostr2;
|
|
|
|
ostr2 << actual;
|
|
|
|
assertEquals( filename, linenr, ostr1.str(), ostr2.str() );
|
2008-12-01 19:52:03 +01:00
|
|
|
}
|
2008-12-09 01:49:32 +01:00
|
|
|
|
2008-10-13 08:42:40 +02:00
|
|
|
void TestFixture::printTests()
|
|
|
|
{
|
|
|
|
const std::list<TestFixture *> &tests = TestRegistry::theInstance().tests();
|
|
|
|
|
|
|
|
for ( std::list<TestFixture *>::const_iterator it = tests.begin(); it != tests.end(); ++it )
|
|
|
|
{
|
|
|
|
std::cout << (*it)->classname << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-10-26 12:11:26 +01:00
|
|
|
void TestFixture::runTests(const char cmd[])
|
2008-10-13 08:42:40 +02:00
|
|
|
{
|
2008-10-26 12:11:26 +01:00
|
|
|
std::string classname(cmd ? cmd : "");
|
|
|
|
std::string testname("");
|
|
|
|
if ( classname.find("::") != std::string::npos )
|
|
|
|
{
|
|
|
|
testname = classname.substr( classname.find("::") + 2 );
|
|
|
|
classname.erase( classname.find("::") );
|
|
|
|
}
|
|
|
|
|
2008-10-13 08:42:40 +02:00
|
|
|
countTests = 0;
|
|
|
|
errmsg.str("");
|
|
|
|
|
|
|
|
const std::list<TestFixture *> &tests = TestRegistry::theInstance().tests();
|
|
|
|
|
|
|
|
for ( std::list<TestFixture *>::const_iterator it = tests.begin(); it != tests.end(); ++it )
|
|
|
|
{
|
2008-10-26 12:11:26 +01:00
|
|
|
if ( classname.empty() || (*it)->classname == classname )
|
|
|
|
(*it)->run();
|
2008-10-13 08:42:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
std::cout << "\n\nTesting Complete\nNumber of tests: " << countTests << "\n";
|
|
|
|
|
|
|
|
std::cerr << errmsg.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-11-23 07:21:44 +01:00
|
|
|
void TestFixture::reportErr( const std::string &errmsg)
|
|
|
|
{
|
|
|
|
errout << errmsg << std::endl;
|
|
|
|
}
|
|
|
|
|
2008-12-09 01:49:32 +01:00
|
|
|
void TestFixture::reportOut( const std::string &outmsg)
|
|
|
|
{
|
|
|
|
// These can probably be ignored
|
|
|
|
}
|