vfs: check userland buffers before reading them.
[haiku.git] / src / tests / kits / storage / StatableTest.h
blob0eaca735cbfcfe92a3a09840f78f62feff63c856
1 // StatableTest.h
3 #ifndef __sk_statable_test_h__
4 #define __sk_statable_test_h__
6 #include <cppunit/TestCaller.h>
7 #include <cppunit/TestSuite.h>
9 #include <list>
10 using std::list;
12 #include "BasicTest.h"
14 class BStatable;
15 class BEntry;
16 class BNode;
18 // TestEntries
20 template <typename C>
21 struct TestEntries
23 ~TestEntries()
25 delete_all();
28 void delete_all()
30 for (typename list<C*>::iterator it = entries.begin();
31 it != entries.end();
32 it++) {
33 // Arghh, BStatable has no virtual destructor!
34 // Workaround: try to cast to one of the subclasses
35 if (BNode *node = dynamic_cast<BNode*>(*it))
36 delete node;
37 else if (BEntry *entry = dynamic_cast<BEntry*>(*it))
38 delete entry;
39 else
40 delete *it;
42 clear();
45 void clear()
47 entries.clear();
48 entryNames.clear();
49 rewind();
52 void add(C *entry, string entryName)
54 entries.push_back(entry);
55 entryNames.push_back(entryName);
58 bool getNext(C *&entry, string &entryName)
60 bool result = (entryIt != entries.end()
61 && entryNameIt != entryNames.end());
62 if (result) {
63 entry = *entryIt;
64 entryName = *entryNameIt;
65 entryIt++;
66 entryNameIt++;
68 return result;
71 void rewind()
73 entryIt = entries.begin();
74 entryNameIt = entryNames.begin();
77 list<C*> entries;
78 list<string> entryNames;
79 typename list<C*>::iterator entryIt;
80 typename list<string>::iterator entryNameIt;
83 typedef TestEntries<BStatable> TestStatables;
86 // StatableTest
88 class StatableTest : public BasicTest
90 public:
91 template<typename DerivedClass>
92 static inline void AddBaseClassTests(const char *prefix,
93 CppUnit::TestSuite *suite);
95 virtual void CreateROStatables(TestStatables& testEntries) = 0;
96 virtual void CreateRWStatables(TestStatables& testEntries) = 0;
97 virtual void CreateUninitializedStatables(TestStatables& testEntries) = 0;
99 // This function called before *each* test added in Suite()
100 void setUp();
102 // This function called after *each* test added in Suite()
103 void tearDown();
105 void GetStatTest();
106 void IsXYZTest();
107 void GetXYZTest();
108 void SetXYZTest();
111 // AddBaseClassTests
112 template<typename DerivedClass>
113 inline void
114 StatableTest::AddBaseClassTests(const char *prefix, CppUnit::TestSuite *suite)
116 typedef CppUnit::TestCaller<DerivedClass> TC;
117 string p(prefix);
119 suite->addTest( new TC(p + "BStatable::GetStat Test",
120 &StatableTest::GetStatTest) );
121 suite->addTest( new TC(p + "BStatable::IsXYZ Test",
122 &StatableTest::IsXYZTest) );
123 suite->addTest( new TC(p + "BStatable::GetXYZ Test",
124 &StatableTest::GetXYZTest) );
125 suite->addTest( new TC(p + "BStatable::SetXYZ Test",
126 &StatableTest::SetXYZTest) );
129 #endif // __sk_statable_test_h__