xref: /haiku/src/tests/servers/app/benchmark/Benchmark.cpp (revision e81a954787e50e56a7f06f72705b7859b6ab06d1)
1 /*
2  * Copyright (C) 2008-2009 Stephan Aßmus <superstippi@gmx.de>
3  * All rights reserved. Distributed under the terms of the MIT license.
4  */
5 
6 #include <memory>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 
11 #include <Application.h>
12 #include <Screen.h>
13 
14 #include "DrawingModeToString.h"
15 #include "TestWindow.h"
16 
17 // tests
18 #include "HorizontalLineTest.h"
19 #include "RandomLineTest.h"
20 #include "StringTest.h"
21 #include "VerticalLineTest.h"
22 
23 
24 struct test_info {
25 	const char*				name;
26 	Test*					(*create)();
27 };
28 
29 const test_info kTestInfos[] = {
30 	{ "HorizontalLines",	HorizontalLineTest::CreateTest },
31 	{ "RandomLines",		RandomLineTest::CreateTest },
32 	{ "Strings",			StringTest::CreateTest },
33 	{ "VerticalLines",		VerticalLineTest::CreateTest },
34 	{ NULL, NULL }
35 };
36 
37 
38 class Benchmark : public BApplication {
39 public:
40 	Benchmark(Test* test, drawing_mode mode, bool clipping)
41 		: BApplication("application/x-vnd.haiku-benchmark"),
42 		  fTest(test),
43 		  fTestWindow(NULL),
44 		  fDrawingMode(mode),
45 		  fUseClipping(clipping)
46 	{
47 	}
48 
49 	~Benchmark()
50 	{
51 		delete fTest;
52 	}
53 
54 	virtual	void ReadyToRun()
55 	{
56 		uint32 width = 500;
57 		uint32 height = 500;
58 		BScreen screen;
59 		BRect frame = screen.Frame();
60 		frame.left = (frame.left + frame.right - width) / 2;
61 		frame.top = (frame.top + frame.bottom - width) / 2;
62 		frame.right = frame.left + width - 1;
63 		frame.bottom = frame.top + height - 1;
64 
65 		fTestWindow = new TestWindow(frame, fTest, fDrawingMode,
66 			fUseClipping, BMessenger(this));
67 	}
68 
69 	virtual bool QuitRequested()
70 	{
71 		if (fTestWindow != NULL)
72 			fTestWindow->SetAllowedToQuit(true);
73 		return BApplication::QuitRequested();
74 	}
75 
76 	virtual void MessageReceived(BMessage* message)
77 	{
78 		switch (message->what) {
79 			case MSG_TEST_CANCELED:
80 				printf("Test canceled early.\n");
81 				// fall through
82 			case MSG_TEST_FINISHED:
83 				fTestWindow->Lock();
84 				fTest->PrintResults(fTestWindow->View());
85 				fTestWindow->Unlock();
86 				PostMessage(B_QUIT_REQUESTED);
87 				break;
88 			default:
89 				BApplication::MessageReceived(message);
90 				break;
91 		}
92 	}
93 
94 private:
95 	Test*			fTest;
96 	TestWindow*		fTestWindow;
97 	drawing_mode	fDrawingMode;
98 	bool			fUseClipping;
99 };
100 
101 
102 static void
103 print_test_list(bool error)
104 {
105 	FILE* out = (error ? stderr : stdout);
106 
107 	fprintf(out, "available tests:\n");
108 
109 	for (int32 i = 0; kTestInfos[i].name; i++)
110 		fprintf(out, "  %s\n", kTestInfos[i].name);
111 }
112 
113 
114 int
115 main(int argc, char** argv)
116 {
117 	// get test name
118 	const char* testName;
119 	if (argc < 2) {
120 		fprintf(stderr, "Usage: %s <test name>\n", argv[0]);
121 		print_test_list(true);
122 		exit(1);
123 	}
124 	// skip program name
125 	argc--;
126 	argv++;
127 
128 	testName = argv[0];
129 	bool clipping = false;
130 	drawing_mode mode = B_OP_COPY;
131 
132 	while (argc > 0) {
133 		drawing_mode possibleMode;
134 		if (strcmp(argv[0], "--clipping") == 0 || strcmp(argv[0], "-c") == 0) {
135 			clipping = true;
136 		} else if (ToDrawingMode(argv[0], possibleMode)) {
137 			mode = possibleMode;
138 		}
139 		argc--;
140 		argv++;
141 	}
142 
143 
144 	// find and create the test
145 	Test* test = NULL;
146 	try {
147 		for (int32 i = 0; kTestInfos[i].name; i++) {
148 			if (strcmp(testName, kTestInfos[i].name) == 0) {
149 				test = (kTestInfos[i].create)();
150 				break;
151 			}
152 		}
153 	} catch (std::bad_alloc) {
154 		fprintf(stderr, "Insufficient memory to create the test. Sorry.\n");
155 		exit(1);
156 	}
157 
158 	if (test == NULL) {
159 		fprintf(stderr, "Error: Invalid test name: \"%s\"\n", testName);
160 		print_test_list(true);
161 		exit(1);
162 	}
163 
164 	Benchmark app(test, mode, clipping);
165 	app.Run();
166 	return 0;
167 }
168