/* * 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 #include #include "TestRunner.h" #include "MulticasterTest.h" #include "CHStringtest.h" #include "autoptrtest.h" #include #include #include #include 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 << " 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()); }