MimeTypeTest.cpp revision 762a48a0
152a38012Sejakowatz// MimeTypeTest.cpp
252a38012Sejakowatz
352a38012Sejakowatz#include <ctype.h>			// For tolower()
452a38012Sejakowatz#include <fcntl.h>			// open()
552a38012Sejakowatz#include <map>
652a38012Sejakowatz#include <queue>
752a38012Sejakowatz#include <stdio.h>
852a38012Sejakowatz#include <string.h>			// For memcmp()
952a38012Sejakowatz#include <string>
1052a38012Sejakowatz#include <unistd.h>
1152a38012Sejakowatz#include <vector>
1252a38012Sejakowatz
1352a38012Sejakowatz
14762a48a0STyler Dauwalder#include <fs_attr.h>		// For struct attr_info
1552a38012Sejakowatz#include <fs_info.h>
1652a38012Sejakowatz#include <Application.h>
1752a38012Sejakowatz#include <Bitmap.h>
1852a38012Sejakowatz#include <DataIO.h>
1952a38012Sejakowatz#include <Drivers.h>		// B_GET_ICON, device_icon
2052a38012Sejakowatz#include <Message.h>
2152a38012Sejakowatz#include <Mime.h>
2252a38012Sejakowatz#include <MimeTypeTest.h>
2352a38012Sejakowatz#include <Path.h>			// Only needed for entry_ref dumps
2452a38012Sejakowatz#include <StorageKit.h>
2552a38012Sejakowatz#include <String.h>
26762a48a0STyler Dauwalder#include <storage_support.h>	// for split_path()
2752a38012Sejakowatz
28762a48a0STyler Dauwalder#include "TestShell.h"
29762a48a0STyler Dauwalder#include "TestApp.h"
30762a48a0STyler Dauwalder#include "TestUtils.h"
3152a38012Sejakowatz
3252a38012Sejakowatz// MIME database directories
3352a38012Sejakowatzstatic const char *testDir				= "/tmp/mimeTestDir";
3452a38012Sejakowatzstatic const char *mimeDatabaseDir		= "/boot/home/config/settings/beos_mime";
3552a38012Sejakowatz
3652a38012Sejakowatz// MIME Test Types
3752a38012Sejakowatz// testType and testTypeApp are Delete()d after each test.
3852a38012Sejakowatzstatic const char *testType				= "text/x-vnd.obos-Storage-Kit-Test";
3952a38012Sejakowatzstatic const char *testType1			= "text/x-vnd.obos-Storage-Kit-Test1";
4052a38012Sejakowatzstatic const char *testType2			= "text/x-vnd.obos-Storage-Kit-Test2";
4152a38012Sejakowatzstatic const char *testType3			= "text/x-vnd.obos-Storage-Kit-Test3";
4252a38012Sejakowatzstatic const char *testType4			= "text/x-vnd.obos-Storage-Kit-Test4";
4352a38012Sejakowatzstatic const char *testType5			= "text/x-vnd.obos-Storage-Kit-Test5";
4452a38012Sejakowatzstatic const char *testTypeApp			= "application/StorageKit-Test";
4552a38012Sejakowatzstatic const char *testTypeApp1			=  "application/"
4652a38012Sejakowatz										   "x-vnd.obos.mime.test.test1";
4752a38012Sejakowatzstatic const char *testTypeApp2			=  "application/"
4852a38012Sejakowatz										   "x-vnd.obos.mime.test.test2";
4952a38012Sejakowatzstatic const char *testTypeApp3			=  "application/"
5052a38012Sejakowatz										   "x-vnd.obos.mime.test.test3";
5152a38012Sejakowatzstatic const char *testTypeInvalid		= "text/Are spaces valid?";
5252a38012Sejakowatzstatic const char *testTypeSuperValid	= "valid-but-fake-supertype";
5352a38012Sejakowatzstatic const char *testTypeSuperInvalid	= "?????";
5452a38012Sejakowatz
5552a38012Sejakowatz// Real MIME types
5652a38012Sejakowatzstatic const char *wildcardType			= "application/octet-stream";
57762a48a0STyler Dauwalderstatic const char *applicationSupertype	= "application";
5852a38012Sejakowatz
5952a38012Sejakowatz// Application Paths
6052a38012Sejakowatzstatic const char *testApp				= "/boot/beos/apps/SoundRecorder";
6152a38012Sejakowatzstatic const char *testApp2				= "/boot/beos/apps/CDPlayer";
6252a38012Sejakowatzstatic const char *fakeTestApp			= "/__this_isn't_likely_to_exist__";
6352a38012Sejakowatz
6452a38012Sejakowatz// BMessage field names
6552a38012Sejakowatzstatic const char *typeField				= "type";
6652a38012Sejakowatzstatic const char *fileExtField				= "extensions";
6752a38012Sejakowatzstatic const char *attrInfoField_Name		= "attr:name";
6852a38012Sejakowatzstatic const char *attrInfoField_PublicName	= "attr:public_name";
6952a38012Sejakowatzstatic const char *attrInfoField_Type		= "attr:type";
7052a38012Sejakowatzstatic const char *attrInfoField_Viewable	= "attr:viewable";
7152a38012Sejakowatzstatic const char *attrInfoField_Editable	= "attr:editable";
7252a38012Sejakowatz
7352a38012Sejakowatz// Descriptions
7452a38012Sejakowatzstatic const char *testDescr			= "Just a test, nothing more :-)";
7552a38012Sejakowatzstatic const char *testDescr2			= "Another amazing test string";
7652a38012Sejakowatzstatic const char *longDescr			=
7752a38012Sejakowatz"This description is longer than B_MIME_TYPE_LENGTH, which is quite useful for certain things... "
7852a38012Sejakowatz"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7952a38012Sejakowatz"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
8052a38012Sejakowatz"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
8152a38012Sejakowatz"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd";
8252a38012Sejakowatz// Signatures
8352a38012Sejakowatzstatic const char *testSig				= "application/x-vnd.obos.mime-type-test";
8452a38012Sejakowatzstatic const char *testSig2				= "application/x-vnd.obos.mime-type-test-2";
8552a38012Sejakowatzstatic const char *longSig				= "application/x-vnd.obos.mime-type-test-long."
8652a38012Sejakowatz"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8752a38012Sejakowatz"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
8852a38012Sejakowatz"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
8952a38012Sejakowatz"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd";
9052a38012Sejakowatz
9152a38012Sejakowatz// Declarations for handy dandy private functions
9252a38012Sejakowatzstatic bool operator==(BBitmap &bmp1, BBitmap &bmp2);
9352a38012Sejakowatzstatic bool operator!=(BBitmap &bmp1, BBitmap &bmp2);
9452a38012Sejakowatzstatic bool operator==(BMessage &msg1, BMessage &msg2);
9552a38012Sejakowatzstatic bool operator!=(BMessage &msg1, BMessage &msg2);
9652a38012Sejakowatzstatic void fill_bitmap(BBitmap &bmp, char value);
9752a38012Sejakowatz//static void dump_bitmap(BBitmap &bmp, char *name = "bmp");
9852a38012Sejakowatz//static void dump_ref(entry_ref *ref, char* name = "ref");
9952a38012Sejakowatzstatic void to_lower(const char *str, std::string &result);
10052a38012Sejakowatzstatic void remove_type(const char *type, const char *databaseDir = mimeDatabaseDir);
10152a38012Sejakowatzstatic bool type_exists(const char *type, const char *databaseDir = mimeDatabaseDir);
10252a38012Sejakowatzclass ContainerAdapter;
10352a38012Sejakowatzclass SetAdapter;
10452a38012Sejakowatzclass QueueAdapter;
10552a38012Sejakowatzvoid FillWithMimeTypes(ContainerAdapter &container, BMessage &typeMessage, const char* fieldName);
10652a38012Sejakowatz	// Used to add all the types in a BMessage from GetInstalled*Types() to some
10752a38012Sejakowatz	// sort of container object (via an adapter to support differing interfaces).
10852a38012Sejakowatz
10952a38012Sejakowatz// Suite
11052a38012SejakowatzCppUnit::Test*
11152a38012SejakowatzMimeTypeTest::Suite() {
112aad997bdSTyler Dauwalder	CppUnit::TestSuite *suite = new CppUnit::TestSuite();
11352a38012Sejakowatz	typedef CppUnit::TestCaller<MimeTypeTest> TC;
11452a38012Sejakowatz
11552a38012Sejakowatz	// Tyler
11652a38012Sejakowatz	suite->addTest( new TC("BMimeType::Install/Delete Test",
11752a38012Sejakowatz						   &MimeTypeTest::InstallDeleteTest) );
11852a38012Sejakowatz	suite->addTest( new TC("BMimeType::App Hint Test",
11952a38012Sejakowatz						   &MimeTypeTest::AppHintTest) );
12052a38012Sejakowatz	suite->addTest( new TC("BMimeType::Attribute Info Test",
12152a38012Sejakowatz						   &MimeTypeTest::AttrInfoTest) );
12252a38012Sejakowatz	suite->addTest( new TC("BMimeType::Long Description Test",
12352a38012Sejakowatz						   &MimeTypeTest::LongDescriptionTest) );
12452a38012Sejakowatz	suite->addTest( new TC("BMimeType::Short Description Test",
12552a38012Sejakowatz						   &MimeTypeTest::ShortDescriptionTest) );
12652a38012Sejakowatz	suite->addTest( new TC("BMimeType::File Extensions Test",
12752a38012Sejakowatz						   &MimeTypeTest::FileExtensionsTest) );
12852a38012Sejakowatz	suite->addTest( new TC("BMimeType::Icon Test (Large)",
12952a38012Sejakowatz						   &MimeTypeTest::LargeIconTest) );
13052a38012Sejakowatz	suite->addTest( new TC("BMimeType::Icon Test (Mini)",
13152a38012Sejakowatz						   &MimeTypeTest::MiniIconTest) );
13252a38012Sejakowatz	suite->addTest( new TC("BMimeType::Icon For Type Test (Large)",
13352a38012Sejakowatz						   &MimeTypeTest::LargeIconForTypeTest) );
13452a38012Sejakowatz	suite->addTest( new TC("BMimeType::Icon For Type Test (Mini)",
13552a38012Sejakowatz						   &MimeTypeTest::MiniIconForTypeTest) );
13652a38012Sejakowatz	suite->addTest( new TC("BMimeType::Installed Types Test",
13752a38012Sejakowatz						   &MimeTypeTest::InstalledTypesTest) );
13852a38012Sejakowatz	suite->addTest( new TC("BMimeType::Preferred App Test",
13952a38012Sejakowatz						   &MimeTypeTest::PreferredAppTest) );
14052a38012Sejakowatz	suite->addTest( new TC("BMimeType::Wildcard Apps Test",
14152a38012Sejakowatz						   &MimeTypeTest::WildcardAppsTest) );
14252a38012Sejakowatz
14352a38012Sejakowatz	// Ingo
14452a38012Sejakowatz	suite->addTest( new TC("BMimeType::Initialization Test",
14552a38012Sejakowatz						   &MimeTypeTest::InitTest) );
14652a38012Sejakowatz	suite->addTest( new TC("BMimeType::MIME String Test",
14752a38012Sejakowatz						   &MimeTypeTest::StringTest) );
14852a38012Sejakowatz	suite->addTest( new TC("BMimeType::MIME Monitoring Test",
14952a38012Sejakowatz						   &MimeTypeTest::MonitoringTest) );
15052a38012Sejakowatz	suite->addTest( new TC("BMimeType::update_mime_info() Test",
15152a38012Sejakowatz						   &MimeTypeTest::UpdateMimeInfoTest) );
15252a38012Sejakowatz	suite->addTest( new TC("BMimeType::create_app_meta_mime() Test",
15352a38012Sejakowatz						   &MimeTypeTest::CreateAppMetaMimeTest) );
15452a38012Sejakowatz	suite->addTest( new TC("BMimeType::get_device_icon() Test",
15552a38012Sejakowatz						   &MimeTypeTest::GetDeviceIconTest) );
15652a38012Sejakowatz	suite->addTest( new TC("BMimeType::Sniffer Rule Test",
15752a38012Sejakowatz						   &MimeTypeTest::SnifferRuleTest) );
15852a38012Sejakowatz	suite->addTest( new TC("BMimeType::Sniffing Test",
15952a38012Sejakowatz						   &MimeTypeTest::SniffingTest) );
16052a38012Sejakowatz
16152a38012Sejakowatz	// In progress
16252a38012Sejakowatz	suite->addTest( new TC("BMimeType::Supporting Apps Test",
16352a38012Sejakowatz						   &MimeTypeTest::SupportingAppsTest) );
16452a38012Sejakowatz
16552a38012Sejakowatz
16652a38012Sejakowatz	return suite;
16752a38012Sejakowatz}
16852a38012Sejakowatz
16952a38012Sejakowatz// Handy comparison operators for BBitmaps. The size and color depth
17052a38012Sejakowatz// are compared first, followed by the bitmap data.
17152a38012Sejakowatzbool
17252a38012Sejakowatzoperator==(BBitmap &bmp1, BBitmap &bmp2) {
17352a38012Sejakowatz	if (bmp1.Bounds() == bmp2.Bounds()) {
17452a38012Sejakowatz//		printf("bmp== 1\n");
17552a38012Sejakowatz		if (bmp1.ColorSpace() == bmp2.ColorSpace()) {
17652a38012Sejakowatz//			printf("bmp== 2\n");
17752a38012Sejakowatz			char *data1 = (char*)bmp1.Bits();
17852a38012Sejakowatz			char *data2 = (char*)bmp2.Bits();
17952a38012Sejakowatz			// NOTE! It's possible that padding bits might not get copied verbatim,
18052a38012Sejakowatz			// which could lead to unexpected failures. If things are acting weird,
18152a38012Sejakowatz			// you might try the commented out code below (keeping in mind that it
18252a38012Sejakowatz			// currently only works for 8-bit color depths).
18352a38012Sejakowatz			for (int i = 0; i < bmp1.BitsLength(); data1++, data2++, i++) {
18452a38012Sejakowatz				if (*data1 != *data2) {
18552a38012Sejakowatz//					printf("i == %d\n", i);
18652a38012Sejakowatz					return false;
18752a38012Sejakowatz				}
18852a38012Sejakowatz			}
18952a38012Sejakowatz/*			for (int i = 0; i < bmp1.Bounds().IntegerHeight(); i++) {
19052a38012Sejakowatz				for (int j = 0; j < bmp1.Bounds().IntegerWidth(); j++) {
19152a38012Sejakowatz//					printf("(%d, %d)", data1[(i * bmp1.BytesPerRow()) + j], data2[(i * bmp2.BytesPerRow()) + j]);
19252a38012Sejakowatz					if (data1[(i * bmp1.BytesPerRow()) + j] != data2[(i * bmp2.BytesPerRow()) + j]) {
19352a38012Sejakowatz						printf("fail at (%d, %d)\n", j, i);
19452a38012Sejakowatz						return false;
19552a38012Sejakowatz					}
19652a38012Sejakowatz				}
19752a38012Sejakowatz			}*/
19852a38012Sejakowatz			return true;
19952a38012Sejakowatz		} else
20052a38012Sejakowatz			return false;
20152a38012Sejakowatz	} else
20252a38012Sejakowatz		return false;
20352a38012Sejakowatz}
20452a38012Sejakowatz
20552a38012Sejakowatzbool
20652a38012Sejakowatzoperator!=(BBitmap &bmp1, BBitmap &bmp2) {
20752a38012Sejakowatz	return !(bmp1 == bmp2);
20852a38012Sejakowatz}
20952a38012Sejakowatz
21052a38012Sejakowatz// Handy comparison operators for BMessages. The BMessages are checked field
21152a38012Sejakowatz// by field, each of which is verified to be identical with respect to: type,
21252a38012Sejakowatz// count, and data (all items).
21352a38012Sejakowatzbool
21452a38012Sejakowatzoperator==(BMessage &msg1, BMessage &msg2) {
21552a38012Sejakowatz	status_t err = B_OK;
21652a38012Sejakowatz
21752a38012Sejakowatz	// For now I'm ignoring the what fields...I shall deal with that later :-)
21852a38012Sejakowatz	if (msg1.what != msg2.what)
21952a38012Sejakowatz		return false;
22052a38012Sejakowatz
22152a38012Sejakowatz/*
22252a38012Sejakowatz	printf("----------------------------------------------------------------------\n");
22352a38012Sejakowatz	msg1.PrintToStream();
22452a38012Sejakowatz	msg2.PrintToStream();
22552a38012Sejakowatz	printf("----------------------------------------------------------------------\n");
22652a38012Sejakowatz*/
22752a38012Sejakowatz
22852a38012Sejakowatz	// Check the counts of field names
22952a38012Sejakowatz	int count1, count2;
23052a38012Sejakowatz	count1 = msg1.CountNames(B_ANY_TYPE);
23152a38012Sejakowatz	count2 = msg2.CountNames(B_ANY_TYPE);
23252a38012Sejakowatz	if (count1 != count2 && (count1 == 0 || count2 == 0))
23352a38012Sejakowatz		return false;
23452a38012Sejakowatz
23552a38012Sejakowatz	// Iterate over all the names in msg1 and check that the field
23652a38012Sejakowatz	// with the same name exists in msg2, is of the same type, and
23752a38012Sejakowatz	// contains identical data.
23852a38012Sejakowatz	for (int i = 0; i < count1 && !err; i++) {
23952a38012Sejakowatz		char *name;
24052a38012Sejakowatz		type_code typeFound1, typeFound2;
24152a38012Sejakowatz		int32 countFound1, countFound2;
24252a38012Sejakowatz
24352a38012Sejakowatz		// Check type and count info
24452a38012Sejakowatz		err = msg1.GetInfo(B_ANY_TYPE, i, &name, &typeFound1, &countFound1);
24552a38012Sejakowatz		if (!err)
24652a38012Sejakowatz			err = msg2.GetInfo(name, &typeFound2, &countFound2);
24752a38012Sejakowatz		if (!err)
24852a38012Sejakowatz			err = (typeFound1 == typeFound2 && countFound1 == countFound2 ? B_OK : B_ERROR);
24952a38012Sejakowatz		if (!err) {
25052a38012Sejakowatz			// Check all the data items
25152a38012Sejakowatz			for (int j = 0; j < countFound1; j++) {
25252a38012Sejakowatz				void *data1, *data2;
25352a38012Sejakowatz				ssize_t bytes1, bytes2;
25452a38012Sejakowatz
25552a38012Sejakowatz				err = msg1.FindData(name, typeFound1, j, (const void**)&data1, &bytes1);
25652a38012Sejakowatz				if (!err)
25752a38012Sejakowatz					err = msg2.FindData(name, typeFound2, j, (const void**)&data2, &bytes2);
25852a38012Sejakowatz				if (!err)
25952a38012Sejakowatz					err = (bytes1 == bytes2 && memcmp(data1, data2, bytes1) == 0 ? B_OK : B_ERROR);
26052a38012Sejakowatz			}
26152a38012Sejakowatz		}
26252a38012Sejakowatz	}
26352a38012Sejakowatz
26452a38012Sejakowatz	return !err;
26552a38012Sejakowatz}
26652a38012Sejakowatz
26752a38012Sejakowatzbool
26852a38012Sejakowatzoperator!=(BMessage &msg1, BMessage &msg2) {
26952a38012Sejakowatz	return !(msg1 == msg2);
27052a38012Sejakowatz}
27152a38012Sejakowatz
27252a38012Sejakowatz// Fills the bitmap data with the given character
27352a38012Sejakowatzvoid
27452a38012Sejakowatzfill_bitmap(BBitmap &bmp, char value) {
27552a38012Sejakowatz	char *data = (char*)bmp.Bits();
27652a38012Sejakowatz	for (int i = 0; i < bmp.BitsLength(); data++, i++) {
27752a38012Sejakowatz//		printf("(%d -> ", *data);
27852a38012Sejakowatz		*data = value;
27952a38012Sejakowatz//		printf("%d)", *data);
28052a38012Sejakowatz	}
28152a38012Sejakowatz//	printf("\n");
28252a38012Sejakowatz}
28352a38012Sejakowatz
28452a38012Sejakowatz// Dumps the size, colorspace, and first data byte
28552a38012Sejakowatz// of the bitmap to stdout
28652a38012Sejakowatz/*void
28752a38012Sejakowatzdump_bitmap(BBitmap &bmp, char *name = "bmp") {
28852a38012Sejakowatz	printf("%s == (%ldx%ld, ", name, bmp.Bounds().IntegerWidth()+1,
28952a38012Sejakowatz		bmp.Bounds().IntegerHeight()+1);
29052a38012Sejakowatz	switch (bmp.ColorSpace()) {
29152a38012Sejakowatz		case B_CMAP8:
29252a38012Sejakowatz			printf("B_CMAP8");
29352a38012Sejakowatz			break;
29452a38012Sejakowatz
29552a38012Sejakowatz		case B_RGBA32:
29652a38012Sejakowatz			printf("B_RGBA32");
29752a38012Sejakowatz			break;
29852a38012Sejakowatz
29952a38012Sejakowatz		default:
30052a38012Sejakowatz			printf("%x", bmp.ColorSpace());
30152a38012Sejakowatz			break;
30252a38012Sejakowatz	}
30352a38012Sejakowatz	printf(", %d)\n", *(char*)bmp.Bits());
30452a38012Sejakowatz}*/
30552a38012Sejakowatz
30652a38012Sejakowatz// IconHelper and IconForTypeHelper:
30752a38012Sejakowatz// Adapter(?) classes needed to reuse icon tests among {Get,Set}Icon() and {Get,Set}IconForType()
30852a38012Sejakowatz// What originally were meant to encapsulate the variations among calls to the various BMimeType
30952a38012Sejakowatz// icon functions have now exploded into beefy helper classes with a bunch of BBitmap related
31052a38012Sejakowatz// functionality as well. A lot of this stuff doesn't necessarily belong
31152a38012Sejakowatz
31252a38012Sejakowatzclass IconHelper {
31352a38012Sejakowatzpublic:
31452a38012Sejakowatz	IconHelper(icon_size which)
31552a38012Sejakowatz		: bmp1(BitmapBounds(which), B_CMAP8),
31652a38012Sejakowatz		  bmp2(BitmapBounds(which), B_CMAP8),
31752a38012Sejakowatz		  bmpTemp(BitmapBounds(which), B_CMAP8),
31852a38012Sejakowatz		  size(which)
31952a38012Sejakowatz	{
32052a38012Sejakowatz		// Initialize our three bitmaps to different "colors"
32152a38012Sejakowatz		fill_bitmap(bmp1, 1);
32252a38012Sejakowatz		fill_bitmap(bmp2, 2);
32352a38012Sejakowatz		fill_bitmap(bmpTemp, 3);
32452a38012Sejakowatz	}
32552a38012Sejakowatz
32652a38012Sejakowatz	virtual ~IconHelper() {}
32752a38012Sejakowatz
32852a38012Sejakowatz	// Returns the proper bitmap bounds for the given icon size
32952a38012Sejakowatz	BRect BitmapBounds(icon_size isize) {
33052a38012Sejakowatz		return isize == B_LARGE_ICON ? BRect(0,0,31,31) : BRect(0,0,15,15);
33152a38012Sejakowatz	}
33252a38012Sejakowatz
33352a38012Sejakowatz	// Returns the proper bitmap bounds for this helper's icon size
33452a38012Sejakowatz	BRect BitmapBounds() {
33552a38012Sejakowatz		return BitmapBounds(size);
33652a38012Sejakowatz	}
33752a38012Sejakowatz
33852a38012Sejakowatz	// Used to call the appropriate GetIcon[ForType] function
33952a38012Sejakowatz	virtual status_t GetIcon(BMimeType &mime, BBitmap *icon) {
34052a38012Sejakowatz		return mime.GetIcon(icon, size);
34152a38012Sejakowatz	}
34252a38012Sejakowatz
34352a38012Sejakowatz	// Used to call the appropriate SetIcon[ForType] function
34452a38012Sejakowatz	virtual status_t SetIcon(BMimeType &mime, BBitmap *icon) {
34552a38012Sejakowatz		return mime.SetIcon(icon, size);
34652a38012Sejakowatz	}
34752a38012Sejakowatz
34852a38012Sejakowatz	BBitmap* TempBitmap() {
34952a38012Sejakowatz		return &bmpTemp;
35052a38012Sejakowatz	}
35152a38012Sejakowatz
35252a38012Sejakowatz	BBitmap* Bitmap1() {
35352a38012Sejakowatz		return &bmp1;
35452a38012Sejakowatz	}
35552a38012Sejakowatz
35652a38012Sejakowatz	BBitmap* Bitmap2() {
35752a38012Sejakowatz		return &bmp2;
35852a38012Sejakowatz	}
35952a38012Sejakowatz
36052a38012Sejakowatz	icon_size Size() {
36152a38012Sejakowatz		return size;
36252a38012Sejakowatz	}
36352a38012Sejakowatz
36452a38012Sejakowatzprotected:
36552a38012Sejakowatz	BBitmap bmp1;
36652a38012Sejakowatz	BBitmap bmp2;
36752a38012Sejakowatz	BBitmap bmpTemp;
36852a38012Sejakowatz	icon_size size;
36952a38012Sejakowatz};
37052a38012Sejakowatz
37152a38012Sejakowatzclass IconForTypeHelper : public IconHelper {
37252a38012Sejakowatzpublic:
37352a38012Sejakowatz	IconForTypeHelper(const char *fileType, icon_size which)
37452a38012Sejakowatz		: IconHelper(which), fileType(fileType) {}
37552a38012Sejakowatz	virtual ~IconForTypeHelper() {}
37652a38012Sejakowatz	virtual status_t GetIcon(BMimeType &mime, BBitmap *icon) {
37752a38012Sejakowatz		return mime.GetIconForType(fileType.c_str(), icon, size);
37852a38012Sejakowatz	}
37952a38012Sejakowatz	virtual status_t SetIcon(BMimeType &mime, BBitmap *icon) {
38052a38012Sejakowatz		return mime.SetIconForType(fileType.c_str(), icon, size);
38152a38012Sejakowatz	}
38252a38012Sejakowatzprotected:
38352a38012Sejakowatz	std::string fileType;
38452a38012Sejakowatz};
38552a38012Sejakowatz
386762a48a0STyler Dauwalder// Adapter classes used by FillWithMimeTypes() to facilitate
387762a48a0STyler Dauwalder// addition of strings to containers with varying interfaces
388762a48a0STyler Dauwalderclass ContainerAdapter {
389762a48a0STyler Dauwalderpublic:
390762a48a0STyler Dauwalder	virtual void Add(std::string value) = 0;
391762a48a0STyler Dauwalder};
392762a48a0STyler Dauwalder
393762a48a0STyler Dauwalderclass SetAdapter : public ContainerAdapter {
394762a48a0STyler Dauwalderpublic:
395762a48a0STyler Dauwalder	SetAdapter(std::set<std::string> &set)
396762a48a0STyler Dauwalder		: fSet(set) { }
397762a48a0STyler Dauwalder	virtual void Add(std::string value) {
398762a48a0STyler Dauwalder		fSet.insert(value);
399762a48a0STyler Dauwalder	}
400762a48a0STyler Dauwalderprotected:
401762a48a0STyler Dauwalder	std::set<std::string> &fSet;
402762a48a0STyler Dauwalder};
403762a48a0STyler Dauwalder
404762a48a0STyler Dauwalderclass QueueAdapter : public ContainerAdapter {
405762a48a0STyler Dauwalderpublic:
406762a48a0STyler Dauwalder	QueueAdapter(std::queue<std::string> &queue)
407762a48a0STyler Dauwalder		: fQueue(queue) { }
408762a48a0STyler Dauwalder	virtual void Add(std::string value) {
409762a48a0STyler Dauwalder		fQueue.push(value);
410762a48a0STyler Dauwalder	}
411762a48a0STyler Dauwalderprotected:
412762a48a0STyler Dauwalder	std::queue<std::string> &fQueue;
413762a48a0STyler Dauwalder};
414762a48a0STyler Dauwalder
415762a48a0STyler Dauwalder
41652a38012Sejakowatz// setUp
41752a38012Sejakowatzvoid
41852a38012SejakowatzMimeTypeTest::setUp()
41952a38012Sejakowatz{
42052a38012Sejakowatz	BasicTest::setUp();
42152a38012Sejakowatz	execCommand(string("mkdir ") + testDir);
42252a38012Sejakowatz/*	// Better not to play with fire, so we'll make a copy of the
42352a38012Sejakowatz	// local mime database which we'll use for certain OpenBeOS tests
42452a38012Sejakowatz	execCommand(string("mkdir ") + testDir
42552a38012Sejakowatz				+ " ; copyattr -d -r -- " + mimeDatabaseDir + "/\* " + testDir
42652a38012Sejakowatz				); */
42752a38012Sejakowatz	// Setup our application
428762a48a0STyler Dauwalder	fApplication = new BTestApp(testSig);
42952a38012Sejakowatz	if (fApplication->Init() != B_OK) {
43052a38012Sejakowatz		fprintf(stderr, "Failed to initialize application.\n");
43152a38012Sejakowatz		delete fApplication;
43252a38012Sejakowatz		fApplication = NULL;
43352a38012Sejakowatz	}
43452a38012Sejakowatz
43552a38012Sejakowatz}
43652a38012Sejakowatz
43752a38012Sejakowatz// tearDown
43852a38012Sejakowatzvoid
43952a38012SejakowatzMimeTypeTest::tearDown()
44052a38012Sejakowatz{
44152a38012Sejakowatz	execCommand(string("rm -rf ") + testDir);
44252a38012Sejakowatz
44352a38012Sejakowatz	// Uninistall our test type
44452a38012Sejakowatz	//! /todo Uncomment the following uninstall code when all is said and done.
44552a38012Sejakowatz/*	BMimeType mime(testType);
44652a38012Sejakowatz	status_t err = mime.InitCheck();
44752a38012Sejakowatz	if (!err && mime.IsInstalled())
44852a38012Sejakowatz		err = mime.Delete();
44952a38012Sejakowatz	if (err)
45052a38012Sejakowatz		fprintf(stderr, "Failed to unistall test type \"%s\"\n", testType); */
45152a38012Sejakowatz	// Terminate the Application
45252a38012Sejakowatz	if (fApplication) {
45352a38012Sejakowatz		fApplication->Terminate();
45452a38012Sejakowatz		delete fApplication;
45552a38012Sejakowatz		fApplication = NULL;
45652a38012Sejakowatz	}
45752a38012Sejakowatz	// remove the types we've added
45852a38012Sejakowatz	const char * const testTypes[] = {
45952a38012Sejakowatz		testType, testType1, testType2, testType3, testType4, testType5,
46052a38012Sejakowatz		testTypeApp, testTypeApp1, testTypeApp2, testTypeApp3,
46152a38012Sejakowatz	};
46252a38012Sejakowatz	for (uint32 i = 0; i < sizeof(testTypes) / sizeof(const char*); i++) {
46352a38012Sejakowatz		BMimeType type(testTypes[i]);
46452a38012Sejakowatz		type.Delete();
46552a38012Sejakowatz	}
46652a38012Sejakowatz	BasicTest::tearDown();
46752a38012Sejakowatz}
46852a38012Sejakowatz
46952a38012Sejakowatz// entry_ref dumping function ; this may be removed at any time
47052a38012Sejakowatz
47152a38012Sejakowatz/*void
47252a38012Sejakowatzdump_ref(entry_ref *ref, char* name = "ref") {
47352a38012Sejakowatz	if (ref) {
47452a38012Sejakowatz		BPath path(ref);
47552a38012Sejakowatz		status_t err = path.InitCheck();
47652a38012Sejakowatz		if (!err) {
47752a38012Sejakowatz			printf("%s == '%s'", name, path.Path());
47852a38012Sejakowatz		} else
47952a38012Sejakowatz			printf("%s == ERROR", name);
48052a38012Sejakowatz		printf(" == (%ld, %Ld, '%s')\n", ref->device, ref->directory, ref->name);
48152a38012Sejakowatz
48252a38012Sejakowatz	} else
48352a38012Sejakowatz		printf("%s == (NULL)\n", name);
48452a38012Sejakowatz}*/
48552a38012Sejakowatz
48652a38012Sejakowatz// App Hint
48752a38012Sejakowatz
48852a38012Sejakowatzvoid
48952a38012SejakowatzMimeTypeTest::AppHintTest() {
49052a38012Sejakowatz	// init a couple of entry_refs to applications
49152a38012Sejakowatz	BEntry entry(testApp);
49252a38012Sejakowatz	entry_ref appRef;
49352a38012Sejakowatz	CHK(entry.InitCheck() == B_OK);
49452a38012Sejakowatz	CHK(entry.GetRef(&appRef) == B_OK);
49552a38012Sejakowatz	BEntry entry2(testApp2);
49652a38012Sejakowatz	entry_ref appRef2;
49752a38012Sejakowatz	CHK(entry2.InitCheck() == B_OK);
49852a38012Sejakowatz	CHK(entry2.GetRef(&appRef2) == B_OK);
49952a38012Sejakowatz	// Uninitialized
500aad997bdSTyler Dauwalder	NextSubTest();
50152a38012Sejakowatz	{
50252a38012Sejakowatz		BMimeType mime;
50352a38012Sejakowatz		entry_ref ref;
50452a38012Sejakowatz		CHK(mime.InitCheck() == B_NO_INIT);
50552a38012Sejakowatz		CHK(mime.GetAppHint(&ref) != B_OK);		// R5 == B_BAD_VALUE
50652a38012Sejakowatz		CHK(mime.SetAppHint(&ref) != B_OK);		// R5 == B_BAD_VALUE
50752a38012Sejakowatz	}
50852a38012Sejakowatz	// NULL params
509aad997bdSTyler Dauwalder	NextSubTest();
51052a38012Sejakowatz	{
51152a38012Sejakowatz		entry_ref ref;
51252a38012Sejakowatz		BMimeType mime(testType);
51352a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
51452a38012Sejakowatz		// Make sure the type isn't installed
51552a38012Sejakowatz		if (mime.IsInstalled())
51652a38012Sejakowatz			CHK(mime.Delete() == B_OK);
51752a38012Sejakowatz		CHK(!mime.IsInstalled());
51852a38012Sejakowatz		CHK(mime.GetAppHint(NULL) != B_OK);		// R5 == B_BAD_VALUE
51952a38012Sejakowatz		CHK(!mime.IsInstalled());
52052a38012Sejakowatz		CHK(mime.SetAppHint(NULL) != B_OK);		// Installs, R5 == B_ENTRY_NOT_FOUND
52152a38012Sejakowatz		CHK(mime.IsInstalled());
52252a38012Sejakowatz		CHK(mime.GetAppHint(NULL) != B_OK);		// R5 == B_BAD_VALUE
52352a38012Sejakowatz		CHK(mime.SetAppHint(NULL) != B_OK);		// R5 == B_ENTRY_NOT_FOUND
52452a38012Sejakowatz	}
52552a38012Sejakowatz	// Non-installed type
526aad997bdSTyler Dauwalder	NextSubTest();
52752a38012Sejakowatz	{
52852a38012Sejakowatz		entry_ref ref;
52952a38012Sejakowatz		BMimeType mime(testType);
53052a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
53152a38012Sejakowatz		// Make sure the type isn't installed
53252a38012Sejakowatz		if (mime.IsInstalled())
53352a38012Sejakowatz			CHK(mime.Delete() == B_OK);
53452a38012Sejakowatz		CHK(!mime.IsInstalled());
53552a38012Sejakowatz		CHK(mime.GetAppHint(&ref) != B_OK);		// R5 == B_ENTRY_NOT_FOUND
53652a38012Sejakowatz		CHK(!mime.IsInstalled());
53752a38012Sejakowatz		CHK(mime.SetAppHint(&appRef) == B_OK);
53852a38012Sejakowatz		CHK(mime.IsInstalled());
53952a38012Sejakowatz		CHK(mime.GetAppHint(&ref) == B_OK);
54052a38012Sejakowatz		CHK(ref == appRef);
54152a38012Sejakowatz	}
54252a38012Sejakowatz	// Installed Type
543aad997bdSTyler Dauwalder	NextSubTest();
54452a38012Sejakowatz	{
54552a38012Sejakowatz		entry_ref ref;
54652a38012Sejakowatz		BMimeType mime(testType);
54752a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
54852a38012Sejakowatz		// Uninstall then reinstall to clear attributes
54952a38012Sejakowatz		if (mime.IsInstalled())
55052a38012Sejakowatz			CHK(mime.Delete() == B_OK);
55152a38012Sejakowatz		if (!mime.IsInstalled())
55252a38012Sejakowatz			CHK(mime.Install() == B_OK);
55352a38012Sejakowatz		CHK(mime.IsInstalled());
55452a38012Sejakowatz		// Get() with no apphint installed
55552a38012Sejakowatz		CHK(mime.GetAppHint(&ref) == B_ENTRY_NOT_FOUND);
55652a38012Sejakowatz		// Initial Set()/Get()
55752a38012Sejakowatz		CHK(mime.SetAppHint(&appRef) == B_OK);
55852a38012Sejakowatz		CHK(mime.GetAppHint(&ref) == B_OK);
55952a38012Sejakowatz		CHK(ref == appRef);
56052a38012Sejakowatz		// Followup Set()/Get()
56152a38012Sejakowatz		CHK(mime.SetAppHint(&appRef2) == B_OK);
56252a38012Sejakowatz		CHK(mime.GetAppHint(&ref) == B_OK);
56352a38012Sejakowatz		CHK(ref == appRef2);
56452a38012Sejakowatz		CHK(ref != appRef);
56552a38012Sejakowatz	}
56652a38012Sejakowatz	// Installed Type, invalid entry_ref
567aad997bdSTyler Dauwalder	NextSubTest();
56852a38012Sejakowatz	{
56952a38012Sejakowatz		entry_ref ref(-1, -1, NULL);
57052a38012Sejakowatz		BMimeType mime(testType);
57152a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
57252a38012Sejakowatz		// Uninstall then reinstall to clear attributes
57352a38012Sejakowatz		if (mime.IsInstalled())
57452a38012Sejakowatz			CHK(mime.Delete() == B_OK);
57552a38012Sejakowatz		if (!mime.IsInstalled())
57652a38012Sejakowatz			CHK(mime.Install() == B_OK);
57752a38012Sejakowatz		CHK(mime.IsInstalled());
57852a38012Sejakowatz		CHK(mime.SetAppHint(&appRef) == B_OK);
57952a38012Sejakowatz		CHK(mime.SetAppHint(&ref) != B_OK);	// R5 == B_BAD_VALUE
58052a38012Sejakowatz	}
58152a38012Sejakowatz	// Installed Type, fake/invalid entry_ref
582aad997bdSTyler Dauwalder	NextSubTest();
58352a38012Sejakowatz	{
58452a38012Sejakowatz		entry_ref ref(0, 0, "__this_ought_not_exist__");
58552a38012Sejakowatz		BMimeType mime(testType);
58652a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
58752a38012Sejakowatz		// Uninstall then reinstall to clear attributes
58852a38012Sejakowatz		if (mime.IsInstalled())
58952a38012Sejakowatz			CHK(mime.Delete() == B_OK);
59052a38012Sejakowatz		if (!mime.IsInstalled())
59152a38012Sejakowatz			CHK(mime.Install() == B_OK);
59252a38012Sejakowatz		CHK(mime.IsInstalled());
59352a38012Sejakowatz		CHK(mime.SetAppHint(&appRef) == B_OK);
59452a38012Sejakowatz		CHK(mime.SetAppHint(&ref) != B_OK);	// R5 == B_ENTRY_NOT_FOUND
59552a38012Sejakowatz	}
59652a38012Sejakowatz	// Installed Type, abstract entry_ref
597aad997bdSTyler Dauwalder	NextSubTest();
59852a38012Sejakowatz	{
59952a38012Sejakowatz		entry_ref fakeRef;
60052a38012Sejakowatz		entry_ref ref;
60152a38012Sejakowatz		BEntry entry(fakeTestApp);
60252a38012Sejakowatz		CHK(entry.InitCheck() == B_OK);
60352a38012Sejakowatz		CHK(!entry.Exists());
60452a38012Sejakowatz		CHK(entry.GetRef(&fakeRef) == B_OK);
60552a38012Sejakowatz		BMimeType mime(testType);
60652a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
60752a38012Sejakowatz		// Uninstall then reinstall to clear attributes
60852a38012Sejakowatz		if (mime.IsInstalled())
60952a38012Sejakowatz			CHK(mime.Delete() == B_OK);
61052a38012Sejakowatz		if (!mime.IsInstalled())
61152a38012Sejakowatz			CHK(mime.Install() == B_OK);
61252a38012Sejakowatz		CHK(mime.IsInstalled());
61352a38012Sejakowatz		CHK(mime.SetAppHint(&appRef) == B_OK);
61452a38012Sejakowatz		CHK(mime.SetAppHint(&fakeRef) == B_OK);
61552a38012Sejakowatz		CHK(mime.GetAppHint(&ref) == B_OK);
61652a38012Sejakowatz		CHK(ref == fakeRef);
61752a38012Sejakowatz		CHK(ref != appRef);
61852a38012Sejakowatz	}
61952a38012Sejakowatz}
62052a38012Sejakowatz
62152a38012Sejakowatz// Attr Info
62252a38012Sejakowatz
62352a38012Sejakowatzvoid
62452a38012SejakowatzMimeTypeTest::AttrInfoTest() {
62552a38012Sejakowatz	// Create some messages to sling around
62652a38012Sejakowatz	const int32 WHAT = 233;	// This is the what value that GAI() returns...not sure if it has a name yet
62752a38012Sejakowatz	BMessage msg1(WHAT), msg2(WHAT), msg3(WHAT), msgIncomplete1(WHAT), msgIncomplete2(WHAT);
62852a38012Sejakowatz
62952a38012Sejakowatz	CHK(msg1.AddString(attrInfoField_Name, "Color") == B_OK);
63052a38012Sejakowatz	CHK(msg1.AddString(attrInfoField_PublicName, "The Color") == B_OK);
63152a38012Sejakowatz	CHK(msg1.AddInt32(attrInfoField_Type, B_STRING_TYPE) == B_OK);
63252a38012Sejakowatz	CHK(msg1.AddBool(attrInfoField_Viewable, true) == B_OK);
63352a38012Sejakowatz	CHK(msg1.AddBool(attrInfoField_Editable, true) == B_OK);
63452a38012Sejakowatz
63552a38012Sejakowatz	CHK(msg1.AddString(attrInfoField_Name, "High Score") == B_OK);
63652a38012Sejakowatz	CHK(msg1.AddString(attrInfoField_PublicName, "The Highest Score Ever") == B_OK);
63752a38012Sejakowatz	CHK(msg1.AddInt32(attrInfoField_Type, B_INT32_TYPE) == B_OK);
63852a38012Sejakowatz	CHK(msg1.AddBool(attrInfoField_Viewable, false) == B_OK);
63952a38012Sejakowatz	CHK(msg1.AddBool(attrInfoField_Editable, false) == B_OK);
64052a38012Sejakowatz
64152a38012Sejakowatz	CHK(msg2.AddString(attrInfoField_Name, "Volume") == B_OK);
64252a38012Sejakowatz	CHK(msg2.AddString(attrInfoField_PublicName, "Loudness") == B_OK);
64352a38012Sejakowatz	CHK(msg2.AddInt32(attrInfoField_Type, B_DOUBLE_TYPE) == B_OK);
64452a38012Sejakowatz	CHK(msg2.AddBool(attrInfoField_Viewable, true) == B_OK);
64552a38012Sejakowatz	CHK(msg2.AddBool(attrInfoField_Editable, true) == B_OK);
64652a38012Sejakowatz
64752a38012Sejakowatz	CHK(msg3.AddString(attrInfoField_Name, "Volume") == B_OK);
64852a38012Sejakowatz	CHK(msg3.AddString(attrInfoField_PublicName, "Loudness") == B_OK);
64952a38012Sejakowatz	CHK(msg3.AddInt32(attrInfoField_Type, B_DOUBLE_TYPE) == B_OK);
65052a38012Sejakowatz	CHK(msg3.AddBool(attrInfoField_Viewable, true) == B_OK);
65152a38012Sejakowatz	CHK(msg3.AddBool(attrInfoField_Editable, true) == B_OK);
65252a38012Sejakowatz
65352a38012Sejakowatz	CHK(msgIncomplete1.AddString(attrInfoField_Name, "Color") == B_OK);
65452a38012Sejakowatz	CHK(msgIncomplete1.AddString(attrInfoField_PublicName, "The Color") == B_OK);
65552a38012Sejakowatz	CHK(msgIncomplete1.AddInt32(attrInfoField_Type, B_STRING_TYPE) == B_OK);
65652a38012Sejakowatz	CHK(msgIncomplete1.AddBool(attrInfoField_Viewable, true) == B_OK);
65752a38012Sejakowatz	CHK(msgIncomplete1.AddBool(attrInfoField_Editable, true) == B_OK);
65852a38012Sejakowatz
65952a38012Sejakowatz	CHK(msgIncomplete1.AddString(attrInfoField_Name, "High Score") == B_OK);
66052a38012Sejakowatz//	CHK(msgIncomplete1.AddString(attrInfoField_PublicName, "The Highest Score Ever") == B_OK);
66152a38012Sejakowatz	CHK(msgIncomplete1.AddInt32(attrInfoField_Type, B_INT32_TYPE) == B_OK);
66252a38012Sejakowatz//	CHK(msgIncomplete1.AddBool(attrInfoField_Viewable, false) == B_OK);
66352a38012Sejakowatz	CHK(msgIncomplete1.AddBool(attrInfoField_Editable, false) == B_OK);
66452a38012Sejakowatz
66552a38012Sejakowatz	CHK(msgIncomplete2.AddString(attrInfoField_Name, "Color") == B_OK);
66652a38012Sejakowatz//	CHK(msgIncomplete2.AddString(attrInfoField_PublicName, "The Color") == B_OK);
66752a38012Sejakowatz//	CHK(msgIncomplete2.AddInt32(attrInfoField_Type, B_STRING_TYPE) == B_OK);
66852a38012Sejakowatz//	CHK(msgIncomplete2.AddBool(attrInfoField_Viewable, true) == B_OK);
66952a38012Sejakowatz	CHK(msgIncomplete2.AddBool(attrInfoField_Editable, true) == B_OK);
67052a38012Sejakowatz
67152a38012Sejakowatz	CHK(msg1 == msg1);
67252a38012Sejakowatz	CHK(msg2 == msg2);
67352a38012Sejakowatz	CHK(msg3 == msg3);
67452a38012Sejakowatz	CHK(msg1 != msg2);
67552a38012Sejakowatz	CHK(msg1 != msg3);
67652a38012Sejakowatz	CHK(msg2 == msg3);
67752a38012Sejakowatz
67852a38012Sejakowatz	// Uninitialized
679aad997bdSTyler Dauwalder	NextSubTest();
68052a38012Sejakowatz	{
68152a38012Sejakowatz		BMimeType mime;
68252a38012Sejakowatz		BMessage msg;
68352a38012Sejakowatz
68452a38012Sejakowatz		CHK(mime.InitCheck() == B_NO_INIT);
68552a38012Sejakowatz		CHK(mime.GetAttrInfo(&msg) != B_OK);		// R5 == B_BAD_VALUE
68652a38012Sejakowatz		CHK(mime.SetAttrInfo(&msg) != B_OK);		// R5 == B_BAD_VALUE
68752a38012Sejakowatz	}
68852a38012Sejakowatz
68952a38012Sejakowatz	// NULL params
690aad997bdSTyler Dauwalder	NextSubTest();
69152a38012Sejakowatz	{
69252a38012Sejakowatz		BMimeType mime(testType);
69352a38012Sejakowatz		BMessage msg;
69452a38012Sejakowatz
69552a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
69652a38012Sejakowatz		// Make sure the type isn't installed
69752a38012Sejakowatz		if (mime.IsInstalled())
69852a38012Sejakowatz			CHK(mime.Delete() == B_OK);
69952a38012Sejakowatz
70052a38012Sejakowatz		// Non-installed
70152a38012Sejakowatz		CHK(!mime.IsInstalled());
70252a38012Sejakowatz		CHK(mime.GetAttrInfo(NULL) != B_OK);	// R5 == B_ENTRY_NOT_FOUND
70352a38012Sejakowatz		CHK(!mime.IsInstalled());
704aad997bdSTyler Dauwalder#if !TEST_R5
70552a38012Sejakowatz		CHK(RES(mime.SetAttrInfo(NULL)) != B_OK);		// R5 == CRASH!!!
70652a38012Sejakowatz#endif
70752a38012Sejakowatz
70852a38012Sejakowatz		// Installed
709aad997bdSTyler Dauwalder		NextSubTest();
71052a38012Sejakowatz		CHK(mime.Install() == B_OK);
71152a38012Sejakowatz		CHK(mime.IsInstalled());
71252a38012Sejakowatz		CHK(mime.GetAttrInfo(NULL) != B_OK);	// R5 == B_ENTRY_NOT_FOUND
713aad997bdSTyler Dauwalder#if !TEST_R5
71452a38012Sejakowatz		CHK(RES(mime.SetAttrInfo(NULL)) != B_OK);		// R5 == CRASH!!!
71552a38012Sejakowatz#endif
71652a38012Sejakowatz	}
71752a38012Sejakowatz
71852a38012Sejakowatz	// Improperly formatted BMessages
719aad997bdSTyler Dauwalder	NextSubTest();
72052a38012Sejakowatz	{
72152a38012Sejakowatz		BMessage msg(WHAT);
72252a38012Sejakowatz		BMimeType mime(testType);
72352a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
72452a38012Sejakowatz
72552a38012Sejakowatz		// Uninstall then reinstall to clear attributes
72652a38012Sejakowatz		if (mime.IsInstalled())
72752a38012Sejakowatz			CHK(mime.Delete() == B_OK);
72852a38012Sejakowatz		if (!mime.IsInstalled())
72952a38012Sejakowatz			CHK(mime.Install() == B_OK);
73052a38012Sejakowatz		CHK(mime.IsInstalled());
73152a38012Sejakowatz
73252a38012Sejakowatz		// Initial Set()/Get()
73352a38012Sejakowatz		msgIncomplete1.RemoveName(typeField);		// Clear "type" fields, since SAI() just adds another
73452a38012Sejakowatz		msgIncomplete2.RemoveName(typeField);
73552a38012Sejakowatz		CHK(msg != msgIncomplete1);
73652a38012Sejakowatz		CHK(msg != msgIncomplete2);
73752a38012Sejakowatz		CHK(mime.SetAttrInfo(&msgIncomplete1) == B_OK);
73852a38012Sejakowatz		CHK(mime.GetAttrInfo(&msg) == B_OK);
73952a38012Sejakowatz		CHK(msgIncomplete1.AddString(typeField, testType) == B_OK);	// Add in "type" fields as GFE() does
74052a38012Sejakowatz		CHK(msgIncomplete2.AddString(typeField, testType) == B_OK);
74152a38012Sejakowatz		CHK(msg == msgIncomplete1);
74252a38012Sejakowatz		CHK(msg != msgIncomplete2);
74352a38012Sejakowatz	}
74452a38012Sejakowatz
74552a38012Sejakowatz	// Set() with improperly formatted message
746aad997bdSTyler Dauwalder	NextSubTest();
74752a38012Sejakowatz	{
74852a38012Sejakowatz		BMessage msg(WHAT);
74952a38012Sejakowatz		BMimeType mime(testType);
75052a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
75152a38012Sejakowatz
75252a38012Sejakowatz		// Uninstall then reinstall to clear attributes
75352a38012Sejakowatz		if (mime.IsInstalled())
75452a38012Sejakowatz			CHK(mime.Delete() == B_OK);
75552a38012Sejakowatz		if (!mime.IsInstalled())
75652a38012Sejakowatz			CHK(mime.Install() == B_OK);
75752a38012Sejakowatz		CHK(mime.IsInstalled());
75852a38012Sejakowatz
75952a38012Sejakowatz		// Initial Set()/Get()
76052a38012Sejakowatz		msgIncomplete1.RemoveName(typeField);		// Clear "type" fields, since SAI() just adds another
76152a38012Sejakowatz		msgIncomplete2.RemoveName(typeField);
76252a38012Sejakowatz		CHK(msg != msgIncomplete1);
76352a38012Sejakowatz		CHK(msg != msgIncomplete2);
76452a38012Sejakowatz		CHK(mime.SetAttrInfo(&msgIncomplete1) == B_OK);
76552a38012Sejakowatz		CHK(mime.GetAttrInfo(&msg) == B_OK);
76652a38012Sejakowatz		CHK(msgIncomplete1.AddString(typeField, testType) == B_OK);	// Add in "type" fields as GFE() does
76752a38012Sejakowatz		CHK(msgIncomplete2.AddString(typeField, testType) == B_OK);
76852a38012Sejakowatz		CHK(msg == msgIncomplete1);
76952a38012Sejakowatz		CHK(msg != msgIncomplete2);
77052a38012Sejakowatz	}
77152a38012Sejakowatz
77252a38012Sejakowatz	// Set() with empty message
773aad997bdSTyler Dauwalder	NextSubTest();
77452a38012Sejakowatz	{
77552a38012Sejakowatz		BMimeType mime(testType);
77652a38012Sejakowatz		BMessage msgEmpty(WHAT);
77752a38012Sejakowatz		BMessage msg(WHAT);
77852a38012Sejakowatz		CHK(msg.AddInt32("stuff", 1234) == B_OK);	// Add an extra attribute to give us something to compare with
77952a38012Sejakowatz
78052a38012Sejakowatz		// Uninstall then reinstall to clear attributes
78152a38012Sejakowatz		if (mime.IsInstalled())
78252a38012Sejakowatz			CHK(mime.Delete() == B_OK);
78352a38012Sejakowatz		if (!mime.IsInstalled())
78452a38012Sejakowatz			CHK(mime.Install() == B_OK);
78552a38012Sejakowatz		CHK(mime.IsInstalled());
78652a38012Sejakowatz
78752a38012Sejakowatz		// Set(empty)
78852a38012Sejakowatz		CHK(msg != msgEmpty);
78952a38012Sejakowatz		CHK(mime.SetAttrInfo(&msgEmpty) == B_OK);
79052a38012Sejakowatz		CHK(mime.GetAttrInfo(&msg) == B_OK);
79152a38012Sejakowatz		CHK(msgEmpty.AddString(typeField, testType) == B_OK);	// Add in "type" fields as GFE() does
79252a38012Sejakowatz		CHK(msg == msgEmpty);
79352a38012Sejakowatz	}
79452a38012Sejakowatz
79552a38012Sejakowatz	// Set() with extra attributes in message
796aad997bdSTyler Dauwalder	NextSubTest();
79752a38012Sejakowatz	{
79852a38012Sejakowatz		BMimeType mime(testType);
79952a38012Sejakowatz		BMessage msg(WHAT);
80052a38012Sejakowatz		BMessage msgExtraSet(msg1);
80152a38012Sejakowatz		CHK(msgExtraSet.AddString("extra", ".extra") == B_OK);
80252a38012Sejakowatz		CHK(msgExtraSet.AddInt32("more_extras", 123) == B_OK);
80352a38012Sejakowatz		CHK(msgExtraSet.AddInt32("more_extras", 456) == B_OK);
80452a38012Sejakowatz		CHK(msgExtraSet.AddInt32("more_extras", 789) == B_OK);
80552a38012Sejakowatz		BMessage msgExtraGet(msgExtraSet);
80652a38012Sejakowatz
80752a38012Sejakowatz		// Uninstall then reinstall to clear attributes
80852a38012Sejakowatz		if (mime.IsInstalled())
80952a38012Sejakowatz			CHK(mime.Delete() == B_OK);
81052a38012Sejakowatz		if (!mime.IsInstalled())
81152a38012Sejakowatz			CHK(mime.Install() == B_OK);
81252a38012Sejakowatz		CHK(mime.IsInstalled());
81352a38012Sejakowatz
81452a38012Sejakowatz		// Set(extra)/Get(empty)
81552a38012Sejakowatz		msg1.RemoveName(typeField);		// Clear "type" fields, since SFE() just adds another
81652a38012Sejakowatz		msg2.RemoveName(typeField);
81752a38012Sejakowatz		CHK(msg != msg1);
81852a38012Sejakowatz		CHK(msg != msgExtraSet);
81952a38012Sejakowatz		CHK(mime.SetAttrInfo(&msgExtraSet) == B_OK);
82052a38012Sejakowatz		CHK(mime.GetAttrInfo(&msg) == B_OK);
82152a38012Sejakowatz		CHK(msg1.AddString(typeField, testType) == B_OK);	// Add in "type" fields as GFE() does
82252a38012Sejakowatz		CHK(msgExtraSet.AddString(typeField, testType) == B_OK);
82352a38012Sejakowatz		CHK(msg == msgExtraSet);
82452a38012Sejakowatz		CHK(msg != msg1);
82552a38012Sejakowatz
82652a38012Sejakowatz		// Get(extra)
827aad997bdSTyler Dauwalder		NextSubTest();
82852a38012Sejakowatz		CHK(mime.GetAttrInfo(&msgExtraGet) == B_OK);
82952a38012Sejakowatz		CHK(msgExtraGet == msgExtraSet);
83052a38012Sejakowatz		CHK(msgExtraGet != msg1);
83152a38012Sejakowatz
83252a38012Sejakowatz		// Get(extra and then some)
833aad997bdSTyler Dauwalder		NextSubTest();
83452a38012Sejakowatz		CHK(msgExtraGet.AddInt32("more_extras", 101112) == B_OK);
83552a38012Sejakowatz		msgExtraGet.RemoveName(typeField);		// Clear "type" fields to be fair, since SFE() just adds another
83652a38012Sejakowatz		CHK(mime.GetAttrInfo(&msgExtraGet) == B_OK);	// Reinitializes result (clearing extra fields)
83752a38012Sejakowatz		CHK(msgExtraGet == msgExtraSet);
83852a38012Sejakowatz		CHK(msgExtraGet != msg1);
83952a38012Sejakowatz
84052a38012Sejakowatz	}
84152a38012Sejakowatz	// Normal Function (Non-installed type)
842aad997bdSTyler Dauwalder	NextSubTest();
84352a38012Sejakowatz	{
84452a38012Sejakowatz		BMimeType mime(testType);
84552a38012Sejakowatz		BMessage msg(WHAT);
84652a38012Sejakowatz		BMessage msg2(WHAT);
84752a38012Sejakowatz
84852a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
84952a38012Sejakowatz		// Make sure the type isn't installed
85052a38012Sejakowatz		if (mime.IsInstalled())
85152a38012Sejakowatz			CHK(mime.Delete() == B_OK);
85252a38012Sejakowatz
85352a38012Sejakowatz		CHK(!mime.IsInstalled());
85452a38012Sejakowatz		CHK(mime.GetAttrInfo(&msg) != B_OK);		// R5 == B_ENTRY_NOT_FOUND
85552a38012Sejakowatz		CHK(!mime.IsInstalled());
85652a38012Sejakowatz		CHK(mime.SetAttrInfo(&msg) == B_OK);
85752a38012Sejakowatz		CHK(mime.IsInstalled());
85852a38012Sejakowatz		CHK(mime.GetAttrInfo(&msg2) == B_OK);
85952a38012Sejakowatz		CHK(msg.AddString(typeField, testType) == B_OK);	// Add in "type" fields as GAI() does
86052a38012Sejakowatz		CHK(msg == msg2);
86152a38012Sejakowatz	}
86252a38012Sejakowatz
86352a38012Sejakowatz	// Normal Function
864aad997bdSTyler Dauwalder	NextSubTest();
86552a38012Sejakowatz	{
86652a38012Sejakowatz		BMessage msg(WHAT);
86752a38012Sejakowatz		BMimeType mime(testType);
86852a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
86952a38012Sejakowatz
87052a38012Sejakowatz		// Uninstall then reinstall to clear attributes
87152a38012Sejakowatz		if (mime.IsInstalled())
87252a38012Sejakowatz			CHK(mime.Delete() == B_OK);
87352a38012Sejakowatz		if (!mime.IsInstalled())
87452a38012Sejakowatz			CHK(mime.Install() == B_OK);
87552a38012Sejakowatz		CHK(mime.IsInstalled());
87652a38012Sejakowatz
87752a38012Sejakowatz		// Initial Set()/Get()
87852a38012Sejakowatz		msg1.RemoveName(typeField);		// Clear "type" fields, since SAI() just adds another
87952a38012Sejakowatz		msg2.RemoveName(typeField);
88052a38012Sejakowatz		CHK(msg != msg1);
88152a38012Sejakowatz		CHK(msg != msg2);
88252a38012Sejakowatz		CHK(mime.SetAttrInfo(&msg1) == B_OK);
88352a38012Sejakowatz		CHK(mime.GetAttrInfo(&msg) == B_OK);
88452a38012Sejakowatz		CHK(msg1.AddString(typeField, testType) == B_OK);	// Add in "type" fields as GFE() does
88552a38012Sejakowatz		CHK(msg2.AddString(typeField, testType) == B_OK);
88652a38012Sejakowatz		CHK(msg == msg1);
88752a38012Sejakowatz		CHK(msg != msg2);
88852a38012Sejakowatz
88952a38012Sejakowatz		// Followup Set()/Get()
890aad997bdSTyler Dauwalder		NextSubTest();
89152a38012Sejakowatz		CHK(msg.MakeEmpty() == B_OK);
89252a38012Sejakowatz		msg1.RemoveName(typeField);		// Clear "type" fields, since SFE() just adds another
89352a38012Sejakowatz		msg2.RemoveName(typeField);
89452a38012Sejakowatz		CHK(msg != msg1);
89552a38012Sejakowatz		CHK(msg != msg2);
89652a38012Sejakowatz		CHK(mime.SetAttrInfo(&msg2) == B_OK);
89752a38012Sejakowatz		CHK(mime.GetAttrInfo(&msg) == B_OK);
89852a38012Sejakowatz		CHK(msg1.AddString(typeField, testType) == B_OK);	// Add in "type" fields as GFE() does
89952a38012Sejakowatz		CHK(msg2.AddString(typeField, testType) == B_OK);
90052a38012Sejakowatz		CHK(msg != msg1);
90152a38012Sejakowatz		CHK(msg == msg2);
90252a38012Sejakowatz
90352a38012Sejakowatz		// Clear
904aad997bdSTyler Dauwalder		NextSubTest();
90552a38012Sejakowatz		CHK(msg.MakeEmpty() == B_OK);
90652a38012Sejakowatz		msg1.RemoveName(typeField);		// Clear "type" fields, since SFE() just adds another
90752a38012Sejakowatz		msg2.RemoveName(typeField);
90852a38012Sejakowatz		CHK(msg != msg1);
90952a38012Sejakowatz		CHK(msg != msg2);
910aad997bdSTyler Dauwalder#if !TEST_R5
91152a38012Sejakowatz		CHK(RES(mime.SetAttrInfo(NULL)) == B_OK);		// R5 == CRASH! despite what one might think should happen
91252a38012Sejakowatz		CHK(RES(mime.GetAttrInfo(&msg)) != B_OK);
91352a38012Sejakowatz		CHK(msg1.AddString(typeField, testType) == B_OK);	// Add in "type" fields as GFE() does
91452a38012Sejakowatz		CHK(msg2.AddString(typeField, testType) == B_OK);
91552a38012Sejakowatz		CHK(msg != msg1);
91652a38012Sejakowatz		CHK(msg != msg2);
91752a38012Sejakowatz#endif
91852a38012Sejakowatz	}
91952a38012Sejakowatz}
92052a38012Sejakowatz
92152a38012Sejakowatz// File Extensions
92252a38012Sejakowatz
92352a38012Sejakowatzvoid
92452a38012SejakowatzMimeTypeTest::FileExtensionsTest() {
92552a38012Sejakowatz	// Create some messages to sling around
92652a38012Sejakowatz	const int32 WHAT = 234;	// This is the what value that GFE returns...not sure if it has a name yet
92752a38012Sejakowatz	BMessage msg1(WHAT), msg2(WHAT), msg3(WHAT);
92852a38012Sejakowatz
92952a38012Sejakowatz	CHK(msg1.AddString(fileExtField, ".data") == B_OK);
93052a38012Sejakowatz	CHK(msg1.AddString(fileExtField, ".txt") == B_OK);
93152a38012Sejakowatz	CHK(msg1.AddString(fileExtField, ".png") == B_OK);
93252a38012Sejakowatz	CHK(msg1.AddString(fileExtField, ".html") == B_OK);
93352a38012Sejakowatz
93452a38012Sejakowatz	CHK(msg2.AddString(fileExtField, ".data") == B_OK);
93552a38012Sejakowatz	CHK(msg2.AddString(fileExtField, ".txt") == B_OK);
93652a38012Sejakowatz
93752a38012Sejakowatz	CHK(msg3.AddString(fileExtField, ".data") == B_OK);
93852a38012Sejakowatz	CHK(msg3.AddString(fileExtField, ".txt") == B_OK);
93952a38012Sejakowatz
94052a38012Sejakowatz	CHK(msg1 == msg1);
94152a38012Sejakowatz	CHK(msg2 == msg2);
94252a38012Sejakowatz	CHK(msg3 == msg3);
94352a38012Sejakowatz	CHK(msg1 != msg2);
94452a38012Sejakowatz	CHK(msg1 != msg3);
94552a38012Sejakowatz	CHK(msg2 == msg3);
94652a38012Sejakowatz
94752a38012Sejakowatz	// Uninitialized
948aad997bdSTyler Dauwalder	NextSubTest();
94952a38012Sejakowatz	{
95052a38012Sejakowatz		BMessage msg(WHAT);
95152a38012Sejakowatz		BMimeType mime;
95252a38012Sejakowatz
95352a38012Sejakowatz		CHK(mime.InitCheck() == B_NO_INIT);
95452a38012Sejakowatz		CHK(mime.GetFileExtensions(&msg) != B_OK);	// R5 == B_BAD_VALUE
95552a38012Sejakowatz		CHK(mime.SetFileExtensions(&msg) != B_OK);	// R5 == B_BAD_VALUE
95652a38012Sejakowatz	}
95752a38012Sejakowatz	// NULL params
958aad997bdSTyler Dauwalder	NextSubTest();
95952a38012Sejakowatz	{
96052a38012Sejakowatz		BMessage msg(WHAT);
96152a38012Sejakowatz		BMimeType mime(testType);
96252a38012Sejakowatz
96352a38012Sejakowatz		CHK(mime.InitCheck() == B_OK);
96452a38012Sejakowatz		// Make sure the type isn't installed
96552a38012Sejakowatz		if (mime.IsInstalled())
96652a38012Sejakowatz			CHK(mime.Delete() == B_OK);
96752a38012Sejakowatz		CHK(!mime.IsInstalled());
96852a38012Sejakowatz		// Not installed
96952a38012Sejakowatz		CHK(mime.GetFileExtensions(NULL) != B_OK);	// R5 == B_BAD_VALUE
97052a38012Sejakowatz		CHK(!mime.IsInstalled());
971aad997bdSTyler Dauwalder#if !TEST_R5
97252a38012Sejakowatz		CHK(RES(mime.SetFileExtensions(NULL)) == B_OK);	// R5 == CRASH!
97352a38012Sejakowatz		CHK(mime.IsInstalled());
97452a38012Sejakowatz		CHK(RES(mime.GetFileExtensions(&msg)) != B_OK);	// R5 == B_ENTRY_NOT_FOUND
97552a38012Sejakowatz		// Installed
97652a38012Sejakowatz/*		CHK(mime.GetFileExtensions(NULL) != B_OK);	// R5 == B_BAD_VALUE
97752a38012Sejakowatz		CHK(mime.SetFileExtensions(helper.Bitmap1()) == B_OK);
97852a38012Sejakowatz		CHK(mime.GetFileExtensions(bmp) == B_OK);
97952a38012Sejakowatz		CHK(*bmp == *helper.Bitmap1());
98052a38012Sejakowatz		CHK(mime.SetFileExtensions(NULL) == B_OK);
98152a38012Sejakowatz		CHK(mime.GetFileExtensions(bmp) != B_OK);	// R5 == B_ENTRY_NOT_FOUND*/
98252a38012Sejakowatz#endif
98352a38012Sejakowatz	}
98452a38012Sejakowatz	// Set() with empty message
985aad997bdSTyler Dauwalder	NextSubTest();
98652a38012Sejakowatz	{
98752a38012Sejakowatz		BMimeType mime(testType);
98852a38012Sejakowatz		BMessage msgEmpty(WHAT);
98952a38012Sejakowatz		BMessage msg(WHAT);
99052a38012Sejakowatz		CHK(msg.AddInt32("stuff", 1234) == B_OK);	// Add an extra attribute to give us something to compare with
99152a38012Sejakowatz
99252a38012Sejakowatz		// Uninstall then reinstall to clear attributes
99352a38012Sejakowatz		if (mime.IsInstalled())
99452a38012Sejakowatz			CHK(mime.Delete() == B_OK);
99552a38012Sejakowatz		if (!mime.IsInstalled())
99652a38012Sejakowatz			CHK(mime.Install() == B_OK);
99752a38012Sejakowatz		CHK(mime.IsInstalled());
99852a38012Sejakowatz
99952a38012Sejakowatz		// Set(empty)
100052a38012Sejakowatz		CHK(msg != msgEmpty);
100152a38012Sejakowatz		CHK(mime.SetFileExtensions(&msgEmpty) == B_OK);
100252a38012Sejakowatz		CHK(mime.GetFileExtensions(&msg) == B_OK);
100352a38012Sejakowatz		CHK(msgEmpty.AddString(typeField, testType) == B_OK);	// Add in "type" fields as GFE() does
100452a38012Sejakowatz		CHK(msg == msgEmpty);
100552a38012Sejakowatz	}
100652a38012Sejakowatz	// Set() with extra attributes in message
1007aad997bdSTyler Dauwalder	NextSubTest();
100852a38012Sejakowatz	{
100952a38012Sejakowatz		BMimeType mime(testType);
101052a38012Sejakowatz		BMessage msg(WHAT);
101152a38012Sejakowatz		BMessage msgExtraSet(msg1);
101252a38012Sejakowatz		CHK(msgExtraSet.AddString("extra", ".extra") == B_OK);
101352a38012Sejakowatz		CHK(msgExtraSet.AddInt32("more_extras", 123) == B_OK);
101452a38012Sejakowatz		CHK(msgExtraSet.AddInt32("more_extras", 456) == B_OK);
101552a38012Sejakowatz		CHK(msgExtraSet.AddInt32("more_extras", 789) == B_OK);
101652a38012Sejakowatz		BMessage msgExtraGet(msgExtraSet);
101752a38012Sejakowatz
101852a38012Sejakowatz		// Uninstall then reinstall to clear attributes
101952a38012Sejakowatz		if (mime.IsInstalled())
102052a38012Sejakowatz			CHK(mime.Delete() == B_OK);
102152a38012Sejakowatz		if (!mime.IsInstalled())
102252a38012Sejakowatz			CHK(mime.Install() == B_OK);
102352a38012Sejakowatz		CHK(mime.IsInstalled());
102452a38012Sejakowatz
102552a38012Sejakowatz		// Set(extra)/Get(empty)
102652a38012Sejakowatz		msg1.RemoveName(typeField);		// Clear "type" fields, since SFE() just adds another
102752a38012Sejakowatz		msg2.RemoveName(typeField);
102852a38012Sejakowatz		CHK(msg != msg1);
102952a38012Sejakowatz		CHK(msg != msgExtraSet);
103052a38012Sejakowatz		CHK(mime.SetFileExtensions(&msgExtraSet) == B_OK);
103152a38012Sejakowatz		CHK(mime.GetFileExtensions(&msg) == B_OK);
103252a38012Sejakowatz		CHK(msg1.AddString(typeField, testType) == B_OK);	// Add in "type" fields as GFE() does
103352a38012Sejakowatz		CHK(msgExtraSet.AddString(typeField, testType) == B_OK);
103452a38012Sejakowatz		CHK(msg == msgExtraSet);
103552a38012Sejakowatz		CHK(msg != msg1);
103652a38012Sejakowatz
103752a38012Sejakowatz		// Get(extra)
1038aad997bdSTyler Dauwalder		NextSubTest();
103952a38012Sejakowatz		CHK(mime.GetFileExtensions(&msgExtraGet) == B_OK);
104052a38012Sejakowatz		CHK(msgExtraGet == msgExtraSet);
104152a38012Sejakowatz		CHK(msgExtraGet != msg1);
104252a38012Sejakowatz
104352a38012Sejakowatz		// Get(extra and then some)
1044aad997bdSTyler Dauwalder		NextSubTest();
104552a38012Sejakowatz		CHK(msgExtraGet.AddInt32("more_extras", 101112) == B_OK);
104652a38012Sejakowatz		msgExtraGet.RemoveName(typeField);		// Clear "type" fields to be fair, since SFE() just adds another
104752a38012Sejakowatz		CHK(mime.GetFileExtensions(&msgExtraGet) == B_OK);	// Reinitializes result (clearing extra fields)
104852a38012Sejakowatz		CHK(msgExtraGet == msgExtraSet);
104952a38012Sejakowatz		CHK(msgExtraGet != msg1);
105052a38012Sejakowatz
105152a38012Sejakowatz	}
105252a38012Sejakowatz	// Normal function
1053aad997bdSTyler Dauwalder	NextSubTest();
105452a38012Sejakowatz	{
105552a38012Sejakowatz		BMessage msg(WHAT);
105652a38012Sejakowatz		BMimeType mime(testType);
105752a38012Sejakowatz
105852a38012