1 // StatableTest.h 2 3 #ifndef __sk_statable_test_h__ 4 #define __sk_statable_test_h__ 5 6 #include <cppunit/TestCaller.h> 7 #include <cppunit/TestSuite.h> 8 9 #include <list> 10 #include <string> 11 12 #include "BasicTest.h" 13 14 // TestEntries 15 16 template <typename C> 17 struct TestEntries 18 { 19 ~TestEntries() 20 { 21 delete_all(); 22 } 23 24 void delete_all() 25 { 26 for (list<C*>::iterator it = entries.begin(); 27 it != entries.end(); 28 it++) { 29 // Arghh, BStatable has no virtual destructor! 30 // Workaround: try to cast to one of the subclasses 31 if (BNode *node = dynamic_cast<BNode*>(*it)) 32 delete node; 33 else if (BEntry *entry = dynamic_cast<BEntry*>(*it)) 34 delete entry; 35 else 36 delete *it; 37 } 38 clear(); 39 } 40 41 void clear() 42 { 43 entries.clear(); 44 entryNames.clear(); 45 rewind(); 46 } 47 48 void add(C *entry, string entryName) 49 { 50 entries.push_back(entry); 51 entryNames.push_back(entryName); 52 } 53 54 bool getNext(C *&entry, string &entryName) 55 { 56 bool result = (entryIt != entries.end() 57 && entryNameIt != entryNames.end()); 58 if (result) { 59 entry = *entryIt; 60 entryName = *entryNameIt; 61 entryIt++; 62 entryNameIt++; 63 } 64 return result; 65 } 66 67 void rewind() 68 { 69 entryIt = entries.begin(); 70 entryNameIt = entryNames.begin(); 71 } 72 73 list<C*> entries; 74 list<string> entryNames; 75 list<C*>::iterator entryIt; 76 list<string>::iterator entryNameIt; 77 }; 78 79 typedef TestEntries<BStatable> TestStatables; 80 81 82 // StatableTest 83 84 class StatableTest : public BasicTest 85 { 86 public: 87 template<typename DerivedClass> 88 static inline void AddBaseClassTests(const char *prefix, 89 CppUnit::TestSuite *suite); 90 91 virtual void CreateROStatables(TestStatables& testEntries) = 0; 92 virtual void CreateRWStatables(TestStatables& testEntries) = 0; 93 virtual void CreateUninitializedStatables(TestStatables& testEntries) = 0; 94 95 // This function called before *each* test added in Suite() 96 void setUp(); 97 98 // This function called after *each* test added in Suite() 99 void tearDown(); 100 101 void GetStatTest(); 102 void IsXYZTest(); 103 void GetXYZTest(); 104 void SetXYZTest(); 105 }; 106 107 // AddBaseClassTests 108 template<typename DerivedClass> 109 inline void 110 StatableTest::AddBaseClassTests(const char *prefix, CppUnit::TestSuite *suite) 111 { 112 typedef CppUnit::TestCaller<DerivedClass> TC; 113 string p(prefix); 114 115 suite->addTest( new TC(p + "BStatable::GetStat Test", 116 &StatableTest::GetStatTest) ); 117 suite->addTest( new TC(p + "BStatable::IsXYZ Test", 118 &StatableTest::IsXYZTest) ); 119 suite->addTest( new TC(p + "BStatable::GetXYZ Test", 120 &StatableTest::GetXYZTest) ); 121 suite->addTest( new TC(p + "BStatable::SetXYZ Test", 122 &StatableTest::SetXYZTest) ); 123 } 124 125 #endif // __sk_statable_test_h__ 126