#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Application.h>
#include <MessageRunner.h>
#include <Window.h>
int32 gMaxCount = 0;
enum {
TEST_MANY_WINDOWS = 0,
TEST_SINGLE_WINDOW,
};
class TestApp : public BApplication {
public:
TestApp(uint32 testMode);
virtual ~TestApp();
virtual void ReadyToRun();
virtual void MessageReceived(BMessage* message);
private:
BMessageRunner* fPulse;
BRect fFrame;
BRect fScreenFrame;
BWindow* fWindow;
uint32 fTestMode;
};
class TestWindow : public BWindow {
public:
TestWindow(BRect frame);
virtual ~TestWindow();
private:
BMessageRunner* fPulse;
};
TestApp::TestApp(uint32 testMode)
: BApplication("application/x.vnd-Haiku.stress-test"),
fPulse(NULL),
fFrame(10.0, 30.0, 150.0, 100.0),
fScreenFrame(0.0, 0.0, 640.0, 480.0),
fWindow(NULL),
fTestMode(testMode)
{
}
TestApp::~TestApp()
{
delete fPulse;
}
void
TestApp::ReadyToRun()
{
BMessage message('tick');
fPulse = new BMessageRunner(be_app_messenger, &message, 100L);
}
void
TestApp::MessageReceived(BMessage* message)
{
static int32 count = 0;
if (gMaxCount != 0 && ++count > gMaxCount)
PostMessage(B_QUIT_REQUESTED);
switch (message->what) {
case 'tick':
switch (fTestMode) {
case TEST_MANY_WINDOWS:
{
fFrame.OffsetBy(10.0, 0.0);
if (fFrame.right > fScreenFrame.right) {
fFrame.OffsetTo(10.0, fFrame.top + 10.0);
}
if (fFrame.bottom > fScreenFrame.bottom) {
fFrame.OffsetTo(10.0, 30.0);
}
int32 action = CountWindows() > 1 ? rand() % 10 : 0;
switch (action) {
case 0:
new TestWindow(fFrame);
break;
case 1:
{
BWindow* window = WindowAt(rand() % CountWindows());
if (window->Lock()) {
if (window->IsHidden())
window->Show();
window->MoveBy(23, 19);
window->Unlock();
}
break;
}
case 2:
{
BWindow* window = WindowAt(rand() % CountWindows());
if (window->Lock()) {
if (!window->IsHidden())
window->Hide();
window->Unlock();
}
break;
}
case 3:
{
BWindow* window = WindowAt(rand() % CountWindows());
if (window->Lock()) {
if (window->IsHidden())
window->Show();
window->Activate();
window->Unlock();
}
break;
}
case 4:
{
BWindow* window = WindowAt(rand() % CountWindows());
if (window->Lock()) {
if (window->IsHidden())
window->Show();
window->SetWorkspaces(1 << (rand() % 4));
window->Unlock();
}
break;
}
case 5:
{
BWindow* window = WindowAt(rand() % CountWindows());
if (window->Lock()) {
if (window->IsHidden())
window->Show();
window->Minimize(true);
window->Unlock();
}
break;
}
case 6:
{
BWindow* window = WindowAt(rand() % CountWindows());
if (window->Lock()) {
if (window->IsHidden())
window->Show();
window->ResizeBy(1, 2);
window->Unlock();
}
break;
}
case 7:
{
BWindow* window = WindowAt(rand() % CountWindows());
if (window->Lock()) {
if (window->IsHidden())
window->Show();
char title[256];
snprintf(title, sizeof(title), "Title %d",
rand() % 100);
window->SetTitle(title);
window->Unlock();
}
break;
}
case 8:
{
BWindow* window = WindowAt(rand() % CountWindows());
if (window->Lock()) {
if (window->IsHidden())
window->Show();
window_look looks[] = {
B_DOCUMENT_WINDOW_LOOK,
B_MODAL_WINDOW_LOOK,
B_FLOATING_WINDOW_LOOK,
};
window->SetLook(looks[rand() % 3]);
window->Unlock();
}
break;
}
case 9:
{
BWindow* window = WindowAt(rand() % CountWindows());
if (window->Lock()) {
if (window->IsHidden())
window->Show();
window_feel feels[] = {
B_NORMAL_WINDOW_FEEL,
B_FLOATING_APP_WINDOW_FEEL,
B_MODAL_APP_WINDOW_FEEL,
};
window->SetFeel(feels[rand() % 3]);
window->Unlock();
}
break;
}
}
break;
}
case TEST_SINGLE_WINDOW:
if (fWindow) {
fWindow->Lock();
fWindow->Quit();
}
fWindow = new BWindow(fFrame, "Test", B_TITLED_WINDOW, 0);
fWindow->Show();
break;
default:
PostMessage(B_QUIT_REQUESTED);
break;
}
break;
default:
BApplication::MessageReceived(message);
}
}
TestWindow::TestWindow(BRect frame)
: BWindow(frame, "Test", B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS)
{
Show();
BMessenger self(this);
BMessage message(B_QUIT_REQUESTED);
fPulse = new BMessageRunner(self, &message, 100000000LL, 1);
if (Thread() < B_OK)
Quit();
}
TestWindow::~TestWindow()
{
delete fPulse;
}
int
main(int argc, char** argv)
{
uint32 testMode = TEST_SINGLE_WINDOW;
if (argc > 1) {
if (strcmp(argv[1], "-many") == 0)
testMode = TEST_MANY_WINDOWS;
else if (strcmp(argv[1], "-single") == 0)
testMode = TEST_SINGLE_WINDOW;
}
if (argc > 2) {
gMaxCount = atol(argv[2]);
}
TestApp app(testMode);
app.Run();
return 0;
}