From 8c73f1cf3b024b9a8dcc0ebc3a0720c3248c65e1 Mon Sep 17 00:00:00 2001 From: Brian Cox Date: Sun, 3 Sep 2017 20:28:24 -0700 Subject: [PATCH] Rework unit test framework (such as it is) to refer to tests by name & not numeric id. Mark tests as skipped if they don't make any TEST assertions or are skipped explicitly --- src/twtest/archive_t.cpp | 4 + src/twtest/blockfile_t.cpp | 6 + src/twtest/blockrecordarray_t.cpp | 4 + src/twtest/charutil_t.cpp | 12 +- src/twtest/cmdlineparser_t.cpp | 7 + src/twtest/codeconvert_t.cpp | 12 +- src/twtest/configfile_t.cpp | 6 + src/twtest/cryptoarchive_t.cpp | 5 +- src/twtest/crytpo_t.cpp | 5 + src/twtest/dbdatasource_t.cpp | 5 + src/twtest/debug_t.cpp | 5 +- src/twtest/displayencoder_t.cpp | 23 +- src/twtest/error_t.cpp | 5 + src/twtest/errorbucketimpl_t.cpp | 4 + src/twtest/fcocompare_t.cpp | 5 + src/twtest/fcodatabasefile_t.cpp | 7 + src/twtest/fconame_t.cpp | 5 +- src/twtest/fconametbl_t.cpp | 5 + src/twtest/fconametranslator_t.cpp | 4 + src/twtest/fcopropimpl_t.cpp | 4 + src/twtest/fcopropvector_t.cpp | 5 + src/twtest/fcoreport_t.cpp | 4 + src/twtest/fcosetimpl_t.cpp | 4 + src/twtest/fcospec_t.cpp | 5 + src/twtest/fcospecattr_t.cpp | 5 + src/twtest/fcospechelper_t.cpp | 5 + src/twtest/fcospeclist_t.cpp | 4 + src/twtest/fcospecutil_t.cpp | 5 + src/twtest/file_t.cpp | 4 + src/twtest/fileheader_t.cpp | 5 + src/twtest/fileutil_t.cpp | 4 + src/twtest/fsdatasourceiter_t.cpp | 5 + src/twtest/fsobject_t.cpp | 7 + src/twtest/fspropcalc_t.cpp | 6 +- src/twtest/fspropdisplayer_t.cpp | 4 + src/twtest/fspropset_t.cpp | 5 + src/twtest/fsspec_t.cpp | 4 + src/twtest/genre_t.cpp | 29 +- src/twtest/genrespeclist_t.cpp | 9 + src/twtest/genreswitcher_t.cpp | 31 +- src/twtest/growheap_t.cpp | 4 + src/twtest/hashtable_t.cpp | 15 +- src/twtest/hierdatabase_t.cpp | 5 + src/twtest/keyfile_t.cpp | 4 + src/twtest/platform_t.cpp | 7 + src/twtest/policyparser_t.cpp | 8 +- src/twtest/refcountobj_t.cpp | 5 + src/twtest/resources_t.cpp | 5 +- src/twtest/serializer_t.cpp | 6 + src/twtest/serializerimpl_t.cpp | 4 + src/twtest/signature_t.cpp | 4 + src/twtest/srefcountobj_t.cpp | 4 + src/twtest/stringencoder_t.cpp | 4 + src/twtest/stringutil_t.h | 5 + src/twtest/tasktimer_t.cpp | 6 + src/twtest/tchar_t.cpp | 5 + src/twtest/test.cpp | 492 +++++++++++++++++------------ src/twtest/test.h | 17 +- src/twtest/textreportviewer_t.cpp | 6 +- src/twtest/twlocale_t.cpp | 8 + src/twtest/twutil_t.cpp | 5 + src/twtest/types_t.cpp | 5 + src/twtest/unixfsservices_t.cpp | 5 +- src/twtest/usernotifystdout_t.cpp | 6 + src/twtest/wchar16_t.cpp | 5 + 65 files changed, 650 insertions(+), 273 deletions(-) diff --git a/src/twtest/archive_t.cpp b/src/twtest/archive_t.cpp index e2e479d..3db5e8a 100644 --- a/src/twtest/archive_t.cpp +++ b/src/twtest/archive_t.cpp @@ -186,3 +186,7 @@ void TestArchive() } } +void RegisterSuite_Archive() +{ + RegisterTest("Archive", "Basic", TestArchive); +} diff --git a/src/twtest/blockfile_t.cpp b/src/twtest/blockfile_t.cpp index 9fb8712..9788af3 100644 --- a/src/twtest/blockfile_t.cpp +++ b/src/twtest/blockfile_t.cpp @@ -109,3 +109,9 @@ void TestBlockFile() bf.Close(); } + +void RegisterSuite_BlockFile() +{ + RegisterTest("BlockFile", "Basic", TestBlockFile); +} + diff --git a/src/twtest/blockrecordarray_t.cpp b/src/twtest/blockrecordarray_t.cpp index 4242f98..a1a3b34 100644 --- a/src/twtest/blockrecordarray_t.cpp +++ b/src/twtest/blockrecordarray_t.cpp @@ -125,3 +125,7 @@ void TestBlockRecordArray() #endif } +void RegisterSuite_BlockRecordArray() +{ + RegisterTest("BlockRecordArray", "Basic", TestBlockRecordArray); +} diff --git a/src/twtest/charutil_t.cpp b/src/twtest/charutil_t.cpp index c55d7cc..827f5ef 100644 --- a/src/twtest/charutil_t.cpp +++ b/src/twtest/charutil_t.cpp @@ -75,11 +75,7 @@ void TestCharUtilBasic() PrintChars( _T("fo\x23 54") ); } - -/* -TSS_BeginTestSuiteFrom( cCharEncoderTest ) - - TSS_AddTestCase( Basic ); - -TSS_EndTestSuite( cCharEncoderTest ) -*/ +void RegisterSuite_CharUtil() +{ + RegisterTest("CharUtil", "Basic", TestCharUtilBasic); +} diff --git a/src/twtest/cmdlineparser_t.cpp b/src/twtest/cmdlineparser_t.cpp index a58de3e..d4898de 100644 --- a/src/twtest/cmdlineparser_t.cpp +++ b/src/twtest/cmdlineparser_t.cpp @@ -161,3 +161,10 @@ void TestCmdLineParser() // TODO -- test a bunch more!!! } +void RegisterSuite_CmdLineParser() +{ + RegisterTest("CmdLineParser", "Basic", TestCmdLineParser); +} + + + diff --git a/src/twtest/codeconvert_t.cpp b/src/twtest/codeconvert_t.cpp index a5947f0..7700f0d 100644 --- a/src/twtest/codeconvert_t.cpp +++ b/src/twtest/codeconvert_t.cpp @@ -185,7 +185,8 @@ char NonZeroChar( char ch ) //TestMbToDb in codeconvert_t.cpp seems to hit an infinite loop or runs verrrry long; ifdef'd" void TestMbToDb() { - TCERR << "\nTODO: TestMbToDb in codeconvert_t.cpp is flaky & needs to be fixed/replaced; currently disabled." << std::endl; + skip("This test is flaky & needs to be fixed/replaced; currently disabled."); + #if 0 std::string s; s.resize( 0x10000 * 2 ); // two bytes for each combination @@ -240,7 +241,8 @@ void TestMbToDb() // dbchar_t to mbchar_t void TestDbToMb() { - TCERR << "\nTODO: TestDbToMb in codeconvert_t.cpp fails, most likely due to not speaking UTF-16. Should fix this." << std::endl; + skip("This test fails, most likely due to not speaking UTF-16. Should fix this."); + #if 0 wc16_string ws; wc16_string::size_type n; @@ -344,4 +346,8 @@ bool LowASCIILooksLikeUCS2InWchart() } #endif - +void RegisterSuite_CodeConvert() +{ + RegisterTest("CodeConvert", "MbToDb", TestMbToDb); + RegisterTest("CodeConvert", "DbToMb", TestDbToMb); +} diff --git a/src/twtest/configfile_t.cpp b/src/twtest/configfile_t.cpp index 2e7b479..d62b03e 100644 --- a/src/twtest/configfile_t.cpp +++ b/src/twtest/configfile_t.cpp @@ -177,3 +177,9 @@ void TestConfigFile2(void) d.TraceDetail("Tests Passed!\n"); //#endif // NOT_BRIANS_TEST } + +void RegisterSuite_ConfigFile() +{ + RegisterTest("ConfigFile", "Basic 1", TestConfigFile); + RegisterTest("ConfigFile", "Basic 2", TestConfigFile2); +} diff --git a/src/twtest/cryptoarchive_t.cpp b/src/twtest/cryptoarchive_t.cpp index 292a9a4..3b754a4 100644 --- a/src/twtest/cryptoarchive_t.cpp +++ b/src/twtest/cryptoarchive_t.cpp @@ -299,4 +299,7 @@ void TestCryptoArchive() #endif } - +void RegisterSuite_CryptoArchive() +{ + RegisterTest("CryptoArchive", "Basic", TestCryptoArchive); +} diff --git a/src/twtest/crytpo_t.cpp b/src/twtest/crytpo_t.cpp index d3a0be2..018f4bb 100644 --- a/src/twtest/crytpo_t.cpp +++ b/src/twtest/crytpo_t.cpp @@ -416,3 +416,8 @@ void TestCrypto() } } +void RegisterSuite_Crypto() +{ + RegisterTest("Crypto", "Basic", TestCrypto); +} + diff --git a/src/twtest/dbdatasource_t.cpp b/src/twtest/dbdatasource_t.cpp index 52680f9..c5d5b73 100644 --- a/src/twtest/dbdatasource_t.cpp +++ b/src/twtest/dbdatasource_t.cpp @@ -212,3 +212,8 @@ void TestDbDataSourceBasic() db.AssertAllBlocksValid(); #endif } + +void RegisterSuite_DbDataSource() +{ + RegisterTest("DbDataSource", "Basic", TestDbDataSourceBasic); +} diff --git a/src/twtest/debug_t.cpp b/src/twtest/debug_t.cpp index ad0d9f6..2b3be0f 100644 --- a/src/twtest/debug_t.cpp +++ b/src/twtest/debug_t.cpp @@ -90,4 +90,7 @@ void TestDebug() d.TraceDebug("Exiting...\n"); } - +void RegisterSuite_Debug() +{ + RegisterTest("Debug", "Basic", TestDebug); +} diff --git a/src/twtest/displayencoder_t.cpp b/src/twtest/displayencoder_t.cpp index 3ec8406..df98865 100644 --- a/src/twtest/displayencoder_t.cpp +++ b/src/twtest/displayencoder_t.cpp @@ -321,17 +321,16 @@ void TestDisplayEncoderBasic() // make sure there are '\' and '"' in it ) } -/*TSS_BeginTestSuiteFrom( cDisplayEncoderTest ) - - TSS_AddTestCase( Basic ); - TSS_AddTestCase( TestHexToChar ); - TSS_AddTestCase( TestCharToHex ); - TSS_AddTestCase( TestStringToHex ); - TSS_AddTestCase( TestHexToString ); - TSS_AddTestCase( TestUnconvertable ); - TSS_AddTestCase( TestUnprintable ); - TSS_AddTestCase( TestQuoteAndBackSlash ); - -TSS_EndTestSuite( cDisplayEncoderTest )*/ +void RegisterSuite_DisplayEncoder() +{ + RegisterTest("DisplayEncoder", "Basic", TestDisplayEncoderBasic); + RegisterTest("DisplayEncoder", "CharToHex", TestCharToHex); + RegisterTest("DisplayEncoder", "HexToChar", TestHexToChar); + RegisterTest("DisplayEncoder", "StringToHex", TestStringToHex); + RegisterTest("DisplayEncoder", "HexToString", TestHexToString); + //RegisterTest("DisplayEncoder", "Unconvertable", TestUnconvertable); + //RegisterTest("DisplayEncoder", "Unprintable", TestUnprintable); + RegisterTest("DisplayEncoder", "QuoteAndBackSlash", TestQuoteAndBackSlash); +} diff --git a/src/twtest/error_t.cpp b/src/twtest/error_t.cpp index 4ab7e35..f3ed526 100644 --- a/src/twtest/error_t.cpp +++ b/src/twtest/error_t.cpp @@ -81,3 +81,8 @@ void TestError() TEST(threw); } + +void RegisterSuite_Error() +{ + RegisterTest("Error", "Basic", TestError); +} diff --git a/src/twtest/errorbucketimpl_t.cpp b/src/twtest/errorbucketimpl_t.cpp index 2a677c2..0ab4184 100644 --- a/src/twtest/errorbucketimpl_t.cpp +++ b/src/twtest/errorbucketimpl_t.cpp @@ -143,3 +143,7 @@ void TestErrorBucketImpl() } +void RegisterSuite_ErrorBucketImpl() +{ + RegisterTest("ErrorBucketImpl", "Basic", TestErrorBucketImpl); +} diff --git a/src/twtest/fcocompare_t.cpp b/src/twtest/fcocompare_t.cpp index f4580ba..752a8f4 100644 --- a/src/twtest/fcocompare_t.cpp +++ b/src/twtest/fcocompare_t.cpp @@ -158,3 +158,8 @@ void TestFCOCompare() return; } + +void RegisterSuite_FCOCompare() +{ + RegisterTest("FCOCompare", "Basic", TestFCOCompare); +} diff --git a/src/twtest/fcodatabasefile_t.cpp b/src/twtest/fcodatabasefile_t.cpp index 551ba15..0e1d19f 100644 --- a/src/twtest/fcodatabasefile_t.cpp +++ b/src/twtest/fcodatabasefile_t.cpp @@ -32,9 +32,16 @@ // fcodatabasefile.cpp #include "tw/stdtw.h" #include "tw/fcodatabasefile.h" +#include "test.h" void TestFCODatabaseFile() { cDebug d("TestFCODatabaseFile"); d.TraceError("Implement this!\n"); + skip("TestFCODatabaseFile not implemented"); +} + +void RegisterSuite_FCODatabaseFile() +{ + RegisterTest("FCODatabaseFile", "Basic", TestFCODatabaseFile); } diff --git a/src/twtest/fconame_t.cpp b/src/twtest/fconame_t.cpp index 4be3a5b..7ef2f54 100644 --- a/src/twtest/fconame_t.cpp +++ b/src/twtest/fconame_t.cpp @@ -139,4 +139,7 @@ void TestFCOName() } } - +void RegisterSuite_FCOName() +{ + RegisterTest("FCOName", "Basic", TestFCOName); +} diff --git a/src/twtest/fconametbl_t.cpp b/src/twtest/fconametbl_t.cpp index b1bba5f..a0e2dbd 100644 --- a/src/twtest/fconametbl_t.cpp +++ b/src/twtest/fconametbl_t.cpp @@ -61,3 +61,8 @@ void TestFCONameTbl() pNode4->Release(); pNode5->Release(); } + +void RegisterSuite_FCONameTbl() +{ + RegisterTest("FCONameTbl", "Basic", TestFCONameTbl); +} diff --git a/src/twtest/fconametranslator_t.cpp b/src/twtest/fconametranslator_t.cpp index 2a32416..fd4bae3 100644 --- a/src/twtest/fconametranslator_t.cpp +++ b/src/twtest/fconametranslator_t.cpp @@ -115,3 +115,7 @@ void TestUnprintable( const TCHAR* pchName, const TCHAR* pchGenre ) TEST( fcoNameNew == fcoName ); } +void RegisterSuite_FCONameTranslator() +{ + RegisterTest("FCONameTranslator", "Basic", TestFCONameTranslator); +} diff --git a/src/twtest/fcopropimpl_t.cpp b/src/twtest/fcopropimpl_t.cpp index 8cda935..492a36f 100644 --- a/src/twtest/fcopropimpl_t.cpp +++ b/src/twtest/fcopropimpl_t.cpp @@ -94,3 +94,7 @@ void TestFCOPropImpl() return; } +void RegisterSuite_FCOPropImpl() +{ + RegisterTest("FCOPropImpl", "Basic", TestFCOPropImpl); +} diff --git a/src/twtest/fcopropvector_t.cpp b/src/twtest/fcopropvector_t.cpp index 699a085..5b4bf27 100644 --- a/src/twtest/fcopropvector_t.cpp +++ b/src/twtest/fcopropvector_t.cpp @@ -192,3 +192,8 @@ static void objManip (cFCOPropVector &testV, cDebug& d) v3.AddItem(3); TEST((v1 ^ v2) == v3); } + +void RegisterSuite_FCOPropVector() +{ + RegisterTest("FCOPropVector", "Basic", TestFCOPropVector); +} diff --git a/src/twtest/fcoreport_t.cpp b/src/twtest/fcoreport_t.cpp index 8dfea82..1a91220 100644 --- a/src/twtest/fcoreport_t.cpp +++ b/src/twtest/fcoreport_t.cpp @@ -171,3 +171,7 @@ void TestFCOReport() d.TraceDebug("Leaving...\n"); } +void RegisterSuite_FCOReport() +{ + RegisterTest("FCOReport", "Basic", TestFCOReport); +} diff --git a/src/twtest/fcosetimpl_t.cpp b/src/twtest/fcosetimpl_t.cpp index 153e0d0..b840958 100644 --- a/src/twtest/fcosetimpl_t.cpp +++ b/src/twtest/fcosetimpl_t.cpp @@ -155,3 +155,7 @@ void TestFCOSetImpl() } +void RegisterSuite_FCOSetImpl() +{ + RegisterTest("FCOSetImpl", "Basic", TestFCOSetImpl); +} diff --git a/src/twtest/fcospec_t.cpp b/src/twtest/fcospec_t.cpp index 251f4e5..86725d1 100644 --- a/src/twtest/fcospec_t.cpp +++ b/src/twtest/fcospec_t.cpp @@ -51,3 +51,8 @@ void TestFCOSpec() cout << "End\tTestFCOSpec" << endl; return; } + +void RegisterSuite_FCOSpec() +{ + RegisterTest("FCOSpec", "Basic", TestFCOSpec); +} diff --git a/src/twtest/fcospecattr_t.cpp b/src/twtest/fcospecattr_t.cpp index ffe9148..6ffc8fe 100644 --- a/src/twtest/fcospecattr_t.cpp +++ b/src/twtest/fcospecattr_t.cpp @@ -88,3 +88,8 @@ void TestFCOSpecAttr() pNew->Release(); pAttr->Release(); } + +void RegisterSuite_FCOSpecAttr() +{ + RegisterTest("FCOSpecAttr", "Basic", TestFCOSpecAttr); +} diff --git a/src/twtest/fcospechelper_t.cpp b/src/twtest/fcospechelper_t.cpp index 30ba8ce..5b86505 100644 --- a/src/twtest/fcospechelper_t.cpp +++ b/src/twtest/fcospechelper_t.cpp @@ -129,3 +129,8 @@ void TestFCOSpecHelper() delete pHelp1; delete pHelp2; } + +void RegisterSuite_FCOSpecHelper() +{ + RegisterTest("FCOSpecHelper", "Basic", TestFCOSpecHelper); +} diff --git a/src/twtest/fcospeclist_t.cpp b/src/twtest/fcospeclist_t.cpp index 8f06705..e5557c7 100644 --- a/src/twtest/fcospeclist_t.cpp +++ b/src/twtest/fcospeclist_t.cpp @@ -164,3 +164,7 @@ void TestFCOSpecList() return; } +void RegisterSuite_FCOSpecList() +{ + RegisterTest("FCOSpecList", "Basic", TestFCOSpecList); +} diff --git a/src/twtest/fcospecutil_t.cpp b/src/twtest/fcospecutil_t.cpp index 19979a7..4dbace8 100644 --- a/src/twtest/fcospecutil_t.cpp +++ b/src/twtest/fcospecutil_t.cpp @@ -80,3 +80,8 @@ void TestFcoSpecUtil() d.TraceDebug("Leaving..\n"); } + +void RegisterSuite_FcoSpecUtil() +{ + RegisterTest("FcoSpecUtil", "Basic", TestFcoSpecUtil); +} diff --git a/src/twtest/file_t.cpp b/src/twtest/file_t.cpp index 9700b83..1e55a96 100644 --- a/src/twtest/file_t.cpp +++ b/src/twtest/file_t.cpp @@ -58,3 +58,7 @@ void TestFile() TEST(testStream); } +void RegisterSuite_File() +{ + RegisterTest("File", "Basic", TestFile); +} diff --git a/src/twtest/fileheader_t.cpp b/src/twtest/fileheader_t.cpp index b2d0160..f4000b3 100644 --- a/src/twtest/fileheader_t.cpp +++ b/src/twtest/fileheader_t.cpp @@ -126,3 +126,8 @@ void TestFileHeader() TEST(memcmp(buf, "abc123", 6) == 0); } } + +void RegisterSuite_FileHeader() +{ + RegisterTest("FileHeader", "Basic", TestFileHeader); +} diff --git a/src/twtest/fileutil_t.cpp b/src/twtest/fileutil_t.cpp index b71a824..007c797 100644 --- a/src/twtest/fileutil_t.cpp +++ b/src/twtest/fileutil_t.cpp @@ -71,3 +71,7 @@ void TestFileUtil() unlink(source.c_str()); } +void RegisterSuite_FileUtil() +{ + RegisterTest("FileUtil", "Basic", TestFileUtil); +} diff --git a/src/twtest/fsdatasourceiter_t.cpp b/src/twtest/fsdatasourceiter_t.cpp index e462629..1917128 100644 --- a/src/twtest/fsdatasourceiter_t.cpp +++ b/src/twtest/fsdatasourceiter_t.cpp @@ -108,4 +108,9 @@ void TestFSDataSourceIter() PrintIter( iter, d ); } +void RegisterSuite_FSDataSourceIter() +{ + RegisterTest("FSDataSourceIter", "Basic", TestFSDataSourceIter); +} + diff --git a/src/twtest/fsobject_t.cpp b/src/twtest/fsobject_t.cpp index d486895..28d5fdd 100644 --- a/src/twtest/fsobject_t.cpp +++ b/src/twtest/fsobject_t.cpp @@ -32,9 +32,16 @@ // fsobject_t -- the file system object test driver #include "fs/stdfs.h" #include "fs/fsobject.h" +#include "test.h" void TestFSObject() { cDebug d("TestFSObject"); d.TraceError("Implement this!\n"); + skip("TestFSObject not implemented"); +} + +void RegisterSuite_FSObject() +{ + RegisterTest("FSObject", "Basic", TestFSObject); } diff --git a/src/twtest/fspropcalc_t.cpp b/src/twtest/fspropcalc_t.cpp index b98af3e..2699b2b 100644 --- a/src/twtest/fspropcalc_t.cpp +++ b/src/twtest/fspropcalc_t.cpp @@ -155,4 +155,8 @@ void TestGetSymLinkStr() TEST(arch.Length() == (int64)file.size()); } - +void RegisterSuite_FSPropCalc() +{ + RegisterTest("FSPropCalc", "Basic", TestFSPropCalc); + RegisterTest("FSPropCalc", "GetSymLinkStr", TestGetSymLinkStr); +} diff --git a/src/twtest/fspropdisplayer_t.cpp b/src/twtest/fspropdisplayer_t.cpp index a654df0..d1fdf82 100644 --- a/src/twtest/fspropdisplayer_t.cpp +++ b/src/twtest/fspropdisplayer_t.cpp @@ -133,3 +133,7 @@ void cTestFSPropDisplayer::Test() return; } +void RegisterSuite_FSPropDisplayer() +{ + RegisterTest("FSPropDisplayer", "Basic", TestFSPropDisplayer); +} diff --git a/src/twtest/fspropset_t.cpp b/src/twtest/fspropset_t.cpp index 269b447..89914d6 100644 --- a/src/twtest/fspropset_t.cpp +++ b/src/twtest/fspropset_t.cpp @@ -92,3 +92,8 @@ void TestFSPropSet() return; } + +void RegisterSuite_FSPropSet() +{ + RegisterTest("FSPropSet", "Basic", TestFSPropSet); +} diff --git a/src/twtest/fsspec_t.cpp b/src/twtest/fsspec_t.cpp index c115988..aca91ca 100644 --- a/src/twtest/fsspec_t.cpp +++ b/src/twtest/fsspec_t.cpp @@ -102,3 +102,7 @@ void TestFCOSpecImpl() pSpec->Release(); } +void RegisterSuite_FCOSpecImpl() +{ + RegisterTest("FCOSpecImpl", "Basic", TestFCOSpecImpl); +} diff --git a/src/twtest/genre_t.cpp b/src/twtest/genre_t.cpp index 2f425d8..e9f3395 100644 --- a/src/twtest/genre_t.cpp +++ b/src/twtest/genre_t.cpp @@ -33,31 +33,30 @@ // genre_t.cpp // -#include - #include "fco/stdfco.h" #include "fco/genreswitcher.h" #include "twtest/test.h" #include "fs/fs.h" -#include "fs/fsfactory.h" - -void TestGenreSwitcher() +void TestGenre() { - cDebug d("TestGenreSwitcher"); + cDebug d("TestGenre"); d.TraceDebug("Entering...\n"); - cGenreSwitcher* genreSwitcher = cGenreSwitcher::GetInstance(); + TEST(cGenreSwitcher::GetInstance()->StringToGenre(cGenreSwitcher::GetInstance()->GenreToString(cFS::GenreID())) == cFS::GenreID()); - TEST(genreSwitcher->CurrentGenre() == cFS::GenreID()); - - // can't switch to invalid genre - //genreSwitcher->SelectGenre(cGenre::GENRE_INVALID); - //TEST(genreSwitcher->CurrentGenre() == cGenre::GENRE_INVALID); + //TODO: GenreToString() dies w/ GENRE_INVALID. Figure out if this should be changed. + // + //TEST(cGenreSwitcher::GetInstance()->StringToGenre(cGenreSwitcher::GetInstance()->GenreToString(cGenre::GENRE_INVALID)) == cGenre::GENRE_INVALID); - genreSwitcher->SelectGenre(cFS::GenreID()); - TEST(genreSwitcher->CurrentGenre() == cFS::GenreID()); - TEST(typeid(*iTWFactory::GetInstance()) == typeid(cFSFactory)); + + TEST(cGenreSwitcher::GetInstance()->StringToGenre(_T("fs")) == cFS::GenreID()); + TEST(cGenreSwitcher::GetInstance()->StringToGenre(_T("none of the above")) == cGenre::GENRE_INVALID); d.TraceDebug("All tests passed.\n"); } + +void RegisterSuite_Genre() +{ + RegisterTest("Genre", "Basic", TestGenre); +} diff --git a/src/twtest/genrespeclist_t.cpp b/src/twtest/genrespeclist_t.cpp index 9109d24..8b446c0 100644 --- a/src/twtest/genrespeclist_t.cpp +++ b/src/twtest/genrespeclist_t.cpp @@ -91,3 +91,12 @@ void TestGenreSpecList() d.TraceDebug("All tests passed.\n"); } + +void RegisterSuite_GenreSpecList() +{ + RegisterTest("GenreSpecList", "Basic", TestGenreSpecList); +} + + + + diff --git a/src/twtest/genreswitcher_t.cpp b/src/twtest/genreswitcher_t.cpp index d378b1e..6fbd8eb 100644 --- a/src/twtest/genreswitcher_t.cpp +++ b/src/twtest/genreswitcher_t.cpp @@ -33,25 +33,36 @@ // genreswitcher_t.h // +#include + #include "fco/stdfco.h" #include "fco/genreswitcher.h" #include "twtest/test.h" #include "fs/fs.h" -void TestGenre() +#include "fs/fsfactory.h" + +void TestGenreSwitcher() { - cDebug d("TestGenre"); + cDebug d("TestGenreSwitcher"); d.TraceDebug("Entering...\n"); - TEST(cGenreSwitcher::GetInstance()->StringToGenre(cGenreSwitcher::GetInstance()->GenreToString(cFS::GenreID())) == cFS::GenreID()); - - //TODO: GenreToString() dies w/ GENRE_INVALID. Figure out if this should be changed. - // - //TEST(cGenreSwitcher::GetInstance()->StringToGenre(cGenreSwitcher::GetInstance()->GenreToString(cGenre::GENRE_INVALID)) == cGenre::GENRE_INVALID); - + cGenreSwitcher* genreSwitcher = cGenreSwitcher::GetInstance(); - TEST(cGenreSwitcher::GetInstance()->StringToGenre(_T("fs")) == cFS::GenreID()); - TEST(cGenreSwitcher::GetInstance()->StringToGenre(_T("none of the above")) == cGenre::GENRE_INVALID); + TEST(genreSwitcher->CurrentGenre() == cFS::GenreID()); + + // can't switch to invalid genre + //genreSwitcher->SelectGenre(cGenre::GENRE_INVALID); + //TEST(genreSwitcher->CurrentGenre() == cGenre::GENRE_INVALID); + + genreSwitcher->SelectGenre(cFS::GenreID()); + TEST(genreSwitcher->CurrentGenre() == cFS::GenreID()); + TEST(typeid(*iTWFactory::GetInstance()) == typeid(cFSFactory)); d.TraceDebug("All tests passed.\n"); } + +void RegisterSuite_GenreSwitcher() +{ + RegisterTest("GenreSwitcher", "Basic", TestGenreSwitcher); +} diff --git a/src/twtest/growheap_t.cpp b/src/twtest/growheap_t.cpp index 8fb6f99..61eecd2 100644 --- a/src/twtest/growheap_t.cpp +++ b/src/twtest/growheap_t.cpp @@ -97,3 +97,7 @@ void TestGrowHeap() TEST( gh.TotalMemUsage() == 0 ); } +void RegisterSuite_GrowHeap() +{ + RegisterTest("GrowHeap", "Basic", TestGrowHeap); +} diff --git a/src/twtest/hashtable_t.cpp b/src/twtest/hashtable_t.cpp index 96ea4d8..67b430e 100644 --- a/src/twtest/hashtable_t.cpp +++ b/src/twtest/hashtable_t.cpp @@ -43,15 +43,6 @@ using namespace std; -void HashTest1(); -void HashTest2(); - -void TestHashTable(void) -{ - HashTest1(); - HashTest2(); -} - void HashTest1() { //Test the Hash table with Key = TSTRING @@ -218,3 +209,9 @@ void HashTest2() d.TraceDebug("PASSED!\n"); } + +void RegisterSuite_HashTable() +{ + RegisterTest("HashTable", "Basic 1", HashTest1); + RegisterTest("HashTable", "Basic 2", HashTest2); +} diff --git a/src/twtest/hierdatabase_t.cpp b/src/twtest/hierdatabase_t.cpp index e18a8cf..4b87202 100644 --- a/src/twtest/hierdatabase_t.cpp +++ b/src/twtest/hierdatabase_t.cpp @@ -206,3 +206,8 @@ void TestHierDatabaseBasic() #endif } +void RegisterSuite_HierDatabase() +{ + RegisterTest("HierDatabase", "Basic", TestHierDatabaseBasic); +} + diff --git a/src/twtest/keyfile_t.cpp b/src/twtest/keyfile_t.cpp index 656dc05..cae960a 100644 --- a/src/twtest/keyfile_t.cpp +++ b/src/twtest/keyfile_t.cpp @@ -134,3 +134,7 @@ void TestKeyFile() return; } +void RegisterSuite_KeyFile() +{ + RegisterTest("KeyFile", "Basic", TestKeyFile); +} diff --git a/src/twtest/platform_t.cpp b/src/twtest/platform_t.cpp index 49cae44..b4ed007 100644 --- a/src/twtest/platform_t.cpp +++ b/src/twtest/platform_t.cpp @@ -204,6 +204,7 @@ void TestSizes() { cDebug d("TestSizes"); d.TraceError("Fix this!\n"); + skip("TODO: TestSizes needs work"); /* TEST( CanBeRepresentedAs( char(), char() ) ); TEST( CanBeRepresentedAs( char(), unsigned char() ) ); @@ -234,3 +235,9 @@ bool CanBeRepresentedAs( E e, T t ) return fReturn; } + +void RegisterSuite_Platform() +{ + RegisterTest("Platform", "Alignment", TestAlignment); + RegisterTest("Platform", "Sizes", TestSizes); +} diff --git a/src/twtest/policyparser_t.cpp b/src/twtest/policyparser_t.cpp index 97a6c35..6070e2d 100644 --- a/src/twtest/policyparser_t.cpp +++ b/src/twtest/policyparser_t.cpp @@ -101,6 +101,9 @@ void TestPolicyParser() cDebug d("TestPolicyParser()"); test_policy_file("pol.txt"); + + TCERR << "TestPolicyParser: Parser needs work to be able to test more than one policy" << std::endl; + // test_policy_file("directives.txt"); //fails unless you substitute your hostname for 'your_host' in this file // TODO: test currently segfaults if you create more than one policy parser in a process. (Not a real world scenario). @@ -110,4 +113,7 @@ void TestPolicyParser() test_policy_file("polruleattr.txt"); */ } - +void RegisterSuite_PolicyParser() +{ + RegisterTest("PolicyParser", "Basic", TestPolicyParser); +} diff --git a/src/twtest/refcountobj_t.cpp b/src/twtest/refcountobj_t.cpp index 68468c0..fb870ac 100644 --- a/src/twtest/refcountobj_t.cpp +++ b/src/twtest/refcountobj_t.cpp @@ -33,6 +33,7 @@ #include "core/stdcore.h" #include "core/refcountobj.h" #include "core/debug.h" +#include "test.h" class cRefCountTestObj : public cRefCountObj { @@ -166,3 +167,7 @@ void TestRefCountObj() return; } +void RegisterSuite_RefCountObj() +{ + RegisterTest("RefCountObj", "Basic", TestRefCountObj); +} diff --git a/src/twtest/resources_t.cpp b/src/twtest/resources_t.cpp index 52b37ec..b2533e3 100644 --- a/src/twtest/resources_t.cpp +++ b/src/twtest/resources_t.cpp @@ -95,6 +95,9 @@ void TestResources() } - +void RegisterSuite_Resources() +{ + RegisterTest("Resources", "Basic", TestResources); +} diff --git a/src/twtest/serializer_t.cpp b/src/twtest/serializer_t.cpp index ab4cd21..2244f05 100644 --- a/src/twtest/serializer_t.cpp +++ b/src/twtest/serializer_t.cpp @@ -38,6 +38,7 @@ #include "core/stdcore.h" #include "core/serializer.h" #include "core/serializable.h" +#include "test.h" // The reading and writing functionality of the serializer is tested in // serializerimpl_t.cpp, so there's very little to be done here. @@ -71,3 +72,8 @@ void TestSerializer() { cSerTestObject test_obj; } + +void RegisterSuite_Serializer() +{ + RegisterTest("Serializer", "Basic", TestSerializer); +} diff --git a/src/twtest/serializerimpl_t.cpp b/src/twtest/serializerimpl_t.cpp index cf69777..7762abf 100644 --- a/src/twtest/serializerimpl_t.cpp +++ b/src/twtest/serializerimpl_t.cpp @@ -178,3 +178,7 @@ void TestSerializerImpl() return; } +void RegisterSuite_SerializerImpl() +{ + RegisterTest("SerializerImpl", "Basic", TestSerializerImpl); +} diff --git a/src/twtest/signature_t.cpp b/src/twtest/signature_t.cpp index 55ee530..82b4b7d 100644 --- a/src/twtest/signature_t.cpp +++ b/src/twtest/signature_t.cpp @@ -361,3 +361,7 @@ void TestSignature() return; } +void RegisterSuite_Signature() +{ + RegisterTest("Signature", "Basic", TestSignature); +} diff --git a/src/twtest/srefcountobj_t.cpp b/src/twtest/srefcountobj_t.cpp index e12a486..9f0b118 100644 --- a/src/twtest/srefcountobj_t.cpp +++ b/src/twtest/srefcountobj_t.cpp @@ -144,3 +144,7 @@ void TestSerRefCountObj() return; } +void RegisterSuite_SerRefCountObj() +{ + RegisterTest("SerRefCountObj", "Basic", TestSerRefCountObj); +} diff --git a/src/twtest/stringencoder_t.cpp b/src/twtest/stringencoder_t.cpp index 77fea63..d0b7cf3 100644 --- a/src/twtest/stringencoder_t.cpp +++ b/src/twtest/stringencoder_t.cpp @@ -93,3 +93,7 @@ void OutputString( TSTRING& str ) TEST( str == qe.Unencode(qe.Encode(str)) ); } +void RegisterSuite_StringEncoder() +{ + RegisterTest("StringEncoder", "Basic", TestStringEncoder); +} diff --git a/src/twtest/stringutil_t.h b/src/twtest/stringutil_t.h index 4ed2875..70117f0 100644 --- a/src/twtest/stringutil_t.h +++ b/src/twtest/stringutil_t.h @@ -172,3 +172,8 @@ void TestStringUtil() #endif//__STRINGUTIL_T_H + +void RegisterSuite_StringUtil() +{ + RegisterTest("StringUtil", "Basic", TestStringUtil); +} diff --git a/src/twtest/tasktimer_t.cpp b/src/twtest/tasktimer_t.cpp index c501261..383021b 100644 --- a/src/twtest/tasktimer_t.cpp +++ b/src/twtest/tasktimer_t.cpp @@ -31,11 +31,17 @@ // // tasktimer_t -- test driver for cTaskTimer #include "core/stdcore.h" +#include "test.h" void TestTaskTimer() { cDebug d("TestTaskTimer"); d.TraceError("Implement this!\n"); + skip("TestTaskTimer unimplemented"); } +void RegisterSuite_TaskTimer() +{ + RegisterTest("TaskTimer", "Basic", TestTaskTimer); +} diff --git a/src/twtest/tchar_t.cpp b/src/twtest/tchar_t.cpp index 9bcc5d0..702bd79 100644 --- a/src/twtest/tchar_t.cpp +++ b/src/twtest/tchar_t.cpp @@ -133,3 +133,8 @@ void test_wist(const TSTRING& input, cDebug& d) d.TraceDetail("%s \n", parse.c_str() ); } +void RegisterSuite_TCHAR() +{ + RegisterTest("TCHAR", "Basic", TestTCHAR); +} + diff --git a/src/twtest/test.cpp b/src/twtest/test.cpp index fd6b2b9..69cca93 100644 --- a/src/twtest/test.cpp +++ b/src/twtest/test.cpp @@ -64,197 +64,142 @@ #include #include -// the test routines -void TestFCOName(); -void TestFCOTest(); -void TestFCOSetImpl(); -void TestFCOSpec(); -void TestFCOPropVector(); -void TestFileHeader(); -void TestFile(); -void TestFSPropSet(); -void TestFCOSpecImpl(); -void TestFSObject(); -void TestFSPropCalc(); -void TestFCOPropImpl(); -void TestFCOCompare(); -//void TestTripwire(); -void TestWin32FSServices(); -void TestFCOSpecList(); -void TestFCOReport(); -void TestArchive(); -void TestSerializer(); -void TestSerializerImpl(); -void TestRefCountObj(); -void TestSignature(); -void TestSerRefCountObj(); -void TestUnixFSServices(); -void TestError(); -void TestDebug(); -void TestFcoSpecUtil(); -void TestTypes(); -void TestTCHAR(); -void TestErrorBucketImpl(); -void TestHashTable(); -void TestTextReportViewer(); -void TestFCONameTbl(); -void TestConfigFile(); -void TestResources(); -void TestGetSymLinkStr(); -void TestPolicyParser(); - -void TestFCOSpecHelper(); -void TestCrypto(); -void TestCryptoArchive(); -void TestFCOSpecAttr(); -void TestCmdLineParser(); -void TestTaskTimer(); -void TestKeyFile(); -void TestTWUtil(); -void TestFSPropDisplayer(); -void TestFSPropDisplayer(); -void TestGenre(); -void TestFSDataSourceIter(); -void TestGenerateDb(); -void TestHierDatabaseBasic(); -void TestGenreSwitcher(); -void TestDbDataSourceBasic(); -void TestGenreSpecList(); -void TestIntegrityCheck(); -void TestFCODatabaseFile(); -void TestWchar16(); -void TestStringEncoder(); - -void TestGrowHeap(); -void TestPlatform(); -void TestBlockFile(); -void TestBlockRecordArray(); -void TestTWLocale(); -void TestFileUtil(); -void TestFCONameTranslator(); -void TestCodeConverter(); - -void TestCharToHex(); -void TestHexToChar(); -void TestStringToHex(); -void TestHexToString(); -//void TestUnconvertable(); -//void TestUnprintable(); -void TestQuoteAndBackSlash(); -void TestDisplayEncoderBasic(); -void TestCharUtilBasic(); -void TestConfigFile2(); -void TestUserNotifyStdout(); +// Known test suites +void RegisterSuite_Archive(); +void RegisterSuite_BlockFile(); +void RegisterSuite_BlockRecordArray(); +void RegisterSuite_CharUtil(); +void RegisterSuite_CmdLineParser(); +void RegisterSuite_CodeConvert(); +void RegisterSuite_ConfigFile(); +void RegisterSuite_CryptoArchive(); +void RegisterSuite_Crypto(); +void RegisterSuite_DbDataSource(); +void RegisterSuite_Debug(); +void RegisterSuite_DisplayEncoder(); +void RegisterSuite_Error(); +void RegisterSuite_ErrorBucketImpl(); +void RegisterSuite_FCOCompare(); +void RegisterSuite_FCODatabaseFile(); +void RegisterSuite_FCOName(); +void RegisterSuite_FCONameTbl(); +void RegisterSuite_FCONameTranslator(); +void RegisterSuite_FCOPropImpl(); +void RegisterSuite_FCOPropVector(); +void RegisterSuite_FCOReport(); +void RegisterSuite_FCOSetImpl(); +void RegisterSuite_FCOSpec(); +void RegisterSuite_FCOSpecAttr(); +void RegisterSuite_FCOSpecHelper(); +void RegisterSuite_FCOSpecList(); +void RegisterSuite_FcoSpecUtil(); +void RegisterSuite_File(); +void RegisterSuite_FileHeader(); +void RegisterSuite_FileUtil(); +void RegisterSuite_FSDataSourceIter(); +void RegisterSuite_FSObject(); +void RegisterSuite_FSPropCalc(); +void RegisterSuite_FSPropDisplayer(); +void RegisterSuite_FSPropSet(); +void RegisterSuite_FCOSpecImpl(); +void RegisterSuite_GenreSwitcher(); +void RegisterSuite_GenreSpecList(); +void RegisterSuite_Error(); +void RegisterSuite_GrowHeap(); +void RegisterSuite_HashTable(); +void RegisterSuite_HierDatabase(); +void RegisterSuite_KeyFile(); +void RegisterSuite_Platform(); +void RegisterSuite_PolicyParser(); +void RegisterSuite_RefCountObj(); +void RegisterSuite_Resources(); +void RegisterSuite_Serializer(); +void RegisterSuite_SerializerImpl(); +void RegisterSuite_Signature(); +void RegisterSuite_SerRefCountObj(); +void RegisterSuite_StringEncoder(); +void RegisterSuite_StringUtil(); +void RegisterSuite_TaskTimer(); +void RegisterSuite_TCHAR(); +void RegisterSuite_TextReportViewer(); +void RegisterSuite_TWLocale(); +void RegisterSuite_TWUtil(); +void RegisterSuite_Types(); +void RegisterSuite_UnixFSServices(); +void RegisterSuite_UserNotifyStdout(); +void RegisterSuite_Wchar16(); /// This is easier than all the (cpp) files and declarations #include "stringutil_t.h" void Usage() { - TCERR << _T("Usage: test {all | testid [testid ...]}\n") + TCERR << _T("Usage: test {all | list | testid [testid ...]}\n") _T("\n") - _T("Ex: test 1 2 3 12\n") - _T("(runs test id's 1, 2, 3, and 12)\n\n"); + _T("Ex: test foo bar/baz\n") + _T("(runs suite foo and test bar/baz)\n\n"); } -const int MAX_TEST_ID = 88; - static int ran_count = 0; static int failed_count = 0; +static int skipped_count = 0; +static int macro_count = 0; + static std::vector error_strings; +static std::vector skipped_strings; -static void Test(int testID) +class skip_exception : public std::runtime_error { - TCERR << std::endl << "=== Running test ID #" << testID << " ===" << std::endl; - - bool ran = true; +public: + skip_exception(const std::string& reason) : std::runtime_error(reason) {} +}; - try { - - switch (testID) +void skip(const std::string& reason) +{ + throw skip_exception(reason); +} + +void CountMacro() +{ + macro_count++; + TCERR << "*** Incrementing macro count, value is now" << macro_count << std::endl;; +} + +///////////////////////// + +static TestMap tests; + +void RegisterTest(const std::string& suite, const std::string testName, TestPtr testPtr ) +{ + tests[suite][testName] = testPtr; +} + + +static void RunTest(const std::string& suiteName, const std::string& testName, TestPtr testPtr) +{ + try + { + if (testPtr) { - case 1: TestArchive(); break; - case 2: TestCmdLineParser(); break; - case 3: TestCrypto(); break; - case 4: TestCryptoArchive(); break; - case 5: TestDebug(); break; - case 6: TestError(); break; - case 7: TestErrorBucketImpl(); break; - case 8: TestFCOCompare(); break; - case 9: TestUserNotifyStdout(); break; - - case 12: TestFCOName(); break; - case 13: TestFCONameTbl(); break; - case 14: TestFCOPropVector(); break; - case 15: TestFCOPropImpl(); break; - case 16: TestFCOReport(); break; - case 17: TestGetSymLinkStr(); break; - case 18: TestFCOSetImpl(); break; - case 19: TestFCOSpec(); break; - case 20: TestFCOSpecAttr(); break; - case 21: TestFCOSpecHelper(); break; - case 22: TestFCOSpecList(); break; - case 23: TestFcoSpecUtil(); break; - case 24: TestFileHeader(); break; - case 25: TestFile(); break; - case 26: TestFSPropSet(); break; - case 27: TestFSPropCalc(); break; - case 28: TestFCOSpecImpl(); break; - case 29: TestFSObject(); break; - case 30: TestSerializer(); break; - case 31: TestRefCountObj(); break; - case 32: TestSerializerImpl(); break; - case 33: TestResources(); break; - case 34: TestSignature(); break; - case 35: TestTaskTimer(); break; - //case 36: TestTripwire(); break; - case 37: TestTextReportViewer(); break; - case 39: TestSerRefCountObj(); break; - case 40: TestError(); break; - case 41: TestFCODatabaseFile(); break; - case 42: TestHashTable(); break; - case 43: TestTCHAR(); break; - case 44: TestTypes(); break; - case 45: TestUnixFSServices(); break; - case 46: TestConfigFile(); break; - case 47: TestPolicyParser(); break; - case 48: TestKeyFile(); break; - case 49: TestTWUtil(); break; - case 50: TestFSPropDisplayer(); break; - case 52: TestGenre(); break; - case 53: TestFSDataSourceIter(); break; - //case 54: TestGenerateDb(); break; - case 55: TestHierDatabaseBasic(); break; - case 56: TestGenreSwitcher(); break; - case 57: TestDbDataSourceBasic(); break; - case 58: TestGenreSpecList(); break; - //case 59: TestIntegrityCheck(); break; - - case 65: TestWchar16(); break; - case 66: TestStringEncoder(); break; - - case 69: TestGrowHeap(); break; - case 70: TestPlatform(); break; - case 71: TestBlockFile(); break; - case 72: TestBlockRecordArray(); break; - case 74: TestFileUtil(); break; - case 75: TestTWLocale(); break; - case 76: TestFCONameTranslator(); break; - case 77: TestStringUtil(); break; - case 78: TestCodeConverter(); break; - - case 79: TestCharToHex(); break; - case 80: TestHexToChar(); break; - case 81: TestStringToHex(); break; - case 82: TestHexToString(); break; - // case 83: TestUnconvertable(); break; - // case 84: TestUnprintable(); break; - case 85: TestQuoteAndBackSlash(); break; - case 86: TestDisplayEncoderBasic(); break; - case 87: TestCharUtilBasic(); break; - case 88: TestConfigFile2(); break; - default: ran = false; break; + ran_count++; + int pre_count = macro_count; + testPtr(); + if (macro_count > pre_count) + TCERR << "PASSED" << std::endl; + else + skip("Test did not make any TEST assertions"); } + return; + } + catch (skip_exception& e) + { + TCERR << "SKIPPED: " << e.what() << std::endl; + + std::stringstream sstr; + sstr << "Test " << suiteName << "/" << testName << ": " << e.what(); + skipped_strings.push_back(sstr.str()); + + skipped_count++; } catch (eError& error) { @@ -262,7 +207,7 @@ static void Test(int testID) cTWUtil::PrintErrorMsg(error); std::stringstream sstr; - sstr << "Test " << testID << ": " << error.GetMsg(); + sstr << "Test " << suiteName << "/" << testName << ": " << error.GetMsg(); error_strings.push_back(sstr.str()); failed_count++; @@ -271,7 +216,7 @@ static void Test(int testID) TCERR << "FAILED: " << e.what() << std::endl; std::stringstream sstr; - sstr << "Test " << testID << ": " << e.what(); + sstr << "Test " << suiteName << "/" << testName << ": " << e.what(); error_strings.push_back(sstr.str()); failed_count++; @@ -280,21 +225,134 @@ static void Test(int testID) TCERR << "FAILED: " << std::endl; std::stringstream sstr; - sstr << "Test " << testID << ": "; + sstr << "Test " << suiteName << "/" << testName << ": "; error_strings.push_back(sstr.str()); - - failed_count++; } - - if(ran) +} + + +static void RunTestSuite(const std::string& suiteName, SuiteMap suite) +{ + SuiteMap::const_iterator itr; + for( itr = suite.begin(); itr != suite.end(); ++itr) { - ran_count++; - TCERR << std::endl << "=== test ID #" << testID << " completed ===" << std::endl; + TCERR << "----- Running test: " << suiteName << "/" << itr->first << " -----" << std::endl << std::endl; + RunTest(suiteName, itr->first, itr->second); + TCERR << std::endl << "----- Finished test: " << suiteName << "/" << itr->first << " -----" << std::endl; + } +} + +static void RunAllTests() +{ + TestMap::const_iterator itr; + for( itr = tests.begin(); itr != tests.end(); ++itr) + { + TCERR << std::endl << "===== Starting test suite: " << itr->first << " =====" << std::endl; + RunTestSuite(itr->first, itr->second); + TCERR << "===== Finished test suite: " << itr->first << " =====" << std::endl; + } +} + +static void ListTests() +{ + TestMap::const_iterator itr; + for( itr = tests.begin(); itr != tests.end(); ++itr) + { + std::string suiteName = itr->first; + SuiteMap suite = itr->second; + + TCERR << suiteName << std::endl; + SuiteMap::const_iterator itr; + for( itr = suite.begin(); itr != suite.end(); ++itr) + { + TCERR << " " << suiteName << "/" << itr->first << std::endl; + } + } +} + +static void RunTest(const std::string& to_run) +{ + std::string::size_type pos = to_run.find_first_of("/"); + if(pos == std::string::npos) + { + RunTestSuite(to_run, tests[to_run]); } else - TCERR << std::endl << "=== test ID #" << testID << " currently unused ===" << std::endl; + { + std::string suite = to_run.substr(0, pos); + std::string testName = to_run.substr(pos+1); + RunTest(suite, testName, tests[suite][testName]); + } } +static void RegisterSuites() +{ + RegisterSuite_Archive(); + RegisterSuite_BlockFile(); + RegisterSuite_BlockRecordArray(); + RegisterSuite_CharUtil(); + RegisterSuite_CmdLineParser(); + RegisterSuite_CodeConvert(); + RegisterSuite_ConfigFile(); + RegisterSuite_CryptoArchive(); + RegisterSuite_Crypto(); + RegisterSuite_DbDataSource(); + RegisterSuite_Debug(); + RegisterSuite_DisplayEncoder(); + RegisterSuite_Error(); + RegisterSuite_ErrorBucketImpl(); + RegisterSuite_FCOCompare(); + RegisterSuite_FCODatabaseFile(); + RegisterSuite_FCOName(); + RegisterSuite_FCONameTbl(); + RegisterSuite_FCONameTranslator(); + RegisterSuite_FCOPropImpl(); + RegisterSuite_FCOPropVector(); + RegisterSuite_FCOReport(); + RegisterSuite_FCOSetImpl(); + RegisterSuite_FCOSpec(); + RegisterSuite_FCOSpecAttr(); + RegisterSuite_FCOSpecHelper(); + RegisterSuite_FCOSpecList(); + RegisterSuite_FcoSpecUtil(); + RegisterSuite_File(); + RegisterSuite_FileHeader(); + RegisterSuite_FileUtil(); + RegisterSuite_FSDataSourceIter(); + RegisterSuite_FSObject(); + RegisterSuite_FSPropCalc(); + RegisterSuite_FSPropDisplayer(); + RegisterSuite_FSPropSet(); + RegisterSuite_FCOSpecImpl(); + RegisterSuite_GenreSwitcher(); + RegisterSuite_GenreSpecList(); + RegisterSuite_Error(); + RegisterSuite_GrowHeap(); + RegisterSuite_HashTable(); + RegisterSuite_HierDatabase(); + RegisterSuite_KeyFile(); + RegisterSuite_Platform(); + RegisterSuite_PolicyParser(); + RegisterSuite_RefCountObj(); + RegisterSuite_Resources(); + RegisterSuite_Serializer(); + RegisterSuite_SerializerImpl(); + RegisterSuite_Signature(); + RegisterSuite_SerRefCountObj(); + RegisterSuite_StringEncoder(); + RegisterSuite_StringUtil(); + RegisterSuite_TaskTimer(); + RegisterSuite_TCHAR(); + RegisterSuite_TextReportViewer(); + RegisterSuite_TWLocale(); + RegisterSuite_TWUtil(); + RegisterSuite_Types(); + RegisterSuite_UnixFSServices(); + RegisterSuite_UserNotifyStdout(); + RegisterSuite_Wchar16(); +} + + std::string TwTestDir() { static std::string dir; @@ -358,17 +416,21 @@ void tw_unexpected_handler() int _tmain(int argc, TCHAR** argv) { +#ifdef _DEBUG std::cout << "Test: Init" << std::endl; + std::cout << "Test: Setup" << std::endl; + std::cout << "Test: argc - " << argc << std::endl; + std::cout << "Test: *argv - " << argv[0] << std::endl; +#endif - try + try { - std::cout << "Test: Setup" << std::endl; - std::cout << "Test: argc - " << argc << std::endl; - std::cout << "Test: *argv - " << argv[0] << std::endl; - EXCEPTION_NAMESPACE set_terminate(tw_terminate_handler); EXCEPTION_NAMESPACE set_unexpected(tw_unexpected_handler); + if (argc < 2) + Usage(); + cTWInit twInit; twInit.Init( argv[0] ); @@ -377,20 +439,24 @@ int _tmain(int argc, TCHAR** argv) //cDebug::SetDebugLevel(cDebug::D_NEVER); cDebug::SetDebugLevel(cDebug::D_DETAIL); //cDebug::SetDebugLevel(cDebug::D_DEBUG); - - int i; - if (argc < 2) - Usage(); - else if (_tcsicmp(argv[1], _T("all")) == 0) - // run all the tests - for (i = 1; i <= MAX_TEST_ID; ++i) - Test(i); + RegisterSuites(); + + if (_tcsicmp(argv[1], _T("all")) == 0) + { + RunAllTests(); + } + else if(_tcsicmp(argv[1], _T("list")) == 0) + { + ListTests(); + } else - for (i = 1; i < argc; ++i) - Test(_ttoi(argv[i])); // Note: if atoi returns 0, Test() will handle it fine. - - } + { + for (int i = 1; i < argc; ++i) + RunTest(argv[i]); + } + + } catch (eError& error) { cTWUtil::PrintErrorMsg(error); @@ -404,16 +470,30 @@ int _tmain(int argc, TCHAR** argv) return 1; } - // make sure all the refrence counted objects have been destroyed + // make sure all the reference counted objects have been destroyed // this test always fails because of the static cFCONameTbl //TEST(cRefCountObj::AllRefCountObjDestoryed() == true); - std::cout << std::endl << "Ran " << ran_count << " unit tests with " << failed_count << " failures." << std::endl; + std::cout << std::endl << "Ran " << ran_count << " unit tests with " << failed_count << " failures, " << skipped_count << " skipped." << std::endl; - std::vector::iterator itr; - for (itr = error_strings.begin(); itr != error_strings.end(); ++itr) + if (failed_count) { - std::cout << "\t" << *itr << std::endl; + std::cout << std::endl << "Failures: " << std::endl; + std::vector::iterator itr; + for (itr = error_strings.begin(); itr != error_strings.end(); ++itr) + { + std::cout << "\t" << *itr << std::endl; + } + } + + if (skipped_count) + { + std::cout << std::endl << "Skipped: " << std::endl; + std::vector::iterator itr; + for (itr = skipped_strings.begin(); itr != skipped_strings.end(); ++itr) + { + std::cout << "\t" << *itr << std::endl; + } } std::cout << std::endl; diff --git a/src/twtest/test.h b/src/twtest/test.h index 13c8db9..90351bb 100644 --- a/src/twtest/test.h +++ b/src/twtest/test.h @@ -66,9 +66,13 @@ public: TSS_EndPackage( cTest ) +void CountMacro(); + /////////////////////////////////////////////////////////////////////////////// -// TEST() -- Works like ASSERT() but it also breaks during release mode -#define TEST(exp) if (!(exp)) \ +// TEST() -- throw a std::runtime error if test condition is false. +// +#define TEST(exp) CountMacro(); \ + if (!(exp)) \ { \ std::cerr<<"TEST(" << #exp << ") failure, file " << __FILE__ << " line " << __LINE__ << std::endl; \ throw std::runtime_error(#exp); \ @@ -79,5 +83,14 @@ TSS_EndPackage( cTest ) std::string TwTestDir(); std::string TwTestPath(const std::string& child); +typedef void (*TestPtr)(); +typedef std::map< std::string, TestPtr > SuiteMap; +typedef std::map< std::string, SuiteMap > TestMap; + +void RegisterTest(const std::string& suite, const std::string testName, TestPtr testPtr ); + +void skip(const std::string& reason); + + #endif // __TEST_H diff --git a/src/twtest/textreportviewer_t.cpp b/src/twtest/textreportviewer_t.cpp index c5ed3e7..7616862 100644 --- a/src/twtest/textreportviewer_t.cpp +++ b/src/twtest/textreportviewer_t.cpp @@ -127,7 +127,7 @@ static void TraceReport(const cFCOReport& r, cDebug& d) void TestTextReportViewer() { - TCERR << std::endl << "TestTextReportViewer needs to be cleaned up & fixed, currently disabled" << std::endl; + skip("TestTextReportViewer needs to be cleaned up & fixed, currently disabled"); #if 0 cFCOReport report; @@ -476,3 +476,7 @@ void MakeDir( const TCHAR* const lpszDirName ) //#endif //FIXED_TRV_TEST_SUITE +void RegisterSuite_TextReportViewer() +{ + RegisterTest("TextReportViewer", "Basic", TestTextReportViewer); +} diff --git a/src/twtest/twlocale_t.cpp b/src/twtest/twlocale_t.cpp index 3bb4df0..289ba28 100644 --- a/src/twtest/twlocale_t.cpp +++ b/src/twtest/twlocale_t.cpp @@ -40,6 +40,7 @@ #include "core/stdcore.h" #include "core/debug.h" #include "core/twlocale.h" +#include "test.h" void TestAtoi(); void TestItoa(); @@ -56,6 +57,8 @@ void TestHex(); void TestTWLocale() { + skip("TWLocale tests are ifdef'd out, need to revisit them"); + #ifdef DOESNTWORK TestHex(); TestAtoi(); @@ -225,3 +228,8 @@ void TestHex() } #endif//DOESNTWORK +void RegisterSuite_TWLocale() +{ + RegisterTest("TWLocale", "Basic", TestTWLocale); +} + diff --git a/src/twtest/twutil_t.cpp b/src/twtest/twutil_t.cpp index 1f0a9e1..93e270b 100644 --- a/src/twtest/twutil_t.cpp +++ b/src/twtest/twutil_t.cpp @@ -108,3 +108,8 @@ std::string WideToNarrow( const TSTRING& strWide ) return strWide; } +void RegisterSuite_TWUtil() +{ + RegisterTest("TWUtil", "Basic", TestTWUtil); +} + diff --git a/src/twtest/types_t.cpp b/src/twtest/types_t.cpp index de1d18e..1b4fe67 100644 --- a/src/twtest/types_t.cpp +++ b/src/twtest/types_t.cpp @@ -50,3 +50,8 @@ void TestTypes() TEST(sizeof(float32) == 4); TEST(sizeof(float64) == 8); } + +void RegisterSuite_Types() +{ + RegisterTest("Types", "Basic", TestTypes); +} diff --git a/src/twtest/unixfsservices_t.cpp b/src/twtest/unixfsservices_t.cpp index 2d00329..45acdbb 100644 --- a/src/twtest/unixfsservices_t.cpp +++ b/src/twtest/unixfsservices_t.cpp @@ -158,7 +158,10 @@ void TestUnixFSServices() TEST( pFSServices->FileDelete( newtestfile ) ); } - +void RegisterSuite_UnixFSServices() +{ + RegisterTest("UnixFSServices", "Basic", TestUnixFSServices); +} diff --git a/src/twtest/usernotifystdout_t.cpp b/src/twtest/usernotifystdout_t.cpp index f81ffb5..29b6846 100644 --- a/src/twtest/usernotifystdout_t.cpp +++ b/src/twtest/usernotifystdout_t.cpp @@ -41,4 +41,10 @@ void TestUserNotifyStdout() { cDebug d("TestUserNotifyStdout"); d.TraceError("Implement this!\n"); + skip("TestUserNotifyStdout unimplemented"); +} + +void RegisterSuite_UserNotifyStdout() +{ + RegisterTest("UserNotifyStdout", "Basic", TestUserNotifyStdout); } diff --git a/src/twtest/wchar16_t.cpp b/src/twtest/wchar16_t.cpp index 83ad7b7..2d3a3c8 100644 --- a/src/twtest/wchar16_t.cpp +++ b/src/twtest/wchar16_t.cpp @@ -124,3 +124,8 @@ void TestWchar16() db.TraceAlways("Done...\n"); } + +void RegisterSuite_Wchar16() +{ + RegisterTest("Wchar16", "Basic", TestWchar16); +}