#include <stdio.h>
#include <Message.h>
#include <OS.h>
#include <Application.h>
#include <Handler.h>
#include <Looper.h>
#include <String.h>
#include <TestShell.h>
#include <TestUtils.h>
#include <cppunit/TestAssert.h>
#include "AppRunner.h"
#include "AppQuitTester.h"
#include "PipedAppRunner.h"
template<typename AppRunnerC>
static
void
check_output(AppRunnerC &runner, const char *expectedOutput)
{
BString buffer;
CHK(runner.GetOutput(&buffer) == B_OK);
if (buffer != expectedOutput)
printf("result is `%s', but should be `%s'\n", buffer.String(),
expectedOutput);
CHK(buffer == expectedOutput);
}
void AppQuitTester::QuitTest1()
{
BApplication app("application/x-vnd.obos-app-quit-test");
const char *output =
"error: 0\n"
"InitCheck(): 0\n"
"BApplication::~BApplication()\n";
AppRunner runner;
CHK(runner.Run("AppQuitTestApp1") == B_OK);
runner.WaitFor(false);
check_output(runner, output);
}
void AppQuitTester::QuitTest2()
{
BApplication app("application/x-vnd.obos-app-quit-test");
const char *output =
"error: 0\n"
"InitCheck(): 0\n"
"BApplication::ReadyToRun()\n"
"BApplication::Run() done: 1\n"
"BApplication::~BApplication()\n";
AppRunner runner;
CHK(runner.Run("AppQuitTestApp2") == B_OK);
runner.WaitFor(false);
check_output(runner, output);
}
void AppQuitTester::QuitTest3()
{
BApplication app("application/x-vnd.obos-app-quit-test");
const char *output =
"error: 0\n"
"InitCheck(): 0\n"
"BApplication::ReadyToRun()\n"
"BApplication::Run() done: 1\n"
"BApplication::~BApplication()\n";
AppRunner runner;
CHK(runner.Run("AppQuitTestApp3") == B_OK);
runner.WaitFor(false);
check_output(runner, output);
}
void AppQuitTester::QuitTest4()
{
BApplication app("application/x-vnd.obos-app-quit-test");
const char *output =
"error: 0\n"
"InitCheck(): 0\n"
"BApplication::ReadyToRun()\n"
"BApplication::Run() done: 1\n"
"BApplication::~BApplication()\n";
PipedAppRunner runner;
CHK(runner.Run("AppQuitTestApp4") == B_OK);
runner.WaitFor();
BString buffer;
CHK(runner.GetOutput(&buffer) == B_OK);
int32 errorIndex = buffer.FindFirst(
"ERROR - you must Lock the application object before calling Quit()");
CHK(errorIndex >= 0);
int32 errorEnd = buffer.FindFirst('\n', errorIndex);
CHK(errorEnd >= 0);
buffer.Remove(errorIndex, errorEnd - errorIndex + 1);
if (buffer != output)
printf("result is `%s', but should be `%s'\n", buffer.String(),
output);
CHK(buffer == output);
}
Test* AppQuitTester::Suite()
{
TestSuite* SuiteOfTests = new TestSuite;
ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest1);
ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest2);
ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest3);
ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest4);
return SuiteOfTests;
}