xref: /haiku/src/tests/servers/app/benchmark/Benchmark.cpp (revision 6ed1dfa1b05230c8fd03eb3038fb2627ddb58dcc)
17c265858SStephan Aßmus /*
2418ce290SStephan Aßmus  * Copyright (C) 2008-2009 Stephan Aßmus <superstippi@gmx.de>
37c265858SStephan Aßmus  * All rights reserved. Distributed under the terms of the MIT license.
47c265858SStephan Aßmus  */
53cb3e0e2SStephan Aßmus 
6418ce290SStephan Aßmus #include <memory>
77c265858SStephan Aßmus #include <stdio.h>
8*6ed1dfa1SStephan Aßmus #include <stdlib.h>
9*6ed1dfa1SStephan Aßmus #include <string.h>
107c265858SStephan Aßmus 
117c265858SStephan Aßmus #include <Application.h>
127c265858SStephan Aßmus #include <Screen.h>
137c265858SStephan Aßmus 
140596ce4fSStephan Aßmus #include "DrawingModeToString.h"
157c265858SStephan Aßmus #include "TestWindow.h"
167c265858SStephan Aßmus 
177c265858SStephan Aßmus // tests
18b4e9c99bSStephan Aßmus #include "HorizontalLineTest.h"
19b4e9c99bSStephan Aßmus #include "RandomLineTest.h"
207c265858SStephan Aßmus #include "StringTest.h"
21b4e9c99bSStephan Aßmus #include "VerticalLineTest.h"
227c265858SStephan Aßmus 
23418ce290SStephan Aßmus 
24418ce290SStephan Aßmus struct test_info {
25418ce290SStephan Aßmus 	const char*				name;
26418ce290SStephan Aßmus 	Test*					(*create)();
27418ce290SStephan Aßmus };
28418ce290SStephan Aßmus 
29418ce290SStephan Aßmus const test_info kTestInfos[] = {
30418ce290SStephan Aßmus 	{ "HorizontalLines",	HorizontalLineTest::CreateTest },
31418ce290SStephan Aßmus 	{ "RandomLines",		RandomLineTest::CreateTest },
32418ce290SStephan Aßmus 	{ "Strings",			StringTest::CreateTest },
33418ce290SStephan Aßmus 	{ "VerticalLines",		VerticalLineTest::CreateTest },
34418ce290SStephan Aßmus 	{ NULL, NULL }
35418ce290SStephan Aßmus };
36418ce290SStephan Aßmus 
37418ce290SStephan Aßmus 
387c265858SStephan Aßmus class Benchmark : public BApplication {
397c265858SStephan Aßmus public:
Benchmark(Test * test,drawing_mode mode,bool clipping)400596ce4fSStephan Aßmus 	Benchmark(Test* test, drawing_mode mode, bool clipping)
413cb3e0e2SStephan Aßmus 		: BApplication("application/x-vnd.haiku-benchmark"),
42418ce290SStephan Aßmus 		  fTest(test),
430596ce4fSStephan Aßmus 		  fTestWindow(NULL),
440596ce4fSStephan Aßmus 		  fDrawingMode(mode),
450596ce4fSStephan Aßmus 		  fUseClipping(clipping)
467c265858SStephan Aßmus 	{
477c265858SStephan Aßmus 	}
487c265858SStephan Aßmus 
~Benchmark()497c265858SStephan Aßmus 	~Benchmark()
507c265858SStephan Aßmus 	{
517c265858SStephan Aßmus 		delete fTest;
527c265858SStephan Aßmus 	}
537c265858SStephan Aßmus 
ReadyToRun()547c265858SStephan Aßmus 	virtual	void ReadyToRun()
557c265858SStephan Aßmus 	{
567c265858SStephan Aßmus 		uint32 width = 500;
577c265858SStephan Aßmus 		uint32 height = 500;
587c265858SStephan Aßmus 		BScreen screen;
597c265858SStephan Aßmus 		BRect frame = screen.Frame();
607c265858SStephan Aßmus 		frame.left = (frame.left + frame.right - width) / 2;
617c265858SStephan Aßmus 		frame.top = (frame.top + frame.bottom - width) / 2;
627c265858SStephan Aßmus 		frame.right = frame.left + width - 1;
637c265858SStephan Aßmus 		frame.bottom = frame.top + height - 1;
647c265858SStephan Aßmus 
650596ce4fSStephan Aßmus 		fTestWindow = new TestWindow(frame, fTest, fDrawingMode,
660596ce4fSStephan Aßmus 			fUseClipping, BMessenger(this));
677c265858SStephan Aßmus 	}
687c265858SStephan Aßmus 
QuitRequested()697c265858SStephan Aßmus 	virtual bool QuitRequested()
707c265858SStephan Aßmus 	{
717c265858SStephan Aßmus 		if (fTestWindow != NULL)
727c265858SStephan Aßmus 			fTestWindow->SetAllowedToQuit(true);
737c265858SStephan Aßmus 		return BApplication::QuitRequested();
747c265858SStephan Aßmus 	}
757c265858SStephan Aßmus 
MessageReceived(BMessage * message)767c265858SStephan Aßmus 	virtual void MessageReceived(BMessage* message)
777c265858SStephan Aßmus 	{
787c265858SStephan Aßmus 		switch (message->what) {
797c265858SStephan Aßmus 			case MSG_TEST_CANCELED:
807c265858SStephan Aßmus 				printf("Test canceled early.\n");
817c265858SStephan Aßmus 				// fall through
827c265858SStephan Aßmus 			case MSG_TEST_FINISHED:
830596ce4fSStephan Aßmus 				fTestWindow->Lock();
840596ce4fSStephan Aßmus 				fTest->PrintResults(fTestWindow->View());
850596ce4fSStephan Aßmus 				fTestWindow->Unlock();
867c265858SStephan Aßmus 				PostMessage(B_QUIT_REQUESTED);
877c265858SStephan Aßmus 				break;
887c265858SStephan Aßmus 			default:
897c265858SStephan Aßmus 				BApplication::MessageReceived(message);
907c265858SStephan Aßmus 				break;
917c265858SStephan Aßmus 		}
927c265858SStephan Aßmus 	}
937c265858SStephan Aßmus 
947c265858SStephan Aßmus private:
957c265858SStephan Aßmus 	Test*			fTest;
967c265858SStephan Aßmus 	TestWindow*		fTestWindow;
970596ce4fSStephan Aßmus 	drawing_mode	fDrawingMode;
980596ce4fSStephan Aßmus 	bool			fUseClipping;
997c265858SStephan Aßmus };
1007c265858SStephan Aßmus 
1017c265858SStephan Aßmus 
102418ce290SStephan Aßmus static void
print_test_list(bool error)103418ce290SStephan Aßmus print_test_list(bool error)
104418ce290SStephan Aßmus {
105418ce290SStephan Aßmus 	FILE* out = (error ? stderr : stdout);
106418ce290SStephan Aßmus 
107418ce290SStephan Aßmus 	fprintf(out, "available tests:\n");
108418ce290SStephan Aßmus 
109418ce290SStephan Aßmus 	for (int32 i = 0; kTestInfos[i].name; i++)
110418ce290SStephan Aßmus 		fprintf(out, "  %s\n", kTestInfos[i].name);
111418ce290SStephan Aßmus }
112418ce290SStephan Aßmus 
113418ce290SStephan Aßmus 
1147c265858SStephan Aßmus int
main(int argc,char ** argv)1157c265858SStephan Aßmus main(int argc, char** argv)
1167c265858SStephan Aßmus {
117418ce290SStephan Aßmus 	// get test name
118418ce290SStephan Aßmus 	const char* testName;
119418ce290SStephan Aßmus 	if (argc < 2) {
120418ce290SStephan Aßmus 		fprintf(stderr, "Usage: %s <test name>\n", argv[0]);
121418ce290SStephan Aßmus 		print_test_list(true);
122418ce290SStephan Aßmus 		exit(1);
123418ce290SStephan Aßmus 	}
1240596ce4fSStephan Aßmus 	// skip program name
1250596ce4fSStephan Aßmus 	argc--;
1260596ce4fSStephan Aßmus 	argv++;
1270596ce4fSStephan Aßmus 
1280596ce4fSStephan Aßmus 	testName = argv[0];
1290596ce4fSStephan Aßmus 	bool clipping = false;
1300596ce4fSStephan Aßmus 	drawing_mode mode = B_OP_COPY;
1310596ce4fSStephan Aßmus 
1320596ce4fSStephan Aßmus 	while (argc > 0) {
1330596ce4fSStephan Aßmus 		drawing_mode possibleMode;
1340596ce4fSStephan Aßmus 		if (strcmp(argv[0], "--clipping") == 0 || strcmp(argv[0], "-c") == 0) {
1350596ce4fSStephan Aßmus 			clipping = true;
1360596ce4fSStephan Aßmus 		} else if (ToDrawingMode(argv[0], possibleMode)) {
1370596ce4fSStephan Aßmus 			mode = possibleMode;
1380596ce4fSStephan Aßmus 		}
1390596ce4fSStephan Aßmus 		argc--;
1400596ce4fSStephan Aßmus 		argv++;
1410596ce4fSStephan Aßmus 	}
1420596ce4fSStephan Aßmus 
143418ce290SStephan Aßmus 
144418ce290SStephan Aßmus 	// find and create the test
145418ce290SStephan Aßmus 	Test* test = NULL;
146418ce290SStephan Aßmus 	try {
147418ce290SStephan Aßmus 		for (int32 i = 0; kTestInfos[i].name; i++) {
148418ce290SStephan Aßmus 			if (strcmp(testName, kTestInfos[i].name) == 0) {
149418ce290SStephan Aßmus 				test = (kTestInfos[i].create)();
150418ce290SStephan Aßmus 				break;
151418ce290SStephan Aßmus 			}
152418ce290SStephan Aßmus 		}
153418ce290SStephan Aßmus 	} catch (std::bad_alloc) {
154418ce290SStephan Aßmus 		fprintf(stderr, "Insufficient memory to create the test. Sorry.\n");
155418ce290SStephan Aßmus 		exit(1);
156418ce290SStephan Aßmus 	}
157418ce290SStephan Aßmus 
158418ce290SStephan Aßmus 	if (test == NULL) {
159418ce290SStephan Aßmus 		fprintf(stderr, "Error: Invalid test name: \"%s\"\n", testName);
160418ce290SStephan Aßmus 		print_test_list(true);
161418ce290SStephan Aßmus 		exit(1);
162418ce290SStephan Aßmus 	}
163418ce290SStephan Aßmus 
1640596ce4fSStephan Aßmus 	Benchmark app(test, mode, clipping);
1657c265858SStephan Aßmus 	app.Run();
1667c265858SStephan Aßmus 	return 0;
1677c265858SStephan Aßmus }
168