xref: /haiku/src/tools/cppunit/TestApp.cpp (revision 1b89aa98ffe3057ab801dab67b9f5de6d1f933a5)
1aad997bdSTyler Dauwalder // TestApp.cpp
2aad997bdSTyler Dauwalder 
3b229fec8SIngo Weinhold #include <Autolock.h>
4b229fec8SIngo Weinhold 
5aad997bdSTyler Dauwalder #include <TestApp.h>
6aad997bdSTyler Dauwalder 
7aad997bdSTyler Dauwalder // TestHandler
8aad997bdSTyler Dauwalder 
9aad997bdSTyler Dauwalder // MessageReceived
10*1b89aa98SIngo Weinhold _EXPORT
11aad997bdSTyler Dauwalder void
12242a6db2STyler Dauwalder BTestHandler::MessageReceived(BMessage *message)
13aad997bdSTyler Dauwalder {
14aad997bdSTyler Dauwalder 	// clone and push it
15aad997bdSTyler Dauwalder 	BMessage *clone = new BMessage(*message);
16aad997bdSTyler Dauwalder 	fQueue.Lock();
17aad997bdSTyler Dauwalder 	fQueue.AddMessage(clone);
18aad997bdSTyler Dauwalder 	fQueue.Unlock();
19aad997bdSTyler Dauwalder }
20aad997bdSTyler Dauwalder 
21aad997bdSTyler Dauwalder // Queue
22*1b89aa98SIngo Weinhold _EXPORT
23aad997bdSTyler Dauwalder BMessageQueue &
24242a6db2STyler Dauwalder BTestHandler::Queue()
25aad997bdSTyler Dauwalder {
26aad997bdSTyler Dauwalder 	return fQueue;
27aad997bdSTyler Dauwalder }
28aad997bdSTyler Dauwalder 
29aad997bdSTyler Dauwalder 
30aad997bdSTyler Dauwalder // TestApp
31aad997bdSTyler Dauwalder 
32aad997bdSTyler Dauwalder // constructor
33*1b89aa98SIngo Weinhold _EXPORT
34242a6db2STyler Dauwalder BTestApp::BTestApp(const char *signature)
35aad997bdSTyler Dauwalder 	   : BApplication(signature),
36aad997bdSTyler Dauwalder 		 fAppThread(B_ERROR),
37b229fec8SIngo Weinhold 		 fHandlers()
38aad997bdSTyler Dauwalder {
39b229fec8SIngo Weinhold 	CreateTestHandler();
40aad997bdSTyler Dauwalder 	Unlock();
41aad997bdSTyler Dauwalder }
42aad997bdSTyler Dauwalder 
43b229fec8SIngo Weinhold // destructor
44*1b89aa98SIngo Weinhold _EXPORT
45b229fec8SIngo Weinhold BTestApp::~BTestApp()
46b229fec8SIngo Weinhold {
47b229fec8SIngo Weinhold 	int32 count = fHandlers.CountItems();
48b229fec8SIngo Weinhold 	for (int32 i = count - 1; i >= 0; i--)
49b229fec8SIngo Weinhold 		DeleteTestHandler(TestHandlerAt(i));
50b229fec8SIngo Weinhold }
51b229fec8SIngo Weinhold 
52aad997bdSTyler Dauwalder // Init
53*1b89aa98SIngo Weinhold _EXPORT
54aad997bdSTyler Dauwalder status_t
55242a6db2STyler Dauwalder BTestApp::Init()
56aad997bdSTyler Dauwalder {
57aad997bdSTyler Dauwalder 	status_t error = B_OK;
58aad997bdSTyler Dauwalder 	fAppThread = spawn_thread(&_AppThreadStart, "query app",
59aad997bdSTyler Dauwalder 							  B_NORMAL_PRIORITY, this);
60aad997bdSTyler Dauwalder 	if (fAppThread < 0)
61aad997bdSTyler Dauwalder 		error = fAppThread;
62aad997bdSTyler Dauwalder 	else {
63aad997bdSTyler Dauwalder 		error = resume_thread(fAppThread);
64aad997bdSTyler Dauwalder 		if (error != B_OK)
65aad997bdSTyler Dauwalder 			kill_thread(fAppThread);
66aad997bdSTyler Dauwalder 	}
67aad997bdSTyler Dauwalder 	if (error != B_OK)
68aad997bdSTyler Dauwalder 		fAppThread = B_ERROR;
69aad997bdSTyler Dauwalder 	return error;
70aad997bdSTyler Dauwalder }
71aad997bdSTyler Dauwalder 
72aad997bdSTyler Dauwalder // Terminate
73*1b89aa98SIngo Weinhold _EXPORT
74aad997bdSTyler Dauwalder void
75242a6db2STyler Dauwalder BTestApp::Terminate()
76aad997bdSTyler Dauwalder {
77aad997bdSTyler Dauwalder 	PostMessage(B_QUIT_REQUESTED, this);
78aad997bdSTyler Dauwalder 	int32 result;
79aad997bdSTyler Dauwalder 	wait_for_thread(fAppThread, &result);
80aad997bdSTyler Dauwalder }
81aad997bdSTyler Dauwalder 
82aad997bdSTyler Dauwalder // ReadyToRun
83*1b89aa98SIngo Weinhold _EXPORT
84aad997bdSTyler Dauwalder void
85242a6db2STyler Dauwalder BTestApp::ReadyToRun()
86aad997bdSTyler Dauwalder {
87aad997bdSTyler Dauwalder }
88aad997bdSTyler Dauwalder 
89b229fec8SIngo Weinhold // CreateTestHandler
90*1b89aa98SIngo Weinhold _EXPORT
91b229fec8SIngo Weinhold BTestHandler *
92b229fec8SIngo Weinhold BTestApp::CreateTestHandler()
93b229fec8SIngo Weinhold {
94b229fec8SIngo Weinhold 	BTestHandler *handler = new BTestHandler;
95b229fec8SIngo Weinhold 	Lock();
96b229fec8SIngo Weinhold 	AddHandler(handler);
97b229fec8SIngo Weinhold 	fHandlers.AddItem(handler);
98b229fec8SIngo Weinhold 	Unlock();
99b229fec8SIngo Weinhold 	return handler;
100b229fec8SIngo Weinhold }
101b229fec8SIngo Weinhold 
102b229fec8SIngo Weinhold // DeleteTestHandler
103*1b89aa98SIngo Weinhold _EXPORT
104b229fec8SIngo Weinhold bool
105b229fec8SIngo Weinhold BTestApp::DeleteTestHandler(BTestHandler *handler)
106b229fec8SIngo Weinhold {
107b229fec8SIngo Weinhold 	bool result = false;
108b229fec8SIngo Weinhold 	Lock();
109b229fec8SIngo Weinhold 	result = fHandlers.RemoveItem(handler);
110b229fec8SIngo Weinhold 	if (result)
111b229fec8SIngo Weinhold 		RemoveHandler(handler);
112b229fec8SIngo Weinhold 	Unlock();
113b229fec8SIngo Weinhold 	if (result)
114b229fec8SIngo Weinhold 		delete handler;
115b229fec8SIngo Weinhold 	return result;
116b229fec8SIngo Weinhold }
117b229fec8SIngo Weinhold 
118aad997bdSTyler Dauwalder // Handler
119*1b89aa98SIngo Weinhold _EXPORT
120242a6db2STyler Dauwalder BTestHandler &
121242a6db2STyler Dauwalder BTestApp::Handler()
122aad997bdSTyler Dauwalder {
123b229fec8SIngo Weinhold 	// The returned handler must never passed to DeleteTestHandler() by the
124b229fec8SIngo Weinhold 	// caller!
125b229fec8SIngo Weinhold 	return *TestHandlerAt(0);
126b229fec8SIngo Weinhold }
127b229fec8SIngo Weinhold 
128b229fec8SIngo Weinhold // TestHandlerAt
129*1b89aa98SIngo Weinhold _EXPORT
130b229fec8SIngo Weinhold BTestHandler *
131b229fec8SIngo Weinhold BTestApp::TestHandlerAt(int32 index)
132b229fec8SIngo Weinhold {
133b229fec8SIngo Weinhold 	BAutolock _lock(this);
134b229fec8SIngo Weinhold 	return (BTestHandler*)fHandlers.ItemAt(index);
135aad997bdSTyler Dauwalder }
136aad997bdSTyler Dauwalder 
137aad997bdSTyler Dauwalder // _AppThreadStart
138*1b89aa98SIngo Weinhold _EXPORT
139aad997bdSTyler Dauwalder int32
140242a6db2STyler Dauwalder BTestApp::_AppThreadStart(void *data)
141aad997bdSTyler Dauwalder {
142242a6db2STyler Dauwalder 	if (BTestApp *app = (BTestApp*)data) {
143aad997bdSTyler Dauwalder 		app->Lock();
144aad997bdSTyler Dauwalder 		app->Run();
145aad997bdSTyler Dauwalder 	}
146aad997bdSTyler Dauwalder 	return 0;
147aad997bdSTyler Dauwalder }
148aad997bdSTyler Dauwalder 
149