xref: /haiku/src/tests/kits/app/bmessage/MessageItemTest.h (revision 0cc48ce6f908a17b367c5c76fd3bd6ac3b76b461)
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,
85be45e998Sejakowatz 	Type (BMessage::*QuickFindFunc)(const char*, int32) const,
86be45e998Sejakowatz 	bool (BMessage::*HasFunc)(const char*, int32) const,
87e5b24a58Sejakowatz 	status_t (BMessage::*ReplaceFunc)(const char*, int32, Type),
88e5b24a58Sejakowatz 	status_t (BMessage::*AddDataFunc)(const char*, type_code, const void*,
89e5b24a58Sejakowatz 									  ssize_t, bool, int32) = &BMessage::AddData,
90e5b24a58Sejakowatz 	status_t (BMessage::*FindDataFunc)(const char*, type_code, int32,
91e5b24a58Sejakowatz 									   const void**, ssize_t*) const = &BMessage::FindData
92be45e998Sejakowatz >
93159d60f9Sejakowatz struct TMessageItemFuncPolicy : public TypePolicy<Type>
94be45e998Sejakowatz {
95be45e998Sejakowatz 	static status_t Add(BMessage& msg, const char* name, Type& val)
96be45e998Sejakowatz 	{
97be45e998Sejakowatz 		return (msg.*AddFunc)(name, val);
98be45e998Sejakowatz 	}
99e5b24a58Sejakowatz 	static status_t AddData(BMessage& msg, const char* name, type_code type,
100159d60f9Sejakowatz 							TypePtr val, ssize_t size, bool fixedSize = true)
101e5b24a58Sejakowatz 	{
102159d60f9Sejakowatz 		return (msg.*AddDataFunc)(name, type, (const void*)val, size, fixedSize);
103e5b24a58Sejakowatz 	}
104be45e998Sejakowatz 	static status_t Find(BMessage& msg, const char* name, int32 index, Type* val)
105be45e998Sejakowatz 	{
106be45e998Sejakowatz 		return (msg.*FindFunc)(name, index, val);
107be45e998Sejakowatz 	}
108be45e998Sejakowatz 	static Type QuickFind(BMessage& msg, const char* name, int32 index)
109be45e998Sejakowatz 	{
110be45e998Sejakowatz 		return (msg.*QuickFindFunc)(name, index);
111be45e998Sejakowatz 	}
112be45e998Sejakowatz 	static bool Has(BMessage& msg, const char* name, int32 index)
113be45e998Sejakowatz 	{
114be45e998Sejakowatz 		return (msg.*HasFunc)(name, index);
115be45e998Sejakowatz 	}
116e5b24a58Sejakowatz 	static status_t Replace(BMessage& msg, const char* name, int32 index, Type& val)
117be45e998Sejakowatz 	{
118be45e998Sejakowatz 		return (msg.*ReplaceFunc)(name, index, val);
119be45e998Sejakowatz 	}
120e5b24a58Sejakowatz 	static status_t FindData(BMessage& msg, const char* name, type_code type,
121e5b24a58Sejakowatz 							 int32 index, const void** data, ssize_t* size)
122e5b24a58Sejakowatz 	{
123e5b24a58Sejakowatz 		return (msg.*FindDataFunc)(name, type, index, data, size);
124e5b24a58Sejakowatz 	}
125e5b24a58Sejakowatz };
126e5b24a58Sejakowatz //------------------------------------------------------------------------------
127e5b24a58Sejakowatz template<class T, T zero = T(), T invalid = T()>
128e5b24a58Sejakowatz struct TMessageItemAssertPolicy
129e5b24a58Sejakowatz {
130e5b24a58Sejakowatz 	inline static T Zero()		{ return zero; }
131e5b24a58Sejakowatz 	inline static T Invalid()	{ return invalid; }
132e5b24a58Sejakowatz 	inline static bool Size(size_t size, T& t)
133e5b24a58Sejakowatz 		{ return size == sizeof (t); }
134e5b24a58Sejakowatz };
135e5b24a58Sejakowatz //------------------------------------------------------------------------------
136e5b24a58Sejakowatz template<class T>
137e5b24a58Sejakowatz struct TMessageItemComparePolicy
138e5b24a58Sejakowatz {
139c5d8f91dSejakowatz 	inline static bool Compare(const T& lhs, const T& rhs);
140c5d8f91dSejakowatz //		{ return lhs == rhs; }
141be45e998Sejakowatz };
142c5d8f91dSejakowatz template<class T>
143c5d8f91dSejakowatz bool
144c5d8f91dSejakowatz TMessageItemComparePolicy<T>::Compare(const T &lhs, const T &rhs)
145c5d8f91dSejakowatz {
146c5d8f91dSejakowatz 	 return lhs == rhs;
147c5d8f91dSejakowatz }
148be45e998Sejakowatz //------------------------------------------------------------------------------
149be45e998Sejakowatz template
150be45e998Sejakowatz <
151be45e998Sejakowatz 	class Type,				// int32
152be45e998Sejakowatz 	type_code TypeCode,		// B_INT32_TYPE
153be45e998Sejakowatz 	class FuncPolicy,		// status_t Add(BMessage&, const char*, Type&)
154be45e998Sejakowatz 							// status_t Find(BMessage&, const char*, int32, Type*)
155be45e998Sejakowatz 							// Type QuickFind(BMessage&, const char*, int32)
156be45e998Sejakowatz 							// bool Has(BMessage&, const char*, int32)
157be45e998Sejakowatz 							// status_t Replace(BMessage&, const char*, int32, Type)
158e5b24a58Sejakowatz 							// status_t FindData(BMessage&, const char*, type_code, int32, const void**, ssize_t*)
159be45e998Sejakowatz 	class InitPolicy,		// Type Zero()
160be45e998Sejakowatz 							// Type Test1()
161be45e998Sejakowatz 							// Type Test2()
162e5b24a58Sejakowatz 							// size_t SizeOf(const Type&)
163be45e998Sejakowatz 							// ArrayType Array()
164be45e998Sejakowatz 							// typedef XXX ArrayType
165e5b24a58Sejakowatz 	class AssertPolicy,		// Type Zero()
166be45e998Sejakowatz 							// Type Invalid()
167e5b24a58Sejakowatz 							// bool Size(size_t, T&)
168e5b24a58Sejakowatz 	class ComparePolicy		// bool Compare(const Type& lhs, const Type& rhs)
169e5b24a58Sejakowatz 		= TMessageItemComparePolicy<Type>
170be45e998Sejakowatz >
171159d60f9Sejakowatz class TMessageItemTest : public TestCase, public TypePolicy<Type>
172be45e998Sejakowatz {
173be45e998Sejakowatz 	public:
174be45e998Sejakowatz 		TMessageItemTest() {;}
175be45e998Sejakowatz 		TMessageItemTest(std::string name) : TestCase(name) {;}
176be45e998Sejakowatz 
177be45e998Sejakowatz 		void MessageItemTest1();
178be45e998Sejakowatz 		void MessageItemTest2();
179be45e998Sejakowatz 		void MessageItemTest3();
180be45e998Sejakowatz 		void MessageItemTest4();
181be45e998Sejakowatz 		void MessageItemTest5();
182be45e998Sejakowatz 		void MessageItemTest6();
183be45e998Sejakowatz 		void MessageItemTest7();
184be45e998Sejakowatz 		void MessageItemTest8();
185*0cc48ce6Sejakowatz 		void MessageItemTest9();
186*0cc48ce6Sejakowatz 		void MessageItemTest10();
187be45e998Sejakowatz 
188be45e998Sejakowatz 		static TestSuite* Suite();
189be45e998Sejakowatz 
190be45e998Sejakowatz 	typedef typename InitPolicy::ArrayType ArrayType;
191be45e998Sejakowatz };
192be45e998Sejakowatz 
193be45e998Sejakowatz 
194be45e998Sejakowatz //------------------------------------------------------------------------------
195be45e998Sejakowatz template
196be45e998Sejakowatz <
197be45e998Sejakowatz 	class Type,
198be45e998Sejakowatz 	type_code TypeCode,
199be45e998Sejakowatz 	class FuncPolicy,
200be45e998Sejakowatz 	class InitPolicy,
201e5b24a58Sejakowatz 	class AssertPolicy,
202e5b24a58Sejakowatz 	class ComparePolicy
203be45e998Sejakowatz >
204be45e998Sejakowatz void
205e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
206be45e998Sejakowatz MessageItemTest1()
207be45e998Sejakowatz {
208be45e998Sejakowatz 	BMessage msg;
209be45e998Sejakowatz 	Type out = InitPolicy::Zero();
210be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_NAME_NOT_FOUND);
211e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, AssertPolicy::Invalid()));
212e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0),
213e5b24a58Sejakowatz 										  AssertPolicy::Invalid()));
214be45e998Sejakowatz 	CPPUNIT_ASSERT(!FuncPolicy::Has(msg, "item", 0));
215be45e998Sejakowatz 	const void* ptr = &out;
216be45e998Sejakowatz 	ssize_t size;
217e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 0, &ptr, &size) ==
218be45e998Sejakowatz 				   B_NAME_NOT_FOUND);
219be45e998Sejakowatz 	CPPUNIT_ASSERT(ptr == NULL);
220be45e998Sejakowatz }
221be45e998Sejakowatz //------------------------------------------------------------------------------
222be45e998Sejakowatz template
223be45e998Sejakowatz <
224be45e998Sejakowatz 	class Type,
225be45e998Sejakowatz 	type_code TypeCode,
226be45e998Sejakowatz 	class FuncPolicy,
227be45e998Sejakowatz 	class InitPolicy,
228e5b24a58Sejakowatz 	class AssertPolicy,
229e5b24a58Sejakowatz 	class ComparePolicy
230be45e998Sejakowatz >
231be45e998Sejakowatz void
232e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
233be45e998Sejakowatz MessageItemTest2()
234*0cc48ce6Sejakowatz {
235be45e998Sejakowatz 	BMessage msg;
236be45e998Sejakowatz 	Type in = InitPolicy::Test1();
237be45e998Sejakowatz 	Type out = InitPolicy::Zero();
238be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in) == B_OK);
239be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", 0));
240e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0), in));
241be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_OK);
242e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in));
243159d60f9Sejakowatz 	TypePtr pout = NULL;
244be45e998Sejakowatz 	ssize_t size;
245e5b24a58Sejakowatz 	status_t err = FuncPolicy::FindData(msg, "item", TypeCode, 0,
246e5b24a58Sejakowatz 										(const void**)&pout, &size);
247be45e998Sejakowatz 	CPPUNIT_ASSERT(err == B_OK);
248159d60f9Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in));
249159d60f9Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
250be45e998Sejakowatz }
251be45e998Sejakowatz //------------------------------------------------------------------------------
252be45e998Sejakowatz template
253be45e998Sejakowatz <
254be45e998Sejakowatz 	class Type,
255be45e998Sejakowatz 	type_code TypeCode,
256be45e998Sejakowatz 	class FuncPolicy,
257be45e998Sejakowatz 	class InitPolicy,
258e5b24a58Sejakowatz 	class AssertPolicy,
259e5b24a58Sejakowatz 	class ComparePolicy
260be45e998Sejakowatz >
261be45e998Sejakowatz void
262e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
263be45e998Sejakowatz MessageItemTest3()
264be45e998Sejakowatz {
265be45e998Sejakowatz 	BMessage msg;
266be45e998Sejakowatz 	Type in = InitPolicy::Test1();
267be45e998Sejakowatz 	Type in2 = InitPolicy::Test2();
268be45e998Sejakowatz 	Type out = InitPolicy::Zero();
269be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in) == B_OK);
270be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Replace(msg, "item", 0, in2) == B_OK);
271be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", 0));
272e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0), in2));
273be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_OK);
274e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in2));
275be45e998Sejakowatz 	out = InitPolicy::Zero();
276159d60f9Sejakowatz 	TypePtr pout;
277be45e998Sejakowatz 	ssize_t size;
278e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 0,
279e5b24a58Sejakowatz 										(const void**)&pout, &size) == B_OK);
280159d60f9Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in2));
281159d60f9Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
282be45e998Sejakowatz }
283be45e998Sejakowatz //------------------------------------------------------------------------------
284be45e998Sejakowatz template
285be45e998Sejakowatz <
286be45e998Sejakowatz 	class Type,
287be45e998Sejakowatz 	type_code TypeCode,
288be45e998Sejakowatz 	class FuncPolicy,
289be45e998Sejakowatz 	class InitPolicy,
290e5b24a58Sejakowatz 	class AssertPolicy,
291e5b24a58Sejakowatz 	class ComparePolicy
292be45e998Sejakowatz >
293be45e998Sejakowatz void
294e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
295be45e998Sejakowatz MessageItemTest4()
296be45e998Sejakowatz {
297be45e998Sejakowatz 	BMessage msg;
298be45e998Sejakowatz 	Type out = InitPolicy::Zero();
299be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 1, &out) == B_NAME_NOT_FOUND);
300e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, AssertPolicy::Invalid()));
301e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 1),
302e5b24a58Sejakowatz 										  AssertPolicy::Invalid()));
303be45e998Sejakowatz 	CPPUNIT_ASSERT(!FuncPolicy::Has(msg, "item", 1));
304be45e998Sejakowatz 	const void* ptr = &out;
305be45e998Sejakowatz 	ssize_t size;
306e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 1, &ptr, &size) ==
307be45e998Sejakowatz 				   B_NAME_NOT_FOUND);
308be45e998Sejakowatz 	CPPUNIT_ASSERT(ptr == NULL);
309be45e998Sejakowatz }
310be45e998Sejakowatz //------------------------------------------------------------------------------
311be45e998Sejakowatz template
312be45e998Sejakowatz <
313be45e998Sejakowatz 	class Type,
314be45e998Sejakowatz 	type_code TypeCode,
315be45e998Sejakowatz 	class FuncPolicy,
316be45e998Sejakowatz 	class InitPolicy,
317e5b24a58Sejakowatz 	class AssertPolicy,
318e5b24a58Sejakowatz 	class ComparePolicy
319be45e998Sejakowatz >
320be45e998Sejakowatz void
321e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
322be45e998Sejakowatz MessageItemTest5()
323be45e998Sejakowatz {
324be45e998Sejakowatz 	BMessage msg;
325be45e998Sejakowatz 	ArrayType in = InitPolicy::Array();
326be45e998Sejakowatz 	Type out = InitPolicy::Zero();
327159d60f9Sejakowatz 	TypePtr pout;
328be45e998Sejakowatz 	ssize_t size;
329be45e998Sejakowatz 
330be45e998Sejakowatz 	for (int32 i = 0; i < InitPolicy::Size(in); ++i)
331be45e998Sejakowatz 	{
332be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in[i]) == B_OK);
333be45e998Sejakowatz 	}
334be45e998Sejakowatz 
335be45e998Sejakowatz 	for (int32 i = 0; i < InitPolicy::Size(in); ++i)
336be45e998Sejakowatz 	{
337be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", i));
338e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", i),
339e5b24a58Sejakowatz 											  in[i]));
340be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", i, &out) == B_OK);
341e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(out, in[i]));
342e5b24a58Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, i,
343be45e998Sejakowatz 											(const void**)&pout, &size) == B_OK);
344159d60f9Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in[i]));
345159d60f9Sejakowatz 		CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
346be45e998Sejakowatz 	}
347be45e998Sejakowatz }
348be45e998Sejakowatz //------------------------------------------------------------------------------
349be45e998Sejakowatz template
350be45e998Sejakowatz <
351be45e998Sejakowatz 	class Type,
352be45e998Sejakowatz 	type_code TypeCode,
353be45e998Sejakowatz 	class FuncPolicy,
354be45e998Sejakowatz 	class InitPolicy,
355e5b24a58Sejakowatz 	class AssertPolicy,
356e5b24a58Sejakowatz 	class ComparePolicy
357be45e998Sejakowatz >
358be45e998Sejakowatz void
359e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
360be45e998Sejakowatz MessageItemTest6()
361be45e998Sejakowatz {
362be45e998Sejakowatz 	BMessage msg;
363be45e998Sejakowatz 	ArrayType in = InitPolicy::Array();
364be45e998Sejakowatz 	Type in2 = InitPolicy::Test2();
365be45e998Sejakowatz 	Type out = InitPolicy::Zero();
366be45e998Sejakowatz 	const int rIndex = 2;
367be45e998Sejakowatz 
368be45e998Sejakowatz 	for (int32 i = 0; i < InitPolicy::Size(in); ++i)
369be45e998Sejakowatz 	{
370be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in[i]) == B_OK);
371be45e998Sejakowatz 	}
372be45e998Sejakowatz 
373be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Replace(msg, "item", rIndex, in2) == B_OK);
374be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", rIndex));
375e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", rIndex),
376e5b24a58Sejakowatz 										  in2));
377be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", rIndex, &out) == B_OK);
378e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in2));
379be45e998Sejakowatz 	out = InitPolicy::Zero();
380159d60f9Sejakowatz 	TypePtr pout;
381be45e998Sejakowatz 	ssize_t size;
382e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, rIndex,
383be45e998Sejakowatz 										(const void**)&pout, &size) == B_OK);
384159d60f9Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in2));
385159d60f9Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
386be45e998Sejakowatz }
387be45e998Sejakowatz //------------------------------------------------------------------------------
388be45e998Sejakowatz template
389be45e998Sejakowatz <
390be45e998Sejakowatz 	class Type,
391be45e998Sejakowatz 	type_code TypeCode,
392be45e998Sejakowatz 	class FuncPolicy,
393be45e998Sejakowatz 	class InitPolicy,
394e5b24a58Sejakowatz 	class AssertPolicy,
395e5b24a58Sejakowatz 	class ComparePolicy
396be45e998Sejakowatz >
397be45e998Sejakowatz void
398e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
399be45e998Sejakowatz MessageItemTest7()
400be45e998Sejakowatz {
401be45e998Sejakowatz 	BMessage msg;
402be45e998Sejakowatz 	Type in = InitPolicy::Test1();
403be45e998Sejakowatz 	Type out = InitPolicy::Zero();
404159d60f9Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::AddData(msg, "item", TypeCode, AddressOf(in),
405159d60f9Sejakowatz 									   InitPolicy::SizeOf(in),
406159d60f9Sejakowatz 									   TypePolicy<Type>::FixedSize) == B_OK);
407be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", 0));
408e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", 0),
409e5b24a58Sejakowatz 										  in));
410be45e998Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", 0, &out) == B_OK);
411e5b24a58Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(out, in));
412159d60f9Sejakowatz 	TypePtr pout = NULL;
413be45e998Sejakowatz 	ssize_t size;
414e5b24a58Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, 0,
415e5b24a58Sejakowatz 										(const void**)&pout, &size) == B_OK);
416159d60f9Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in));
417159d60f9Sejakowatz 	CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
418be45e998Sejakowatz }
419be45e998Sejakowatz //------------------------------------------------------------------------------
420159d60f9Sejakowatz #include <stdio.h>
421be45e998Sejakowatz template
422be45e998Sejakowatz <
423be45e998Sejakowatz 	class Type,
424be45e998Sejakowatz 	type_code TypeCode,
425be45e998Sejakowatz 	class FuncPolicy,
426be45e998Sejakowatz 	class InitPolicy,
427e5b24a58Sejakowatz 	class AssertPolicy,
428e5b24a58Sejakowatz 	class ComparePolicy
429be45e998Sejakowatz >
430be45e998Sejakowatz void
431e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
432be45e998Sejakowatz MessageItemTest8()
433be45e998Sejakowatz {
434be45e998Sejakowatz 	BMessage msg;
435be45e998Sejakowatz 	ArrayType in = InitPolicy::Array();
436be45e998Sejakowatz 	Type out = InitPolicy::Zero();
437159d60f9Sejakowatz 	TypePtr pout;
438be45e998Sejakowatz 	ssize_t size;
439be45e998Sejakowatz 	for (int32 i = 0; i < InitPolicy::Size(in); ++i)
440be45e998Sejakowatz 	{
441e5b24a58Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::AddData(msg, "item", TypeCode,
442159d60f9Sejakowatz 					   AddressOf(in[i]), InitPolicy::SizeOf(in[i]),
443159d60f9Sejakowatz 					   TypePolicy<Type>::FixedSize) == B_OK);
444be45e998Sejakowatz 	}
445be45e998Sejakowatz 
446be45e998Sejakowatz 	for (int32 i = 0; i < InitPolicy::Size(in); ++i)
447be45e998Sejakowatz 	{
448be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Has(msg, "item", i));
449e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, "item", i),
450e5b24a58Sejakowatz 											  in[i]));
451be45e998Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::Find(msg, "item", i, &out) == B_OK);
452e5b24a58Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(out, in[i]));
453e5b24a58Sejakowatz 		CPPUNIT_ASSERT(FuncPolicy::FindData(msg, "item", TypeCode, i,
454be45e998Sejakowatz 											(const void**)&pout, &size) == B_OK);
455159d60f9Sejakowatz 		CPPUNIT_ASSERT(ComparePolicy::Compare(Dereference(pout), in[i]));
456159d60f9Sejakowatz 		CPPUNIT_ASSERT(AssertPolicy::Size(size, Dereference(pout)));
457be45e998Sejakowatz 	}
458be45e998Sejakowatz }
459be45e998Sejakowatz //------------------------------------------------------------------------------
460be45e998Sejakowatz template
461be45e998Sejakowatz <
462be45e998Sejakowatz 	class Type,
463be45e998Sejakowatz 	type_code TypeCode,
464be45e998Sejakowatz 	class FuncPolicy,
465be45e998Sejakowatz 	class InitPolicy,
466e5b24a58Sejakowatz 	class AssertPolicy,
467e5b24a58Sejakowatz 	class ComparePolicy
468be45e998Sejakowatz >
469*0cc48ce6Sejakowatz void
470*0cc48ce6Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
471*0cc48ce6Sejakowatz MessageItemTest9()
472*0cc48ce6Sejakowatz {
473*0cc48ce6Sejakowatz 	BMessage msg;
474*0cc48ce6Sejakowatz 	Type in = InitPolicy::Test1();
475*0cc48ce6Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Add(msg, NULL, in) == B_BAD_VALUE);
476*0cc48ce6Sejakowatz }
477*0cc48ce6Sejakowatz //------------------------------------------------------------------------------
478*0cc48ce6Sejakowatz template
479*0cc48ce6Sejakowatz <
480*0cc48ce6Sejakowatz 	class Type,
481*0cc48ce6Sejakowatz 	type_code TypeCode,
482*0cc48ce6Sejakowatz 	class FuncPolicy,
483*0cc48ce6Sejakowatz 	class InitPolicy,
484*0cc48ce6Sejakowatz 	class AssertPolicy,
485*0cc48ce6Sejakowatz 	class ComparePolicy
486*0cc48ce6Sejakowatz >
487*0cc48ce6Sejakowatz void
488*0cc48ce6Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
489*0cc48ce6Sejakowatz MessageItemTest10()
490*0cc48ce6Sejakowatz {
491*0cc48ce6Sejakowatz 	BMessage msg;
492*0cc48ce6Sejakowatz 	Type in = InitPolicy::Test1();
493*0cc48ce6Sejakowatz 	Type out = InitPolicy::Zero();
494*0cc48ce6Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in) == B_OK);
495*0cc48ce6Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Has(msg, NULL, 0) == false);
496*0cc48ce6Sejakowatz 	CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, NULL, 0),
497*0cc48ce6Sejakowatz 										  AssertPolicy::Invalid()));
498*0cc48ce6Sejakowatz 	CPPUNIT_ASSERT(FuncPolicy::Find(msg, NULL, 0, &out) == B_BAD_VALUE);
499*0cc48ce6Sejakowatz 	TypePtr pout = NULL;
500*0cc48ce6Sejakowatz 	ssize_t size;
501*0cc48ce6Sejakowatz 	status_t err = FuncPolicy::FindData(msg, NULL, TypeCode, 0,
502*0cc48ce6Sejakowatz 										(const void**)&pout, &size);
503*0cc48ce6Sejakowatz 	CPPUNIT_ASSERT(err = B_BAD_VALUE);
504*0cc48ce6Sejakowatz }
505*0cc48ce6Sejakowatz //------------------------------------------------------------------------------
506*0cc48ce6Sejakowatz template
507*0cc48ce6Sejakowatz <
508*0cc48ce6Sejakowatz 	class Type,
509*0cc48ce6Sejakowatz 	type_code TypeCode,
510*0cc48ce6Sejakowatz 	class FuncPolicy,
511*0cc48ce6Sejakowatz 	class InitPolicy,
512*0cc48ce6Sejakowatz 	class AssertPolicy,
513*0cc48ce6Sejakowatz 	class ComparePolicy
514*0cc48ce6Sejakowatz >
515be45e998Sejakowatz TestSuite*
516e5b24a58Sejakowatz TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
517be45e998Sejakowatz Suite()
518be45e998Sejakowatz {
519be45e998Sejakowatz 	TestSuite* suite = new TestSuite("BMessage::Add/Find/Replace/HasRect()");
520be45e998Sejakowatz 
521be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest1);
522be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest2);
523be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest3);
524be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest4);
525be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest5);
526be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest6);
527be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest7);
528be45e998Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest8);
529*0cc48ce6Sejakowatz #ifndef TEST_R5
530*0cc48ce6Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest9);
531*0cc48ce6Sejakowatz 	ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest10);
532*0cc48ce6Sejakowatz #endif
533be45e998Sejakowatz 
534be45e998Sejakowatz 	return suite;
535be45e998Sejakowatz }
536be45e998Sejakowatz //------------------------------------------------------------------------------
537be45e998Sejakowatz 
538be45e998Sejakowatz #endif	// MESSAGEITEMTEST_H
539be45e998Sejakowatz 
540be45e998Sejakowatz /*
541be45e998Sejakowatz  * $Log $
542be45e998Sejakowatz  *
543be45e998Sejakowatz  * $Id  $
544be45e998Sejakowatz  *
545be45e998Sejakowatz 
546be45e998Sejakowatz  */