212 lines
4.3 KiB
C++
212 lines
4.3 KiB
C++
|
|
||
|
|
||
|
/*
|
||
|
* A command line based tool to run tests.
|
||
|
* TestRunner expects as its only argument the name of a TestCase class.
|
||
|
* TestRunner prints out a trace as the tests are executed followed by a
|
||
|
* summary at the end.
|
||
|
*
|
||
|
* You can add to the tests that the TestRunner knows about by
|
||
|
* making additional calls to "addTest (...)" in main.
|
||
|
*
|
||
|
* Here is the synopsis:
|
||
|
*
|
||
|
* TestRunner [-wait] ExampleTestCase
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include <iostream>
|
||
|
#include <vector>
|
||
|
|
||
|
#include "TestRunner.h"
|
||
|
#include "MulticasterTest.h"
|
||
|
#include "CHStringtest.h"
|
||
|
#include "autoptrtest.h"
|
||
|
#include <WQLParserTest.h>
|
||
|
#include <wbemcomn\testlib\maintest.h>
|
||
|
#include <maintest.h>
|
||
|
#include <windows.h>
|
||
|
|
||
|
TestAllocator::TestAllocator():size_(0),mem_(HeapCreate(0,0,0)),freze_(false){} ;
|
||
|
TestAllocator::~TestAllocator(){ HeapDestroy(mem_);} ;
|
||
|
|
||
|
TestAllocator * TestAllocator::instance()
|
||
|
{
|
||
|
static TestAllocator tmp;
|
||
|
return &tmp;
|
||
|
}
|
||
|
|
||
|
void * TestAllocator::allocate(size_t n){
|
||
|
if (freze_ && size_< n )
|
||
|
return 0;
|
||
|
void * p = HeapAlloc(mem_,0,n);
|
||
|
if (p!=0)
|
||
|
size_+=n;
|
||
|
return p;
|
||
|
};
|
||
|
|
||
|
void TestAllocator::deallocate(void *p){
|
||
|
if (p == 0)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
size_-=HeapSize(mem_,0,p);
|
||
|
HeapFree(mem_,0,p);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
void* __cdecl operator new(size_t n)
|
||
|
{
|
||
|
return TestAllocator::instance()->allocate(n);
|
||
|
}
|
||
|
|
||
|
void* __cdecl operator new(size_t n, std::nothrow_t&)
|
||
|
{
|
||
|
return TestAllocator::instance()->allocate(n);
|
||
|
}
|
||
|
|
||
|
void __cdecl operator delete(void *p)
|
||
|
{
|
||
|
return TestAllocator::instance()->deallocate(p);
|
||
|
}
|
||
|
|
||
|
void __cdecl operator delete(void *p, std::nothrow_t&)
|
||
|
{
|
||
|
return TestAllocator::instance()->deallocate(p);
|
||
|
}
|
||
|
|
||
|
void* __cdecl operator new[](size_t n)
|
||
|
{
|
||
|
return TestAllocator::instance()->allocate(n);
|
||
|
}
|
||
|
|
||
|
void* __cdecl operator new[](size_t n, std::nothrow_t&)
|
||
|
{
|
||
|
return TestAllocator::instance()->allocate(n);
|
||
|
}
|
||
|
|
||
|
void __cdecl operator delete[](void *p)
|
||
|
{
|
||
|
return TestAllocator::instance()->deallocate(p);
|
||
|
}
|
||
|
|
||
|
void __cdecl operator delete[](void *p, std::nothrow_t&)
|
||
|
{
|
||
|
return TestAllocator::instance()->deallocate(p);
|
||
|
}
|
||
|
*/
|
||
|
TestRunner::TestRunner ():allocator(TestAllocator::instance()),m_wait (false)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
void TestRunner::printBanner ()
|
||
|
{
|
||
|
cout << "Usage: driver [ -wait ] testName, where name is the name of a test case class" << endl;
|
||
|
}
|
||
|
|
||
|
|
||
|
void TestRunner::run (int ac, char **av)
|
||
|
{
|
||
|
string testCase;
|
||
|
int numberOfTests = 0;
|
||
|
|
||
|
for (int i = 1; i < ac; i++) {
|
||
|
|
||
|
if (string (av [i]) == "-wait") {
|
||
|
m_wait = true;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
testCase = av [i];
|
||
|
|
||
|
Test *testToRun = NULL;
|
||
|
|
||
|
if (testCase == "*") {
|
||
|
for (mappings::iterator it = m_mappings.begin ();
|
||
|
it != m_mappings.end ();
|
||
|
++it) {
|
||
|
testToRun = (*it).second;
|
||
|
run (testToRun);
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
if (testCase == "/?" || testCase == "-?" ) {
|
||
|
printBanner ();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
for (mappings::iterator it = m_mappings.begin ();
|
||
|
it != m_mappings.end ();
|
||
|
++it) {
|
||
|
if ((*it).first == testCase) {
|
||
|
testToRun = (*it).second;
|
||
|
run (testToRun);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
numberOfTests++;
|
||
|
|
||
|
if (!testToRun) {
|
||
|
cout << "Test " << testCase << " not found." << endl;
|
||
|
return;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
if (numberOfTests == 0) {
|
||
|
printBanner ();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (m_wait) {
|
||
|
cout << "<RETURN> to continue" << endl;
|
||
|
cin.get ();
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
TestRunner::~TestRunner ()
|
||
|
{
|
||
|
for (mappings::iterator it = m_mappings.begin ();
|
||
|
it != m_mappings.end ();
|
||
|
++it)
|
||
|
it->second->Delete();
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
void TestRunner::run (Test *test)
|
||
|
{
|
||
|
TextTestResult result;
|
||
|
|
||
|
if (test)
|
||
|
test->run (&result);
|
||
|
|
||
|
cout << result << endl;
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
populateRunner(TestRunner& runner)
|
||
|
{
|
||
|
runner.addTest ("MulticasterTest", MulticasterTest::suite ());
|
||
|
runner.addTest ("CHStringTest", CHStringTestCase::suite ());
|
||
|
runner.addTest ("AutoBuffer", autobufferTest::suite());
|
||
|
runner.addTest ("WQLParserTest", WQLParserTest::suite());
|
||
|
runner.addTest ("CoreDllTest", CoreTest::suite());
|
||
|
runner.addTest ("WBEMCommonTest", WBEMCommonTest::suite());
|
||
|
}
|
||
|
|
||
|
|