#include <string.h>
#include <Application.h>
#include <Clipboard.h>
#define CHK CPPUNIT_ASSERT
#include <TestShell.h>
#include "ReadWriteTester.h"
void ReadWriteTester::Clear1()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clip("Clear1");
#ifdef TEST_R5
CHK(false);
#endif
CPPUNIT_ASSERT_DEBUGGER(clip.Clear());
}
void ReadWriteTester::Clear2()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clip("Clear2");
BMessage *data;
if ( clip.Lock() )
{
CHK(clip.Clear() == B_OK);
if ( (data = clip.Data()) )
CHK(data->IsEmpty());
}
}
void ReadWriteTester::Revert1()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clip("Revert1");
#ifdef TEST_R5
CHK(false);
#endif
CPPUNIT_ASSERT_DEBUGGER(clip.Revert());
}
void ReadWriteTester::Revert2()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clip("Revert2");
BMessage *data;
char *str;
ssize_t size;
if ( clip.Lock() )
{
clip.Clear();
if ( (data = clip.Data()) )
{
data->AddData("text/plain",B_MIME_TYPE, "Revert2", 8);
clip.Commit();
}
clip.Unlock();
}
if ( clip.Lock() )
{
clip.Clear();
if ( (data = clip.Data()) )
{
data->AddData("text/plain",B_MIME_TYPE, "Foo", 4);
}
CHK(clip.Revert() == B_OK);
if ( (data = clip.Data()) )
{
data->FindData("text/plain",B_MIME_TYPE, (const void **)&str, &size);
CHK(strcmp(str,"Revert2") == 0);
}
clip.Unlock();
}
}
void ReadWriteTester::Commit1()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clip("Commit1");
#ifdef TEST_R5
CHK(false);
#endif
CPPUNIT_ASSERT_DEBUGGER(clip.Commit());
}
void ReadWriteTester::Commit2()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clipA("Commit2");
BClipboard clipB("Commit2");
BMessage *data;
char *str;
ssize_t size;
if ( clipA.Lock() )
{
clipA.Clear();
if ( (data = clipA.Data()) )
{
data->AddData("text/plain",B_MIME_TYPE, "Commit2", 8);
CHK(clipA.Commit() == B_OK);
}
clipA.Unlock();
}
if ( clipB.Lock() )
{
if ( (data = clipB.Data()) )
{
data->FindData("text/plain",B_MIME_TYPE, (const void **)&str, &size);
CHK(strcmp(str,"Commit2") == 0);
}
clipB.Unlock();
}
}
void ReadWriteTester::Data1()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clip("Data1");
#ifdef TEST_R5
CHK(false);
#endif
CPPUNIT_ASSERT_DEBUGGER(clip.Data());
}
void ReadWriteTester::Data2()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clip("Data2");
BMessage *data;
char *str;
ssize_t size;
if ( clip.Lock() )
{
clip.Clear();
data = clip.Data();
CHK(data);
data->AddData("text/plain",B_MIME_TYPE, "Data2", 6);
clip.Commit();
clip.Unlock();
}
if ( clip.Lock() )
{
data = clip.Data();
CHK(data);
data->FindData("text/plain",B_MIME_TYPE, (const void **)&str, &size);
CHK(strcmp(str,"Data2") == 0);
clip.Unlock();
}
}
void ReadWriteTester::DataSource1()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clip("DataSource1");
CHK(!clip.DataSource().IsValid());
}
void ReadWriteTester::DataSource2()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clipA("DataSource2");
BClipboard clipB("DataSource2");
BMessage *data;
if ( clipA.Lock() )
{
clipA.Clear();
if ( (data = clipA.Data()) )
{
data->AddData("text/plain",B_MIME_TYPE, "DataSource2", 12);
clipA.Commit();
}
clipA.Unlock();
}
CHK(!clipB.DataSource().IsValid());
}
void ReadWriteTester::DataSource3()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clipA("DataSource3");
BClipboard clipB("DataSource3");
BMessage *data;
if ( clipA.Lock() )
{
clipA.Clear();
if ( (data = clipA.Data()) )
{
data->AddData("text/plain",B_MIME_TYPE, "DataSource3", 12);
clipA.Commit();
}
clipA.Unlock();
}
if ( clipB.Lock() )
{
CHK(clipB.DataSource().IsValid());
CHK(clipB.DataSource() == be_app_messenger);
}
}
void ReadWriteTester::StartWatching1()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clip("StartWatching1");
BMessage *data;
BLooper *looper = new BLooper();
RWHandler handler;
looper->AddHandler(&handler);
looper->Run();
BMessenger target(&handler);
CHK(clip.StartWatching(target) == B_OK);
if ( clip.Lock() )
{
clip.Clear();
data = clip.Data();
data->AddData("text/plain",B_MIME_TYPE, "StartWatching1", 15);
clip.Commit();
clip.Unlock();
}
snooze(100000);
looper->Lock();
looper->Quit();
CHK(handler.ClipboardModified());
clip.StopWatching(target);
}
void ReadWriteTester::StopWatching1()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clip("StopWatching1");
if ( clip.StartWatching(be_app_messenger) == B_OK )
{
CHK(clip.StopWatching(be_app_messenger) == B_OK);
}
}
void ReadWriteTester::StopWatching2()
{
BApplication app("application/x-vnd.clipboardtest");
BClipboard clip("StopWatching2");
CHK(clip.StopWatching(be_app_messenger) == B_BAD_VALUE);
}
Test* ReadWriteTester::Suite()
{
TestSuite* SuiteOfTests = new TestSuite;
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Clear1);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Clear2);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Revert1);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Revert2);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Commit1);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Commit2);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Data1);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Data2);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, DataSource1);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, DataSource2);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, DataSource3);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, StartWatching1);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, StopWatching1);
ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, StopWatching2);
return SuiteOfTests;
}
RWHandler::RWHandler()
: BHandler()
{
fClipboardModified = false;
}
void
RWHandler::MessageReceived(BMessage *message)
{
switch (message->what) {
case B_CLIPBOARD_CHANGED:
fClipboardModified = true;
break;
default:
BHandler::MessageReceived(message);
break;
}
}
bool
RWHandler::ClipboardModified()
{
return fClipboardModified;
}