xref: /haiku/src/tests/kits/app/bclipboard/ReadWriteTester.cpp (revision 394cc79e32e656d69c00e79afb18af77f63d1067)
19bd2271cSDarkWyrm //------------------------------------------------------------------------------
29bd2271cSDarkWyrm //	ReadWriteTester.cpp
39bd2271cSDarkWyrm //
49bd2271cSDarkWyrm //------------------------------------------------------------------------------
59bd2271cSDarkWyrm 
69bd2271cSDarkWyrm // Standard Includes -----------------------------------------------------------
79bd2271cSDarkWyrm #include <string.h>
89bd2271cSDarkWyrm 
99bd2271cSDarkWyrm // System Includes -------------------------------------------------------------
109bd2271cSDarkWyrm #include <Application.h>
119bd2271cSDarkWyrm #include <Clipboard.h>
129bd2271cSDarkWyrm 
139bd2271cSDarkWyrm #define CHK	CPPUNIT_ASSERT
149bd2271cSDarkWyrm 
159bd2271cSDarkWyrm // Project Includes ------------------------------------------------------------
169bd2271cSDarkWyrm 
179bd2271cSDarkWyrm // Local Includes --------------------------------------------------------------
189bd2271cSDarkWyrm #include "ReadWriteTester.h"
199bd2271cSDarkWyrm 
209bd2271cSDarkWyrm // Local Defines ---------------------------------------------------------------
219bd2271cSDarkWyrm 
229bd2271cSDarkWyrm // Globals ---------------------------------------------------------------------
239bd2271cSDarkWyrm 
249bd2271cSDarkWyrm //------------------------------------------------------------------------------
259bd2271cSDarkWyrm 
269bd2271cSDarkWyrm /*
279bd2271cSDarkWyrm 	status_t Clear()
289bd2271cSDarkWyrm 	@case 1
299bd2271cSDarkWyrm 	@results		Clear() returns B_ERROR
309bd2271cSDarkWyrm  */
319bd2271cSDarkWyrm void ReadWriteTester::Clear1()
329bd2271cSDarkWyrm {
33*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
349bd2271cSDarkWyrm   BClipboard clip("Clear1");
359bd2271cSDarkWyrm 
36*394cc79eSshadow303 #ifdef TEST_R5
37*394cc79eSshadow303   CHK(false);
38*394cc79eSshadow303 #endif
399bd2271cSDarkWyrm   CHK(clip.Clear() == B_ERROR);
409bd2271cSDarkWyrm }
419bd2271cSDarkWyrm 
429bd2271cSDarkWyrm /*
439bd2271cSDarkWyrm 	status_t Clear()
449bd2271cSDarkWyrm 	@case 1
459bd2271cSDarkWyrm 	@results		Clear() returns B_OK
469bd2271cSDarkWyrm 				data message is empty
479bd2271cSDarkWyrm  */
489bd2271cSDarkWyrm void ReadWriteTester::Clear2()
499bd2271cSDarkWyrm {
50*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
519bd2271cSDarkWyrm   BClipboard clip("Clear2");
529bd2271cSDarkWyrm   BMessage *data;
539bd2271cSDarkWyrm 
549bd2271cSDarkWyrm   if ( clip.Lock() )
559bd2271cSDarkWyrm   {
569bd2271cSDarkWyrm     CHK(clip.Clear() == B_OK);
579bd2271cSDarkWyrm     if ( (data = clip.Data()) )
589bd2271cSDarkWyrm       CHK(data->IsEmpty());
599bd2271cSDarkWyrm   }
609bd2271cSDarkWyrm }
619bd2271cSDarkWyrm 
629bd2271cSDarkWyrm /*
639bd2271cSDarkWyrm 	status_t Revert()
649bd2271cSDarkWyrm 	@case 1
659bd2271cSDarkWyrm 	@results		Revert() returns B_ERROR
669bd2271cSDarkWyrm  */
679bd2271cSDarkWyrm void ReadWriteTester::Revert1()
689bd2271cSDarkWyrm {
69*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
709bd2271cSDarkWyrm   BClipboard clip("Revert1");
719bd2271cSDarkWyrm 
72*394cc79eSshadow303 #ifdef TEST_R5
73*394cc79eSshadow303   CHK(false);
74*394cc79eSshadow303 #endif
759bd2271cSDarkWyrm   CHK(clip.Revert() == B_ERROR);
769bd2271cSDarkWyrm }
779bd2271cSDarkWyrm 
789bd2271cSDarkWyrm /*
799bd2271cSDarkWyrm 	status_t Revert()
809bd2271cSDarkWyrm 	@case 2
819bd2271cSDarkWyrm 	@results		Revert() returns B_OK
829bd2271cSDarkWyrm 				data message is reset
839bd2271cSDarkWyrm  */
849bd2271cSDarkWyrm void ReadWriteTester::Revert2()
859bd2271cSDarkWyrm {
86*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
879bd2271cSDarkWyrm   BClipboard clip("Revert2");
889bd2271cSDarkWyrm   BMessage *data;
899bd2271cSDarkWyrm   char *str;
909bd2271cSDarkWyrm   ssize_t size;
919bd2271cSDarkWyrm 
929bd2271cSDarkWyrm   if ( clip.Lock() )
939bd2271cSDarkWyrm   {
949bd2271cSDarkWyrm     clip.Clear();
959bd2271cSDarkWyrm     if ( (data = clip.Data()) )
969bd2271cSDarkWyrm     {
979bd2271cSDarkWyrm       data->AddData("text/plain",B_MIME_TYPE, "Revert2", 8);
989bd2271cSDarkWyrm       clip.Commit();
999bd2271cSDarkWyrm     }
1009bd2271cSDarkWyrm     clip.Unlock();
1019bd2271cSDarkWyrm   }
1029bd2271cSDarkWyrm 
1039bd2271cSDarkWyrm   if ( clip.Lock() )
1049bd2271cSDarkWyrm   {
1059bd2271cSDarkWyrm     clip.Clear();
1069bd2271cSDarkWyrm     if ( (data = clip.Data()) )
1079bd2271cSDarkWyrm     {
1089bd2271cSDarkWyrm       data->AddData("text/plain",B_MIME_TYPE, "Foo", 4);
1099bd2271cSDarkWyrm     }
1109bd2271cSDarkWyrm     CHK(clip.Revert() == B_OK);
1119bd2271cSDarkWyrm     if ( (data = clip.Data()) )
1129bd2271cSDarkWyrm     {
1139bd2271cSDarkWyrm       data->FindData("text/plain",B_MIME_TYPE, (const void **)&str, &size);
1149bd2271cSDarkWyrm       CHK(strcmp(str,"Revert2") == 0);
1159bd2271cSDarkWyrm     }
1169bd2271cSDarkWyrm     clip.Unlock();
1179bd2271cSDarkWyrm   }
1189bd2271cSDarkWyrm }
1199bd2271cSDarkWyrm 
1209bd2271cSDarkWyrm /*
1219bd2271cSDarkWyrm 	status_t Commit()
1229bd2271cSDarkWyrm 	@case 1
1239bd2271cSDarkWyrm 	@results		Commit() returns B_ERROR
1249bd2271cSDarkWyrm  */
1259bd2271cSDarkWyrm void ReadWriteTester::Commit1()
1269bd2271cSDarkWyrm {
127*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
1289bd2271cSDarkWyrm   BClipboard clip("Commit1");
1299bd2271cSDarkWyrm 
130*394cc79eSshadow303 #ifdef TEST_R5
131*394cc79eSshadow303   CHK(false);
132*394cc79eSshadow303 #endif
1339bd2271cSDarkWyrm   CHK(clip.Commit() == B_ERROR);
1349bd2271cSDarkWyrm }
1359bd2271cSDarkWyrm 
1369bd2271cSDarkWyrm /*
1379bd2271cSDarkWyrm 	status_t Commit()
1389bd2271cSDarkWyrm 	@case 2
1399bd2271cSDarkWyrm 	@results		Commit() returns B_OK
1409bd2271cSDarkWyrm 				data is uploaded from system
1419bd2271cSDarkWyrm  */
1429bd2271cSDarkWyrm void ReadWriteTester::Commit2()
1439bd2271cSDarkWyrm {
144*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
1459bd2271cSDarkWyrm   BClipboard clipA("Commit2");
1469bd2271cSDarkWyrm   BClipboard clipB("Commit2");
1479bd2271cSDarkWyrm   BMessage *data;
1489bd2271cSDarkWyrm   char *str;
1499bd2271cSDarkWyrm   ssize_t size;
1509bd2271cSDarkWyrm 
1519bd2271cSDarkWyrm   if ( clipA.Lock() )
1529bd2271cSDarkWyrm   {
1539bd2271cSDarkWyrm     clipA.Clear();
1549bd2271cSDarkWyrm     if ( (data = clipA.Data()) )
1559bd2271cSDarkWyrm     {
1569bd2271cSDarkWyrm       data->AddData("text/plain",B_MIME_TYPE, "Commit2", 8);
1579bd2271cSDarkWyrm       CHK(clipA.Commit() == B_OK);
1589bd2271cSDarkWyrm     }
1599bd2271cSDarkWyrm     clipA.Unlock();
1609bd2271cSDarkWyrm   }
1619bd2271cSDarkWyrm   if ( clipB.Lock() )
1629bd2271cSDarkWyrm   {
1639bd2271cSDarkWyrm     if ( (data = clipB.Data()) )
1649bd2271cSDarkWyrm     {
1659bd2271cSDarkWyrm       data->FindData("text/plain",B_MIME_TYPE, (const void **)&str, &size);
1669bd2271cSDarkWyrm       CHK(strcmp(str,"Commit2") == 0);
1679bd2271cSDarkWyrm     }
1689bd2271cSDarkWyrm     clipB.Unlock();
1699bd2271cSDarkWyrm   }
1709bd2271cSDarkWyrm }
1719bd2271cSDarkWyrm 
1729bd2271cSDarkWyrm /*
1739bd2271cSDarkWyrm 	BMessage *Data()
1749bd2271cSDarkWyrm 	@case 1
1759bd2271cSDarkWyrm 	@results		Data() returns NULL
1769bd2271cSDarkWyrm  */
1779bd2271cSDarkWyrm void ReadWriteTester::Data1()
1789bd2271cSDarkWyrm {
179*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
1809bd2271cSDarkWyrm   BClipboard clip("Data1");
1819bd2271cSDarkWyrm 
182*394cc79eSshadow303 #ifdef TEST_R5
183*394cc79eSshadow303   CHK(false);
184*394cc79eSshadow303 #endif
1859bd2271cSDarkWyrm   CHK(!clip.Data());
1869bd2271cSDarkWyrm }
1879bd2271cSDarkWyrm 
1889bd2271cSDarkWyrm /*
1899bd2271cSDarkWyrm 	BMessage *Data()
1909bd2271cSDarkWyrm 	@case 2
1919bd2271cSDarkWyrm 	@results		Data() returns a message with correct data
1929bd2271cSDarkWyrm  */
1939bd2271cSDarkWyrm void ReadWriteTester::Data2()
1949bd2271cSDarkWyrm {
195*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
1969bd2271cSDarkWyrm   BClipboard clip("Data2");
1979bd2271cSDarkWyrm   BMessage *data;
1989bd2271cSDarkWyrm   char *str;
1999bd2271cSDarkWyrm   ssize_t size;
2009bd2271cSDarkWyrm 
2019bd2271cSDarkWyrm   if ( clip.Lock() )
2029bd2271cSDarkWyrm   {
2039bd2271cSDarkWyrm     clip.Clear();
2049bd2271cSDarkWyrm     data = clip.Data();
2059bd2271cSDarkWyrm     CHK(data);
2069bd2271cSDarkWyrm     data->AddData("text/plain",B_MIME_TYPE, "Data2", 6);
2079bd2271cSDarkWyrm     clip.Commit();
2089bd2271cSDarkWyrm     clip.Unlock();
2099bd2271cSDarkWyrm   }
2109bd2271cSDarkWyrm   if ( clip.Lock() )
2119bd2271cSDarkWyrm   {
2129bd2271cSDarkWyrm     data = clip.Data();
2139bd2271cSDarkWyrm     CHK(data);
2149bd2271cSDarkWyrm     data->FindData("text/plain",B_MIME_TYPE, (const void **)&str, &size);
2159bd2271cSDarkWyrm     CHK(strcmp(str,"Data2") == 0);
2169bd2271cSDarkWyrm     clip.Unlock();
2179bd2271cSDarkWyrm   }
2189bd2271cSDarkWyrm }
2199bd2271cSDarkWyrm 
2209bd2271cSDarkWyrm /*
2219bd2271cSDarkWyrm 	BMessenger DataSource()
2229bd2271cSDarkWyrm 	@case 1
2239bd2271cSDarkWyrm 	@results		DataSource returns and invalid BMessenger
2249bd2271cSDarkWyrm  */
2259bd2271cSDarkWyrm void ReadWriteTester::DataSource1()
2269bd2271cSDarkWyrm {
227*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
2289bd2271cSDarkWyrm   BClipboard clip("DataSource1");
2299bd2271cSDarkWyrm 
2309bd2271cSDarkWyrm   CHK(!clip.DataSource().IsValid());
2319bd2271cSDarkWyrm }
2329bd2271cSDarkWyrm 
2339bd2271cSDarkWyrm /*
2349bd2271cSDarkWyrm 	BMessenger DataSource()
2359bd2271cSDarkWyrm 	@case 2
2369bd2271cSDarkWyrm 	@results		DataSource returns an invalid BMessenger
2379bd2271cSDarkWyrm  */
2389bd2271cSDarkWyrm void ReadWriteTester::DataSource2()
2399bd2271cSDarkWyrm {
240*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
2419bd2271cSDarkWyrm   BClipboard clipA("DataSource2");
2429bd2271cSDarkWyrm   BClipboard clipB("DataSource2");
2439bd2271cSDarkWyrm   BMessage *data;
2449bd2271cSDarkWyrm 
2459bd2271cSDarkWyrm   if ( clipA.Lock() )
2469bd2271cSDarkWyrm   {
2479bd2271cSDarkWyrm     clipA.Clear();
2489bd2271cSDarkWyrm     if ( (data = clipA.Data()) )
2499bd2271cSDarkWyrm     {
2509bd2271cSDarkWyrm       data->AddData("text/plain",B_MIME_TYPE, "DataSource2", 12);
2519bd2271cSDarkWyrm       clipA.Commit();
2529bd2271cSDarkWyrm     }
2539bd2271cSDarkWyrm     clipA.Unlock();
2549bd2271cSDarkWyrm   }
2559bd2271cSDarkWyrm   CHK(!clipB.DataSource().IsValid());
2569bd2271cSDarkWyrm }
2579bd2271cSDarkWyrm 
2589bd2271cSDarkWyrm /*
2599bd2271cSDarkWyrm 	BMessenger DataSource()
2609bd2271cSDarkWyrm 	@case 3
2619bd2271cSDarkWyrm 	@results		DataSource returns a valid BMessenger
2629bd2271cSDarkWyrm  */
2639bd2271cSDarkWyrm void ReadWriteTester::DataSource3()
2649bd2271cSDarkWyrm {
265*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
2669bd2271cSDarkWyrm   BClipboard clipA("DataSource3");
2679bd2271cSDarkWyrm   BClipboard clipB("DataSource3");
2689bd2271cSDarkWyrm   BMessage *data;
2699bd2271cSDarkWyrm 
2709bd2271cSDarkWyrm   if ( clipA.Lock() )
2719bd2271cSDarkWyrm   {
2729bd2271cSDarkWyrm     clipA.Clear();
2739bd2271cSDarkWyrm     if ( (data = clipA.Data()) )
2749bd2271cSDarkWyrm     {
2759bd2271cSDarkWyrm       data->AddData("text/plain",B_MIME_TYPE, "DataSource3", 12);
2769bd2271cSDarkWyrm       clipA.Commit();
2779bd2271cSDarkWyrm     }
2789bd2271cSDarkWyrm     clipA.Unlock();
2799bd2271cSDarkWyrm   }
2809bd2271cSDarkWyrm   if ( clipB.Lock() )
2819bd2271cSDarkWyrm   {
2829bd2271cSDarkWyrm     CHK(clipB.DataSource().IsValid());
2839bd2271cSDarkWyrm     CHK(clipB.DataSource() == be_app_messenger);
2849bd2271cSDarkWyrm   }
2859bd2271cSDarkWyrm }
2869bd2271cSDarkWyrm 
2879bd2271cSDarkWyrm /*
2889bd2271cSDarkWyrm 	status_t StartWatching(BMessenger target)
2899bd2271cSDarkWyrm 	@case 1
2909bd2271cSDarkWyrm 	@results		return B_OK, target is notified when clipboard is written
2919bd2271cSDarkWyrm  */
2929bd2271cSDarkWyrm void ReadWriteTester::StartWatching1()
2939bd2271cSDarkWyrm {
294*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
2959bd2271cSDarkWyrm   BClipboard clip("StartWatching1");
2969bd2271cSDarkWyrm   BMessage *data;
2979bd2271cSDarkWyrm   char *str;
2989bd2271cSDarkWyrm   ssize_t size;
2999bd2271cSDarkWyrm 
3009bd2271cSDarkWyrm   RWHandler handler;
3019bd2271cSDarkWyrm   BMessenger target(&handler);
3029bd2271cSDarkWyrm   CHK(clip.StartWatching(target) == B_OK);
3039bd2271cSDarkWyrm   if ( clip.Lock() )
3049bd2271cSDarkWyrm   {
3059bd2271cSDarkWyrm     clip.Clear();
3069bd2271cSDarkWyrm     data = clip.Data();
3079bd2271cSDarkWyrm     data->AddData("text/plain",B_MIME_TYPE, "StartWatching1", 15);
3089bd2271cSDarkWyrm     clip.Commit();
3099bd2271cSDarkWyrm     clip.Unlock();
3109bd2271cSDarkWyrm   }
3119bd2271cSDarkWyrm   CHK(handler.ClipboardModified());
3129bd2271cSDarkWyrm   clip.StopWatching(target);
3139bd2271cSDarkWyrm }
3149bd2271cSDarkWyrm 
3159bd2271cSDarkWyrm /*
3169bd2271cSDarkWyrm 	status_t StopWatching(BMessenger target)
3179bd2271cSDarkWyrm 	@case 1
3189bd2271cSDarkWyrm 	@results		return B_OK
3199bd2271cSDarkWyrm  */
3209bd2271cSDarkWyrm void ReadWriteTester::StopWatching1()
3219bd2271cSDarkWyrm {
322*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
3239bd2271cSDarkWyrm   BClipboard clip("StopWatching1");
3249bd2271cSDarkWyrm   if ( clip.StartWatching(be_app_messenger) == B_OK )
3259bd2271cSDarkWyrm   {
3269bd2271cSDarkWyrm     CHK(clip.StopWatching(be_app_messenger) == B_OK);
3279bd2271cSDarkWyrm   }
3289bd2271cSDarkWyrm }
3299bd2271cSDarkWyrm 
3309bd2271cSDarkWyrm /*
3319bd2271cSDarkWyrm 	status_t StopWatching(BMessenger target)
3329bd2271cSDarkWyrm 	@case 2
3339bd2271cSDarkWyrm 	@results		return B_BAD_VALUE
3349bd2271cSDarkWyrm  */
3359bd2271cSDarkWyrm void ReadWriteTester::StopWatching2()
3369bd2271cSDarkWyrm {
337*394cc79eSshadow303   BApplication app("application/x-vnd.clipboardtest");
3389bd2271cSDarkWyrm   BClipboard clip("StopWatching2");
3399bd2271cSDarkWyrm   CHK(clip.StopWatching(be_app_messenger) == B_BAD_VALUE);
3409bd2271cSDarkWyrm }
3419bd2271cSDarkWyrm 
3429bd2271cSDarkWyrm Test* ReadWriteTester::Suite()
3439bd2271cSDarkWyrm {
3449bd2271cSDarkWyrm 	TestSuite* SuiteOfTests = new TestSuite;
3459bd2271cSDarkWyrm 
3469bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Clear1);
3479bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Clear2);
3489bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Revert1);
3499bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Revert2);
3509bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Commit1);
3519bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Commit2);
3529bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Data1);
3539bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, Data2);
3549bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, DataSource1);
3559bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, DataSource2);
3569bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, DataSource3);
3579bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, StartWatching1);
3589bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, StopWatching1);
3599bd2271cSDarkWyrm 	ADD_TEST4(BClipboard, SuiteOfTests, ReadWriteTester, StopWatching2);
3609bd2271cSDarkWyrm 
3619bd2271cSDarkWyrm 	return SuiteOfTests;
3629bd2271cSDarkWyrm }
3639bd2271cSDarkWyrm 
3649bd2271cSDarkWyrm // RWHandler
3659bd2271cSDarkWyrm 
3669bd2271cSDarkWyrm // constructor
3679bd2271cSDarkWyrm RWHandler::RWHandler()
3689bd2271cSDarkWyrm 		 : BHandler()
3699bd2271cSDarkWyrm {
3709bd2271cSDarkWyrm 	fClipboardModified = false;
3719bd2271cSDarkWyrm }
3729bd2271cSDarkWyrm 
3739bd2271cSDarkWyrm // MessageReceived
3749bd2271cSDarkWyrm void
3759bd2271cSDarkWyrm RWHandler::MessageReceived(BMessage *message)
3769bd2271cSDarkWyrm {
3779bd2271cSDarkWyrm 	switch (message->what) {
3789bd2271cSDarkWyrm 		case B_CLIPBOARD_CHANGED:
3799bd2271cSDarkWyrm 		  	fClipboardModified = true;
3809bd2271cSDarkWyrm 			break;
3819bd2271cSDarkWyrm 		default:
3829bd2271cSDarkWyrm 			BHandler::MessageReceived(message);
3839bd2271cSDarkWyrm 			break;
3849bd2271cSDarkWyrm 	}
3859bd2271cSDarkWyrm }
3869bd2271cSDarkWyrm 
387736e86f9Sejakowatz // ClipboardModified
388736e86f9Sejakowatz bool
389736e86f9Sejakowatz RWHandler::ClipboardModified()
390736e86f9Sejakowatz {
391736e86f9Sejakowatz 	return fClipboardModified;
392736e86f9Sejakowatz }
3939bd2271cSDarkWyrm 
394