xref: /haiku/src/tests/kits/app/bmessage/MessageItemTest.h (revision e5b24a582e1fe8b62032f0fa49dfdba26a449c6d)
1be45e998Sejakowatz //------------------------------------------------------------------------------
2be45e998Sejakowatz //	MessageItemTest.h
3be45e998Sejakowatz //
4be45e998Sejakowatz //------------------------------------------------------------------------------
5be45e998Sejakowatz 
6be45e998Sejakowatz #ifndef MESSAGEITEMTEST_H
7be45e998Sejakowatz #define MESSAGEITEMTEST_H
8be45e998Sejakowatz 
9be45e998Sejakowatz // A sad attempt to get rid of the horrible and pathetic vector<bool> specialization
10be45e998Sejakowatz #define __SGI_STL_INTERNAL_BVECTOR_H
11be45e998Sejakowatz 
12be45e998Sejakowatz // Standard Includes -----------------------------------------------------------
13be45e998Sejakowatz #include <iostream>
14be45e998Sejakowatz #include <stdio.h>
15be45e998Sejakowatz #ifdef TEST_OBOS
16be45e998Sejakowatz #include <posix/typeinfo>
17be45e998Sejakowatz #else
18be45e998Sejakowatz #include <typeinfo>
19be45e998Sejakowatz #endif
20be45e998Sejakowatz #include <posix/string.h>
21be45e998Sejakowatz 
22be45e998Sejakowatz // System Includes -------------------------------------------------------------
23be45e998Sejakowatz #include <Message.h>
24be45e998Sejakowatz 
25be45e998Sejakowatz // Project Includes ------------------------------------------------------------
26be45e998Sejakowatz 
27be45e998Sejakowatz // Local Includes --------------------------------------------------------------
28be45e998Sejakowatz #include "../common.h"
29be45e998Sejakowatz 
30be45e998Sejakowatz // Local Defines ---------------------------------------------------------------
31*e5b24a58Sejakowatz #define TEMPLATE_TEST_PARAMS <Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>
32be45e998Sejakowatz #define ADD_TEMPLATE_TEST(classbeingtested, suitename, classname, funcname)				\
33be45e998Sejakowatz 	(suitename)->addTest(new TestCaller<classname>(((string(#classbeingtested) + "::" + #funcname + "::" + typeid(Type).name()).c_str() ),	\
34be45e998Sejakowatz 						 &classname::funcname));
35be45e998Sejakowatz 
36be45e998Sejakowatz // Globals ---------------------------------------------------------------------
37be45e998Sejakowatz template
38be45e998Sejakowatz <
39be45e998Sejakowatz 	class Type,				// int32
40be45e998Sejakowatz 	type_code TypeCode,		// B_INT32_TYPE
41be45e998Sejakowatz 	class FuncPolicy,		// status_t Add(BMessage&, const char*, Type&)
42be45e998Sejakowatz 							// status_t Find(BMessage&, const char*, int32, Type*)
43be45e998Sejakowatz 							// Type QuickFind(BMessage&, const char*, int32)
44be45e998Sejakowatz 							// bool Has(BMessage&, const char*, int32)
45be45e998Sejakowatz 							// status_t Replace(BMessage&, const char*, int32, Type)
46be45e998Sejakowatz 	class InitPolicy,		// Type Zero()
47be45e998Sejakowatz 							// Type Test1()
48be45e998Sejakowatz 							// Type Test2()
49*e5b24a58Sejakowatz 							// size_t SizeOf(const Type&)
50*e5b24a58Sejakowatz 							// ArrayType Array()
51*e5b24a58Sejakowatz 							// typedef XXX ArrayType
52*e5b24a58Sejakowatz 	class AssertPolicy,		// Type Zero()
53*e5b24a58Sejakowatz 							// Type Invalid()
54*e5b24a58Sejakowatz 	class ComparePolicy		// bool Compare(const Type& lhs, const Type& rhs)
55be45e998Sejakowatz >
56be45e998Sejakowatz class TMessageItemTest;
57be45e998Sejakowatz 
58be45e998Sejakowatz 
59be45e998Sejakowatz //------------------------------------------------------------------------------
60be45e998Sejakowatz template<class T>
61be45e998Sejakowatz struct ArrayTypeBase
62be45e998Sejakowatz {
63be45e998Sejakowatz 	typedef vector<T> ArrayType;
64be45e998Sejakowatz 	typedef typename ArrayType::size_type SizeType;
65be45e998Sejakowatz 	static SizeType Size(ArrayType& array) { return array.size(); }
66be45e998Sejakowatz };
67be45e998Sejakowatz //------------------------------------------------------------------------------
68be45e998Sejakowatz template
69be45e998Sejakowatz <
70be45e998Sejakowatz 	typename Type,
71be45e998Sejakowatz 	status_t (BMessage::*AddFunc)(const char*, Type),
72be45e998Sejakowatz 	status_t (BMessage::*FindFunc)(const char*, int32, Type*) const,
73be45e998Sejakowatz 	Type (BMessage::*QuickFindFunc)(const char*, int32) const,
74be45e998Sejakowatz 	bool (BMessage::*HasFunc)(const char*, int32) const,
75*e5b24a58Sejakowatz 	status_t (BMessage::*ReplaceFunc)(const char*, int32, Type),
76*e5b24a58Sejakowatz 	status_t (BMessage::*AddDataFunc)(const char*, type_code, const void*,
77*e5b24a58Sejakowatz 									  ssize_t, bool, int32) = &BMessage::AddData,
78*e5b24a58Sejakowatz 	status_t (BMessage::*FindDataFunc)(const char*, type_code, int32,
79*e5b24a58Sejakowatz 									   const void**, ssize_t*) const = &BMessage::FindData
80be45e998Sejakowatz >
81be45e998Sejakowatz struct TMessageItemFuncPolicy
82be45e998Sejakowatz {
83be45e998Sejakowatz 	static status_t Add(BMessage& msg, const char* name, Type& val)
84be45e998Sejakowatz 	{
85be45e998Sejakowatz 		return (msg.*AddFunc)(name, val);
86be45e998Sejakowatz 	}
87*e5b24a58Sejakowatz 	static status_t AddData(BMessage& msg, const char* name, type_code type,
88*e5b24a58Sejakowatz 							Type* val, ssize_t size)
89*e5b24a58Sejakowatz 	{
90*e5b24a58Sejakowatz 		return (msg.*AddDataFunc)(name, type, (const void*)val, size);
91*e5b24a58Sejakowatz 	}
92be45e998Sejakowatz 	static status_t Find(BMessage& msg, const char* name, int32 index, Type* val)
93be45e998Sejakowatz 	{
94be45e998Sejakowatz 		return (msg.*FindFunc)(name, index, val);
95be45e998Sejakowatz 	}
96be45e998Sejakowatz 	static Type QuickFind(BMessage& msg, const char* name, int32 index)
97be45e998Sejakowatz 	{
98be45e998Sejakowatz 		return (msg.*QuickFindFunc)(name, index);
99be45e998Sejakowatz 	}
100be45e998Sejakowatz 	static bool Has(BMessage& msg, const char* name, int32 index)
101be45e998Sejakowatz 	{
102be45e998Sejakowatz 		return (msg.*HasFunc)(name, index);
103be45e998Sejakowatz 	}
104*e5b24a58Sejakowatz 	static status_t Replace(BMessage& msg, const char* name, int32 index, Type& val)
105be45e998Sejakowatz 	{
106be45e998Sejakowatz 		return (msg.*ReplaceFunc)(name, index, val);
107be45e998Sejakowatz 	}
108*e5b24a58Sejakowatz 	static status_t FindData(BMessage& msg, const char* name, type_code type,
109*e5b24a58Sejakowatz 							 int32 index, const void** data, ssize_t* size)
110*e5b24a58Sejakowatz 	{
111*e5b24a58Sejakowatz 		return (msg.*FindDataFunc)(name, type, index, data, size);
112*e5b24a58Sejakowatz 	}
113*e5b24a58Sejakowatz };
114*e5b24a58Sejakowatz //------------------------------------------------------------------------------
115*e5b24a58Sejakowatz template<class T, T zero = T(), T invalid = T()>
116*e5b24a58Sejakowatz struct TMessageItemAssertPolicy
117*e5b24a58Sejakowatz {
118*e5b24a58Sejakowatz 	inline static T Zero()		{ return zero; }
119*e5b24a58Sejakowatz 	inline static T Invalid()	{ return invalid; }
120*e5b24a58Sejakowatz 	inline static bool Size(size_t size, T& t)
121*e5b24a58Sejakowatz 		{ return size == sizeof (t); }
122*e5b24a58Sejakowatz };
123*e5b24a58Sejakowatz //------------------------------------------------------------------------------
124*e5b24a58Sejakowatz template<class T>
125*e5b24a58Sejakowatz struct TMessageItemComparePolicy
126*e5b24a58Sejakowatz {
127*e5b24a58Sejakowatz 	inline static bool Compare(const T& lhs, const T& rhs)
128*e5b24a58Sejakowatz 		{ return lhs == rhs; }
129be45e998Sejakowatz };
130be45e998Sejakowatz //------------------------------------------------------------------------------
131be45e998Sejakowatz template
132be45e998Sejakowatz <
133be45e998Sejakowatz 	class Type,				// int32
134be45e998Sejakowatz 	type_code TypeCode,		// B_INT32_TYPE
135be45e998Sejakowatz 	class FuncPolicy,		// status_t Add(BMessage&, const char*, Type&)
136be45e998Sejakowatz 							// status_t Find(BMessage&, const char*, int32, Type*)
137be45e998Sejakowatz 							// Type QuickFind(BMessage&, const char*, int32)
138be45e998Sejakowatz 							// bool Has(BMessage&, const char*, int32)
139be45e998Sejakowatz 							// status_t Replace(BMessage&, const char*, int32, Type)
140*e5b24a58Sejakowatz 							// status_t FindData(BMessage&, const char*, type_code, int32, const void**, ssize_t*)
141be45e998Sejakowatz 	class InitPolicy,		// Type Zero()
142be45e998Sejakowatz 							// Type Test1()
143be45e998Sejakowatz 							// Type Test2()
144*e5b24a58Sejakowatz 							// size_t SizeOf(const Type&)
145be45e998Sejakowatz 							// ArrayType Array()
146be45e998Sejakowatz 							// typedef XXX ArrayType
147*e5b24a58Sejakowatz 	class AssertPolicy,		// Type Zero()
148be45e998Sejakowatz 							// Type Invalid()
149*e5b24a58Sejakowatz 							// bool Size(size_t, T&)
150*e5b24a58Sejakowatz 	class ComparePolicy		// bool Compare(const Type& lhs, const Type& rhs)
151*e5b24a58Sejakowatz 		= TMessageItemComparePolicy<Type>
152be45e998Sejakowatz >
153be45e998Sejakowatz class TMessageItemTest : public TestCase
154be45e998Sejakowatz {
155be45e998Sejakowatz 	public:
156be45e998Sejakowatz 		TMessageItemTest() {;}
157be45e998Sejakowatz 		TMessageItemTest(std::string name) : TestCase(name) {;}
158be45e998Sejakowatz 
159be45e998Sejakowatz 		void MessageItemTest1();
160be45e998Sejakowatz 		void MessageItemTest2();
161be45e998Sejakowatz 		void MessageItemTest3();
162be45e998Sejakowatz 		void MessageItemTest4();
163be45e998Sejakowatz 		void MessageItemTest5();
164be45e998Sejakowatz 		void MessageItemTest6();
165be45e998Sejakowatz 		void MessageItemTest7();
166be45e998Sejakowatz 		void MessageItemTest8();
167be45e998Sejakowatz 
168be45e998Sejakowatz 		static TestSuite* Suite();
169be45e998Sejakowatz 
170be45e998Sejakowatz 	typedef typename InitPolicy::ArrayType ArrayType;
171be45e998Sejakowatz };
172be45e998Sejakowatz 
173be45e998Sejakowatz 
174be45e998Sejakowatz //------------------------------------------------------------------------------
175be45e998Sejakowatz template
176be45e998Sejakowatz <
177be45e998Sejakowatz 	class Type,
178be45e998Sejakowatz 	type_code TypeCode,
179be45e998Sejakowatz 	class FuncPolicy,
180be45e998Sejakowatz 	class InitPolicy,
181*e5b24a58Sejakowatz 	class AssertPolicy,
182*e5b24a58Sejakowatz 	class ComparePolicy
183be45e998Sejakowatz >
184be45e998Sejakowatz void
185*e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
186be45e998Sejakowatz MessageItemTest1()
187be45e998Sejakowatz {
188be45e998Sejakowatz 	BMessage msg;
189be45e998Sejakowatz 	Type out = InitPolicy::Zero();
190be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_NAME_NOT_FOUND);
191*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, AssertPolicy::Invalid()));
192*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0),
193*e5b24a58Sejakowatz 										  AssertPolicy::Invalid()));
194be45e998Sejakowatz 	CPPUNIT_ASSERT(!FuncPolicy::Has(msg, "item", 0));
195be45e998Sejakowatz 	const void* ptr = &out;
196be45e998Sejakowatz 	ssize_t size;
197*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 0, &ptr, &size) ==
198be45e998Sejakowatz 				   B_NAME_NOT_FOUND);
199be45e998Sejakowatz 	CPPUNIT_ASSERT(ptr == NULL);
200be45e998Sejakowatz }
201be45e998Sejakowatz //------------------------------------------------------------------------------
202*e5b24a58Sejakowatz //	R5 segfaults on the find data portion of this test for entry_refs
203*e5b24a58Sejakowatz //	TODO: test R5 for entry_ref & BMessage
204be45e998Sejakowatz template
205be45e998Sejakowatz <
206be45e998Sejakowatz 	class Type,
207be45e998Sejakowatz 	type_code TypeCode,
208be45e998Sejakowatz 	class FuncPolicy,
209be45e998Sejakowatz 	class InitPolicy,
210*e5b24a58Sejakowatz 	class AssertPolicy,
211*e5b24a58Sejakowatz 	class ComparePolicy
212be45e998Sejakowatz >
213be45e998Sejakowatz void
214*e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
215be45e998Sejakowatz MessageItemTest2()
216be45e998Sejakowatz {
217be45e998Sejakowatz 	BMessage msg;
218be45e998Sejakowatz 	Type in = InitPolicy::Test1();
219be45e998Sejakowatz 	Type out = InitPolicy::Zero();
220be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in) == B_OK);
221be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", 0));
222*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0), in));
223be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_OK);
224*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in));
225be45e998Sejakowatz 	Type* pout = NULL;
226be45e998Sejakowatz 	ssize_t size;
227*e5b24a58Sejakowatz 	status_t err = FuncPolicy::FindData(msg, "item", TypeCode, 0,
228*e5b24a58Sejakowatz 										(const void**)&pout, &size);
229be45e998Sejakowatz 	CPPUNIT_ASSERT(err == B_OK);
230*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(*pout, in));
231*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, *pout));
232be45e998Sejakowatz }
233be45e998Sejakowatz //------------------------------------------------------------------------------
234*e5b24a58Sejakowatz //	TODO: test R5 for entry_ref & BMessage
235be45e998Sejakowatz template
236be45e998Sejakowatz <
237be45e998Sejakowatz 	class Type,
238be45e998Sejakowatz 	type_code TypeCode,
239be45e998Sejakowatz 	class FuncPolicy,
240be45e998Sejakowatz 	class InitPolicy,
241*e5b24a58Sejakowatz 	class AssertPolicy,
242*e5b24a58Sejakowatz 	class ComparePolicy
243be45e998Sejakowatz >
244be45e998Sejakowatz void
245*e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
246be45e998Sejakowatz MessageItemTest3()
247be45e998Sejakowatz {
248be45e998Sejakowatz 	BMessage msg;
249be45e998Sejakowatz 	Type in = InitPolicy::Test1();
250be45e998Sejakowatz 	Type in2 = InitPolicy::Test2();
251be45e998Sejakowatz 	Type out = InitPolicy::Zero();
252be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in) == B_OK);
253be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Replace(msg, "item", 0, in2) == B_OK);
254be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", 0));
255*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0), in2));
256be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_OK);
257*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in2));
258be45e998Sejakowatz 	out = InitPolicy::Zero();
259be45e998Sejakowatz 	Type* pout;
260be45e998Sejakowatz 	ssize_t size;
261*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 0,
262*e5b24a58Sejakowatz 										(const void**)&pout, &size) == B_OK);
263*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(*pout, in2));
264*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, *pout));
265be45e998Sejakowatz }
266be45e998Sejakowatz //------------------------------------------------------------------------------
267be45e998Sejakowatz template
268be45e998Sejakowatz <
269be45e998Sejakowatz 	class Type,
270be45e998Sejakowatz 	type_code TypeCode,
271be45e998Sejakowatz 	class FuncPolicy,
272be45e998Sejakowatz 	class InitPolicy,
273*e5b24a58Sejakowatz 	class AssertPolicy,
274*e5b24a58Sejakowatz 	class ComparePolicy
275be45e998Sejakowatz >
276be45e998Sejakowatz void
277*e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
278be45e998Sejakowatz MessageItemTest4()
279be45e998Sejakowatz {
280be45e998Sejakowatz 	BMessage msg;
281be45e998Sejakowatz 	Type out = InitPolicy::Zero();
282be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 1, &out) == B_NAME_NOT_FOUND);
283*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, AssertPolicy::Invalid()));
284*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 1),
285*e5b24a58Sejakowatz 										  AssertPolicy::Invalid()));
286be45e998Sejakowatz 	CPPUNIT_ASSERT(!FuncPolicy::Has(msg, "item", 1));
287be45e998Sejakowatz 	const void* ptr = &out;
288be45e998Sejakowatz 	ssize_t size;
289*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 1, &ptr, &size) ==
290be45e998Sejakowatz 				   B_NAME_NOT_FOUND);
291be45e998Sejakowatz 	CPPUNIT_ASSERT(ptr == NULL);
292be45e998Sejakowatz }
293be45e998Sejakowatz //------------------------------------------------------------------------------
294*e5b24a58Sejakowatz //	TODO: test R5 for entry_ref & BMessage
295be45e998Sejakowatz template
296be45e998Sejakowatz <
297be45e998Sejakowatz 	class Type,
298be45e998Sejakowatz 	type_code TypeCode,
299be45e998Sejakowatz 	class FuncPolicy,
300be45e998Sejakowatz 	class InitPolicy,
301*e5b24a58Sejakowatz 	class AssertPolicy,
302*e5b24a58Sejakowatz 	class ComparePolicy
303be45e998Sejakowatz >
304be45e998Sejakowatz void
305*e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
306be45e998Sejakowatz MessageItemTest5()
307be45e998Sejakowatz {
308be45e998Sejakowatz 	BMessage msg;
309be45e998Sejakowatz 	ArrayType in = InitPolicy::Array();
310be45e998Sejakowatz 	Type out = InitPolicy::Zero();
311be45e998Sejakowatz 	Type* pout;
312be45e998Sejakowatz 	ssize_t size;
313be45e998Sejakowatz 
314be45e998Sejakowatz 	for (int32 i = 0; i < InitPolicy::Size(in); ++i)
315be45e998Sejakowatz 	{
316be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in[i]) == B_OK);
317be45e998Sejakowatz 	}
318be45e998Sejakowatz 
319be45e998Sejakowatz 	for (int32 i = 0; i < InitPolicy::Size(in); ++i)
320be45e998Sejakowatz 	{
321be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", i));
322*e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", i),
323*e5b24a58Sejakowatz 											  in[i]));
324be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", i, &out) == B_OK);
325*e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(out, in[i]));
326*e5b24a58Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, i,
327be45e998Sejakowatz 											(const void**)&pout, &size) == B_OK);
328*e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(*pout, in[i]));
329*e5b24a58Sejakowatz 		CPPUNIT_ASSERT(AssertPolicy::Size(size, *pout));
330be45e998Sejakowatz 	}
331be45e998Sejakowatz }
332be45e998Sejakowatz //------------------------------------------------------------------------------
333*e5b24a58Sejakowatz //	TODO: test R5 for entry_ref & BMessage
334be45e998Sejakowatz template
335be45e998Sejakowatz <
336be45e998Sejakowatz 	class Type,
337be45e998Sejakowatz 	type_code TypeCode,
338be45e998Sejakowatz 	class FuncPolicy,
339be45e998Sejakowatz 	class InitPolicy,
340*e5b24a58Sejakowatz 	class AssertPolicy,
341*e5b24a58Sejakowatz 	class ComparePolicy
342be45e998Sejakowatz >
343be45e998Sejakowatz void
344*e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
345be45e998Sejakowatz MessageItemTest6()
346be45e998Sejakowatz {
347be45e998Sejakowatz 	BMessage msg;
348be45e998Sejakowatz 	ArrayType in = InitPolicy::Array();
349be45e998Sejakowatz 	Type in2 = InitPolicy::Test2();
350be45e998Sejakowatz 	Type out = InitPolicy::Zero();
351be45e998Sejakowatz 	const int rIndex = 2;
352be45e998Sejakowatz 
353be45e998Sejakowatz 	for (int32 i = 0; i < InitPolicy::Size(in); ++i)
354be45e998Sejakowatz 	{
355be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in[i]) == B_OK);
356be45e998Sejakowatz 	}
357be45e998Sejakowatz 
358be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Replace(msg, "item", rIndex, in2) == B_OK);
359be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", rIndex));
360*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", rIndex),
361*e5b24a58Sejakowatz 										  in2));
362be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", rIndex, &out) == B_OK);
363*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in2));
364be45e998Sejakowatz 	out = InitPolicy::Zero();
365be45e998Sejakowatz 	Type* pout;
366be45e998Sejakowatz 	ssize_t size;
367*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, rIndex,
368be45e998Sejakowatz 										(const void**)&pout, &size) == B_OK);
369*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(*pout, in2));
370*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, *pout));
371be45e998Sejakowatz }
372be45e998Sejakowatz //------------------------------------------------------------------------------
373*e5b24a58Sejakowatz //	TODO: test R5 for entry_ref & BMessage
374be45e998Sejakowatz template
375be45e998Sejakowatz <
376be45e998Sejakowatz 	class Type,
377be45e998Sejakowatz 	type_code TypeCode,
378be45e998Sejakowatz 	class FuncPolicy,
379be45e998Sejakowatz 	class InitPolicy,
380*e5b24a58Sejakowatz 	class AssertPolicy,
381*e5b24a58Sejakowatz 	class ComparePolicy
382be45e998Sejakowatz >
383be45e998Sejakowatz void
384*e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
385be45e998Sejakowatz MessageItemTest7()
386be45e998Sejakowatz {
387be45e998Sejakowatz 	BMessage msg;
388be45e998Sejakowatz 	Type in = InitPolicy::Test1();
389be45e998Sejakowatz 	Type out = InitPolicy::Zero();
390*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::AddData(msg, "item", TypeCode, &in,
391*e5b24a58Sejakowatz 									   InitPolicy::SizeOf(in)) == B_OK);
392be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", 0));
393*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0),
394*e5b24a58Sejakowatz 										  in));
395be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_OK);
396*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in));
397be45e998Sejakowatz 	Type* pout = NULL;
398be45e998Sejakowatz 	ssize_t size;
399*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 0,
400*e5b24a58Sejakowatz 										(const void**)&pout, &size) == B_OK);
401*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(*pout, in));
402*e5b24a58Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, *pout));
403be45e998Sejakowatz }
404be45e998Sejakowatz //------------------------------------------------------------------------------
405be45e998Sejakowatz template
406be45e998Sejakowatz <
407be45e998Sejakowatz 	class Type,
408be45e998Sejakowatz 	type_code TypeCode,
409be45e998Sejakowatz 	class FuncPolicy,
410be45e998Sejakowatz 	class InitPolicy,
411*e5b24a58Sejakowatz 	class AssertPolicy,
412*e5b24a58Sejakowatz 	class ComparePolicy
413be45e998Sejakowatz >
414be45e998Sejakowatz void
415*e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
416be45e998Sejakowatz MessageItemTest8()
417be45e998Sejakowatz {
418be45e998Sejakowatz 	BMessage msg;
419be45e998Sejakowatz 	ArrayType in = InitPolicy::Array();
420be45e998Sejakowatz 	Type out = InitPolicy::Zero();
421be45e998Sejakowatz 	Type* pout;
422be45e998Sejakowatz 	ssize_t size;
423be45e998Sejakowatz 
424be45e998Sejakowatz 	for (int32 i = 0; i < InitPolicy::Size(in); ++i)
425be45e998Sejakowatz 	{
426*e5b24a58Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::AddData(msg, "item", TypeCode,
427*e5b24a58Sejakowatz 					   &in[i], InitPolicy::SizeOf(in[i])) == B_OK);
428be45e998Sejakowatz 	}
429be45e998Sejakowatz 
430be45e998Sejakowatz 	for (int32 i = 0; i < InitPolicy::Size(in); ++i)
431be45e998Sejakowatz 	{
432be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", i));
433*e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", i),
434*e5b24a58Sejakowatz 											  in[i]));
435be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", i, &out) == B_OK);
436*e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(out, in[i]));
437*e5b24a58Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, i,
438be45e998Sejakowatz 											(const void**)&pout, &size) == B_OK);
439*e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(*pout, in[i]));
440*e5b24a58Sejakowatz 		CPPUNIT_ASSERT(AssertPolicy::Size(size, *pout));
441be45e998Sejakowatz 	}
442be45e998Sejakowatz }
443be45e998Sejakowatz //------------------------------------------------------------------------------
444be45e998Sejakowatz template
445be45e998Sejakowatz <
446be45e998Sejakowatz 	class Type,
447be45e998Sejakowatz 	type_code TypeCode,
448be45e998Sejakowatz 	class FuncPolicy,
449be45e998Sejakowatz 	class InitPolicy,
450*e5b24a58Sejakowatz 	class AssertPolicy,
451*e5b24a58Sejakowatz 	class ComparePolicy
452be45e998Sejakowatz >
453be45e998Sejakowatz TestSuite*
454*e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
455be45e998Sejakowatz Suite()
456be45e998Sejakowatz {
457be45e998Sejakowatz 	TestSuite* suite = new TestSuite("BMessage::Add/Find/Replace/HasRect()");
458be45e998Sejakowatz 
459be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest1);
460be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest2);
461be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest3);
462be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest4);
463be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest5);
464be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest6);
465be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest7);
466be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest8);
467be45e998Sejakowatz 
468be45e998Sejakowatz 	return suite;
469be45e998Sejakowatz }
470be45e998Sejakowatz //------------------------------------------------------------------------------
471be45e998Sejakowatz 
472be45e998Sejakowatz #endif	// MESSAGEITEMTEST_H
473be45e998Sejakowatz 
474be45e998Sejakowatz /*
475be45e998Sejakowatz  * $Log $
476be45e998Sejakowatz  *
477be45e998Sejakowatz  * $Id  $
478be45e998Sejakowatz  *
479be45e998Sejakowatz 
480be45e998Sejakowatz  */