xref: /haiku/src/tests/kits/app/bmessage/MessageItemTest.h (revision 9fa0302ad0d6369868a9dccd59f7a98cbf239fcb)
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 ---------------------------------------------------------------
31e5b24a58Sejakowatz #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()
49e5b24a58Sejakowatz 							// size_t SizeOf(const Type&)
50e5b24a58Sejakowatz 							// ArrayType Array()
51e5b24a58Sejakowatz 							// typedef XXX ArrayType
52e5b24a58Sejakowatz 	class AssertPolicy,		// Type Zero()
53e5b24a58Sejakowatz 							// Type Invalid()
54e5b24a58Sejakowatz 	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 //------------------------------------------------------------------------------
68159d60f9Sejakowatz template<class Type>
69159d60f9Sejakowatz struct TypePolicy
70159d60f9Sejakowatz {
71159d60f9Sejakowatz 	typedef Type* TypePtr;
72159d60f9Sejakowatz 	enum { FixedSize = true };
73159d60f9Sejakowatz 	inline Type& Dereference(TypePtr p)
74159d60f9Sejakowatz 	{
75159d60f9Sejakowatz 		return *p;
76159d60f9Sejakowatz 	}
77159d60f9Sejakowatz 	inline TypePtr AddressOf(Type& t) { return &t; }
78159d60f9Sejakowatz };
79159d60f9Sejakowatz //------------------------------------------------------------------------------
80be45e998Sejakowatz template
81be45e998Sejakowatz <
82be45e998Sejakowatz 	typename Type,
83be45e998Sejakowatz 	status_t (BMessage::*AddFunc)(const char*, Type),
84be45e998Sejakowatz 	status_t (BMessage::*FindFunc)(const char*, int32, Type*) const,
852605a4f5Sejakowatz 	status_t (BMessage::*ShortFindFunc)(const char*, Type*) const,
86be45e998Sejakowatz 	Type (BMessage::*QuickFindFunc)(const char*, int32) const,
87be45e998Sejakowatz 	bool (BMessage::*HasFunc)(const char*, int32) const,
88e5b24a58Sejakowatz 	status_t (BMessage::*ReplaceFunc)(const char*, int32, Type),
89e5b24a58Sejakowatz 	status_t (BMessage::*AddDataFunc)(const char*, type_code, const void*,
90e5b24a58Sejakowatz 									  ssize_t, bool, int32) = &BMessage::AddData,
91e5b24a58Sejakowatz 	status_t (BMessage::*FindDataFunc)(const char*, type_code, int32,
92e5b24a58Sejakowatz 									   const void**, ssize_t*) const = &BMessage::FindData
93be45e998Sejakowatz >
94159d60f9Sejakowatz struct TMessageItemFuncPolicy : public TypePolicy<Type>
95be45e998Sejakowatz {
96be45e998Sejakowatz 	static status_t Add(BMessage& msg, const char* name, Type& val)
97be45e998Sejakowatz 	{
98be45e998Sejakowatz 		return (msg.*AddFunc)(name, val);
99be45e998Sejakowatz 	}
100e5b24a58Sejakowatz 	static status_t AddData(BMessage& msg, const char* name, type_code type,
101159d60f9Sejakowatz 							TypePtr val, ssize_t size, bool fixedSize = true)
102e5b24a58Sejakowatz 	{
103159d60f9Sejakowatz 		return (msg.*AddDataFunc)(name, type, (const void*)val, size, fixedSize);
104e5b24a58Sejakowatz 	}
105be45e998Sejakowatz 	static status_t Find(BMessage& msg, const char* name, int32 index, Type* val)
106be45e998Sejakowatz 	{
107be45e998Sejakowatz 		return (msg.*FindFunc)(name, index, val);
108be45e998Sejakowatz 	}
1092605a4f5Sejakowatz 	static status_t ShortFind(BMessage& msg, const char* name, Type* val)
1102605a4f5Sejakowatz 	{
1112605a4f5Sejakowatz 		return (msg.*ShortFindFunc)(name, val);
1122605a4f5Sejakowatz 	}
113be45e998Sejakowatz 	static Type QuickFind(BMessage& msg, const char* name, int32 index)
114be45e998Sejakowatz 	{
115be45e998Sejakowatz 		return (msg.*QuickFindFunc)(name, index);
116be45e998Sejakowatz 	}
117be45e998Sejakowatz 	static bool Has(BMessage& msg, const char* name, int32 index)
118be45e998Sejakowatz 	{
119be45e998Sejakowatz 		return (msg.*HasFunc)(name, index);
120be45e998Sejakowatz 	}
121e5b24a58Sejakowatz 	static status_t Replace(BMessage& msg, const char* name, int32 index, Type& val)
122be45e998Sejakowatz 	{
123be45e998Sejakowatz 		return (msg.*ReplaceFunc)(name, index, val);
124be45e998Sejakowatz 	}
125e5b24a58Sejakowatz 	static status_t FindData(BMessage& msg, const char* name, type_code type,
126e5b24a58Sejakowatz 							 int32 index, const void** data, ssize_t* size)
127e5b24a58Sejakowatz 	{
128e5b24a58Sejakowatz 		return (msg.*FindDataFunc)(name, type, index, data, size);
129e5b24a58Sejakowatz 	}
130e5b24a58Sejakowatz };
131e5b24a58Sejakowatz //------------------------------------------------------------------------------
132e5b24a58Sejakowatz template<class T, T zero = T(), T invalid = T()>
133e5b24a58Sejakowatz struct TMessageItemAssertPolicy
134e5b24a58Sejakowatz {
135e5b24a58Sejakowatz 	inline static T Zero()		{ return zero; }
136e5b24a58Sejakowatz 	inline static T Invalid()	{ return invalid; }
137e5b24a58Sejakowatz 	inline static bool Size(size_t size, T& t)
138e5b24a58Sejakowatz 		{ return size == sizeof (t); }
139e5b24a58Sejakowatz };
140e5b24a58Sejakowatz //------------------------------------------------------------------------------
141e5b24a58Sejakowatz template<class T>
142e5b24a58Sejakowatz struct TMessageItemComparePolicy
143e5b24a58Sejakowatz {
144c5d8f91dSejakowatz 	inline static bool Compare(const T& lhs, const T& rhs);
145c5d8f91dSejakowatz //		{ return lhs == rhs; }
146be45e998Sejakowatz };
147c5d8f91dSejakowatz template<class T>
148c5d8f91dSejakowatz bool
149c5d8f91dSejakowatz TMessageItemComparePolicy<T>::Compare(const T &lhs, const T &rhs)
150c5d8f91dSejakowatz {
151c5d8f91dSejakowatz 	 return lhs == rhs;
152c5d8f91dSejakowatz }
153be45e998Sejakowatz //------------------------------------------------------------------------------
154be45e998Sejakowatz template
155be45e998Sejakowatz <
156be45e998Sejakowatz 	class Type,				// int32
157be45e998Sejakowatz 	type_code TypeCode,		// B_INT32_TYPE
158be45e998Sejakowatz 	class FuncPolicy,		// status_t Add(BMessage&, const char*, Type&)
159be45e998Sejakowatz 							// status_t Find(BMessage&, const char*, int32, Type*)
160be45e998Sejakowatz 							// Type QuickFind(BMessage&, const char*, int32)
161be45e998Sejakowatz 							// bool Has(BMessage&, const char*, int32)
162be45e998Sejakowatz 							// status_t Replace(BMessage&, const char*, int32, Type)
163e5b24a58Sejakowatz 							// status_t FindData(BMessage&, const char*, type_code, int32, const void**, ssize_t*)
164be45e998Sejakowatz 	class InitPolicy,		// Type Zero()
165be45e998Sejakowatz 							// Type Test1()
166be45e998Sejakowatz 							// Type Test2()
167e5b24a58Sejakowatz 							// size_t SizeOf(const Type&)
168be45e998Sejakowatz 							// ArrayType Array()
169be45e998Sejakowatz 							// typedef XXX ArrayType
170e5b24a58Sejakowatz 	class AssertPolicy,		// Type Zero()
171be45e998Sejakowatz 							// Type Invalid()
172e5b24a58Sejakowatz 							// bool Size(size_t, T&)
173e5b24a58Sejakowatz 	class ComparePolicy		// bool Compare(const Type& lhs, const Type& rhs)
174e5b24a58Sejakowatz 		= TMessageItemComparePolicy<Type>
175be45e998Sejakowatz >
176159d60f9Sejakowatz class TMessageItemTest : public TestCase, public TypePolicy<Type>
177be45e998Sejakowatz {
178be45e998Sejakowatz 	public:
179be45e998Sejakowatz 		TMessageItemTest() {;}
180be45e998Sejakowatz 		TMessageItemTest(std::string name) : TestCase(name) {;}
181be45e998Sejakowatz 
182be45e998Sejakowatz 		void MessageItemTest1();
183be45e998Sejakowatz 		void MessageItemTest2();
184be45e998Sejakowatz 		void MessageItemTest3();
185be45e998Sejakowatz 		void MessageItemTest4();
186be45e998Sejakowatz 		void MessageItemTest5();
187be45e998Sejakowatz 		void MessageItemTest6();
188be45e998Sejakowatz 		void MessageItemTest7();
189be45e998Sejakowatz 		void MessageItemTest8();
1900cc48ce6Sejakowatz 		void MessageItemTest9();
1910cc48ce6Sejakowatz 		void MessageItemTest10();
192*9fa0302aSejakowatz 		void MessageItemTest11();
193*9fa0302aSejakowatz 		void MessageItemTest12();
194be45e998Sejakowatz 
195be45e998Sejakowatz 		static TestSuite* Suite();
196be45e998Sejakowatz 
197be45e998Sejakowatz 	typedef typename InitPolicy::ArrayType ArrayType;
198be45e998Sejakowatz };
199be45e998Sejakowatz 
200be45e998Sejakowatz 
201be45e998Sejakowatz //------------------------------------------------------------------------------
202be45e998Sejakowatz template
203be45e998Sejakowatz <
204be45e998Sejakowatz 	class Type,
205be45e998Sejakowatz 	type_code TypeCode,
206be45e998Sejakowatz 	class FuncPolicy,
207be45e998Sejakowatz 	class InitPolicy,
208e5b24a58Sejakowatz 	class AssertPolicy,
209e5b24a58Sejakowatz 	class ComparePolicy
210be45e998Sejakowatz >
211be45e998Sejakowatz void
212e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
213be45e998Sejakowatz MessageItemTest1()
214be45e998Sejakowatz {
215be45e998Sejakowatz 	BMessage msg;
216be45e998Sejakowatz 	Type out = InitPolicy::Zero();
2172605a4f5Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::ShortFind(msg, "item", &out) == B_NAME_NOT_FOUND);
218be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_NAME_NOT_FOUND);
219e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, AssertPolicy::Invalid()));
220e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0),
221e5b24a58Sejakowatz 										  AssertPolicy::Invalid()));
222be45e998Sejakowatz 	CPPUNIT_ASSERT(!FuncPolicy::Has(msg, "item", 0));
223be45e998Sejakowatz 	const void* ptr = &out;
224be45e998Sejakowatz 	ssize_t size;
225e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 0, &ptr, &size) ==
226be45e998Sejakowatz 				   B_NAME_NOT_FOUND);
227be45e998Sejakowatz 	CPPUNIT_ASSERT(ptr == NULL);
228be45e998Sejakowatz }
229be45e998Sejakowatz //------------------------------------------------------------------------------
230be45e998Sejakowatz template
231be45e998Sejakowatz <
232be45e998Sejakowatz 	class Type,
233be45e998Sejakowatz 	type_code TypeCode,
234be45e998Sejakowatz 	class FuncPolicy,
235be45e998Sejakowatz 	class InitPolicy,
236e5b24a58Sejakowatz 	class AssertPolicy,
237e5b24a58Sejakowatz 	class ComparePolicy
238be45e998Sejakowatz >
239be45e998Sejakowatz void
240e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
241be45e998Sejakowatz MessageItemTest2()
2420cc48ce6Sejakowatz {
243be45e998Sejakowatz 	BMessage msg;
244be45e998Sejakowatz 	Type in = InitPolicy::Test1();
245be45e998Sejakowatz 	Type out = InitPolicy::Zero();
246be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in) == B_OK);
247be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", 0));
248e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0), in));
2492605a4f5Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::ShortFind(msg, "item", &out) == B_OK);
250be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_OK);
251e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in));
252159d60f9Sejakowatz 	TypePtr pout = NULL;
253be45e998Sejakowatz 	ssize_t size;
254e5b24a58Sejakowatz 	status_t err = FuncPolicy::FindData(msg, "item", TypeCode, 0,
255e5b24a58Sejakowatz 										(const void**)&pout, &size);
256be45e998Sejakowatz 	CPPUNIT_ASSERT(err == B_OK);
257159d60f9Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in));
258159d60f9Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
259be45e998Sejakowatz }
260be45e998Sejakowatz //------------------------------------------------------------------------------
261be45e998Sejakowatz template
262be45e998Sejakowatz <
263be45e998Sejakowatz 	class Type,
264be45e998Sejakowatz 	type_code TypeCode,
265be45e998Sejakowatz 	class FuncPolicy,
266be45e998Sejakowatz 	class InitPolicy,
267e5b24a58Sejakowatz 	class AssertPolicy,
268e5b24a58Sejakowatz 	class ComparePolicy
269be45e998Sejakowatz >
270be45e998Sejakowatz void
271e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
272be45e998Sejakowatz MessageItemTest3()
273be45e998Sejakowatz {
274be45e998Sejakowatz 	BMessage msg;
275be45e998Sejakowatz 	Type in = InitPolicy::Test1();
276be45e998Sejakowatz 	Type in2 = InitPolicy::Test2();
277be45e998Sejakowatz 	Type out = InitPolicy::Zero();
278be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in) == B_OK);
279be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Replace(msg, "item", 0, in2) == B_OK);
280be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", 0));
281e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0), in2));
2822605a4f5Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::ShortFind(msg, "item", &out) == B_OK);
283be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_OK);
284e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in2));
285be45e998Sejakowatz 	out = InitPolicy::Zero();
286159d60f9Sejakowatz 	TypePtr pout;
287be45e998Sejakowatz 	ssize_t size;
288e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 0,
289e5b24a58Sejakowatz 										(const void**)&pout, &size) == B_OK);
290159d60f9Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in2));
291159d60f9Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
292be45e998Sejakowatz }
293be45e998Sejakowatz //------------------------------------------------------------------------------
294be45e998Sejakowatz template
295be45e998Sejakowatz <
296be45e998Sejakowatz 	class Type,
297be45e998Sejakowatz 	type_code TypeCode,
298be45e998Sejakowatz 	class FuncPolicy,
299be45e998Sejakowatz 	class InitPolicy,
300e5b24a58Sejakowatz 	class AssertPolicy,
301e5b24a58Sejakowatz 	class ComparePolicy
302be45e998Sejakowatz >
303be45e998Sejakowatz void
304e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
305be45e998Sejakowatz MessageItemTest4()
306be45e998Sejakowatz {
307be45e998Sejakowatz 	BMessage msg;
308be45e998Sejakowatz 	Type out = InitPolicy::Zero();
309be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 1, &out) == B_NAME_NOT_FOUND);
310e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, AssertPolicy::Invalid()));
311e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 1),
312e5b24a58Sejakowatz 										  AssertPolicy::Invalid()));
313be45e998Sejakowatz 	CPPUNIT_ASSERT(!FuncPolicy::Has(msg, "item", 1));
314be45e998Sejakowatz 	const void* ptr = &out;
315be45e998Sejakowatz 	ssize_t size;
316e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 1, &ptr, &size) ==
317be45e998Sejakowatz 				   B_NAME_NOT_FOUND);
318be45e998Sejakowatz 	CPPUNIT_ASSERT(ptr == NULL);
319be45e998Sejakowatz }
320be45e998Sejakowatz //------------------------------------------------------------------------------
321be45e998Sejakowatz template
322be45e998Sejakowatz <
323be45e998Sejakowatz 	class Type,
324be45e998Sejakowatz 	type_code TypeCode,
325be45e998Sejakowatz 	class FuncPolicy,
326be45e998Sejakowatz 	class InitPolicy,
327e5b24a58Sejakowatz 	class AssertPolicy,
328e5b24a58Sejakowatz 	class ComparePolicy
329be45e998Sejakowatz >
330be45e998Sejakowatz void
331e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
332be45e998Sejakowatz MessageItemTest5()
333be45e998Sejakowatz {
334be45e998Sejakowatz 	BMessage msg;
335be45e998Sejakowatz 	ArrayType in = InitPolicy::Array();
336be45e998Sejakowatz 	Type out = InitPolicy::Zero();
337159d60f9Sejakowatz 	TypePtr pout;
338be45e998Sejakowatz 	ssize_t size;
339be45e998Sejakowatz 
340*9fa0302aSejakowatz 	for (uint32 ii = 0; ii < InitPolicy::Size(in); ++ii)
341be45e998Sejakowatz 	{
342*9fa0302aSejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in[ii]) == B_OK);
343be45e998Sejakowatz 	}
344be45e998Sejakowatz 
345169ae266Sejakowatz 	for (uint32 i = 0; i < InitPolicy::Size(in); ++i)
346be45e998Sejakowatz 	{
347be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", i));
348e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", i),
349e5b24a58Sejakowatz 											  in[i]));
350be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", i, &out) == B_OK);
351e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(out, in[i]));
352e5b24a58Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, i,
353be45e998Sejakowatz 											(const void**)&pout, &size) == B_OK);
354159d60f9Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in[i]));
355159d60f9Sejakowatz 		CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
356be45e998Sejakowatz 	}
357be45e998Sejakowatz }
358be45e998Sejakowatz //------------------------------------------------------------------------------
359be45e998Sejakowatz template
360be45e998Sejakowatz <
361be45e998Sejakowatz 	class Type,
362be45e998Sejakowatz 	type_code TypeCode,
363be45e998Sejakowatz 	class FuncPolicy,
364be45e998Sejakowatz 	class InitPolicy,
365e5b24a58Sejakowatz 	class AssertPolicy,
366e5b24a58Sejakowatz 	class ComparePolicy
367be45e998Sejakowatz >
368be45e998Sejakowatz void
369e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
370be45e998Sejakowatz MessageItemTest6()
371be45e998Sejakowatz {
372be45e998Sejakowatz 	BMessage msg;
373be45e998Sejakowatz 	ArrayType in = InitPolicy::Array();
374be45e998Sejakowatz 	Type in2 = InitPolicy::Test2();
375be45e998Sejakowatz 	Type out = InitPolicy::Zero();
376be45e998Sejakowatz 	const int rIndex = 2;
377be45e998Sejakowatz 
378169ae266Sejakowatz 	for (uint32 i = 0; i < InitPolicy::Size(in); ++i)
379be45e998Sejakowatz 	{
380be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in[i]) == B_OK);
381be45e998Sejakowatz 	}
382be45e998Sejakowatz 
383be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Replace(msg, "item", rIndex, in2) == B_OK);
384be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", rIndex));
385e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", rIndex),
386e5b24a58Sejakowatz 										  in2));
387be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", rIndex, &out) == B_OK);
388e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in2));
389be45e998Sejakowatz 	out = InitPolicy::Zero();
390159d60f9Sejakowatz 	TypePtr pout;
391be45e998Sejakowatz 	ssize_t size;
392e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, rIndex,
393be45e998Sejakowatz 										(const void**)&pout, &size) == B_OK);
394159d60f9Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in2));
395159d60f9Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
396be45e998Sejakowatz }
397be45e998Sejakowatz //------------------------------------------------------------------------------
398be45e998Sejakowatz template
399be45e998Sejakowatz <
400be45e998Sejakowatz 	class Type,
401be45e998Sejakowatz 	type_code TypeCode,
402be45e998Sejakowatz 	class FuncPolicy,
403be45e998Sejakowatz 	class InitPolicy,
404e5b24a58Sejakowatz 	class AssertPolicy,
405e5b24a58Sejakowatz 	class ComparePolicy
406be45e998Sejakowatz >
407be45e998Sejakowatz void
408e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
409be45e998Sejakowatz MessageItemTest7()
410be45e998Sejakowatz {
411be45e998Sejakowatz 	BMessage msg;
412be45e998Sejakowatz 	Type in = InitPolicy::Test1();
413be45e998Sejakowatz 	Type out = InitPolicy::Zero();
414159d60f9Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::AddData(msg, "item", TypeCode, AddressOf(in),
415159d60f9Sejakowatz 									   InitPolicy::SizeOf(in),
416159d60f9Sejakowatz 									   TypePolicy<Type>::FixedSize) == B_OK);
417be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", 0));
418e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0),
419e5b24a58Sejakowatz 										  in));
4202605a4f5Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::ShortFind(msg, "item", &out) == B_OK);
421be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_OK);
422e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in));
423159d60f9Sejakowatz 	TypePtr pout = NULL;
424be45e998Sejakowatz 	ssize_t size;
425e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 0,
426e5b24a58Sejakowatz 										(const void**)&pout, &size) == B_OK);
427159d60f9Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in));
428159d60f9Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
429be45e998Sejakowatz }
430be45e998Sejakowatz //------------------------------------------------------------------------------
431159d60f9Sejakowatz #include <stdio.h>
432be45e998Sejakowatz template
433be45e998Sejakowatz <
434be45e998Sejakowatz 	class Type,
435be45e998Sejakowatz 	type_code TypeCode,
436be45e998Sejakowatz 	class FuncPolicy,
437be45e998Sejakowatz 	class InitPolicy,
438e5b24a58Sejakowatz 	class AssertPolicy,
439e5b24a58Sejakowatz 	class ComparePolicy
440be45e998Sejakowatz >
441be45e998Sejakowatz void
442e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
443be45e998Sejakowatz MessageItemTest8()
444be45e998Sejakowatz {
445be45e998Sejakowatz 	BMessage msg;
446be45e998Sejakowatz 	ArrayType in = InitPolicy::Array();
447be45e998Sejakowatz 	Type out = InitPolicy::Zero();
448159d60f9Sejakowatz 	TypePtr pout;
449be45e998Sejakowatz 	ssize_t size;
450169ae266Sejakowatz 	for (uint32 i = 0; i < InitPolicy::Size(in); ++i)
451be45e998Sejakowatz 	{
452e5b24a58Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::AddData(msg, "item", TypeCode,
453159d60f9Sejakowatz 					   AddressOf(in[i]), InitPolicy::SizeOf(in[i]),
454159d60f9Sejakowatz 					   TypePolicy<Type>::FixedSize) == B_OK);
455be45e998Sejakowatz 	}
456be45e998Sejakowatz 
457169ae266Sejakowatz 	for (uint32 i = 0; i < InitPolicy::Size(in); ++i)
458be45e998Sejakowatz 	{
459be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", i));
460e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", i),
461e5b24a58Sejakowatz 											  in[i]));
462be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", i, &out) == B_OK);
463e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(out, in[i]));
464e5b24a58Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, i,
465be45e998Sejakowatz 											(const void**)&pout, &size) == B_OK);
466159d60f9Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in[i]));
467159d60f9Sejakowatz 		CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
468be45e998Sejakowatz 	}
469be45e998Sejakowatz }
470be45e998Sejakowatz //------------------------------------------------------------------------------
471be45e998Sejakowatz template
472be45e998Sejakowatz <
473be45e998Sejakowatz 	class Type,
474be45e998Sejakowatz 	type_code TypeCode,
475be45e998Sejakowatz 	class FuncPolicy,
476be45e998Sejakowatz 	class InitPolicy,
477e5b24a58Sejakowatz 	class AssertPolicy,
478e5b24a58Sejakowatz 	class ComparePolicy
479be45e998Sejakowatz >
4800cc48ce6Sejakowatz void
4810cc48ce6Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
4820cc48ce6Sejakowatz MessageItemTest9()
4830cc48ce6Sejakowatz {
4840cc48ce6Sejakowatz 	BMessage msg;
4850cc48ce6Sejakowatz 	Type in = InitPolicy::Test1();
4860cc48ce6Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Add(msg, NULL, in) == B_BAD_VALUE);
4870cc48ce6Sejakowatz }
4880cc48ce6Sejakowatz //------------------------------------------------------------------------------
4890cc48ce6Sejakowatz template
4900cc48ce6Sejakowatz <
4910cc48ce6Sejakowatz 	class Type,
4920cc48ce6Sejakowatz 	type_code TypeCode,
4930cc48ce6Sejakowatz 	class FuncPolicy,
4940cc48ce6Sejakowatz 	class InitPolicy,
4950cc48ce6Sejakowatz 	class AssertPolicy,
4960cc48ce6Sejakowatz 	class ComparePolicy
4970cc48ce6Sejakowatz >
4980cc48ce6Sejakowatz void
4990cc48ce6Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
5000cc48ce6Sejakowatz MessageItemTest10()
5010cc48ce6Sejakowatz {
5020cc48ce6Sejakowatz 	BMessage msg;
5030cc48ce6Sejakowatz 	Type in = InitPolicy::Test1();
5040cc48ce6Sejakowatz 	Type out = InitPolicy::Zero();
5050cc48ce6Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in) == B_OK);
5060cc48ce6Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, NULL, 0) == false);
5070cc48ce6Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, NULL, 0),
5080cc48ce6Sejakowatz 										  AssertPolicy::Invalid()));
5092605a4f5Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::ShortFind(msg, NULL, &out) == B_BAD_VALUE);
5100cc48ce6Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, NULL, 0, &out) == B_BAD_VALUE);
5110cc48ce6Sejakowatz 	TypePtr pout = NULL;
5120cc48ce6Sejakowatz 	ssize_t size;
5130cc48ce6Sejakowatz 	status_t err = FuncPolicy::FindData(msg, NULL, TypeCode, 0,
5140cc48ce6Sejakowatz 										(const void**)&pout, &size);
5150cc48ce6Sejakowatz 	CPPUNIT_ASSERT(err = B_BAD_VALUE);
5160cc48ce6Sejakowatz }
5170cc48ce6Sejakowatz //------------------------------------------------------------------------------
5180cc48ce6Sejakowatz template
5190cc48ce6Sejakowatz <
5200cc48ce6Sejakowatz 	class Type,
5210cc48ce6Sejakowatz 	type_code TypeCode,
5220cc48ce6Sejakowatz 	class FuncPolicy,
5230cc48ce6Sejakowatz 	class InitPolicy,
5240cc48ce6Sejakowatz 	class AssertPolicy,
5250cc48ce6Sejakowatz 	class ComparePolicy
5260cc48ce6Sejakowatz >
527*9fa0302aSejakowatz void
528*9fa0302aSejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
529*9fa0302aSejakowatz MessageItemTest11()
530*9fa0302aSejakowatz {
531*9fa0302aSejakowatz 	BMessage msg;
532*9fa0302aSejakowatz 	Type in = InitPolicy::Test1();
533*9fa0302aSejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in) == B_OK);
534*9fa0302aSejakowatz 
535*9fa0302aSejakowatz 	ssize_t flatSize = msg.FlattenedSize();
536*9fa0302aSejakowatz 	char* buf = new(nothrow) char[flatSize];
537*9fa0302aSejakowatz 	CPPUNIT_ASSERT(buf);
538*9fa0302aSejakowatz 
539*9fa0302aSejakowatz 	CPPUNIT_ASSERT(msg.Flatten(buf, flatSize) == B_OK);
540*9fa0302aSejakowatz 
541*9fa0302aSejakowatz 	BMessage msg2;
542*9fa0302aSejakowatz 	Type out = InitPolicy::Zero();
543*9fa0302aSejakowatz 	CPPUNIT_ASSERT(msg2.Unflatten(buf) == B_OK);
544*9fa0302aSejakowatz 	CPPUNIT_ASSERT(FuncPolicy::ShortFind(msg, "item", &out) == B_OK);
545*9fa0302aSejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(in, out));
546*9fa0302aSejakowatz 
547*9fa0302aSejakowatz 	delete[] buf;
548*9fa0302aSejakowatz }
549*9fa0302aSejakowatz //------------------------------------------------------------------------------
550*9fa0302aSejakowatz template
551*9fa0302aSejakowatz <
552*9fa0302aSejakowatz 	class Type,
553*9fa0302aSejakowatz 	type_code TypeCode,
554*9fa0302aSejakowatz 	class FuncPolicy,
555*9fa0302aSejakowatz 	class InitPolicy,
556*9fa0302aSejakowatz 	class AssertPolicy,
557*9fa0302aSejakowatz 	class ComparePolicy
558*9fa0302aSejakowatz >
559*9fa0302aSejakowatz void
560*9fa0302aSejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
561*9fa0302aSejakowatz MessageItemTest12()
562*9fa0302aSejakowatz {
563*9fa0302aSejakowatz 	BMessage msg;
564*9fa0302aSejakowatz 	ArrayType in = InitPolicy::Array();
565*9fa0302aSejakowatz 
566*9fa0302aSejakowatz 	for (uint32 ii = 0; ii < InitPolicy::Size(in); ++ii)
567*9fa0302aSejakowatz 	{
568*9fa0302aSejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in[ii]) == B_OK);
569*9fa0302aSejakowatz 	}
570*9fa0302aSejakowatz 
571*9fa0302aSejakowatz 	ssize_t flatSize = msg.FlattenedSize();
572*9fa0302aSejakowatz 	char* buf = new(nothrow) char[flatSize];
573*9fa0302aSejakowatz 	CPPUNIT_ASSERT(buf);
574*9fa0302aSejakowatz 
575*9fa0302aSejakowatz 	CPPUNIT_ASSERT(msg.Flatten(buf, flatSize) == B_OK);
576*9fa0302aSejakowatz 
577*9fa0302aSejakowatz 	BMessage msg2;
578*9fa0302aSejakowatz 	Type out = InitPolicy::Zero();
579*9fa0302aSejakowatz 	TypePtr pout;
580*9fa0302aSejakowatz 	ssize_t size;
581*9fa0302aSejakowatz 	CPPUNIT_ASSERT(msg2.Unflatten(buf) == B_OK);
582*9fa0302aSejakowatz 
583*9fa0302aSejakowatz 	for (uint32 i = 0; i < InitPolicy::Size(in); ++i)
584*9fa0302aSejakowatz 	{
585*9fa0302aSejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", i));
586*9fa0302aSejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", i),
587*9fa0302aSejakowatz 											  in[i]));
588*9fa0302aSejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", i, &out) == B_OK);
589*9fa0302aSejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(out, in[i]));
590*9fa0302aSejakowatz 		CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, i,
591*9fa0302aSejakowatz 											(const void**)&pout, &size) == B_OK);
592*9fa0302aSejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in[i]));
593*9fa0302aSejakowatz 		CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
594*9fa0302aSejakowatz 	}
595*9fa0302aSejakowatz 
596*9fa0302aSejakowatz 	delete[] buf;
597*9fa0302aSejakowatz }
598*9fa0302aSejakowatz //------------------------------------------------------------------------------
599*9fa0302aSejakowatz template
600*9fa0302aSejakowatz <
601*9fa0302aSejakowatz 	class Type,
602*9fa0302aSejakowatz 	type_code TypeCode,
603*9fa0302aSejakowatz 	class FuncPolicy,
604*9fa0302aSejakowatz 	class InitPolicy,
605*9fa0302aSejakowatz 	class AssertPolicy,
606*9fa0302aSejakowatz 	class ComparePolicy
607*9fa0302aSejakowatz >
608be45e998Sejakowatz TestSuite*
609e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
610be45e998Sejakowatz Suite()
611be45e998Sejakowatz {
612be45e998Sejakowatz 	TestSuite* suite = new TestSuite("BMessage::Add/Find/Replace/HasRect()");
613be45e998Sejakowatz 
614be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest1);
615be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest2);
616be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest3);
617be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest4);
618be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest5);
619be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest6);
620be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest7);
621be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest8);
6220cc48ce6Sejakowatz #ifndef TEST_R5
6230cc48ce6Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest9);
6240cc48ce6Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest10);
6250cc48ce6Sejakowatz #endif
626*9fa0302aSejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest11);
627*9fa0302aSejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest12);
628be45e998Sejakowatz 
629be45e998Sejakowatz 	return suite;
630be45e998Sejakowatz }
631be45e998Sejakowatz //------------------------------------------------------------------------------
632be45e998Sejakowatz 
633be45e998Sejakowatz #endif	// MESSAGEITEMTEST_H
634be45e998Sejakowatz 
635be45e998Sejakowatz /*
636be45e998Sejakowatz  * $Log $
637be45e998Sejakowatz  *
638be45e998Sejakowatz  * $Id  $
639be45e998Sejakowatz  *
640be45e998Sejakowatz 
641be45e998Sejakowatz  */
642