xref: /haiku/src/tests/kits/storage/StatableTest.h (revision 7120e97489acbf17d86d3f33e3b2e68974fd4b23)
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