Testing: Updated the testing to the new test framework

This commit is contained in:
Daniel Marjamäki 2008-10-13 06:42:40 +00:00
parent 26549bf916
commit d330eb197a
9 changed files with 310 additions and 257 deletions

View File

@ -2,15 +2,19 @@
#include "tokenize.h"
#include "CommonCheck.h"
#include "CheckBufferOverrun.h"
#include "MiniCppUnit.h"
#include "testsuite.h"
#include <sstream>
extern std::ostringstream errout;
extern bool ShowAll;
class TestBufferOverrun : public TestFixture<TestBufferOverrun>
class TestBufferOverrun : public TestFixture
{
public:
TestBufferOverrun() : TestFixture("TestBufferOverrun")
{ }
private:
void check( const char code[] )
{
@ -31,8 +35,7 @@ private:
CheckBufferOverrun();
}
public:
TEST_FIXTURE( TestBufferOverrun )
void run()
{
TEST_CASE( noerr1 );
TEST_CASE( noerr2 );
@ -316,6 +319,6 @@ public:
};
REGISTER_FIXTURE( TestBufferOverrun )
static TestBufferOverrun testbufferoverrun;

View File

@ -4,16 +4,26 @@
#include "tokenize.h"
#include "CommonCheck.h"
#include "CheckOther.h"
#include "MiniCppUnit.h"
#include "testsuite.h"
#include <sstream>
extern std::ostringstream errout;
extern bool ShowAll;
class TestCharVar : public TestFixture<TestCharVar>
class TestCharVar : public TestFixture
{
public:
TestCharVar() : TestFixture("TestCharVar")
{ }
private:
void run()
{
TEST_CASE( array_index );
TEST_CASE( bitop );
}
void check( const char code[] )
{
// Tokenize..
@ -32,14 +42,6 @@ private:
CheckCharVariable();
}
public:
TEST_FIXTURE( TestCharVar )
{
TEST_CASE( array_index );
TEST_CASE( bitop );
}
void array_index()
{
check( "void foo()\n"
@ -75,5 +77,5 @@ public:
}
};
REGISTER_FIXTURE( TestCharVar )
static TestCharVar testcharvar;

View File

@ -1,95 +1,100 @@
#include "tokenize.h"
#include "CheckClass.h"
#include "MiniCppUnit.h"
#include <sstream>
extern std::ostringstream errout;
class TestConstructors : public TestFixture<TestConstructors>
{
private:
void check( const char code[] )
{
// Tokenize..
tokens = tokens_back = NULL;
std::istringstream istr(code);
TokenizeCode( istr );
SimplifyTokenList();
// Clear the error buffer..
errout.str("");
// Check for memory leaks..
CheckConstructors();
}
public:
TEST_FIXTURE( TestConstructors )
{
TEST_CASE( simple1 );
TEST_CASE( simple2 );
TEST_CASE( simple3 );
TEST_CASE( simple4 );
}
void simple1()
{
check( "class Fred\n"
"{\n"
"public:\n"
" int i;\n"
"};\n" );
ASSERT_EQUALS( std::string("[test.cpp:1] The class 'Fred' has no constructor\n"), errout.str() );
}
void simple2()
{
check( "class Fred\n"
"{\n"
"public:\n"
" Fred() { }\n"
" int i;\n"
"};\n" );
ASSERT_EQUALS( std::string("[test.cpp:4] Uninitialized member variable 'Fred::i'\n"), errout.str() );
}
void simple3()
{
check( "class Fred\n"
"{\n"
"public:\n"
" Fred();\n"
" int i;\n"
"};\n"
"Fred::Fred()\n"
"{ }\n" );
ASSERT_EQUALS( std::string("[test.cpp:7] Uninitialized member variable 'Fred::i'\n"), errout.str() );
}
void simple4()
{
check( "class Fred\n"
"{\n"
"public:\n"
" Fred();\n"
" Fred(int _i);\n"
" int i;\n"
"};\n"
"Fred::Fred()\n"
"{ }\n"
"Fred::Fred(int _i)\n"
"{\n"
" i = _i;\n"
"}\n" );
ASSERT_EQUALS( std::string("[test.cpp:8] Uninitialized member variable 'Fred::i'\n"), errout.str() );
}
};
REGISTER_FIXTURE( TestConstructors )
#include "tokenize.h"
#include "CheckClass.h"
#include "testsuite.h"
#include <sstream>
extern std::ostringstream errout;
class TestConstructors : public TestFixture
{
public:
TestConstructors() : TestFixture("TestConstructors")
{ }
private:
void check( const char code[] )
{
// Tokenize..
tokens = tokens_back = NULL;
std::istringstream istr(code);
TokenizeCode( istr );
SimplifyTokenList();
// Clear the error buffer..
errout.str("");
// Check for memory leaks..
CheckConstructors();
}
void run()
{
TEST_CASE( simple1 );
TEST_CASE( simple2 );
TEST_CASE( simple3 );
TEST_CASE( simple4 );
}
void simple1()
{
check( "class Fred\n"
"{\n"
"public:\n"
" int i;\n"
"};\n" );
std::string actual( errout.str() );
std::string expected( "[test.cpp:1] The class 'Fred' has no constructor\n" );
ASSERT_EQUALS( expected, actual );
}
void simple2()
{
check( "class Fred\n"
"{\n"
"public:\n"
" Fred() { }\n"
" int i;\n"
"};\n" );
ASSERT_EQUALS( std::string("[test.cpp:4] Uninitialized member variable 'Fred::i'\n"), errout.str() );
}
void simple3()
{
check( "class Fred\n"
"{\n"
"public:\n"
" Fred();\n"
" int i;\n"
"};\n"
"Fred::Fred()\n"
"{ }\n" );
ASSERT_EQUALS( std::string("[test.cpp:7] Uninitialized member variable 'Fred::i'\n"), errout.str() );
}
void simple4()
{
check( "class Fred\n"
"{\n"
"public:\n"
" Fred();\n"
" Fred(int _i);\n"
" int i;\n"
"};\n"
"Fred::Fred()\n"
"{ }\n"
"Fred::Fred(int _i)\n"
"{\n"
" i = _i;\n"
"}\n" );
ASSERT_EQUALS( std::string("[test.cpp:8] Uninitialized member variable 'Fred::i'\n"), errout.str() );
}
};
static TestConstructors testconstructors;

View File

@ -5,15 +5,19 @@
#include "tokenize.h"
#include "CheckOther.h"
#include "MiniCppUnit.h"
#include "testsuite.h"
#include <sstream>
extern std::ostringstream errout;
extern bool ShowAll;
class TestDivision : public TestFixture<TestDivision>
class TestDivision : public TestFixture
{
public:
TestDivision() : TestFixture("TestDivision")
{ }
private:
void check( const char code[] )
{
@ -31,8 +35,7 @@ private:
CheckUnsignedDivision();
}
public:
TEST_FIXTURE( TestDivision )
void run()
{
TEST_CASE( division1 );
TEST_CASE( division2 );
@ -125,6 +128,6 @@ public:
}
};
REGISTER_FIXTURE( TestDivision )
static TestDivision testdivision;

View File

@ -1,15 +1,19 @@
#include "tokenize.h"
#include "CheckMemoryLeak.h"
#include "MiniCppUnit.h"
#include "testsuite.h"
#include <sstream>
extern std::ostringstream errout;
extern bool ShowAll;
class TestMemleak : public TestFixture<TestMemleak>
class TestMemleak : public TestFixture
{
public:
TestMemleak() : TestFixture("TestMemleak")
{ }
private:
void check( const char code[] )
{
@ -27,8 +31,7 @@ private:
CheckMemoryLeak();
}
public:
TEST_FIXTURE( TestMemleak )
void run()
{
TEST_CASE( simple1 );
TEST_CASE( simple2 );
@ -58,7 +61,6 @@ public:
TEST_CASE( func2 );
TEST_CASE( class1 );
}
void simple1()
@ -524,6 +526,6 @@ public:
};
REGISTER_FIXTURE( TestMemleak )
static TestMemleak testmemleak;

View File

@ -18,15 +18,15 @@
<CfgParent>Base</CfgParent>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<OutputExt>exe</OutputExt>
<BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
<OutputExt>exe</OutputExt>
<Defines>NO_STRICT</Defines>
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
<DynamicRTL>true</DynamicRTL>
<ILINK_ObjectSearchPath>C:\cppcheck</ILINK_ObjectSearchPath>
<UsePackages>true</UsePackages>
<NoVCL>true</NoVCL>
<ILINK_ObjectSearchPath>C:\cppcheck</ILINK_ObjectSearchPath>
<ProjectType>CppConsoleApplication</ProjectType>
<NoVCL>true</NoVCL>
<FinalOutputDir>.</FinalOutputDir>
<PackageImports>vclx.bpi;vcl.bpi;rtl.bpi;vclactnband.bpi</PackageImports>
<BCC_wpar>false</BCC_wpar>
@ -34,10 +34,10 @@
<ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;C:\cppcheck</ILINK_LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
<DCC_Optimize>false</DCC_Optimize>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
<Defines>_DEBUG;$(Defines)</Defines>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
<BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
<ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
@ -47,8 +47,8 @@
<IntermediateOutputDir>Debug</IntermediateOutputDir>
<TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
<BCC_StackFrames>true</BCC_StackFrames>
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
<ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
<TASM_Debugging>Full</TASM_Debugging>
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
</PropertyGroup>
@ -71,49 +71,49 @@
<ItemGroup>
<CppCompile Include="CheckBufferOverrun.cpp">
<DependentOn>CheckBufferOverrun.h</DependentOn>
<BuildOrder>9</BuildOrder>
<BuildOrder>7</BuildOrder>
</CppCompile>
<CppCompile Include="CheckClass.cpp">
<DependentOn>CheckClass.h</DependentOn>
<BuildOrder>10</BuildOrder>
<BuildOrder>8</BuildOrder>
</CppCompile>
<CppCompile Include="CheckMemoryLeak.cpp">
<DependentOn>CheckMemoryLeak.h</DependentOn>
<BuildOrder>2</BuildOrder>
<BuildOrder>1</BuildOrder>
</CppCompile>
<CppCompile Include="CheckOther.cpp">
<DependentOn>CheckOther.h</DependentOn>
<BuildOrder>11</BuildOrder>
<BuildOrder>9</BuildOrder>
</CppCompile>
<CppCompile Include="CommonCheck.cpp">
<DependentOn>CommonCheck.h</DependentOn>
<BuildOrder>5</BuildOrder>
</CppCompile>
<CppCompile Include="MiniCppUnit.cpp">
<BuildOrder>3</BuildOrder>
</CppCompile>
<CppCompile Include="testbufferoverrun.cpp">
<BuildOrder>7</BuildOrder>
<BuildOrder>5</BuildOrder>
</CppCompile>
<CppCompile Include="testcharvar.cpp">
<DependentOn>testcharvar.h</DependentOn>
<BuildOrder>12</BuildOrder>
<BuildOrder>10</BuildOrder>
</CppCompile>
<CppCompile Include="testconstructors.cpp">
<BuildOrder>8</BuildOrder>
</CppCompile>
<CppCompile Include="testdivision.cpp">
<BuildOrder>6</BuildOrder>
</CppCompile>
<CppCompile Include="testmemleak.cpp">
<CppCompile Include="testdivision.cpp">
<BuildOrder>4</BuildOrder>
</CppCompile>
<CppCompile Include="TestsRunner.cpp">
<BuildOrder>0</BuildOrder>
<CppCompile Include="testmemleak.cpp">
<BuildOrder>2</BuildOrder>
</CppCompile>
<CppCompile Include="testrunner.cpp">
<BuildOrder>11</BuildOrder>
</CppCompile>
<CppCompile Include="testsuite.cpp">
<BuildOrder>12</BuildOrder>
</CppCompile>
<CppCompile Include="tokenize.cpp">
<DependentOn>tokenize.h</DependentOn>
<BuildOrder>1</BuildOrder>
<BuildOrder>0</BuildOrder>
</CppCompile>
<BuildConfiguration Include="Debug">
<Key>Cfg_1</Key>

View File

@ -1,10 +1,18 @@
#include "testsuite.h"
int main()
{
TestSuite::runTests();
return 0;
}
#include "testsuite.h"
#include <string>
#include <vector>
bool ShowAll = false;
bool CheckCodingStyle = true;
extern std::vector<std::string> Files;
int main()
{
Files.push_back( "test.cpp" );
TestFixture::runTests();
return 0;
}

View File

@ -1,75 +1,101 @@
#include "testsuite.h"
#include <iostream>
#include <list>
/**
* TestRegistry
**/
class TestRegistry
{
private:
std::list<TestSuite *> _tests;
public:
static TestRegistry &theInstance()
{
static TestRegistry testreg;
return testreg;
}
void addTest( TestSuite *t )
{
_tests.push_back( t );
}
void removeTest( TestSuite *t )
{
_tests.remove( t );
}
const std::list<TestSuite *> &tests() const
{ return _tests; }
};
/**
* TestSuite
**/
TestSuite::TestSuite(const std::string &_name) : classname(_name)
{
TestRegistry::theInstance().addTest(this);
}
TestSuite::~TestSuite()
{
TestRegistry::theInstance().removeTest(this);
}
void TestSuite::printTests()
{
const std::list<TestSuite *> &tests = TestRegistry::theInstance().tests();
for ( std::list<TestSuite *>::const_iterator it = tests.begin(); it != tests.end(); ++it )
{
std::cout << (*it)->classname << std::endl;
}
}
void TestSuite::runTests()
{
const std::list<TestSuite *> &tests = TestRegistry::theInstance().tests();
for ( std::list<TestSuite *>::const_iterator it = tests.begin(); it != tests.end(); ++it )
{
(*it)->run();
}
}
#include "testsuite.h"
#include <iostream>
#include <list>
/**
* 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 );
}
void removeTest( TestFixture *t )
{
_tests.remove( 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);
}
TestFixture::~TestFixture()
{
TestRegistry::theInstance().removeTest(this);
}
bool TestFixture::runTest(const char testname[])
{
countTests++;
std::cout << classname << "::" << testname << "\n";
return true;
}
void TestFixture::assertFail(const char *filename, int linenr)
{
errmsg << "Assertion failed in " << filename << " at line " << linenr << std::endl;
}
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;
}
}
void TestFixture::runTests()
{
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 )
{
(*it)->run();
}
std::cout << "\n\nTesting Complete\nNumber of tests: " << countTests << "\n";
std::cerr << errmsg.str();
}

View File

@ -1,27 +1,31 @@
#include <iostream>
#include <string>
class TestSuite
{
protected:
std::string classname;
virtual void run() = 0;
public:
TestSuite(const std::string &_name);
~TestSuite();
static void printTests();
static void runTests();
};
#define TEST_CASE( NAME ) std::cout << classname << "::" << #NAME << std::endl; NAME ();
/*
#define ASSERT_EQUALS( EXPECTED , ACTUAL )
*/
#include <sstream>
class TestFixture
{
private:
static std::ostringstream errmsg;
static unsigned int countTests;
protected:
std::string classname;
virtual void run()
{ }
bool runTest(const char testname[]);
void assertFail(const char *filename, int linenr);
public:
TestFixture(const std::string &_name);
~TestFixture();
static void printTests();
static void runTests();
};
#define TEST_CASE( NAME ) if ( runTest(#NAME) ) NAME ();
#define ASSERT_EQUALS( EXPECTED , ACTUAL ) if (EXPECTED!=ACTUAL) assertFail(__FILE__, __LINE__);