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