#include <stdio.h>
#include <Directory.h>
#include <Entry.h>
#include <File.h>
#include <fs_attr.h>
#include <Message.h>
#include <Node.h>
#include <Roster.h>
#ifdef TEST_OBOS
#include <RosterPrivate.h>
#endif
#include <TestShell.h>
#include <TestUtils.h>
#include <cppunit/TestAssert.h>
#include "GetRecentTester.h"
#include "testapps/RecentAppsTestApp.h"
const int32 kFlagsType = 'APPF';
const char *kTypeAttr = "BEOS:TYPE";
const char *kSigAttr = "BEOS:APP_SIG";
const char *kFlagsAttr = "BEOS:APP_FLAGS";
#ifndef B_MIME_STRING_TYPE
#define B_MIME_STRING_TYPE 'MIMS'
#endif
const int32 kSingleLaunchFlags = B_SINGLE_LAUNCH;
const int32 kMultipleLaunchFlags = B_MULTIPLE_LAUNCH;
const int32 kExclusiveLaunchFlags = B_EXCLUSIVE_LAUNCH;
const int32 kSingleLaunchArgvOnlyFlags = B_SINGLE_LAUNCH | B_ARGV_ONLY;
const int32 kMultipleLaunchArgvOnlyFlags = B_MULTIPLE_LAUNCH | B_ARGV_ONLY;
const int32 kExclusiveLaunchArgvOnlyFlags = B_EXCLUSIVE_LAUNCH | B_ARGV_ONLY;
const int32 kSingleLaunchBackgroundFlags = B_SINGLE_LAUNCH | B_BACKGROUND_APP;
const int32 kMultipleLaunchBackgroundFlags = B_MULTIPLE_LAUNCH | B_BACKGROUND_APP;
const int32 kExclusiveLaunchBackgroundFlags = B_EXCLUSIVE_LAUNCH | B_BACKGROUND_APP;
const int32 kSingleLaunchArgvOnlyBackgroundFlags = B_SINGLE_LAUNCH | B_ARGV_ONLY | B_BACKGROUND_APP;
const int32 kMultipleLaunchArgvOnlyBackgroundFlags = B_MULTIPLE_LAUNCH | B_ARGV_ONLY | B_BACKGROUND_APP;
const int32 kExclusiveLaunchArgvOnlyBackgroundFlags = B_EXCLUSIVE_LAUNCH | B_ARGV_ONLY | B_BACKGROUND_APP;
const int32 kQualifyingFlags[] = {
kSingleLaunchFlags,
kMultipleLaunchFlags,
kExclusiveLaunchFlags,
};
const int32 kNonQualifyingFlags[] = {
kSingleLaunchArgvOnlyFlags,
kMultipleLaunchArgvOnlyFlags,
kExclusiveLaunchArgvOnlyFlags,
kSingleLaunchBackgroundFlags,
kMultipleLaunchBackgroundFlags,
kExclusiveLaunchBackgroundFlags,
kSingleLaunchArgvOnlyBackgroundFlags,
kMultipleLaunchArgvOnlyBackgroundFlags,
kExclusiveLaunchArgvOnlyBackgroundFlags,
};
const char *kTempDirRoot = "/tmp";
const char *kTempDir = "/tmp/obos-recent-tests";
const char *kTempSaveFile = "/tmp/obos-recent-tests/RosterSettingsTest";
const char *kTestType1 = "text/x-vnd.obos-recent-docs-test-type-1";
const char *kTestType2 = "text/x-vnd.obos-recent-docs-test-type-2";
const char *test_types[] = {
kTestType1,
kTestType2,
};
struct test_doc {
const char *name;
const char *type;
} test_docs[] = {
{ "first-file-of-type-1", kTestType1 },
{ "second-file-of-type-1", kTestType1 },
{ "first-file-of-type-2", kTestType2 },
{ "second-file-of-type-2", kTestType2 },
{ "untyped", NULL },
};
enum test_doc_index {
kTestDocUntyped,
kTestDoc1Type1,
kTestDoc2Type1,
kTestDoc1Type2,
kTestDoc2Type2,
};
const char *test_folders[] = {
"test-folder-1",
"test-folder-2",
"test-folder-3",
"test-folder-4",
};
const char *test_sigs[] = {
"application/x-vnd.obos-recent-tests-1",
"imposter/this-is-not-an-app-sig-now-is-it?",
"application/x-vnd.obos-recent-tests-3",
"application/x-vnd.obos-recent-tests-app-sig-4",
"application/x-vnd.obos-recent-tests-5",
"application/x-vnd.obos-recent-tests-6",
"application/x-vnd.obos-recent-tests-7",
"application/x-vnd.obos-recent-tests-8",
};
status_t check_ref_count(BMessage *refMsg, int32 count);
status_t set_test_app_attributes(const entry_ref *app, const char *sig, const int32 *flags);
status_t launch_test_app(RecentAppsTestAppId id, const int32 *flags);
status_t get_test_app_ref(RecentAppsTestAppId id, entry_ref *ref);
status_t get_test_ref(test_doc_index index, entry_ref *ref);
containing \a count B_REF_TYPE entries.
\return
- \c B_OK: The predicate is true
- \c B_ERROR: The predicate is false
- other error code: An error occured
*/
status_t
check_ref_count(BMessage *refMsg, int32 count)
{
type_code type;
int32 realCount;
status_t err = refMsg ? B_OK : B_BAD_VALUE;
if (!err)
err = refMsg->GetInfo("refs", &type, &realCount);
if (!err) {
err = realCount == count ? B_OK : B_ERROR;
if (!err)
err = type == B_REF_TYPE ? B_OK : B_ERROR;
} else if (err == B_NAME_NOT_FOUND && count == 0) {
err = B_OK;
}
return err;
}
the given entry (which is assumed to be an application).
\param app The entry to modify
\param sig If \c non-NULL, the given signature should be written to the entry's
\c BEOS:APP_SIG attribute. If \c NULL, said attribute should be
removed if it exists.
\param sig If \c non-NULL, the given flags should be written to the entry's
\c BEOS:APP_FLAG attribute. If \c NULL, said attribute should be
removed if it exists.
*/
status_t
set_test_app_attributes(const entry_ref *app, const char *sig, const int32 *flags)
{
BNode node;
attr_info info;
status_t err = app ? B_OK : B_BAD_VALUE;
if (!err)
err = node.SetTo(app);
if (!err) {
if (sig) {
ssize_t bytes = node.WriteAttr(kSigAttr, B_MIME_STRING_TYPE, 0, sig, strlen(sig)+1);
if (bytes >= 0)
err = bytes == (ssize_t)strlen(sig)+1 ? B_OK : B_FILE_ERROR;
else
err = bytes;
} else {
if (node.GetAttrInfo(kSigAttr, &info) == B_OK)
err = node.RemoveAttr(kSigAttr);
}
}
if (!err) {
if (flags) {
ssize_t bytes = node.WriteAttr(kFlagsAttr, kFlagsType, 0, flags, sizeof(int32));
if (bytes >= 0)
err = bytes == sizeof(int32) ? B_OK : B_FILE_ERROR;
else
err = bytes;
} else {
if (node.GetAttrInfo(kFlagsAttr, &info) == B_OK)
err = node.RemoveAttr(kFlagsAttr);
}
}
return err;
}
\c BEOS:APP_FLAGS attribute as specified.
See RecentAppsTestApp.h for more info on RecentAppsTestAppId, and see
set_test_app_attributes() for more info on the nature of the \a flags argument.
*/
status_t
launch_test_app(RecentAppsTestAppId id, const int32 *flags)
{
entry_ref ref;
status_t err = get_test_app_ref(id, &ref);
std::string sig;
if (!err) {
err = set_test_app_attributes(&ref, kRecentAppsTestAppSigs[id], flags);
}
if (!err) {
BRoster roster;
err = roster.Launch(&ref);
}
if (!err)
snooze(250000);
return err;
}
\param id The id of the app of interest
\param ref Pointer to a pre-allocated \c entry_ref structure
into which the result is set.
*/
status_t
get_test_app_ref(RecentAppsTestAppId id, entry_ref *ref)
{
const char *testDir = BTestShell::GlobalTestDir();
BEntry entry;
status_t err = ref ? B_OK : B_BAD_VALUE;
if (!err)
err = testDir ? B_OK : B_NAME_NOT_FOUND;
if (!err) {
char path[B_PATH_NAME_LENGTH];
sprintf(path, "%s/%s%s", testDir, kRecentAppsTestAppFilenames[id],
#if TEST_R5
"_r5"
#else
""
#endif
);
err = entry.SetTo(path);
}
if (!err)
err = entry.GetRef(ref);
return err;
}
The file is assumed to reside in the directory specified
by \c kTempDir.
\param leafname the name of the file with no path information
\param ref pointer to a pre-allocated entry_ref into which the
result is stored
*/
status_t get_test_ref(const char *leafname, entry_ref *ref)
{
BEntry entry;
status_t err = leafname && ref ? B_OK : B_BAD_VALUE;
if (!err) {
char path[B_PATH_NAME_LENGTH];
sprintf(path, "%s/%s", kTempDir, leafname);
err = entry.SetTo(path);
}
if (!err)
err = entry.GetRef(ref);
return err;
}
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is NULL; maxCount < 0
@results R5: crashes
Haiku: should quietly do nothing.
*/
void
GetRecentTester::GetRecentAppsTestA1()
{
#if !TEST_R5
BRoster roster;
roster.GetRecentApps(NULL, -10);
#endif
}
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is NULL; maxCount == 0
@results R5: crashes
Haiku: should quietly do nothing.
*/
void
GetRecentTester::GetRecentAppsTestA2()
{
#if !TEST_R5
BRoster roster;
roster.GetRecentApps(NULL, 0);
#endif
}
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is NULL; maxCount > 0
@results R5: crashes
Haiku: should quietly do nothing.
*/
void
GetRecentTester::GetRecentAppsTestA3()
{
#if !TEST_R5
BRoster roster;
roster.GetRecentApps(NULL, 10);
#endif
}
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is valid; maxCount < 0
@results Should return zero recent apps
*/
void
GetRecentTester::GetRecentAppsTestB1()
{
BRoster roster;
BMessage msg;
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, -1);
CHK(check_ref_count(&msg, 0) == B_OK);
}
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is valid; maxCount == 0
@results Should return zero recent apps
*/
void
GetRecentTester::GetRecentAppsTestB2()
{
BRoster roster;
BMessage msg;
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, 0);
CHK(check_ref_count(&msg, 0) == B_OK);
}
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is valid; maxCount > 0
@results Should return maxCount apps
*/
void
GetRecentTester::GetRecentAppsTestB3()
{
BRoster roster;
BMessage msg;
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, 1);
CHK(check_ref_count(&msg, 1) == B_OK);
}
void GetRecentApps(BMessage *refList, int32 maxCount)
@case C1 Our control app is launched, followed by an application
with no BEOS:APP_FLAGS attribute.
@results The latter application should *not* appear at the top
of the recent apps list.
*/
void
GetRecentTester::GetRecentAppsTestC1()
{
BRoster roster;
BMessage msg;
entry_ref ref;
entry_ref appRef1;
entry_ref appRef2;
NextSubTest();
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, 1);
CHK(msg.FindRef("refs", 0, &ref) == B_OK);
CHK(get_test_app_ref(kControlApp, &appRef1) == B_OK);
CHK(appRef1 == ref);
NextSubTest();
CHK(launch_test_app(kEmptyApp, NULL) == B_OK);
msg.MakeEmpty();
roster.GetRecentApps(&msg, 5);
CHK(msg.FindRef("refs", 0, &ref) == B_OK);
CHK(get_test_app_ref(kEmptyApp, &appRef2) == B_OK);
CHK(appRef2 != ref);
CHK(appRef1 == ref);
}
void GetRecentApps(BMessage *refList, int32 maxCount)
@case C1 Our control app is launched, followed by an application
with a non-qualifying BEOS:APP_FLAGS attribute.
@results The latter application should *not* appear at the top
of the recent apps list.
*/
void
GetRecentTester::GetRecentAppsTestC2()
{
uint count = sizeof(kNonQualifyingFlags) / sizeof(int32);
for (uint i = 0; i < count; i++) {
BRoster roster;
BMessage msg;
entry_ref ref1;
entry_ref ref2;
entry_ref appRef1;
entry_ref appRef2;
NextSubTest();
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, 1);
CHK(msg.FindRef("refs", 0, &ref1) == B_OK);
CHK(get_test_app_ref(kControlApp, &appRef1) == B_OK);
CHK(appRef1 == ref1);
NextSubTest();
CHK(launch_test_app(kNonQualifyingApp, &kNonQualifyingFlags[i]) == B_OK);
msg.MakeEmpty();
roster.GetRecentApps(&msg, 10);
CHK(msg.FindRef("refs", 0, &ref1) == B_OK);
CHK(msg.FindRef("refs", 1, &ref2) == B_OK);
CHK(get_test_app_ref(kNonQualifyingApp, &appRef2) == B_OK);
CHK(appRef2 != ref1);
CHK(appRef2 != ref2);
CHK(appRef1 == ref1);
CHK(appRef1 != ref2);
}
}
void GetRecentApps(BMessage *refList, int32 maxCount)
@case C3 Application with a non-qualifying BEOS:APP_FLAGS
attribute is launched.
@results Said application should *not* appear at the top
of the recent apps list.
*/
void
GetRecentTester::GetRecentAppsTestC3()
{
uint count = sizeof(kQualifyingFlags) / sizeof(int32);
for (uint i = 0; i < count; i++) {
BRoster roster;
BMessage msg;
entry_ref ref1;
entry_ref ref2;
entry_ref appRef1;
entry_ref appRef2;
NextSubTest();
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, 1);
CHK(msg.FindRef("refs", 0, &ref1) == B_OK);
CHK(get_test_app_ref(kControlApp, &appRef1) == B_OK);
CHK(appRef1 == ref1);
NextSubTest();
CHK(launch_test_app(kQualifyingApp, &kQualifyingFlags[i]) == B_OK);
msg.MakeEmpty();
roster.GetRecentApps(&msg, 5);
CHK(msg.FindRef("refs", 0, &ref1) == B_OK);
CHK(msg.FindRef("refs", 1, &ref2) == B_OK);
CHK(get_test_app_ref(kQualifyingApp, &appRef2) == B_OK);
CHK(appRef2 == ref1);
CHK(appRef2 != ref2);
CHK(appRef1 != ref1);
CHK(appRef1 == ref2);
}
}
void GetRecentDocuments(BMessage *refList, int32 maxCount,
const char *fileType, const char *appSig)
@case 1 refList is NULL; all other params are valid
@results Should quietly do nothing.
*/
void
GetRecentTester::GetRecentDocumentsTest1()
{
#if !TEST_R5
BRoster roster;
roster.GetRecentDocuments(NULL, 1);
roster.GetRecentDocuments(NULL, 1, &test_types[0], 1, NULL);
#endif
}
void GetRecentDocuments(BMessage *refList, int32 maxCount,
const char *fileType, const char *appSig)
@case 2 refList is non-NULL, maxCount is zero, fileType and
appSig are NULL.
@results R5: Returns one recent document.
Haiku: Returns an empty message
*/
void
GetRecentTester::GetRecentDocumentsTest2()
{
BRoster roster;
BMessage msg;
roster.GetRecentDocuments(&msg, 0);
#if TEST_R5
CHK(check_ref_count(&msg, 1) == B_OK);
#else
CHK(check_ref_count(&msg, 0) == B_OK);
#endif
}
void GetRecentDocuments(BMessage *refList, int32 maxCount,
const char *fileType, const char *appSig)
@case 3 refList is non-NULL, maxCount is negative, fileType and
appSig are NULL.
@results R5: Returns one recent document.
Haiku: Returns an empty message
*/
void
GetRecentTester::GetRecentDocumentsTest3()
{
BRoster roster;
BMessage msg;
roster.GetRecentDocuments(&msg, -1);
#if TEST_R5
CHK(check_ref_count(&msg, 1) == B_OK);
#else
CHK(check_ref_count(&msg, 0) == B_OK);
#endif
}
void GetRecentDocuments(BMessage *refList, int32 maxCount,
const char *fileType, const char *appSig)
@case 4 Four recent docs are added, with each pair having matching
app sigs and each pair of docs with-non matching app sigs
having matching file types. Get it?
@results When no app sig and a count of 4 is specified, the four folders
in reverse order are returned.
When the first app sig and a count of 4 is specified, the two
folders that match that sig are returned.
When the second app sig and a count of 4 is specified, the two
folders that match that sig are returned.
*/
void
GetRecentTester::GetRecentDocumentsTest4()
{
entry_ref doc1;
entry_ref doc2;
entry_ref doc3;
entry_ref doc4;
entry_ref doc5;
entry_ref recent1;
entry_ref recent2;
entry_ref recent3;
entry_ref recent4;
entry_ref recent5;
BRoster roster;
BMessage msg;
CHK(get_test_ref(test_docs[0].name, &doc1) == B_OK);
CHK(get_test_ref(test_docs[1].name, &doc2) == B_OK);
CHK(get_test_ref(test_docs[2].name, &doc3) == B_OK);
CHK(get_test_ref(test_docs[3].name, &doc4) == B_OK);
CHK(get_test_ref(test_docs[4].name, &doc5) == B_OK);
roster.AddToRecentDocuments(&doc1, test_sigs[0]);
roster.AddToRecentDocuments(&doc2, test_sigs[1]);
roster.AddToRecentDocuments(&doc3, test_sigs[0]);
roster.AddToRecentDocuments(&doc4, test_sigs[1]);
roster.AddToRecentDocuments(&doc5, test_sigs[2]);
NextSubTest();
roster.GetRecentDocuments(&msg, 5);
CHK(check_ref_count(&msg, 5) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(msg.FindRef("refs", 4, &recent5) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc4);
CHK(recent3 == doc3);
CHK(recent4 == doc2);
CHK(recent5 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[0]);
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc2);
CHK(recent2 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[1]);
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[0], 1, NULL);
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc2);
CHK(recent2 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[1], 1, NULL);
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types, 2, NULL);
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
CHK(recent4 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, NULL, test_sigs[0]);
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc3);
CHK(recent2 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, NULL, test_sigs[1]);
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc2);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, NULL, test_sigs[2]);
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == doc5);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[0], test_sigs[0]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc3);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[0], test_sigs[1]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[0], test_sigs[2]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[1], test_sigs[0]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[1], test_sigs[1]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[1], test_sigs[2]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc4);
CHK(recent3 == doc3);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[0], 1, test_sigs[0]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc3);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[0], 1, test_sigs[1]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[0], 1, test_sigs[2]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[1], 1, test_sigs[0]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[1], 1, test_sigs[1]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[1], 1, test_sigs[2]);
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc4);
CHK(recent3 == doc3);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types, 2, test_sigs[0]);
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
CHK(recent4 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types, 2, test_sigs[1]);
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
CHK(recent4 == doc1);
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types, 2, test_sigs[2]);
CHK(check_ref_count(&msg, 5) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(msg.FindRef("refs", 4, &recent5) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc4);
CHK(recent3 == doc3);
CHK(recent4 == doc2);
CHK(recent5 == doc1);
}
void GetRecentDocuments(BMessage *refList, int32 maxCount,
const char *fileType, const char *appSig)
@case 5 Six recent folders are added, two of which are duplicates
under different app sigs.
@results A request for the four duplicates should return the
four non-duplicates.
*/
void
GetRecentTester::GetRecentDocumentsTest5()
{
entry_ref doc1;
entry_ref doc2;
entry_ref doc3;
entry_ref doc4;
entry_ref recent1;
entry_ref recent2;
entry_ref recent3;
entry_ref recent4;
BRoster roster;
BMessage msg;
CHK(get_test_ref(test_docs[0].name, &doc1) == B_OK);
CHK(get_test_ref(test_docs[1].name, &doc2) == B_OK);
CHK(get_test_ref(test_docs[2].name, &doc3) == B_OK);
CHK(get_test_ref(test_docs[3].name, &doc4) == B_OK);
roster.AddToRecentDocuments(&doc1, test_sigs[4]);
roster.AddToRecentDocuments(&doc2, test_sigs[5]);
roster.AddToRecentDocuments(&doc3, test_sigs[4]);
roster.AddToRecentDocuments(&doc4, test_sigs[5]);
roster.AddToRecentDocuments(&doc3, test_sigs[6]);
roster.AddToRecentDocuments(&doc4, test_sigs[7]);
NextSubTest();
roster.GetRecentDocuments(&msg, 1, NULL, test_sigs[7]);
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == doc4);
NextSubTest();
roster.GetRecentDocuments(&msg, 1, NULL, test_sigs[6]);
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == doc3);
NextSubTest();
roster.GetRecentDocuments(&msg, 1, NULL, test_sigs[5]);
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == doc4);
NextSubTest();
roster.GetRecentDocuments(&msg, 1, NULL, test_sigs[4]);
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == doc3);
NextSubTest();
roster.GetRecentDocuments(&msg, 4);
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
CHK(recent4 == doc1);
}
void GetRecentFolders(BMessage *refList, int32 maxCount, const char *appSig)
@case 1 refList is NULL; maxCount is valid, appSig is NULL.
@results Should quietly do nothing.
*/
void
GetRecentTester::GetRecentFoldersTest1()
{
#if !TEST_R5
BRoster roster;
roster.GetRecentFolders(NULL, 1);
#endif
}
void GetRecentFolders(BMessage *refList, int32 maxCount, const char *appSig)
@case 2 refList is valid, maxCount is negative, appSig is NULL.
@results R5: Returns one recent document.
Haiku: Returns an empty message
*/
void
GetRecentTester::GetRecentFoldersTest2()
{
entry_ref folder1;
entry_ref folder2;
entry_ref recent1;
entry_ref recent2;
BRoster roster;
BMessage msg;
CHK(get_test_ref(test_folders[0], &folder1) == B_OK);
CHK(get_test_ref(test_folders[1], &folder2) == B_OK);
roster.AddToRecentFolders(&folder1, NULL);
roster.GetRecentFolders(&msg, -1);
#ifdef TEST_R5
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder1);
#else
CHK(check_ref_count(&msg, 0) == B_OK);
#endif
}
void GetRecentFolders(BMessage *refList, int32 maxCount, const char *appSig)
@case 3 refList is valid, maxCount is zero, appSig is NULL.
@results R5: Returns one recent document.
Haiku: Returns an empty message
*/
void
GetRecentTester::GetRecentFoldersTest3()
{
entry_ref folder1;
entry_ref folder2;
entry_ref recent1;
entry_ref recent2;
BRoster roster;
BMessage msg;
CHK(get_test_ref(test_folders[0], &folder1) == B_OK);
CHK(get_test_ref(test_folders[1], &folder2) == B_OK);
roster.AddToRecentFolders(&folder1, NULL);
roster.GetRecentFolders(&msg, 0);
#ifdef TEST_R5
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder1);
#else
CHK(check_ref_count(&msg, 0) == B_OK);
#endif
}
void GetRecentFolders(BMessage *refList, int32 maxCount, const char *appSig)
@case 4 Four recent folders are added, with each pair having matching
app sigs.
@results When no app sig and a count of 4 is specified, the four folders
in reverse order are returned.
When the first app sig and a count of 4 is specified, the two
folders that match that sig are returned.
When the second app sig and a count of 4 is specified, the two
folders that match that sig are returned.
*/
void
GetRecentTester::GetRecentFoldersTest4()
{
entry_ref folder1;
entry_ref folder2;
entry_ref folder3;
entry_ref folder4;
entry_ref recent1;
entry_ref recent2;
entry_ref recent3;
entry_ref recent4;
BRoster roster;
BMessage msg;
CHK(get_test_ref(test_folders[0], &folder1) == B_OK);
CHK(get_test_ref(test_folders[1], &folder2) == B_OK);
CHK(get_test_ref(test_folders[2], &folder3) == B_OK);
CHK(get_test_ref(test_folders[3], &folder4) == B_OK);
roster.AddToRecentFolders(&folder1, test_sigs[0]);
roster.AddToRecentFolders(&folder2, test_sigs[1]);
roster.AddToRecentFolders(&folder3, test_sigs[0]);
roster.AddToRecentFolders(&folder4, test_sigs[1]);
NextSubTest();
roster.GetRecentFolders(&msg, 4, NULL);
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == folder4);
CHK(recent2 == folder3);
CHK(recent3 == folder2);
CHK(recent4 == folder1);
NextSubTest();
roster.GetRecentFolders(&msg, 4, test_sigs[0]);
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == folder3);
CHK(recent2 == folder1);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentFolders(&msg, 4, test_sigs[1]);
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == folder4);
CHK(recent2 == folder2);
}
void GetRecentFolders(BMessage *refList, int32 maxCount, const char *appSig)
@case 5 Six recent folders are added, two of which are duplicates
under different app sigs.
@results A request for the four duplicates should return the
four non-duplicates.
*/
void
GetRecentTester::GetRecentFoldersTest5()
{
entry_ref folder1;
entry_ref folder2;
entry_ref folder3;
entry_ref folder4;
entry_ref recent1;
entry_ref recent2;
entry_ref recent3;
entry_ref recent4;
BRoster roster;
BMessage msg;
CHK(get_test_ref(test_folders[0], &folder1) == B_OK);
CHK(get_test_ref(test_folders[1], &folder2) == B_OK);
CHK(get_test_ref(test_folders[2], &folder3) == B_OK);
CHK(get_test_ref(test_folders[3], &folder4) == B_OK);
roster.AddToRecentFolders(&folder1, test_sigs[4]);
roster.AddToRecentFolders(&folder2, test_sigs[5]);
roster.AddToRecentFolders(&folder3, test_sigs[4]);
roster.AddToRecentFolders(&folder4, test_sigs[5]);
roster.AddToRecentFolders(&folder3, test_sigs[6]);
roster.AddToRecentFolders(&folder4, test_sigs[7]);
NextSubTest();
roster.GetRecentFolders(&msg, 1, test_sigs[7]);
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder4);
NextSubTest();
roster.GetRecentFolders(&msg, 1, test_sigs[6]);
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder3);
NextSubTest();
roster.GetRecentFolders(&msg, 1, test_sigs[5]);
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder4);
NextSubTest();
roster.GetRecentFolders(&msg, 1, test_sigs[4]);
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder3);
NextSubTest();
roster.GetRecentFolders(&msg, 4, NULL);
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == folder4);
CHK(recent2 == folder3);
CHK(recent3 == folder2);
CHK(recent4 == folder1);
}
void
GetRecentTester::RecentListsLoadSaveClearTest()
{
#ifdef TEST_R5
Outputf("(no tests actually performed for R5 version)\n");
#else
entry_ref doc1;
entry_ref doc2;
entry_ref folder1;
entry_ref folder2;
entry_ref app1;
entry_ref app2;
const char *appSig1 = kRecentAppsTestAppSigs[kQualifyingApp];
const char *appSig2 = kRecentAppsTestAppSigs[kControlApp];
entry_ref recent1;
entry_ref recent2;
BRoster roster;
BMessage msg;
CHK(get_test_ref(test_docs[0].name, &doc1) == B_OK);
CHK(get_test_ref(test_docs[1].name, &doc2) == B_OK);
CHK(get_test_ref(test_folders[0], &folder1) == B_OK);
CHK(get_test_ref(test_folders[1], &folder2) == B_OK);
CHK(get_test_app_ref(kQualifyingApp, &app1) == B_OK);
CHK(get_test_app_ref(kControlApp, &app2) == B_OK);
CHK(set_test_app_attributes(&app1, kRecentAppsTestAppSigs[kQualifyingApp],
&kMultipleLaunchFlags) == B_OK);
CHK(set_test_app_attributes(&app2, kRecentAppsTestAppSigs[kControlApp],
&kMultipleLaunchFlags) == B_OK);
roster.AddToRecentDocuments(&doc1, test_sigs[0]);
roster.AddToRecentDocuments(&doc2, test_sigs[1]);
roster.AddToRecentFolders(&folder1, test_sigs[0]);
roster.AddToRecentFolders(&folder2, test_sigs[1]);
BRoster::Private(roster).AddToRecentApps(appSig1);
BRoster::Private(roster).AddToRecentApps(appSig2);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentDocuments(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc2);
CHK(recent2 == doc1);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentFolders(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == folder2);
CHK(recent2 == folder1);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentApps(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == app2);
CHK(recent2 == app1);
NextSubTest();
BRoster::Private(roster).SaveRecentLists(kTempSaveFile);
BRoster::Private(roster).ClearRecentDocuments();
BRoster::Private(roster).ClearRecentFolders();
BRoster::Private(roster).ClearRecentApps();
NextSubTest();
msg.MakeEmpty();
roster.GetRecentDocuments(&msg, 2);
CHK(check_ref_count(&msg, 0) == B_OK);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentFolders(&msg, 2);
CHK(check_ref_count(&msg, 0) == B_OK);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentApps(&msg, 2);
CHK(check_ref_count(&msg, 0) == B_OK);
NextSubTest();
BRoster::Private(roster).LoadRecentLists(kTempSaveFile);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentDocuments(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc2);
CHK(recent2 == doc1);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentFolders(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == folder2);
CHK(recent2 == folder1);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentApps(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == app2);
CHK(recent2 == app1);
#endif
}
void
GetRecentTester::setUp()
{
status_t err = B_OK;
BDirectory tempDir;
if (!BEntry(kTempDir).Exists()) {
BDirectory rootDir;
err = rootDir.SetTo(kTempDirRoot);
if (!err)
err = rootDir.CreateDirectory(kTempDir, &tempDir);
if (!err)
err = tempDir.InitCheck();
if (err) {
printf("WARNING: Unable to create temp directory for BRoster::GetRecent*() tests, error "
"== 0x%lx. It's entirely possible that most of these tests will fail because "
"of this\n", err);
return;
}
}
if (!err) {
int count = sizeof(test_docs) / sizeof(test_doc);
for (int i = 0; !err && i < count; i++) {
BFile file;
char filename[B_PATH_NAME_LENGTH];
sprintf(filename, "%s/%s", kTempDir, test_docs[i].name);
ExecCommand("touch ", filename);
err = file.SetTo(filename, B_READ_WRITE);
err = tempDir.CreateFile(test_docs[i].name, &file);
if (!err)
err = file.InitCheck();
*/
if (!err && test_docs[i].type) {
int len = strlen(test_docs[i].type)+1;
ssize_t bytes = file.WriteAttr(kTypeAttr, B_MIME_STRING_TYPE, 0,
test_docs[i].type, len);
if (bytes >= 0)
err = bytes == len ? B_OK : B_FILE_ERROR;
else
err = bytes;
}
}
}
if (!err) {
int count = sizeof(test_folders) / sizeof(char*);
for (int i = 0; !err && i < count; i++) {
char dirname[B_PATH_NAME_LENGTH];
sprintf(dirname, "%s/%s", kTempDir, test_folders[i]);
if (!BEntry(dirname).Exists())
ExecCommand("mkdir ", dirname);
err = tempDir.CreateDirectory(test_folders[i], NULL);
if (err == B_FILE_EXISTS)
err = B_OK;
*/
}
}
if (err) {
printf("WARNING: Error encountered while creating test files and/or folders, error "
"code == 0x%lx. It's entirely possible that most or all of these tests will "
"fail now because of this\n", err);
}
}
void
GetRecentTester::tearDown()
{
if (BEntry(kTempDir).Exists())
ExecCommand("rm -rf ", kTempDir);
}
Test* GetRecentTester::Suite()
{
TestSuite* SuiteOfTests = new TestSuite;
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestA1);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestA2);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestA3);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestB1);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestB2);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestB3);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestC1);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestC2);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestC3);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentDocumentsTest1);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentDocumentsTest2);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentDocumentsTest3);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentDocumentsTest4);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentDocumentsTest5);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentFoldersTest1);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentFoldersTest2);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentFoldersTest3);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentFoldersTest4);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentFoldersTest5);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, RecentListsLoadSaveClearTest);
return SuiteOfTests;
}