[sldev] Unit Test Harness :Patch-5

Gaurav Sharma gsharma at adroit-inc.com
Sun Apr 8 23:45:54 PDT 2007


Hi,

Please find attached Patch 5 for Unit Test addtions. It contains:

1.Unit Tests:
    Completed: llinventory, llpermission, llsaleinfo, v3color, v4color,
v4coloru
    In progress: llevent.h
2.Fixed llinventory.cpp and llsaleinfo.cpp:
    i) Added a ref to fix a crasher bug
   ii) Fixed incosistance in exportFileXML and importXML in how "flags" get
storted
  iii) Fixed inconsistancy in exportFileXML for some properties that did not
get exported correctly(uuid, parent_uuid, type, price, creation date)

Next up:
    Unit Tests for the following:
    i) llcommon - llevent
   ii) llmath - lltreenode, llocttree
  iii) Determine classes that uses LLSD serialization/deserialization and
write unit tests for the same
  iv) Start spending more time in SL using debug build to repro potential
crashes and apply fixes.

Thanks
Gaurav

-------------- next part --------------
A non-text attachment was scrubbed...
Name: unit test patch-5.zip
Type: application/octet-stream
Size: 15331 bytes
Desc: not available
Url : http://lists.secondlife.com/pipermail/sldev/attachments/20070409/59b56c04/unittestpatch-5-0001.obj
-------------- next part --------------
diff -uwN 2007-03-13-Patch2\linden\indra\llinventory/llinventory.cpp 2007-03-13\linden\indra\llinventory/llinventory.cpp
--- 2007-03-13-Patch2\linden\indra\llinventory/llinventory.cpp	Tue Mar 13 12:57:42 2007
+++ 2007-03-13\linden\indra\llinventory/llinventory.cpp	Tue Apr 03 05:14:05 2007
@@ -1242,9 +1242,11 @@
 {
 	LLMemType m1(LLMemType::MTYPE_INVENTORY);
 	LLXMLNode *ret = new LLXMLNode("item", FALSE);
+	ret->ref();
 
-	ret->createChild("uuid", TRUE)->setUUIDValue(1, &mUUID);
-	ret->createChild("parent_uuid", TRUE)->setUUIDValue(1, &mParentUUID);
+
+	ret->createChild("uuid", FALSE)->setUUIDValue(1, &mUUID);
+	ret->createChild("parent_uuid", FALSE)->setUUIDValue(1, &mParentUUID);
 
 	mPermissions.exportFileXML()->setParent(ret);
 
@@ -1274,7 +1276,7 @@
 	ret->createChild("asset_type", FALSE)->setStringValue(1, &type_str);
 	ret->createChild("inventory_type", FALSE)->setStringValue(1, &inv_type_str);
 	S32 tmp_flags = (S32) mFlags;
-	ret->createChild("flags", FALSE)->setByteValue(4, (U8*)(&tmp_flags), LLXMLNode::ENCODING_HEX);
+	ret->createChild("flags", FALSE)->setIntValue(1, &tmp_flags);
 
 	mSaleInfo.exportFileXML()->setParent(ret);
 
diff -uwN 2007-03-13-Patch2\linden\indra\llinventory/llsaleinfo.cpp 2007-03-13\linden\indra\llinventory/llsaleinfo.cpp
--- 2007-03-13-Patch2\linden\indra\llinventory/llsaleinfo.cpp	Tue Mar 13 12:57:42 2007
+++ 2007-03-13\linden\indra\llinventory/llsaleinfo.cpp	Tue Apr 03 04:56:10 2007
@@ -124,9 +124,10 @@
 LLXMLNode *LLSaleInfo::exportFileXML() const
 {
 	LLXMLNode *ret = new LLXMLNode("sale_info", FALSE);
+	ret->ref(); 
 	LLString type_str = lookup(mSaleType);
-	ret->createChild("type", TRUE)->setStringValue(1, &type_str);
-	ret->createChild("price", TRUE)->setIntValue(1, &mSalePrice);
+	ret->createChild("type", FALSE)->setStringValue(1, &type_str);
+	ret->createChild("price", FALSE)->setIntValue(1, &mSalePrice);
 	return ret;
 }
diff -uwN 2007-03-13-Patch2\linden\indra\test/inventory.cpp 2007-03-13\linden\indra\test/inventory.cpp
--- 2007-03-13-Patch2\linden\indra\test/inventory.cpp	Tue Mar 13 12:57:46 2007
+++ 2007-03-13\linden\indra\test/inventory.cpp	Tue Apr 03 04:35:14 2007
@@ -101,67 +101,436 @@
 	typedef inventory_test::object inventory_object;
 	tut::inventory_test inv("llinventory");
 
+//***class LLInventoryType***//
+
+
 	template<> template<>
 	void inventory_object::test<1>()
 	{
+		LLInventoryType::EType retType =  LLInventoryType::lookup("sound");
+		ensure("1.LLInventoryType::lookup(char*) failed", retType == LLInventoryType::IT_SOUND);
+
+		retType = LLInventoryType::lookup("snapshot");
+		ensure("2.LLInventoryType::lookup(char*) failed", retType == LLInventoryType::IT_SNAPSHOT);
+	}
+
+	template<> template<>
+	void inventory_object::test<2>()
+	{
+		const char* retType =  LLInventoryType::lookup(LLInventoryType::IT_CALLINGCARD);
+		ensure("1.LLInventoryType::lookup(EType) failed", 0 == strcmp(retType, "callcard")); 
+
+		retType = LLInventoryType::lookup(LLInventoryType::IT_LANDMARK);
+		ensure("2.LLInventoryType::lookup(EType) failed", 0 == strcmp(retType, "landmark"));
+		
+	}
+
+	template<> template<>
+	void inventory_object::test<3>()
+	{
+		static const char* retType =  LLInventoryType::lookupHumanReadable(LLInventoryType::IT_CALLINGCARD);
+		ensure("1.LLInventoryType::lookupHumanReadable(EType) failed", 0 == strcmp(retType, "calling card")); 
+
+		retType =  LLInventoryType::lookupHumanReadable(LLInventoryType::IT_LANDMARK);
+		ensure("2.LLInventoryType::lookupHumanReadable(EType) failed", 0 == strcmp(retType, "landmark")); 
+	}
+
+	template<> template<>
+	void inventory_object::test<4>()
+	{
+		static LLInventoryType::EType retType =  LLInventoryType::defaultForAssetType(LLAssetType::AT_TEXTURE);
+		ensure("1.LLInventoryType::defaultForAssetType(LLAssetType EType) failed", retType == LLInventoryType::IT_TEXTURE);
+
+		retType =  LLInventoryType::defaultForAssetType(LLAssetType::AT_LANDMARK);
+		ensure("2.LLInventoryType::defaultForAssetType(LLAssetType EType) failed", retType == LLInventoryType::IT_LANDMARK);
+	}
+
+//*****class LLInventoryItem*****//
+
+	template<> template<>
+	void inventory_object::test<5>()
+	{
 		LLPointer<LLInventoryItem> src = create_random_inventory_item();
 		LLSD sd = ll_create_sd_from_inventory_item(src);
 		//llinfos << "sd: " << *sd << llendl;
-		LLPointer<LLInventoryItem> dst;
+		LLPointer<LLInventoryItem> dst = ll_create_item_from_sd(sd);
+		ensure_equals("1.item id::getUUID() failed", dst->getUUID(), src->getUUID());
+		ensure_equals("2.parent::getParentUUID() failed", dst->getParentUUID(), src->getParentUUID());
+		ensure_equals("3.name::getName() failed", dst->getName(), src->getName());
+		ensure_equals("4.type::getType() failed", dst->getType(), src->getType());
+		
+		ensure_equals("5.permissions::getPermissions() failed", dst->getPermissions(), src->getPermissions());
+		ensure_equals("6.description::getDescription() failed", dst->getDescription(), src->getDescription());
+		ensure_equals("7.sale type::getSaleType() failed", dst->getSaleInfo().getSaleType(), src->getSaleInfo().getSaleType());
+		ensure_equals("8.sale price::getSalePrice() failed", dst->getSaleInfo().getSalePrice(), src->getSaleInfo().getSalePrice());
+		ensure_equals("9.asset id::getAssetUUID() failed", dst->getAssetUUID(), src->getAssetUUID());
+		ensure_equals("10.inventory type::getInventoryType() failed", dst->getInventoryType(), src->getInventoryType());
+		ensure_equals("11.flags::getFlags() failed", dst->getFlags(), src->getFlags());
+		ensure_equals("12.creation::getCreationDate() failed", dst->getCreationDate(), src->getCreationDate());
+
+		LLUUID new_item_id, new_parent_id;
+		new_item_id.generate();
+		src->setUUID(new_item_id);
+		
+		new_parent_id.generate();
+		src->setParent(new_parent_id);
+		
+		LLString new_name = "LindenLab";
+		src->rename(new_name);
+		
+		src->setType(LLAssetType::AT_SOUND);
+
+		LLUUID new_asset_id;
+		new_asset_id.generate();
+		
+		src->setAssetUUID(new_asset_id);
+		LLString new_desc = "SecondLife Testing";
+		src->setDescription(new_desc);
+		
+		S32 new_price = rand();
+		LLSaleInfo new_sale_info(LLSaleInfo::FS_COPY, new_price);
+		src->setSaleInfo(new_sale_info);
+
+		U32 new_flags = rand();
+		S32 new_creation = time(NULL);
+
+		LLPermissions new_perm;
+
+		LLUUID new_creator_id;
+		new_creator_id.generate();
+	
+		LLUUID new_owner_id;
+		new_owner_id.generate();
+
+		LLUUID last_owner_id;
+		last_owner_id.generate();
+
+		LLUUID new_group_id;
+		new_group_id.generate();
+		new_perm.init(new_creator_id, new_owner_id, last_owner_id, new_group_id);
+		new_perm.initMasks(PERM_ALL, PERM_ALL, PERM_COPY, PERM_COPY, PERM_MODIFY | PERM_COPY);
+		src->setPermissions(new_perm);
+
+		src->setInventoryType(LLInventoryType::IT_SOUND);
+		src->setFlags(new_flags);
+		src->setCreationDate(new_creation);
+
+		sd = ll_create_sd_from_inventory_item(src);
+		//llinfos << "sd: " << *sd << llendl;
 		dst = ll_create_item_from_sd(sd);
-		ensure_equals("item id", dst->getUUID(), src->getUUID());
-		ensure_equals("parent", dst->getParentUUID(), src->getParentUUID());
-		ensure_equals("name", dst->getName(), src->getName());
-		ensure_equals("type", dst->getType(), src->getType());
-		ensure_equals(
-			"permissions",
-			dst->getPermissions(),
-			src->getPermissions());
-		ensure_equals(
-			"description",
-			dst->getDescription(),
-			src->getDescription());
-		ensure_equals(
-			"sale type",
-			dst->getSaleInfo().getSaleType(),
-			src->getSaleInfo().getSaleType());
-		ensure_equals(
-			"sale price",
-			dst->getSaleInfo().getSalePrice(),
-			src->getSaleInfo().getSalePrice());
-		ensure_equals("asset id", dst->getAssetUUID(), src->getAssetUUID());
-		ensure_equals(
-			"inventory type",
-			dst->getInventoryType(),
-			src->getInventoryType());
-		ensure_equals("flags", dst->getFlags(), src->getFlags());
-		ensure_equals(
-			"creation",
-			dst->getCreationDate(),
-			src->getCreationDate());
+		ensure_equals("13.item id::getUUID() failed", dst->getUUID(), src->getUUID());
+		ensure_equals("14.parent::getParentUUID() failed", dst->getParentUUID(), src->getParentUUID());
+		ensure_equals("15.name::getName() failed", dst->getName(), src->getName());
+		ensure_equals("16.type::getType() failed", dst->getType(), src->getType());
+		
+		ensure_equals("17.permissions::getPermissions() failed", dst->getPermissions(), src->getPermissions());
+		ensure_equals("18.description::getDescription() failed", dst->getDescription(), src->getDescription());
+		ensure_equals("19.sale type::getSaleType() failed type", dst->getSaleInfo().getSaleType(), src->getSaleInfo().getSaleType());
+		ensure_equals("20.sale price::getSalePrice() failed price", dst->getSaleInfo().getSalePrice(), src->getSaleInfo().getSalePrice());
+		ensure_equals("21.asset id::getAssetUUID() failed id", dst->getAssetUUID(), src->getAssetUUID());
+		ensure_equals("22.inventory type::getInventoryType() failed type", dst->getInventoryType(), src->getInventoryType());
+		ensure_equals("23.flags::getFlags() failed", dst->getFlags(), src->getFlags());
+		ensure_equals("24.creation::getCreationDate() failed", dst->getCreationDate(), src->getCreationDate());
+		
 	}
 
 	template<> template<>
-	void inventory_object::test<2>()
+	void inventory_object::test<6>()
+	{
+		LLPointer<LLInventoryItem> src = create_random_inventory_item();
+		
+		LLUUID new_item_id, new_parent_id;
+		new_item_id.generate();
+		src->setUUID(new_item_id);
+		
+		new_parent_id.generate();
+		src->setParent(new_parent_id);
+		
+		LLString new_name = "LindenLab";
+		src->rename(new_name);
+		
+		src->setType(LLAssetType::AT_SOUND);
+
+		LLUUID new_asset_id;
+		new_asset_id.generate();
+		
+		src->setAssetUUID(new_asset_id);
+		LLString new_desc = "SecondLife Testing";
+		src->setDescription(new_desc);
+		
+		S32 new_price = rand();
+		LLSaleInfo new_sale_info(LLSaleInfo::FS_COPY, new_price);
+		src->setSaleInfo(new_sale_info);
+
+		U32 new_flags = rand();
+		S32 new_creation = time(NULL);
+
+		LLPermissions new_perm;
+
+		LLUUID new_creator_id;
+		new_creator_id.generate();
+	
+		LLUUID new_owner_id;
+		new_owner_id.generate();
+
+		LLUUID last_owner_id;
+		last_owner_id.generate();
+
+		LLUUID new_group_id;
+		new_group_id.generate();
+		new_perm.init(new_creator_id, new_owner_id, last_owner_id, new_group_id);
+		new_perm.initMasks(PERM_ALL, PERM_ALL, PERM_COPY, PERM_COPY, PERM_MODIFY | PERM_COPY);
+		src->setPermissions(new_perm);
+
+		src->setInventoryType(LLInventoryType::IT_SOUND);
+		src->setFlags(new_flags);
+		src->setCreationDate(new_creation);
+
+		LLSD sd = ll_create_sd_from_inventory_item(src);
+		LLPointer<LLInventoryItem> dst = ll_create_item_from_sd(sd);
+
+
+		LLPointer<LLInventoryItem> src1 = create_random_inventory_item();
+		src1->copy(src);
+		src1->clone(src);
+		
+		ensure_equals("1.item id::getUUID() failed", dst->getUUID(), src1->getUUID());
+		ensure_equals("2.parent::getParentUUID() failed", dst->getParentUUID(), src1->getParentUUID());
+		ensure_equals("3.name::getName() failed", dst->getName(), src1->getName());
+		ensure_equals("4.type::getType() failed", dst->getType(), src1->getType());
+		
+		ensure_equals("5.permissions::getPermissions() failed", dst->getPermissions(), src1->getPermissions());
+		ensure_equals("6.description::getDescription() failed", dst->getDescription(), src1->getDescription());
+		ensure_equals("7.sale type::getSaleType() failed type", dst->getSaleInfo().getSaleType(), src1->getSaleInfo().getSaleType());
+		ensure_equals("8.sale price::getSalePrice() failed price", dst->getSaleInfo().getSalePrice(), src1->getSaleInfo().getSalePrice());
+		ensure_equals("9.asset id::getAssetUUID() failed id", dst->getAssetUUID(), src1->getAssetUUID());
+		ensure_equals("10.inventory type::getInventoryType() failed type", dst->getInventoryType(), src1->getInventoryType());
+		ensure_equals("11.flags::getFlags() failed", dst->getFlags(), src1->getFlags());
+		ensure_equals("12.creation::getCreationDate() failed", dst->getCreationDate(), src1->getCreationDate());
+
+		LLPointer<LLInventoryItem> src2;
+		src1->clone(src2);
+		
+		ensure_not_equals("13.item id::getUUID() failed", src1->getUUID(), src2->getUUID());
+		ensure_equals("14.parent::getParentUUID() failed", src2->getParentUUID(), src1->getParentUUID());
+		ensure_equals("15.name::getName() failed", src2->getName(), src1->getName());
+		ensure_equals("16.type::getType() failed", src2->getType(), src1->getType());
+		
+		ensure_equals("17.permissions::getPermissions() failed", src2->getPermissions(), src1->getPermissions());
+		ensure_equals("18.description::getDescription() failed", src2->getDescription(), src1->getDescription());
+		ensure_equals("19.sale type::getSaleType() failed type", src2->getSaleInfo().getSaleType(), src1->getSaleInfo().getSaleType());
+		ensure_equals("20.sale price::getSalePrice() failed price", src2->getSaleInfo().getSalePrice(), src1->getSaleInfo().getSalePrice());
+		ensure_equals("21.asset id::getAssetUUID() failed id", src2->getAssetUUID(), src1->getAssetUUID());
+		ensure_equals("22.inventory type::getInventoryType() failed type", src2->getInventoryType(), src1->getInventoryType());
+		ensure_equals("23.flags::getFlags() failed", src2->getFlags(), src1->getFlags());
+		ensure_equals("24.creation::getCreationDate() failed", src2->getCreationDate(), src1->getCreationDate());
+
+
+	}
+
+	template<> template<>
+	void inventory_object::test<7>()
+	{
+		FILE* fp = fopen("linden_file.dat","w+");
+		if(!fp)
+		{
+			llerrs << "file could not be opened\n" << llendl;
+			return;
+		}
+			
+		LLPointer<LLInventoryItem> src1 = create_random_inventory_item();
+		src1->exportFile(fp, TRUE);
+		fclose(fp);
+
+		LLPointer<LLInventoryItem> src2 = new LLInventoryItem();	
+		fp = fopen("linden_file.dat","r+");
+		if(!fp)
+		{
+			llerrs << "file could not be opened\n" << llendl;
+			return;
+		}
+		
+		src2->importFile(fp);
+		fclose(fp);
+		
+		ensure_equals("1.item id::getUUID() failed", src1->getUUID(), src2->getUUID());
+		ensure_equals("2.parent::getParentUUID() failed", src1->getParentUUID(), src2->getParentUUID());
+		ensure_equals("3.permissions::getPermissions() failed", src1->getPermissions(), src2->getPermissions());
+		ensure_equals("4.sale price::getSalePrice() failed price", src1->getSaleInfo().getSalePrice(), src2->getSaleInfo().getSalePrice());
+		ensure_equals("5.asset id::getAssetUUID() failed id", src1->getAssetUUID(), src2->getAssetUUID());
+		ensure_equals("6.type::getType() failed", src1->getType(), src2->getType());
+		ensure_equals("7.inventory type::getInventoryType() failed type", src1->getInventoryType(), src2->getInventoryType());
+		ensure_equals("8.name::getName() failed", src1->getName(), src2->getName());
+		ensure_equals("9.description::getDescription() failed", src1->getDescription(), src2->getDescription());				
+		ensure_equals("10.creation::getCreationDate() failed", src1->getCreationDate(), src2->getCreationDate());
+			
+	}
+
+	template<> template<>
+	void inventory_object::test<8>()
+	{
+			
+		LLPointer<LLInventoryItem> src1 = create_random_inventory_item();
+
+		std::ostringstream ostream;
+		src1->exportLegacyStream(ostream, TRUE);
+		
+		std::istringstream istream(ostream.str());
+		LLPointer<LLInventoryItem> src2 = new LLInventoryItem();
+		src2->importLegacyStream(istream);
+					
+		ensure_equals("1.item id::getUUID() failed", src1->getUUID(), src2->getUUID());
+		ensure_equals("2.parent::getParentUUID() failed", src1->getParentUUID(), src2->getParentUUID());
+		ensure_equals("3.permissions::getPermissions() failed", src1->getPermissions(), src2->getPermissions());
+		ensure_equals("4.sale price::getSalePrice() failed price", src1->getSaleInfo().getSalePrice(), src2->getSaleInfo().getSalePrice());
+		ensure_equals("5.asset id::getAssetUUID() failed id", src1->getAssetUUID(), src2->getAssetUUID());
+		ensure_equals("6.type::getType() failed", src1->getType(), src2->getType());
+		ensure_equals("7.inventory type::getInventoryType() failed type", src1->getInventoryType(), src2->getInventoryType());
+		ensure_equals("8.name::getName() failed", src1->getName(), src2->getName());
+		ensure_equals("9.description::getDescription() failed", src1->getDescription(), src2->getDescription());				
+		ensure_equals("10.creation::getCreationDate() failed", src1->getCreationDate(), src2->getCreationDate());
+		
+		
+	}
+
+	template<> template<>
+	void inventory_object::test<9>()
+	{
+		
+		LLPointer<LLInventoryItem> src1 = create_random_inventory_item();
+		LLXMLNode* x_node = src1->exportFileXML(TRUE);
+
+		LLPointer<LLInventoryItem> src2 = new LLInventoryItem();
+		src2->importXML(x_node);
+		ensure_equals("1.item id::getUUID() failed", src1->getUUID(), src2->getUUID());
+		ensure_equals("2.parent::getParentUUID() failed", src1->getParentUUID(), src2->getParentUUID());
+		ensure_equals("3.permissions::getPermissions() failed", src1->getPermissions(), src2->getPermissions());
+		ensure_equals("4.sale price::getSalePrice() failed price", src1->getSaleInfo().getSalePrice(), src2->getSaleInfo().getSalePrice());
+		ensure_equals("5.asset id::getAssetUUID() failed id", src1->getAssetUUID(), src2->getAssetUUID());
+		ensure_equals("6.type::getType() failed", src1->getType(), src2->getType());
+		ensure_equals("7.inventory type::getInventoryType() failed type", src1->getInventoryType(), src2->getInventoryType());
+		ensure_equals("8.name::getName() failed", src1->getName(), src2->getName());
+		ensure_equals("9.description::getDescription() failed", src1->getDescription(), src2->getDescription());				
+		ensure_equals("10.creation::getCreationDate() failed", src1->getCreationDate(), src2->getCreationDate());
+		
+		
+	}
+		
+	template<> template<>
+	void inventory_object::test<10>()
+	{
+		LLPointer<LLInventoryItem> src1 = create_random_inventory_item();
+		U8* bin_bucket = new U8[300];
+		S32 bin_bucket_size = src1->packBinaryBucket(bin_bucket, NULL);
+
+		LLPointer<LLInventoryItem> src2 = new LLInventoryItem();
+		src2->unpackBinaryBucket(bin_bucket, bin_bucket_size);
+
+		ensure_equals("1.sale price::getSalePrice() failed price", src1->getSaleInfo().getSalePrice(), src2->getSaleInfo().getSalePrice());
+		ensure_equals("2.sale type::getSaleType() failed type", src1->getSaleInfo().getSaleType(), src2->getSaleInfo().getSaleType());
+		ensure_equals("3.type::getType() failed", src1->getType(), src2->getType());
+		ensure_equals("4.inventory type::getInventoryType() failed type", src1->getInventoryType(), src2->getInventoryType());
+		ensure_equals("5.name::getName() failed", src1->getName(), src2->getName());
+		ensure_equals("6.description::getDescription() failed", src1->getDescription(), src2->getDescription());				
+		ensure_equals("7.flags::getFlags() failed", src1->getFlags(), src2->getFlags());
+	
+	}
+	
+	template<> template<>
+	void inventory_object::test<11>()
+	{
+		LLPointer<LLInventoryItem> src1 = create_random_inventory_item();
+		LLSD retSd = src1->asLLSD();
+		LLPointer<LLInventoryItem> src2 = new LLInventoryItem();
+		src2->fromLLSD(retSd);
+
+		ensure_equals("1.item id::getUUID() failed", src1->getUUID(), src2->getUUID());
+		ensure_equals("2.parent::getParentUUID() failed", src1->getParentUUID(), src2->getParentUUID());
+		ensure_equals("3.permissions::getPermissions() failed", src1->getPermissions(), src2->getPermissions());
+		ensure_equals("4.asset id::getAssetUUID() failed id", src1->getAssetUUID(), src2->getAssetUUID());
+		ensure_equals("5.type::getType() failed", src1->getType(), src2->getType());
+		ensure_equals("6.inventory type::getInventoryType() failed type", src1->getInventoryType(), src2->getInventoryType());
+		ensure_equals("7.flags::getFlags() failed", src1->getFlags(), src2->getFlags());
+		ensure_equals("8.sale type::getSaleType() failed type", src1->getSaleInfo().getSaleType(), src2->getSaleInfo().getSaleType());
+		ensure_equals("9.sale price::getSalePrice() failed price", src1->getSaleInfo().getSalePrice(), src2->getSaleInfo().getSalePrice());
+		ensure_equals("10.name::getName() failed", src1->getName(), src2->getName());
+		ensure_equals("11.description::getDescription() failed", src1->getDescription(), src2->getDescription());				
+		ensure_equals("12.creation::getCreationDate() failed", src1->getCreationDate(), src2->getCreationDate());
+		
+	}	
+
+//******class LLInventoryCategory*******//
+
+	template<> template<>
+	void inventory_object::test<12>()
 	{
 		LLPointer<LLInventoryCategory> src = create_random_inventory_cat();
 		LLSD sd = ll_create_sd_from_inventory_category(src);
 		LLPointer<LLInventoryCategory> dst = ll_create_category_from_sd(sd);
-		ensure_equals("item id", dst->getUUID(), src->getUUID());
-		ensure_equals("parent", dst->getParentUUID(), src->getParentUUID());
-		ensure_equals("name", dst->getName(), src->getName());
-		ensure_equals("type", dst->getType(), src->getType());
-		ensure_equals(
-			"preferred type",
-			dst->getPreferredType(),
-			src->getPreferredType());
+		
+		ensure_equals("1.item id::getUUID() failed", dst->getUUID(), src->getUUID());
+		ensure_equals("2.parent::getParentUUID() failed", dst->getParentUUID(), src->getParentUUID());
+		ensure_equals("3.name::getName() failed", dst->getName(), src->getName());
+		ensure_equals("4.type::getType() failed", dst->getType(), src->getType());
+		ensure_equals("5.preferred type::getPreferredType() failed", dst->getPreferredType(), src->getPreferredType());
+
+		src->setPreferredType( LLAssetType::AT_TEXTURE);
+		sd = ll_create_sd_from_inventory_category(src);
+		dst = ll_create_category_from_sd(sd);
+		ensure_equals("6.preferred type::getPreferredType() failed", dst->getPreferredType(), src->getPreferredType());
+
+		
 	}
 
-/*
 	template<> template<>
-	void inventory_object::test<3>()
+	void inventory_object::test<13>()
+	{
+		FILE* fp = fopen("linden_file.dat","w");
+		if(!fp)
 	{
+			llerrs << "file coudnt be opened\n" << llendl;
+			return;
+		}
+			
+		LLPointer<LLInventoryCategory> src1 = create_random_inventory_cat();
+		src1->exportFile(fp, TRUE);
+		fclose(fp);
+
+		LLPointer<LLInventoryCategory> src2 = new LLInventoryCategory();	
+		fp = fopen("linden_file.dat","r");
+		if(!fp)
+		{
+			llerrs << "file coudnt be opened\n" << llendl;
+			return;
+		}
+		
+		src2->importFile(fp);
+		fclose(fp);
+
+		ensure_equals("1.item id::getUUID() failed", src1->getUUID(), src2->getUUID());
+		ensure_equals("2.parent::getParentUUID() failed", src1->getParentUUID(), src2->getParentUUID());
+ 		ensure_equals("3.type::getType() failed", src1->getType(), src2->getType());
+		ensure_equals("4.preferred type::getPreferredType() failed", src1->getPreferredType(), src2->getPreferredType());
+		ensure_equals("5.name::getName() failed", src1->getName(), src2->getName());
+	}
+
+	template<> template<>
+	void inventory_object::test<14>()
+	{
+		LLPointer<LLInventoryCategory> src1 = create_random_inventory_cat();
+
+		std::ostringstream ostream;
+		src1->exportLegacyStream(ostream, TRUE);
+
+		std::istringstream istream(ostream.str());
+		LLPointer<LLInventoryCategory> src2 = new LLInventoryCategory();
+		src2->importLegacyStream(istream);
+					
+		ensure_equals("1.item id::getUUID() failed", src1->getUUID(), src2->getUUID());
+		ensure_equals("2.parent::getParentUUID() failed", src1->getParentUUID(), src2->getParentUUID());
+		ensure_equals("3.type::getType() failed", src1->getType(), src2->getType());
+		ensure_equals("4.preferred type::getPreferredType() failed", src1->getPreferredType(), src2->getPreferredType());
+		ensure_equals("5.name::getName() failed", src1->getName(), src2->getName());
 			
 	}
-*/
 }
diff -uwN 2007-03-13-Patch2\linden\indra\test/llpermissions_tut.cpp 2007-03-13\linden\indra\test/llpermissions_tut.cpp
--- 2007-03-13-Patch2\linden\indra\test/llpermissions_tut.cpp	Wed Dec 31 16:00:00 1969
+++ 2007-03-13\linden\indra\test/llpermissions_tut.cpp	Tue Apr 03 04:28:56 2007
@@ -0,0 +1,533 @@
+/**
+ * @file llpermissions_tut.cpp
+ * @author Adroit
+ * @date March 2007
+ * @brief llpermissions test cases.
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+ 
+#include <tut/tut.h>
+#include "lltut.h"
+#include "message.h"
+#include "llpermissions.h"
+
+
+namespace tut
+{
+	struct permission
+	{
+	};
+	typedef test_group<permission> permission_t;
+	typedef permission_t::object permission_object_t;
+	tut::permission_t tut_permission("permission");
+
+	template<> template<>
+	void permission_object_t::test<1>()
+	{
+		LLPermissions permissions;
+		LLUUID	uuid = permissions.getCreator();
+		LLUUID	uuid1 = permissions.getOwner(); 
+		LLUUID	uuid2 = permissions.getGroup();
+		LLUUID	uuid3 = permissions.getLastOwner(); 
+
+		ensure("LLPermission Get Functions failed", (uuid == LLUUID::null && uuid1 == LLUUID::null && 
+			uuid2 == LLUUID::null && uuid3 == LLUUID::null));
+		ensure("LLPermission Get Functions failed", (permissions.getMaskBase() == PERM_ALL && permissions.getMaskOwner() == PERM_ALL && 
+			permissions.getMaskGroup() == PERM_ALL && permissions.getMaskEveryone() == PERM_ALL && permissions.getMaskNextOwner() == PERM_ALL));
+		ensure("Ownership functions failed", (permissions.isGroupOwned() == FALSE && permissions.isOwned() == FALSE));
+	}
+
+	template<> template<>
+	void permission_object_t::test<2>()
+	{
+		LLPermissions permissions;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		permissions.init(creator, owner, lastOwner, group);
+
+		ensure_equals("init/getCreator():failed to return the creator ", creator, permissions.getCreator());	
+		ensure_equals("init/getOwner():failed to return the owner ", owner, permissions.getOwner());
+		ensure_equals("init/getLastOwner():failed to return the group ", lastOwner, permissions.getLastOwner());	
+		ensure_equals("init/getGroup():failed to return the group ", group, permissions.getGroup());	
+	}
+
+	template<> template<>
+	void permission_object_t::test<3>()
+	{
+		LLPermissions permissions;
+		U32 base = PERM_ALL;
+		U32 owner = PERM_ITEM_UNRESTRICTED; //PERM_ITEM_UNRESTRICTED = PERM_MODIFY | PERM_COPY | PERM_TRANSFER;
+		U32 group = PERM_TRANSFER | PERM_MOVE | PERM_COPY|PERM_MODIFY;
+		U32 everyone = PERM_TRANSFER | PERM_MOVE | PERM_MODIFY;
+		U32 next = PERM_NONE;
+
+		U32 fixedbase = base;
+		U32 fixedowner = PERM_ITEM_UNRESTRICTED; //owner & fixedbase
+		U32 fixedgroup = PERM_ITEM_UNRESTRICTED; // no PERM_MOVE as owner does not have that perm either
+		U32 fixedeveryone = PERM_TRANSFER; // no PERM_MOVE. Everyone can never modify.
+		U32 fixednext = PERM_NONE;
+
+		permissions.initMasks(base, owner, everyone, group, next); // will fix perms if not allowed.
+		ensure_equals("initMasks/getMaskBase():failed to return the MaskBase ", fixedbase, permissions.getMaskBase());	
+		ensure_equals("initMasks/getMaskOwner():failed to return the MaskOwner ", fixedowner, permissions.getMaskOwner());	
+		ensure_equals("initMasks/getMaskEveryone():failed to return the MaskGroup ", fixedgroup, permissions.getMaskGroup());	
+		ensure_equals("initMasks/getMaskEveryone():failed to return the MaskEveryone ", fixedeveryone, permissions.getMaskEveryone());	
+		ensure_equals("initMasks/getMaskNextOwner():failed to return the MaskNext ", fixednext, permissions.getMaskNextOwner());	
+
+		// explictly set should maintain the values
+		permissions.setMaskBase(base); //no fixing
+		ensure_equals("setMaskBase/getMaskBase():failed to return the MaskBase ", base, permissions.getMaskBase());	
+
+		permissions.setMaskOwner(owner);
+		ensure_equals("setMaskOwner/getMaskOwner():failed to return the MaskOwner ", owner, permissions.getMaskOwner());	
+		
+		permissions.setMaskEveryone(everyone);
+		ensure_equals("setMaskEveryone/getMaskEveryone():failed to return the MaskEveryone ", everyone, permissions.getMaskEveryone());	
+
+		permissions.setMaskGroup(group);
+		ensure_equals("setMaskGroup/getMaskEveryone():failed to return the MaskGroup ", group, permissions.getMaskGroup());	
+
+		permissions.setMaskNext(next);
+		ensure_equals("setMaskNext/getMaskNextOwner():failed to return the MaskNext ", next, permissions.getMaskNextOwner());	
+
+		// further tests can be added to ensure perms for owner/group/everyone etc. get properly fixed. 
+		// code however suggests that there is no explict check if the perms are correct and the user of this 
+		// class is expected to know how to use them correctly. skipping further test cases for now for various
+		// perm combinations.
+	}
+
+	template<> template<>
+	void permission_object_t::test<4>()
+	{
+		LLPermissions perm,perm1;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm1.init(creator,owner,lastOwner,group);
+		perm.set(perm1);
+		ensure("set():failed to set ", (creator == perm.getCreator()) && (owner == perm.getOwner())&&
+									(lastOwner == perm.getLastOwner())&& (group == perm.getGroup()));	
+		}
+
+	template<> template<>
+	void permission_object_t::test<5>()
+	{
+		LLPermissions perm,perm1;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm1.init(creator,owner,lastOwner,group);
+
+		U32 base = PERM_TRANSFER;
+		U32 ownerp = PERM_TRANSFER;
+		U32 groupp = PERM_TRANSFER;
+		U32 everyone = PERM_TRANSFER;
+		U32 next = PERM_NONE;
+
+		perm1.initMasks(base, ownerp, everyone, groupp, next);
+
+		base = PERM_ALL;
+		ownerp = PERM_ITEM_UNRESTRICTED; //PERM_ITEM_UNRESTRICTED = PERM_MODIFY | PERM_COPY | PERM_TRANSFER;
+		groupp = PERM_TRANSFER | PERM_COPY|PERM_MODIFY;
+		everyone = PERM_TRANSFER;
+		next = PERM_NONE;
+		
+		perm.init(creator,owner,lastOwner,group);
+		perm.initMasks(base, ownerp, everyone, groupp, next); 
+
+		// restrict permissions by accumulation
+		perm.accumulate(perm1);
+
+		U32 fixedbase = PERM_TRANSFER | PERM_MOVE;
+		U32 fixedowner = PERM_TRANSFER;
+		U32 fixedgroup = PERM_TRANSFER;
+		U32 fixedeveryone = PERM_TRANSFER;
+		U32 fixednext = PERM_NONE;
+
+		ensure_equals("accumulate failed ", fixedbase, perm.getMaskBase());	
+		ensure_equals("accumulate failed ", fixedowner, perm.getMaskOwner());	
+		ensure_equals("accumulate failed ", fixedgroup, perm.getMaskGroup());	
+		ensure_equals("accumulate failed ", fixedeveryone, perm.getMaskEveryone());	
+		ensure_equals("accumulate failed ", fixednext, perm.getMaskNextOwner());	
+	}
+
+	template<> template<>
+	void permission_object_t::test<6>()
+	{
+		LLPermissions perm;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		ensure_equals("getSafeOwner:failed ", owner,perm.getSafeOwner());
+		
+		///NULL Owner
+		perm.init(creator,LLUUID::null,lastOwner,group);
+		ensure_equals("getSafeOwner:failed ", group, perm.getSafeOwner());
+	}
+	
+		template<> template<>
+	void permission_object_t::test<7>()
+	{
+		LLPermissions perm1;
+		LLUUID uuid;
+		BOOL is_group_owned = FALSE;
+		ensure("1:getOwnership:failed ", (FALSE == perm1.getOwnership(uuid,is_group_owned)));
+		
+		LLPermissions perm;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		perm.getOwnership(uuid,is_group_owned);
+		ensure("2:getOwnership:failed ", ((uuid == owner) && (FALSE == is_group_owned))); 
+
+		perm.init(creator,LLUUID::null,lastOwner,group);
+		perm.getOwnership(uuid,is_group_owned);
+		ensure("3:getOwnership:failed ", ((uuid == group) && (TRUE == is_group_owned))); 
+	}
+
+	template<> template<>
+	void permission_object_t::test<8>()
+	{
+		LLPermissions perm,perm1;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		perm1.init(creator,owner,lastOwner,group);
+		ensure_equals("getCRC32:failed ", perm.getCRC32(),perm1.getCRC32());
+	}
+
+	template<> template<>
+	void permission_object_t::test<9>()
+	{
+		LLPermissions perm;
+		LLUUID agent("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
+		bool is_atomic = TRUE;
+		ensure("setOwnerAndGroup():failed ", (TRUE == perm.setOwnerAndGroup(agent,owner,group,is_atomic)));
+		
+		LLUUID owner2("68edcf47-ccd7-45b8-9f90-1649d7f12807"); 
+		LLUUID group2("9c8eca51-53d5-42a7-bb58-cef070395db9");
+		
+		// cant change - agent need to be current owner
+		ensure("setOwnerAndGroup():failed ", (FALSE == perm.setOwnerAndGroup(agent,owner2,group2,is_atomic)));
+		
+		// should be able to change - agent and owner same as current owner
+		ensure("setOwnerAndGroup():failed ", (TRUE == perm.setOwnerAndGroup(owner,owner,group2,is_atomic)));
+	}
+
+	template<> template<>
+	void permission_object_t::test<10>()
+	{
+		LLPermissions perm;
+		LLUUID agent;
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
+		ensure("deedToGroup():failed ", (TRUE == perm.deedToGroup(agent,group)));
+	}
+	template<> template<>
+	void permission_object_t::test<11>()
+	{
+		LLPermissions perm;
+		LLUUID agent;
+		BOOL set = 1;
+		U32 bits = PERM_TRANSFER | PERM_MODIFY;
+		ensure("setBaseBits():failed ", (TRUE == perm.setBaseBits(agent, set, bits)));
+		ensure("setOwnerBits():failed ", (TRUE == perm.setOwnerBits(agent, set, bits)));
+
+		LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8");
+		ensure("setBaseBits():failed ", (FALSE == perm.setBaseBits(agent1, set, bits)));
+		ensure("setOwnerBits():failed ", (FALSE == perm.setOwnerBits(agent1, set, bits)));
+	}
+
+	template<> template<>
+	void permission_object_t::test<12>()
+	{
+		LLPermissions perm;
+		LLUUID agent;
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		BOOL set = 1;
+		U32 bits = 10;
+		ensure("setGroupBits():failed ", (TRUE == perm.setGroupBits(agent,group, set, bits)));
+		ensure("setEveryoneBits():failed ", (TRUE == perm.setEveryoneBits(agent,group, set, bits)));
+		ensure("setNextOwnerBits():failed ", (TRUE == perm.setNextOwnerBits(agent,group, set, bits)));
+
+		LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		ensure("setGroupBits():failed ", (FALSE == perm.setGroupBits(agent1,group, set, bits)));
+		ensure("setEveryoneBits():failed ", (FALSE == perm.setEveryoneBits(agent1,group, set, bits)));
+		ensure("setNextOwnerBits():failed ", (FALSE == perm.setNextOwnerBits(agent1,group, set, bits)));
+	}
+
+	template<> template<>
+	void permission_object_t::test<13>()
+	{
+		LLPermissions perm;
+		LLUUID agent;
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		U32 bits = 10;
+		ensure("allowOperationBy():failed ", (TRUE == perm.allowOperationBy(bits,agent,group)));
+
+		LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		perm.init(creator,owner,lastOwner,group);
+		ensure("allowOperationBy():failed ", (TRUE == perm.allowOperationBy(bits,agent1,group)));
+	}
+
+	template<> template<>
+	void permission_object_t::test<14>()
+	{
+		LLPermissions perm;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner;
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		LLUUID agent;
+		ensure("1:allowModifyBy():failed ", (TRUE == perm.allowModifyBy(agent)));
+		ensure("2:allowModifyBy():failed ", (TRUE == perm.allowModifyBy(agent,group)));
+				
+		U32 val1 = 0x7FFFFFFF;
+		S32 sVal = 1 << 14;
+		sVal = val1 & sVal;
+		LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); 
+		ensure("3:allowModifyBy():failed ", (sVal == perm.allowModifyBy(agent1)));
+		ensure("4:allowModifyBy():failed ", (sVal == perm.allowModifyBy(agent1,group)));
+	}
+	
+	template<> template<>
+	void permission_object_t::test<15>()
+	{
+		LLPermissions perm;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner;
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		LLUUID agent;
+		ensure("1:allowCopyBy():failed ", (TRUE == perm.allowModifyBy(agent)));
+		ensure("2:allowCopyBy():failed ", (TRUE == perm.allowModifyBy(agent,group)));
+				
+		U32 val1 = 0x7FFFFFFF;
+		S32 sVal = 1 << 15;
+		sVal = val1 & sVal;
+		LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); 
+		ensure("3:allowCopyBy():failed ", (sVal == perm.allowCopyBy(agent1)));
+		ensure("4:allowCopyBy():failed ", (sVal == perm.allowCopyBy(agent1,group)));
+	}
+
+	template<> template<>
+	void permission_object_t::test<16>()
+	{
+		LLPermissions perm;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner;
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		LLUUID agent;
+		ensure("1:allowMoveBy():failed ", (TRUE == perm.allowMoveBy(agent)));
+		ensure("2:allowMoveBy():failed ", (TRUE == perm.allowMoveBy(agent,group)));
+
+		U32 val1 = 0x7FFFFFFF;
+		S32 sVal = 1 << 19;
+		sVal = val1 & sVal;
+		LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8"); 
+		ensure("3:allowMoveBy():failed ", (sVal == perm.allowMoveBy(agent1)));
+		ensure("4:allowMoveBy():failed ", (sVal == perm.allowMoveBy(agent1,group)));
+	}
+
+	template<> template<>
+	void permission_object_t::test<17>()
+	{
+		LLPermissions perm;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner;
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		LLUUID agent;
+		ensure("1:allowMoveBy():failed ", (TRUE == perm.allowTransferTo(agent)));
+		
+		perm.init(creator,owner,lastOwner,group);
+		U32 val1 = 0x7FFFFFFF;
+		S32 sVal = 1 << 13;
+		sVal = val1 & sVal;
+		ensure("2:allowMoveBy():failed ", (sVal == perm.allowTransferTo(agent)));
+	}
+
+	template<> template<>
+	void permission_object_t::test<18>()
+	{
+		LLPermissions perm,perm1;
+		ensure("1:Operator==:failed ", perm == perm1);
+		
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		perm = perm1;
+		ensure("2:Operator==:failed ", perm == perm1);
+	}
+
+	template<> template<>
+	void permission_object_t::test<19>()
+	{
+		LLPermissions perm,perm1;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		ensure("2:Operator==:failed ", perm != perm1);
+	}
+
+	template<> template<>
+	void permission_object_t::test<20>()
+	{
+		FILE* fp = fopen("linden_file.dat","w+");
+		if(!fp)
+		{
+			llerrs << "file coudnt be opened\n" << llendl;
+			return;
+		}
+		LLPermissions perm,perm1;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		
+		U32 base = PERM_TRANSFER | PERM_COPY;
+		U32 ownerp = PERM_TRANSFER;
+		U32 groupp = PERM_TRANSFER;
+		U32 everyone = PERM_TRANSFER;
+		U32 next = PERM_NONE;
+
+		perm.initMasks(base, ownerp, everyone, groupp, next);
+
+		perm.exportFile(fp);
+		fclose(fp);	
+		fp = fopen("linden_file.dat","r+");
+		if(!fp)
+		{
+			llerrs << "file coudnt be opened\n" << llendl;
+			return;
+		}
+		perm1.importFile(fp);
+		fclose(fp);
+		ensure("exportFile()/importFile():failed to export and import the data ", perm1 == perm);	
+}
+
+	template<> template<>
+	void permission_object_t::test<21>()
+	{
+		LLPermissions perm,perm1;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+
+		U32 base = PERM_TRANSFER | PERM_COPY;
+		U32 ownerp = PERM_TRANSFER;
+		U32 groupp = PERM_TRANSFER;
+		U32 everyone = PERM_TRANSFER;
+		U32 next = PERM_NONE;
+
+		perm.initMasks(base, ownerp, everyone, groupp, next);
+
+		std::ostringstream ostream;
+		perm.exportLegacyStream(ostream);
+		std::istringstream istream(ostream.str());
+		perm1.importLegacyStream(istream);
+
+		ensure("exportLegacyStream()/importLegacyStream():failed to export and import the data ", perm1 == perm);	
+	}
+
+	template<> template<>
+	void permission_object_t::test<22>()
+	{
+		LLPermissions perm,perm1;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		LLXMLNode* xml_node = perm.exportFileXML();
+		perm1.importXML(xml_node);
+		ensure("exportFileXML()/importXML():failed to export and import the data ", perm1 == perm);	
+	}
+
+	template<> template<>
+	void permission_object_t::test<23>()
+	{
+		LLPermissions perm,perm1;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		std::ostringstream stream1, stream2;
+		stream1 << perm;
+		perm1.init(creator,owner,lastOwner,group);
+		stream2 << perm1;
+		ensure("1:operator << failed",(stream1.str() == stream2.str()));	
+	}
+
+	template<> template<>
+	void permission_object_t::test<24>()
+	{
+		LLPermissions perm,perm1;
+		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	
+		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806"); 
+		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); 
+		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		
+		perm.init(creator,owner,lastOwner,group);
+		
+		U32 base = PERM_TRANSFER | PERM_COPY;
+		U32 ownerp = PERM_TRANSFER;
+		U32 groupp = PERM_TRANSFER;
+		U32 everyone = PERM_TRANSFER;
+		U32 next = PERM_NONE;
+
+		perm.initMasks(base, ownerp, everyone, groupp, next);
+
+		LLSD sd = ll_create_sd_from_permissions(perm);
+		perm1 = ll_permissions_from_sd(sd);
+		ensure_equals("ll_permissions_from_sd() and ll_create_sd_from_permissions()functions failed", perm, perm1);
+	}
+
+	template<> template<>
+	void permission_object_t::test<25>()
+	{
+		LLAggregatePermissions AggrPermission;	
+		LLAggregatePermissions AggrPermission1;	
+		ensure("getU8() function failed", (AggrPermission.getU8() == 0));
+		ensure("isEmpty() function failed", (AggrPermission.isEmpty() == TRUE));
+		AggrPermission.getValue(PERM_TRANSFER);
+		ensure_equals("getValue() function failed", AggrPermission.getValue(PERM_TRANSFER), 0x00);
+
+		AggrPermission.aggregate(PERM_ITEM_UNRESTRICTED);
+		ensure("aggregate() function failed", (AggrPermission.isEmpty() == FALSE));
+
+		AggrPermission1.aggregate(AggrPermission);
+		ensure("aggregate() function failed", (AggrPermission1.isEmpty() == FALSE));
+
+		std::ostringstream stream1;
+		stream1 << AggrPermission;
+		ensure("operator<< failed", (stream1.str() == "{PI_COPY=All, PI_MODIFY=All, PI_TRANSFER=All}"));
+	}
+}
diff -uwN 2007-03-13-Patch2\linden\indra\test/llsaleinfo_tut.cpp 2007-03-13\linden\indra\test/llsaleinfo_tut.cpp
--- 2007-03-13-Patch2\linden\indra\test/llsaleinfo_tut.cpp	Wed Dec 31 16:00:00 1969
+++ 2007-03-13\linden\indra\test/llsaleinfo_tut.cpp	Tue Apr 03 05:31:56 2007
@@ -0,0 +1,223 @@
+/** 
+ * @file LLSaleInfo_tut.cpp
+ * @author Adroit
+ * @date March 2007
+ * @brief Test cases of llsaleinfo.h
+ *
+**/
+
+#include <tut/tut.h>
+#include "lltut.h"
+#include "linden_common.h"
+#include "llsaleinfo.h"
+
+namespace tut
+{
+	struct llsaleinfo_tut
+	{
+	};
+	typedef test_group<llsaleinfo_tut> llsaleinfo_tut_t;
+	typedef llsaleinfo_tut_t::object llsaleinfo_test_t;
+	tut::llsaleinfo_tut_t tut_llsaleinfo_test("llsaleinfo");
+
+	template<> template<>
+	void llsaleinfo_test_t::test<1>()
+	{
+		//test case for getSaleType(), getSalePrice(), getCRC32() fn.
+		//test case for setSaleType(), setSalePrice() fn.
+
+		S32 sale_price = 10000;
+		LLSaleInfo llsaleinfo(LLSaleInfo::FS_COPY, sale_price);
+		char* sale= "copy";
+
+		LLSD llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo);
+		LLSaleInfo saleinfo1 = ll_sale_info_from_sd(llsd_obj1);
+		
+		ensure("1. The getSaleType() fn failed", LLSaleInfo::FS_COPY == llsaleinfo.getSaleType());
+		ensure("2. LLSaleInfo::isForSale() fn failed", TRUE == llsaleinfo.isForSale());
+		ensure("3. The getSalePrice() fn failed", sale_price == llsaleinfo.getSalePrice());
+		ensure("4. The getCRC32() fn failed", 235833404 == llsaleinfo.getCRC32());
+		ensure("5. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_COPY == llsaleinfo.lookup(sale));
+		ensure_equals("6. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice());
+		ensure_equals("7. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType());
+
+		llsaleinfo.setSalePrice(10000000);
+		llsaleinfo.setSaleType(LLSaleInfo::FS_ORIGINAL);
+		sale = "cntn";
+		llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo);
+		saleinfo1 = ll_sale_info_from_sd(llsd_obj1);
+
+		ensure("8. The getSaleType() and setSaleType() fn failed", LLSaleInfo::FS_ORIGINAL == llsaleinfo.getSaleType());
+		ensure("9. LLSaleInfo::isForSale() fn failed", TRUE == llsaleinfo.isForSale());
+		ensure("10. The getSalePrice() fn failed", 10000000 == llsaleinfo.getSalePrice());
+		ensure("11. The getCRC32() fn failed", 127911702 == llsaleinfo.getCRC32());
+		ensure("12. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_CONTENTS == llsaleinfo.lookup(sale));
+		ensure_equals("13. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice());
+		ensure_equals("14. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType());
+
+		llsaleinfo.setSalePrice(55000550);
+		llsaleinfo.setSaleType(LLSaleInfo::FS_CONTENTS);
+		sale = "orig";
+		llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo);
+		saleinfo1 = ll_sale_info_from_sd(llsd_obj1);
+
+		ensure("15. The getSaleType() and setSaleType() fn failed", LLSaleInfo::FS_CONTENTS == llsaleinfo.getSaleType());
+		ensure("16. LLSaleInfo::isForSale() fn failed", TRUE == llsaleinfo.isForSale());
+		ensure("17. The getSalePrice() fn failed", 55000550 == llsaleinfo.getSalePrice());
+		ensure("18. The getCRC32() fn failed", 408735656 == llsaleinfo.getCRC32());
+		ensure("19. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_ORIGINAL == llsaleinfo.lookup(sale));
+		ensure_equals("20. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice());
+		ensure_equals("21. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType());
+
+		llsaleinfo.setSalePrice(-6432);
+		llsaleinfo.setSaleType(LLSaleInfo::FS_NOT);
+		sale = "not";
+		llsd_obj1 = ll_create_sd_from_sale_info(llsaleinfo);
+		saleinfo1 = ll_sale_info_from_sd(llsd_obj1);
+
+		ensure("22. The getSaleType() and setSaleType() fn failed", LLSaleInfo::FS_NOT == llsaleinfo.getSaleType());
+		ensure("23. LLSaleInfo::isForSale() fn failed", FALSE == llsaleinfo.isForSale());
+		ensure("24. The getSalePrice() fn failed", 0 == llsaleinfo.getSalePrice());
+		ensure("25. The getCRC32() fn failed", 0 == llsaleinfo.getCRC32());
+		ensure("26. LLSaleInfo::lookup(const char* name) fn failed", LLSaleInfo::FS_NOT == llsaleinfo.lookup(sale));
+		ensure_equals("27. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSalePrice(), saleinfo1.getSalePrice());
+		ensure_equals("28. ll_create_sd_from_sale_info() fn failed", llsaleinfo.getSaleType(), saleinfo1.getSaleType());
+	}
+
+	template<> template<>
+	void llsaleinfo_test_t::test<2>()
+	{
+
+		FILE* fp = fopen("linden_file.dat","w+");
+		if(!fp)
+		{
+			llerrs << "file could not be opened\n" << llendl;
+			return;
+		}
+			
+		S32 sale_price = 43500;
+		LLSaleInfo llsaleinfo(LLSaleInfo::FS_COPY, sale_price);
+		
+		llsaleinfo.exportFile(fp);
+		fclose(fp);
+
+		LLSaleInfo llsaleinfo1;
+		U32 perm_mask;
+		BOOL has_perm_mask;
+		fp = fopen("linden_file.dat","r");
+		
+		if(!fp)
+		{
+			llerrs << "file coudnt be opened\n" << llendl;
+			return;
+		}
+		
+		llsaleinfo1.importFile(fp, has_perm_mask, perm_mask);
+		fclose(fp);
+		
+		ensure("importFile() fn failed ", llsaleinfo.getSaleType() == llsaleinfo1.getSaleType() &&
+								     llsaleinfo.getSalePrice() == llsaleinfo1.getSalePrice());				
+	}
+
+	template<> template<>
+	void llsaleinfo_test_t::test<3>()
+	{
+		S32 sale_price = 525452;
+		LLSaleInfo llsaleinfo(LLSaleInfo::FS_ORIGINAL, sale_price);
+		
+		std::ostringstream ostream;
+		llsaleinfo.exportLegacyStream(ostream);
+		
+		std::istringstream istream(ostream.str());
+		LLSaleInfo llsaleinfo1;
+		U32 perm_mask = 0;
+		BOOL has_perm_mask = FALSE;
+		llsaleinfo1.importLegacyStream(istream, has_perm_mask, perm_mask);
+					
+		ensure("importLegacyStream() fn failed ", llsaleinfo.getSalePrice() == llsaleinfo1.getSalePrice() &&
+										       llsaleinfo.getSaleType() == llsaleinfo1.getSaleType());		
+	}
+
+	template<> template<>
+	void llsaleinfo_test_t::test<4>()
+	{
+		S32 sale_price = 23445;
+		LLSaleInfo saleinfo(LLSaleInfo::FS_CONTENTS, sale_price);
+		
+		LLXMLNode* x_node = saleinfo.exportFileXML();
+
+		LLSaleInfo saleinfo1(LLSaleInfo::FS_NOT, 0);
+		
+		saleinfo1.importXML(x_node);
+		ensure_equals("1.importXML() fn failed", saleinfo.getSalePrice(), saleinfo1.getSalePrice());
+		ensure_equals("2.importXML() fn failed", saleinfo.getSaleType(), saleinfo1.getSaleType());
+	}
+
+	template<> template<>
+	void llsaleinfo_test_t::test<5>()
+	{	
+		S32 sale_price = 99000;
+		LLSaleInfo saleinfo(LLSaleInfo::FS_ORIGINAL, sale_price);
+		
+		LLSD sd_result = saleinfo.asLLSD();
+		
+		U32 perm_mask = 0 ;
+		BOOL has_perm_mask = FALSE;
+
+		LLSaleInfo saleinfo1;
+		saleinfo1.fromLLSD( sd_result, has_perm_mask, perm_mask);	
+
+		ensure_equals("asLLSD and fromLLSD failed", saleinfo.getSalePrice(), saleinfo1.getSalePrice());
+		ensure_equals("asLLSD and fromLLSD failed", saleinfo.getSaleType(), saleinfo1.getSaleType());
+	}
+
+	//static EForSale lookup(const char* name) fn test
+	template<> template<>
+	void llsaleinfo_test_t::test<6>()
+	{
+		S32 sale_price = 233223;
+		LLSaleInfo::EForSale ret_type = LLSaleInfo::lookup("orig");
+		
+		ensure_equals("lookup(const char* name) fn failed", ret_type, LLSaleInfo::FS_ORIGINAL);
+
+		LLSaleInfo saleinfo(LLSaleInfo::FS_COPY, sale_price);
+		const char* result = LLSaleInfo::lookup(LLSaleInfo::FS_COPY);
+		ensure("char* lookup(EForSale type) fn failed", 0 == strcmp("copy", result));
+	}
+
+	//void LLSaleInfo::accumulate(const LLSaleInfo& sale_info) fn test
+	template<> template<>
+	void llsaleinfo_test_t::test<7>()
+	{
+		S32 sale_price = 20;
+		LLSaleInfo saleinfo(LLSaleInfo::FS_COPY, sale_price);
+		LLSaleInfo saleinfo1(LLSaleInfo::FS_COPY, sale_price);
+		saleinfo1.accumulate(saleinfo);
+		ensure_equals("LLSaleInfo::accumulate(const LLSaleInfo& sale_info) fn failed", saleinfo1.getSalePrice(), 40);
+				
+	}
+
+	// test cases of bool operator==(const LLSaleInfo &rhs) fn
+	// test case of bool operator!=(const LLSaleInfo &rhs) fn
+	template<> template<>
+	void llsaleinfo_test_t::test<8>()
+	{
+		S32 sale_price = 55000;
+		LLSaleInfo saleinfo(LLSaleInfo::FS_ORIGINAL, sale_price);
+		LLSaleInfo saleinfoequal(LLSaleInfo::FS_ORIGINAL, sale_price);
+		LLSaleInfo saleinfonotequal(LLSaleInfo::FS_ORIGINAL, sale_price*2);
+		
+		ensure("operator == fn. failed", true == (saleinfo == saleinfoequal));
+		ensure("operator != fn. failed", true == (saleinfo != saleinfonotequal));
+	}			
+
+	template<> template<>
+	void llsaleinfo_test_t::test<9>()
+	{
+
+		//TBD: void LLSaleInfo::packMessage(LLMessageSystem* msg) const
+		//TBD: void LLSaleInfo::unpackMessage(LLMessageSystem* msg, const char* block)
+		//TBD: void LLSaleInfo::unpackMultiMessage(LLMessageSystem* msg, const char* block, S32 block_num)
+	}
+
+}
diff -uwN 2007-03-13-Patch2\linden\indra\test/v3color_tut.cpp 2007-03-13\linden\indra\test/v3color_tut.cpp
--- 2007-03-13-Patch2\linden\indra\test/v3color_tut.cpp	Wed Dec 31 16:00:00 1969
+++ 2007-03-13\linden\indra\test/v3color_tut.cpp	Fri Mar 30 00:26:52 2007
@@ -0,0 +1,287 @@
+/**
+ * @file v3color_tut.cpp
+ * @author Adroit
+ * @date March 2007
+ * @brief v3color test cases.
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include <tut/tut.h>
+#include "lltut.h"
+#include "linden_common.h"
+#include "v3color.h"
+
+
+namespace tut
+{
+	struct v3color_data
+	{
+	};
+	typedef test_group<v3color_data> v3color_test;
+	typedef v3color_test::object v3color_object;
+	tut::v3color_test v3color_testcase("v3color");
+
+	template<> template<>
+	void v3color_object::test<1>()
+	{
+		LLColor3 llcolor3;
+		ensure("1:LLColor3:Fail to initialize ", (0.0f == llcolor3.mV[0]) && (0.0f == llcolor3.mV[1]) && (0.0f == llcolor3.mV[2]));
+		F32 r = 2.0f, g = 3.2f, b = 1.f;
+		F32 v1,v2,v3;
+		LLColor3 llcolor3a(r,g,b);
+		ensure("2:LLColor3:Fail to initialize " ,(2.0f == llcolor3a.mV[0]) && (3.2f == llcolor3a.mV[1]) && (1.f == llcolor3a.mV[2]));
+		
+		const F32 vec[3] = {2.0f, 3.2f,1.f};
+		LLColor3 llcolor3b(vec);
+		ensure("3:LLColor3:Fail to initialize " ,(2.0f == llcolor3b.mV[0]) && (3.2f == llcolor3b.mV[1]) && (1.f == llcolor3b.mV[2]));
+		char* str = "561122";
+		LLColor3 llcolor3c(str);
+		v1 = (F32)86.0f/255.0f; // 0x56 = 86
+		v2 = (F32)17.0f/255.0f; // 0x11 = 17
+		v3 = (F32)34.0f/255.f;  // 0x22 = 34
+		ensure("4:LLColor3:Fail to initialize " ,(v1 == llcolor3c.mV[0]) && (v2 == llcolor3c.mV[1]) && (v3 == llcolor3c.mV[2]));
+	}
+
+	template<> template<>
+	void v3color_object::test<2>()
+	{
+		LLColor3 llcolor3;
+		llcolor3.setToBlack();
+		ensure("setToBlack:Fail to set black ", ((llcolor3.mV[0] == 0.f) && (llcolor3.mV[1] == 0.f) && (llcolor3.mV[2] == 0.f)));
+		llcolor3.setToWhite();
+		ensure("setToWhite:Fail to set white  ", ((llcolor3.mV[0] == 1.f) && (llcolor3.mV[1] == 1.f) && (llcolor3.mV[2] == 1.f)));
+	}
+
+	template<> template<>
+	void v3color_object::test<3>()
+	{
+		F32 r = 2.3436212f, g = 1231.f, b = 4.7849321232f;
+		LLColor3 llcolor3, llcolor3a;
+		llcolor3.setVec(r,g,b);
+		ensure("1:setVec(r,g,b) Fail ",((r == llcolor3.mV[0]) && (g == llcolor3.mV[1]) && (b == llcolor3.mV[2])));
+		llcolor3a.setVec(llcolor3);
+		ensure_equals("2:setVec(LLColor3) Fail ", llcolor3,llcolor3a);
+		F32 vec[3] = {1.2324f, 2.45634f, .234563f};
+		llcolor3.setToBlack();
+		llcolor3.setVec(vec);
+		ensure("3:setVec(F32*) Fail ",((vec[0] == llcolor3.mV[0]) && (vec[1] == llcolor3.mV[1]) && (vec[2] == llcolor3.mV[2])));
+	}
+
+	template<> template<>
+	void v3color_object::test<4>()
+	{
+		F32 r = 2.3436212f, g = 1231.f, b = 4.7849321232f;
+		LLColor3 llcolor3(r,g,b);
+		ensure("magVecSquared:Fail ", is_approx_equal(llcolor3.magVecSquared(), (r*r + g*g + b*b)));
+		ensure("magVec:Fail ", is_approx_equal(llcolor3.magVec(), fsqrtf(r*r + g*g + b*b)));
+	}
+
+	template<> template<>
+	void v3color_object::test<5>()
+	{
+		F32 r = 2.3436212f, g = 1231.f, b = 4.7849321232f;
+		F32 val1, val2,val3;
+		LLColor3 llcolor3(r,g,b);
+		F32 vecMag = llcolor3.normVec();
+		F32 mag = fsqrtf(r*r + g*g + b*b);
+		F32 oomag = 1.f / mag;
+		val1 = r * oomag;
+		val2 = g * oomag;
+		val3 = b * oomag;
+		ensure("1:normVec failed ", (val1 == llcolor3.mV[0] && val2 == llcolor3.mV[1] && val3 == llcolor3.mV[2] && vecMag == mag));
+		r = .000000000f, g = 0.f, b = 0.0f;
+		llcolor3.setVec(r,g,b);
+		vecMag = llcolor3.normVec();
+		ensure("2:normVec failed should be 0. ", (0. == llcolor3.mV[0] && 0. == llcolor3.mV[1] && 0. == llcolor3.mV[2] && vecMag == 0.));
+	}
+
+	template<> template<>
+	void v3color_object::test<6>()
+	{
+		F32 r = 2.3436212f, g = -1231.f, b = .7849321232f;
+		std::ostringstream stream1, stream2;
+		LLColor3 llcolor3(r,g,b),llcolor3a;
+		stream1 << llcolor3;
+		llcolor3a.setVec(r,g,b);
+		stream2 << llcolor3a;
+		ensure("operator << failed ", (stream1.str() == stream2.str()));	
+	}
+		
+	template<> template<>
+	void v3color_object::test<7>()
+	{
+		F32 r = 2.3436212f, g = -1231.f, b = .7849321232f;
+		LLColor3 llcolor3(r,g,b),llcolor3a;
+		llcolor3a = llcolor3;
+		ensure("operator == failed ", (llcolor3a == llcolor3));	
+	}
+
+	template<> template<>
+	void v3color_object::test<8>()
+	{
+		F32 r1 =1.f, g1 = 2.f,b1 = 1.2f, r2 = -2.3f, g2 = 1.11f, b2 = 1234.234f;
+		LLColor3 llcolor3(r1,g1,b1),llcolor3a(r2,g2,b2),llcolor3b;
+		llcolor3b = llcolor3 + llcolor3a ;
+		ensure("1:operator+ failed",is_approx_equal(r1+r2 ,llcolor3b.mV[0]) && is_approx_equal(g1+g2,llcolor3b.mV[1])&& is_approx_equal(b1+b2,llcolor3b.mV[2]));
+		r1 = -.235f, g1 = -24.32f, b1 = 2.13f,  r2 = -2.3f, g2 = 1.f, b2 = 34.21f;
+		llcolor3.setVec(r1,g1,b1);
+		llcolor3a.setVec(r2,g2,b2);
+		llcolor3b = llcolor3 + llcolor3a;
+		ensure("2:operator+ failed",is_approx_equal(r1+r2 ,llcolor3b.mV[0]) && is_approx_equal(g1+g2,llcolor3b.mV[1])&& is_approx_equal(b1+b2,llcolor3b.mV[2]));
+	}
+
+	template<> template<>
+	void v3color_object::test<9>()
+	{
+		F32 r1 =1.f, g1 = 2.f,b1 = 1.2f, r2 = -2.3f, g2 = 1.11f, b2 = 1234.234f;
+		LLColor3 llcolor3(r1,g1,b1),llcolor3a(r2,g2,b2),llcolor3b;
+		llcolor3b = llcolor3 - llcolor3a ;
+		ensure("1:operator- failed",is_approx_equal(r1-r2 ,llcolor3b.mV[0]) && is_approx_equal(g1-g2,llcolor3b.mV[1])&& is_approx_equal(b1-b2,llcolor3b.mV[2]));
+		r1 = -.235f, g1 = -24.32f, b1 = 2.13f,  r2 = -2.3f, g2 = 1.f, b2 = 34.21f;
+		llcolor3.setVec(r1,g1,b1);
+		llcolor3a.setVec(r2,g2,b2);
+		llcolor3b = llcolor3 - llcolor3a;
+		ensure("2:operator- failed",is_approx_equal(r1-r2 ,llcolor3b.mV[0]) && is_approx_equal(g1-g2,llcolor3b.mV[1])&& is_approx_equal(b1-b2,llcolor3b.mV[2]));
+	}
+
+	template<> template<>
+	void v3color_object::test<10>()
+	{
+		F32 r1 =1.f, g1 = 2.f,b1 = 1.2f, r2 = -2.3f, g2 = 1.11f, b2 = 1234.234f;
+		LLColor3 llcolor3(r1,g1,b1),llcolor3a(r2,g2,b2),llcolor3b;
+		llcolor3b = llcolor3 * llcolor3a;
+		ensure("1:operator* failed",is_approx_equal(r1*r2 ,llcolor3b.mV[0]) && is_approx_equal(g1*g2,llcolor3b.mV[1])&& is_approx_equal(b1*b2,llcolor3b.mV[2]));
+		llcolor3a.setToBlack();
+		F32 mulVal = 4.332f;
+		llcolor3a = llcolor3 * mulVal;
+		ensure("2:operator* failed",is_approx_equal(r1*mulVal ,llcolor3a.mV[0]) && is_approx_equal(g1*mulVal,llcolor3a.mV[1])&& is_approx_equal(b1*mulVal,llcolor3a.mV[2]));
+		llcolor3a.setToBlack();
+		llcolor3a = mulVal * llcolor3;
+		ensure("3:operator* failed",is_approx_equal(r1*mulVal ,llcolor3a.mV[0]) && is_approx_equal(g1*mulVal,llcolor3a.mV[1])&& is_approx_equal(b1*mulVal,llcolor3a.mV[2]));
+	}
+
+	template<> template<>
+	void v3color_object::test<11>()
+	{
+		F32 r = 2.3436212f, g = 1231.f, b = 4.7849321232f;
+		LLColor3 llcolor3(r,g,b),llcolor3a;
+		llcolor3a = -llcolor3;
+		ensure("operator- failed ", (-llcolor3a == llcolor3));	
+	}
+
+	template<> template<>
+	void v3color_object::test<12>()
+	{
+		F32 r = 2.3436212f, g = 1231.f, b = 4.7849321232f;
+		LLColor3 llcolor3(r,g,b),llcolor3a(r,g,b);
+		ensure_equals("1:operator== failed",llcolor3a,llcolor3);
+		r = 13.3436212f, g = -11.f, b = .7849321232f;
+		llcolor3.setVec(r,g,b);
+		llcolor3a.setVec(r,g,b);
+		ensure_equals("2:operator== failed",llcolor3a,llcolor3);
+	}
+
+	template<> template<>
+	void v3color_object::test<13>()
+	{
+		F32 r1 =1.f, g1 = 2.f,b1 = 1.2f, r2 = -2.3f, g2 = 1.11f, b2 = 1234.234f;
+		LLColor3 llcolor3(r1,g1,b1),llcolor3a(r2,g2,b2);
+		ensure("1:operator!= failed",(llcolor3 != llcolor3a));
+		llcolor3.setToBlack();
+		llcolor3a.setVec(llcolor3);
+		ensure("2:operator!= failed", ( FALSE == (llcolor3a != llcolor3)));
+	}
+
+	template<> template<>
+	void v3color_object::test<14>()
+	{
+		F32 r1 =1.f, g1 = 2.f,b1 = 1.2f, r2 = -2.3f, g2 = 1.11f, b2 = 1234.234f;
+		LLColor3 llcolor3(r1,g1,b1),llcolor3a(r2,g2,b2);
+		llcolor3a += llcolor3;
+		ensure("1:operator+= failed",is_approx_equal(r1+r2 ,llcolor3a.mV[0]) && is_approx_equal(g1+g2,llcolor3a.mV[1])&& is_approx_equal(b1+b2,llcolor3a.mV[2]));
+		llcolor3.setVec(r1,g1,b1);
+		llcolor3a.setVec(r2,g2,b2);
+		llcolor3a += llcolor3;
+		ensure("2:operator+= failed",is_approx_equal(r1+r2 ,llcolor3a.mV[0]) && is_approx_equal(g1+g2,llcolor3a.mV[1])&& is_approx_equal(b1+b2,llcolor3a.mV[2]));
+	}
+
+	template<> template<>
+	void v3color_object::test<15>()
+	{
+		F32 r1 =1.f, g1 = 2.f,b1 = 1.2f, r2 = -2.3f, g2 = 1.11f, b2 = 1234.234f;
+		LLColor3 llcolor3(r1,g1,b1),llcolor3a(r2,g2,b2);
+		llcolor3a -= llcolor3;
+		ensure("1:operator-= failed",is_approx_equal(r1-r2 ,llcolor3a.mV[0]) && is_approx_equal(g1-g2,llcolor3a.mV[1])&& is_approx_equal(b1-b2,llcolor3a.mV[2]));
+		llcolor3.setVec(r1,g1,b1);
+		llcolor3a.setVec(r2,g2,b2);
+		llcolor3a -= llcolor3;
+		ensure("2:operator-= failed",is_approx_equal(r1-r2 ,llcolor3a.mV[0]) && is_approx_equal(g1-g2,llcolor3a.mV[1])&& is_approx_equal(b1-b2,llcolor3a.mV[2]));
+	}
+	
+	template<> template<>
+	void v3color_object::test<16>()
+	{
+		F32 r1 =1.f, g1 = 2.f,b1 = 1.2f, r2 = -2.3f, g2 = 1.11f, b2 = 1234.234f;
+		LLColor3 llcolor3(r1,g1,b1),llcolor3a(r2,g2,b2);
+		llcolor3a *= llcolor3;
+		ensure("1:operator*= failed",is_approx_equal(r1*r2 ,llcolor3a.mV[0]) && is_approx_equal(g1*g2,llcolor3a.mV[1])&& is_approx_equal(b1*b2,llcolor3a.mV[2]));
+		F32 mulVal = 4.332f;
+		llcolor3 *=mulVal;
+		ensure("2:operator*= failed",is_approx_equal(r1*mulVal ,llcolor3.mV[0]) && is_approx_equal(g1*mulVal,llcolor3.mV[1])&& is_approx_equal(b1*mulVal,llcolor3.mV[2]));
+	}
+
+	template<> template<>
+	void v3color_object::test<17>()
+	{
+		F32 r = 2.3436212f, g = -1231.f, b = .7849321232f;
+		LLColor3 llcolor3(r,g,b);
+		llcolor3.clamp();
+		ensure("1:clamp:Fail to clamp " ,(1.0f == llcolor3.mV[0]) && (0.f == llcolor3.mV[1]) && (b == llcolor3.mV[2]));
+		r = -2.3436212f, g = -1231.f, b = 67.7849321232f;
+		llcolor3.setVec(r,g,b);
+		llcolor3.clamp();
+		ensure("2:clamp:Fail to clamp " ,(0.f == llcolor3.mV[0]) && (0.f == llcolor3.mV[1]) && (1.f == llcolor3.mV[2]));
+	}
+
+	template<> template<>
+	void v3color_object::test<18>()
+	{
+		F32 r1 =1.f, g1 = 2.f,b1 = 1.2f, r2 = -2.3f, g2 = 1.11f, b2 = 1234.234f;
+		F32 val = 2.3f,val1,val2,val3;
+		LLColor3 llcolor3(r1,g1,b1),llcolor3a(r2,g2,b2);
+		val1 = r1 + (r2 - r1)* val;
+		val2 = g1 + (g2 - g1)* val;
+		val3 = b1 + (b2 - b1)* val;
+		LLColor3 llcolor3b = lerp(llcolor3,llcolor3a,val);
+		ensure("lerp failed ", ((val1 ==llcolor3b.mV[0])&& (val2 ==llcolor3b.mV[1]) && (val3 ==llcolor3b.mV[2])));		
+	}
+
+	template<> template<>
+	void v3color_object::test<19>()
+	{
+		F32 r1 =1.f, g1 = 2.f,b1 = 1.2f, r2 = -2.3f, g2 = 1.11f, b2 = 1234.234f;
+		LLColor3 llcolor3(r1,g1,b1),llcolor3a(r2,g2,b2);
+		F32 val = distVec(llcolor3,llcolor3a);
+		ensure("distVec failed ", is_approx_equal(fsqrtf((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2)) ,val));
+		
+		F32 val1 = distVec_squared(llcolor3,llcolor3a);
+		ensure("distVec_squared failed ", is_approx_equal(((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2)) ,val1));
+	}
+
+	template<> template<>
+	void v3color_object::test<20>()
+	{
+		F32 r1 = 1.02223f, g1 = 22222.212f, b1 = 122222.00002f;
+		LLColor3 llcolor31(r1,g1,b1);
+
+		LLSD sd = llcolor31.getValue();
+		LLColor3 llcolor32;
+		llcolor32.setValue(sd);
+		ensure_equals("LLColor3::setValue/getValue failed", llcolor31, llcolor32);
+
+		LLColor3 llcolor33(sd);
+		ensure_equals("LLColor3(LLSD) failed", llcolor31, llcolor33);
+	}
+}
diff -uwN 2007-03-13-Patch2\linden\indra\test/v4color_tut.cpp 2007-03-13\linden\indra\test/v4color_tut.cpp
--- 2007-03-13-Patch2\linden\indra\test/v4color_tut.cpp	Wed Dec 31 16:00:00 1969
+++ 2007-03-13\linden\indra\test/v4color_tut.cpp	Fri Mar 30 01:30:56 2007
@@ -0,0 +1,341 @@
+/**
+ * @file v4color_tut.cpp
+ * @author Adroit
+ * @date March 2007
+ * @brief v4color test cases.
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+
+#include <tut/tut.h>
+#include "lltut.h"
+#include "linden_common.h"
+#include "v4coloru.h"
+#include "llsd.h"
+#include "v3color.h"
+#include "v4color.h"
+
+
+namespace tut
+{
+	struct v4color_data
+	{
+	};
+	typedef test_group<v4color_data> v4color_test;
+	typedef v4color_test::object v4color_object;
+	tut::v4color_test v4color_testcase("v4color");
+
+	template<> template<>
+	void v4color_object::test<1>()
+	{
+		LLColor4 llcolor4;
+		ensure("1:LLColor4:Fail to initialize ", ((0 == llcolor4.mV[VX]) && (0 == llcolor4.mV[VY]) && (0 == llcolor4.mV[VZ])&& (1.0f == llcolor4.mV[VW])));
+
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF, a = 0xAF;
+		LLColor4 llcolor4a(r,g,b);
+		ensure("2:LLColor4:Fail to initialize ", ((r == llcolor4a.mV[VX]) && (g == llcolor4a.mV[VY]) && (b == llcolor4a.mV[VZ])&& (1.0f == llcolor4a.mV[VW])));
+		
+		LLColor4 llcolor4b(r,g,b,a);
+		ensure("3:LLColor4:Fail to initialize ", ((r == llcolor4b.mV[VX]) && (g == llcolor4b.mV[VY]) && (b == llcolor4b.mV[VZ])&& (a == llcolor4b.mV[VW])));
+		
+		const F32 vec[4] = {.112f ,23.2f, -4.2f, -.0001f};
+		LLColor4 llcolor4c(vec);
+		ensure("4:LLColor4:Fail to initialize ", ((vec[0] == llcolor4c.mV[VX]) && (vec[1] == llcolor4c.mV[VY]) && (vec[2] == llcolor4c.mV[VZ])&& (vec[3] == llcolor4c.mV[VW])));		
+		
+		LLColor3 llcolor3(-2.23f,1.01f,42.3f);
+		F32 val = -.1f;
+		LLColor4 llcolor4d(llcolor3,val);
+		ensure("5:LLColor4:Fail to initialize ", ((llcolor3.mV[VX] == llcolor4d.mV[VX]) && (llcolor3.mV[VY] == llcolor4d.mV[VY]) && (llcolor3.mV[VZ] == llcolor4d.mV[VZ])&& (val == llcolor4d.mV[VW])));
+
+		LLSD sd = llcolor4d.getValue();
+		LLColor4 llcolor4e(sd);
+		ensure_equals("6:LLColor4:(LLSD) failed ", llcolor4d, llcolor4e);
+		
+		U8 r1 = 0xF2, g1 = 0xFA, b1 = 0xBF;
+		LLColor4U color4u(r1,g1,b1);
+		LLColor4 llcolor4g(color4u);
+		const F32 SCALE = 1.f/255.f;
+		F32 r2 = r1*SCALE, g2 = g1* SCALE, b2 = b1* SCALE;
+		ensure("7:LLColor4:Fail to initialize ", ((r2 == llcolor4g.mV[VX]) && (g2 == llcolor4g.mV[VY]) && (b2 == llcolor4g.mV[VZ])));
+	}
+
+	template<> template<>
+	void v4color_object::test<2>()
+	{
+		LLColor4 llcolor(1.0, 2.0, 3.0, 4.0);
+		LLSD llsd = llcolor.getValue();
+		LLColor4 llcolor4(llsd), llcolor4a;
+		llcolor4a.setValue(llsd);
+		ensure("setValue: failed", (llcolor4 == llcolor4a));
+		LLSD sd = llcolor4a.getValue();
+		LLColor4 llcolor4b(sd);
+		ensure("getValue: Failed ", (llcolor4b == llcolor4a));
+	}
+
+	template<> template<>
+	void v4color_object::test<3>()
+	{
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF,a = 0xAF;
+		LLColor4 llcolor4(r,g,b,a);
+		llcolor4.setToBlack();
+		ensure("setToBlack:Fail to set the black ", ((0 == llcolor4.mV[VX]) && (0 == llcolor4.mV[VY]) && (0 == llcolor4.mV[VZ])&& (1.0f == llcolor4.mV[VW])));
+
+		llcolor4.setToWhite();
+		ensure("setToWhite:Fail to set the white ", ((1.f == llcolor4.mV[VX]) && (1.f == llcolor4.mV[VY]) && (1.f == llcolor4.mV[VZ])&& (1.0f == llcolor4.mV[VW])));
+	}
+
+	template<> template<>
+	void v4color_object::test<4>()
+	{
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF, a = 0xAF;
+		LLColor4 llcolor4;
+		llcolor4.setVec(r,g,b);
+		ensure("1:setVec:Fail to set the values ", ((r == llcolor4.mV[VX]) && (g == llcolor4.mV[VY]) && (b == llcolor4.mV[VZ])&& (1.f == llcolor4.mV[VW])));
+
+		llcolor4.setVec(r,g,b,a);
+		ensure("2:setVec:Fail to set the values ", ((r == llcolor4.mV[VX]) && (g == llcolor4.mV[VY]) && (b == llcolor4.mV[VZ])&& (a == llcolor4.mV[VW])));
+
+		LLColor4 llcolor4a; 
+		llcolor4a.setVec(llcolor4);
+		ensure_equals("3:setVec:Fail to set the values ", llcolor4a,llcolor4);
+
+		LLColor3 llcolor3(-2.23f,1.01f,42.3f);
+		llcolor4a.setVec(llcolor3);
+		ensure("4:setVec:Fail to set the values ", ((llcolor3.mV[VX] == llcolor4a.mV[VX]) && (llcolor3.mV[VY] == llcolor4a.mV[VY]) && (llcolor3.mV[VZ] == llcolor4a.mV[VZ])));
+
+		F32 val = -.33f;
+		llcolor4a.setVec(llcolor3,val);
+		ensure("4:setVec:Fail to set the values ", ((llcolor3.mV[VX] == llcolor4a.mV[VX]) && (llcolor3.mV[VY] == llcolor4a.mV[VY]) && (llcolor3.mV[VZ] == llcolor4a.mV[VZ]) && (val == llcolor4a.mV[VW])));
+
+		const F32 vec[4] = {.112f ,23.2f, -4.2f, -.0001f};
+		LLColor4 llcolor4c;
+		llcolor4c.setVec(vec);
+		ensure("5:setVec:Fail to initialize ", ((vec[0] == llcolor4c.mV[VX]) && (vec[1] == llcolor4c.mV[VY]) && (vec[2] == llcolor4c.mV[VZ])&& (vec[3] == llcolor4c.mV[VW])));		
+
+		U8 r1 = 0xF2, g1 = 0xFA, b1= 0xBF;
+		LLColor4U color4u(r1,g1,b1);
+		llcolor4.setVec(color4u);
+		const F32 SCALE = 1.f/255.f;
+		F32 r2 = r1*SCALE, g2 = g1* SCALE, b2 = b1* SCALE;
+		ensure("6:setVec:Fail to initialize ", ((r2 == llcolor4.mV[VX]) && (g2 == llcolor4.mV[VY]) && (b2 == llcolor4.mV[VZ])));
+	}
+
+	template<> template<>
+	void v4color_object::test<5>()
+	{
+		F32 alpha = 0xAF;
+		LLColor4 llcolor4;
+		llcolor4.setAlpha(alpha);
+		ensure("setAlpha:Fail to initialize ", (alpha == llcolor4.mV[VW]));
+	}
+
+	template<> template<>
+	void v4color_object::test<6>()
+	{
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF;
+		LLColor4 llcolor4(r,g,b);
+		ensure("magVecSquared:Fail ", is_approx_equal(llcolor4.magVecSquared(), (r*r + g*g + b*b)));
+		ensure("magVec:Fail ", is_approx_equal(llcolor4.magVec(), fsqrtf(r*r + g*g + b*b)));
+	}
+
+	template<> template<>
+	void v4color_object::test<7>()
+	{
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF;
+		LLColor4 llcolor4(r,g,b);
+		F32 vecMag = llcolor4.normVec();
+		F32 mag = fsqrtf(r*r + g*g + b*b);
+		F32 oomag = 1.f / mag;
+		F32 val1 = r * oomag, val2 = g * oomag,	val3 = b * oomag;
+		ensure("1:normVec failed ", (val1 == llcolor4.mV[0] && val2 == llcolor4.mV[1] && val3 == llcolor4.mV[2] && vecMag == mag));
+	}
+
+	template<> template<>
+	void v4color_object::test<8>()
+	{
+		LLColor4 llcolor4;
+		ensure("1:isOpaque failed ",(1 == llcolor4.isOpaque()));
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF,a = 1.f;
+		llcolor4.setVec(r,g,b,a);
+		ensure("2:isOpaque failed ",(1 == llcolor4.isOpaque()));
+		a = 2.f;
+		llcolor4.setVec(r,g,b,a);
+		ensure("3:isOpaque failed ",(0 == llcolor4.isOpaque()));
+	}
+
+	template<> template<>
+	void v4color_object::test<9>()
+	{
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF;
+		LLColor4 llcolor4(r,g,b);
+		ensure("1:operator [] failed",( r ==  llcolor4[0]));	
+		ensure("2:operator [] failed",( g ==  llcolor4[1]));
+		ensure("3:operator [] failed",( b ==  llcolor4[2]));
+
+		r = 0xA20, g = 0xFBFF, b = 0xFFF;
+		llcolor4.setVec(r,g,b);
+		F32 &ref1 = llcolor4[0];
+		ensure("4:operator [] failed",( ref1 ==  llcolor4[0]));
+		F32 &ref2 = llcolor4[1];
+		ensure("5:operator [] failed",( ref2 ==  llcolor4[1]));
+		F32 &ref3 = llcolor4[2];
+		ensure("6:operator [] failed",( ref3 ==  llcolor4[2]));
+	}
+
+	template<> template<>
+	void v4color_object::test<10>()
+	{
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF;
+		LLColor3 llcolor3(r,g,b);
+		LLColor4 llcolor4a,llcolor4b;
+		llcolor4a = llcolor3;
+		ensure("Operator=:Fail to initialize ", ((llcolor3.mV[0] == llcolor4a.mV[VX]) && (llcolor3.mV[1] == llcolor4a.mV[VY]) && (llcolor3.mV[2] == llcolor4a.mV[VZ])));
+		LLSD sd = llcolor4a.getValue();
+		llcolor4b = sd;
+		ensure_equals("Operator= LLSD:Fail ", llcolor4a, llcolor4b);
+	}
+
+	template<> template<>
+	void v4color_object::test<11>()
+	{
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF;
+		std::ostringstream stream1, stream2;
+		LLColor4 llcolor4a(r,g,b),llcolor4b;
+		stream1 << llcolor4a;
+		llcolor4b.setVec(r,g,b);
+		stream2 << llcolor4b;
+		ensure("operator << failed ", (stream1.str() == stream2.str()));	
+	}
+
+	template<> template<>
+	void v4color_object::test<12>()
+	{
+		F32 r1 = 0x20, g1 = 0xFFFF, b1 = 0xFF;
+		F32 r2 = 0xABF, g2 = 0xFB, b2 = 0xFFF;
+		LLColor4 llcolor4a(r1,g1,b1),llcolor4b(r2,g2,b2),llcolor4c;
+		llcolor4c = llcolor4b + llcolor4a;
+		ensure("operator+:Fail to Add the values ",  (is_approx_equal(r1+r2,llcolor4c.mV[VX]) && is_approx_equal(g1+g2,llcolor4c.mV[VY]) && is_approx_equal(b1+b2,llcolor4c.mV[VZ])));
+
+		llcolor4b += llcolor4a;
+		ensure("operator+=:Fail to Add the values ",  (is_approx_equal(r1+r2,llcolor4b.mV[VX]) && is_approx_equal(g1+g2,llcolor4b.mV[VY]) && is_approx_equal(b1+b2,llcolor4b.mV[VZ])));
+	}
+
+	template<> template<>
+	void v4color_object::test<13>()
+	{
+		F32 r1 = 0x20, g1 = 0xFFFF, b1 = 0xFF;
+		F32 r2 = 0xABF, g2 = 0xFB, b2 = 0xFFF;
+		LLColor4 llcolor4a(r1,g1,b1),llcolor4b(r2,g2,b2),llcolor4c;
+		llcolor4c = llcolor4a - llcolor4b;
+		ensure("operator-:Fail to subtract the values ",  (is_approx_equal(r1-r2,llcolor4c.mV[VX]) && is_approx_equal(g1-g2,llcolor4c.mV[VY]) && is_approx_equal(b1-b2,llcolor4c.mV[VZ])));
+
+		llcolor4a -= llcolor4b;
+		ensure("operator-=:Fail to subtract the values ",  (is_approx_equal(r1-r2,llcolor4a.mV[VX]) && is_approx_equal(g1-g2,llcolor4a.mV[VY]) && is_approx_equal(b1-b2,llcolor4a.mV[VZ])));
+	}
+
+	template<> template<>
+	void v4color_object::test<14>()
+	{
+		F32 r1 = 0x20, g1 = 0xFFFF, b1 = 0xFF;
+		F32 r2 = 0xABF, g2 = 0xFB, b2 = 0xFFF;
+		LLColor4 llcolor4a(r1,g1,b1),llcolor4b(r2,g2,b2),llcolor4c;
+		llcolor4c = llcolor4a * llcolor4b;
+		ensure("1:operator*:Fail to multiply the values",  (is_approx_equal(r1*r2,llcolor4c.mV[VX]) && is_approx_equal(g1*g2,llcolor4c.mV[VY]) && is_approx_equal(b1*b2,llcolor4c.mV[VZ])));
+		
+		F32 mulVal = 3.33f;
+		llcolor4c = llcolor4a * mulVal;
+		ensure("2:operator*:Fail ",  (is_approx_equal(r1*mulVal,llcolor4c.mV[VX]) && is_approx_equal(g1*mulVal,llcolor4c.mV[VY]) && is_approx_equal(b1*mulVal,llcolor4c.mV[VZ])));
+		llcolor4c = mulVal * llcolor4a;
+		ensure("3:operator*:Fail to multiply the values",  (is_approx_equal(r1*mulVal,llcolor4c.mV[VX]) && is_approx_equal(g1*mulVal,llcolor4c.mV[VY]) && is_approx_equal(b1*mulVal,llcolor4c.mV[VZ])));
+
+		llcolor4a *= mulVal;
+		ensure("4:operator*=:Fail to multiply the values ",  (is_approx_equal(r1*mulVal,llcolor4a.mV[VX]) && is_approx_equal(g1*mulVal,llcolor4a.mV[VY]) && is_approx_equal(b1*mulVal,llcolor4a.mV[VZ])));
+
+		LLColor4 llcolor4d(r1,g1,b1),llcolor4e(r2,g2,b2);
+		llcolor4e *= llcolor4d;
+		ensure("5:operator*=:Fail to multiply the values ",  (is_approx_equal(r1*r2,llcolor4e.mV[VX]) && is_approx_equal(g1*g2,llcolor4e.mV[VY]) && is_approx_equal(b1*b2,llcolor4e.mV[VZ])));
+	}
+
+	template<> template<>
+	void v4color_object::test<15>()
+	{
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF,a = 0x30;
+		F32 div = 12.345f;
+		LLColor4 llcolor4a(r,g,b,a),llcolor4b;
+		llcolor4b = llcolor4a % div;//chnage only alpha value nor r,g,b;
+		ensure("1operator%:Fail ",  (is_approx_equal(r,llcolor4b.mV[VX]) && is_approx_equal(g,llcolor4b.mV[VY]) && is_approx_equal(b,llcolor4b.mV[VZ])&& is_approx_equal(div*a,llcolor4b.mV[VW])));
+		
+		llcolor4b = div % llcolor4a;
+		ensure("2operator%:Fail ",  (is_approx_equal(r,llcolor4b.mV[VX]) && is_approx_equal(g,llcolor4b.mV[VY]) && is_approx_equal(b,llcolor4b.mV[VZ])&& is_approx_equal(div*a,llcolor4b.mV[VW])));
+
+		llcolor4a %= div;
+		ensure("operator%=:Fail ",  (is_approx_equal(a*div,llcolor4a.mV[VW])));
+	}
+
+	template<> template<>
+	void v4color_object::test<16>()
+	{
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF,a = 0x30;
+		LLColor4 llcolor4a(r,g,b,a),llcolor4b;
+		llcolor4b = llcolor4a;
+		ensure("1:operator== failed to ensure the equality ", (llcolor4b == llcolor4a));	
+		F32 r1 = 0x2, g1 = 0xFF, b1 = 0xFA;
+		LLColor3 llcolor3(r1,g1,b1);
+		llcolor4b = llcolor3;
+		ensure("2:operator== failed to ensure the equality ", (llcolor4b == llcolor3));	
+		ensure("2:operator!= failed to ensure the equality ", (llcolor4a != llcolor3));
+	}
+
+	template<> template<>
+	void v4color_object::test<17>()
+	{
+		F32 r = 0x20, g = 0xFFFF, b = 0xFF;
+		LLColor4 llcolor4a(r,g,b),llcolor4b;
+		LLColor3 llcolor3 = vec4to3(llcolor4a);
+		ensure("vec4to3:Fail to convert vec4 to vec3 ",  (is_approx_equal(llcolor3.mV[VX],llcolor4a.mV[VX]) && is_approx_equal(llcolor3.mV[VY],llcolor4a.mV[VY]) && is_approx_equal(llcolor3.mV[VZ],llcolor4a.mV[VZ])));
+		llcolor4b = vec3to4(llcolor3);
+		ensure_equals("vec3to4:Fail to convert vec3 to vec4 ",  llcolor4b, llcolor4a);
+	}
+
+	template<> template<>
+	void v4color_object::test<18>()
+	{
+		F32 r1 = 0x20, g1 = 0xFFFF, b1 = 0xFF, val = 0x20;
+		F32 r2 = 0xABF, g2 = 0xFB, b2 = 0xFFF;
+		LLColor4 llcolor4a(r1,g1,b1),llcolor4b(r2,g2,b2),llcolor4c;
+		llcolor4c = lerp(llcolor4a,llcolor4b,val);
+		ensure("lerp:Fail ",  (is_approx_equal(r1 + (r2 - r1)* val,llcolor4c.mV[VX]) && is_approx_equal(g1 + (g2 - g1)* val,llcolor4c.mV[VY]) && is_approx_equal(b1 + (b2 - b1)* val,llcolor4c.mV[VZ])));
+	}
+
+	template<> template<>
+	void v4color_object::test<19>()
+	{
+		F32 r = 12.0f, g = -2.3f, b = 1.32f, a = 5.0f;
+		LLColor4 llcolor4a(r,g,b,a),llcolor4b;
+		const char *color = "red";
+		LLColor4::parseColor(color, &llcolor4b);
+		ensure_equals("1:parseColor() failed to parse the color value ", llcolor4b, LLColor4::red);
+
+		color = "12.0, -2.3, 1.32, 5.0";
+		LLColor4::parseColor(color, &llcolor4b);
+		llcolor4a = llcolor4a * (1.f / 255.f);
+		ensure_equals("2:parseColor() failed to parse the color value ",  llcolor4a,llcolor4b);
+
+		color = "yellow5";
+		llcolor4a.setVec(r,g,b);
+		LLColor4::parseColor(color, &llcolor4a);
+		ensure_equals("3:parseColor() failed to parse the color value ", llcolor4a, LLColor4::yellow5);
+	}
+
+	template<> template<>
+	void v4color_object::test<20>()
+	{
+		F32 r = 12.0f, g = -2.3f, b = 1.32f, a = 5.0f;
+		LLColor4 llcolor4a(r,g,b,a),llcolor4b;
+		const char *color = "12.0, -2.3, 1.32, 5.0";
+		LLColor4::parseColor4(color, &llcolor4b);
+		ensure_equals("parseColor4() failed to parse the color value ",  llcolor4a, llcolor4b);
+	}
+}
diff -uwN 2007-03-13-Patch2\linden\indra\test/v4coloru_tut.cpp 2007-03-13\linden\indra\test/v4coloru_tut.cpp
--- 2007-03-13-Patch2\linden\indra\test/v4coloru_tut.cpp	Wed Dec 31 16:00:00 1969
+++ 2007-03-13\linden\indra\test/v4coloru_tut.cpp	Fri Mar 30 01:54:06 2007
@@ -0,0 +1,251 @@
+/**
+ * @file v4coloru_tut.cpp
+ * @author Adroit
+ * @date March 2007
+ * @brief v4coloru test cases.
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+
+#include <tut/tut.h>
+#include "lltut.h"
+#include "linden_common.h"
+#include "llsd.h"
+#include "v4coloru.h"
+
+
+namespace tut
+{
+	struct v4coloru_data
+	{
+	};
+	typedef test_group<v4coloru_data> v4coloru_test;
+	typedef v4coloru_test::object v4coloru_object;
+	tut::v4coloru_test v4coloru_testcase("v4coloru");
+
+	template<> template<>
+	void v4coloru_object::test<1>()
+	{
+		LLColor4U llcolor4u;
+		ensure("1:LLColor4u:Fail to initialize ", ((0 == llcolor4u.mV[VX]) && (0 == llcolor4u.mV[VY]) && (0 == llcolor4u.mV[VZ])&& (255 == llcolor4u.mV[VW])));
+
+		U8 r = 0x12, g = 0xFF, b = 0xAF, a = 0x23;
+		LLColor4U llcolor4u1(r,g,b);
+		ensure("2:LLColor4u:Fail to initialize ", ((r == llcolor4u1.mV[VX]) && (g == llcolor4u1.mV[VY]) && (b == llcolor4u1.mV[VZ])&& (255 == llcolor4u1.mV[VW])));
+		
+		LLColor4U llcolor4u2(r,g,b,a);
+		ensure("3:LLColor4u:Fail to initialize ", ((r == llcolor4u2.mV[VX]) && (g == llcolor4u2.mV[VY]) && (b == llcolor4u2.mV[VZ])&& (a == llcolor4u2.mV[VW])));
+
+		const U8 vec[4] = {0x12,0xFF,0xAF,0x23};
+		LLColor4U llcolor4u3(vec);
+		ensure("4:LLColor4u:Fail to initialize ", ((vec[0] == llcolor4u3.mV[VX]) && (vec[1] == llcolor4u3.mV[VY]) && (vec[2] == llcolor4u3.mV[VZ])&& (vec[3] == llcolor4u3.mV[VW])));		
+
+		LLSD sd = llcolor4u3.getValue();
+		LLColor4U llcolor4u4(sd);
+		ensure_equals("5:LLColor4u (LLSD) Failed ", llcolor4u4, llcolor4u3);
+	}
+	
+	template<> template<>
+	void v4coloru_object::test<2>()
+	{
+		LLColor4U llcolor4ua(1, 2, 3, 4);
+		LLSD sd = llcolor4ua.getValue();
+		LLColor4U llcolor4u;
+		llcolor4u.setValue(sd);
+		ensure_equals("setValue(LLSD)/getValue Failed ", llcolor4u, llcolor4ua);
+	}
+
+	template<> template<>
+	void v4coloru_object::test<3>()
+	{
+		U8 r = 0x12, g = 0xFF, b = 0xAF, a = 0x23;
+		LLColor4U llcolor4u(r,g,b,a);
+		llcolor4u.setToBlack();
+		ensure("setToBlack:Fail to set black ", ((0 == llcolor4u.mV[VX]) && (0 == llcolor4u.mV[VY]) && (0 == llcolor4u.mV[VZ])&& (255 == llcolor4u.mV[VW])));
+
+		llcolor4u.setToWhite();
+		ensure("setToWhite:Fail to white ", ((255 == llcolor4u.mV[VX]) && (255 == llcolor4u.mV[VY]) && (255 == llcolor4u.mV[VZ])&& (255 == llcolor4u.mV[VW])));
+	}
+	
+	template<> template<>
+	void v4coloru_object::test<4>()
+	{
+		U8 r = 0x12, g = 0xFF, b = 0xAF, a = 0x23;
+		LLColor4U llcolor4ua(r,g,b,a);
+		LLSD sd = llcolor4ua.getValue();
+		LLColor4U llcolor4u = sd;
+		ensure_equals("Operator=(LLSD) Failed ",  llcolor4u, llcolor4ua);
+	}
+
+	template<> template<>
+	void v4coloru_object::test<5>()
+	{
+		U8 r = 0x12, g = 0xFF, b = 0xAF, a = 0x23;
+		LLColor4U llcolor4u;
+		llcolor4u.setVec(r,g,b,a);
+		ensure("1:setVec:Fail to set the values ", ((r == llcolor4u.mV[VX]) && (g == llcolor4u.mV[VY]) && (b == llcolor4u.mV[VZ])&& (a == llcolor4u.mV[VW])));
+
+		llcolor4u.setToBlack();
+		llcolor4u.setVec(r,g,b);
+		ensure("2:setVec:Fail to set the values ", ((r == llcolor4u.mV[VX]) && (g == llcolor4u.mV[VY]) && (b == llcolor4u.mV[VZ])&& (255 == llcolor4u.mV[VW])));
+
+		LLColor4U llcolor4u1;
+		llcolor4u1.setVec(llcolor4u);
+		ensure_equals("3:setVec:Fail to set the values ", llcolor4u1,llcolor4u);
+		
+		const U8 vec[4] = {0x12,0xFF,0xAF,0x23};
+		LLColor4U llcolor4u2;
+		llcolor4u2.setVec(vec);
+		ensure("4:setVec:Fail to set the values ", ((vec[0] == llcolor4u2.mV[VX]) && (vec[1] == llcolor4u2.mV[VY]) && (vec[2] == llcolor4u2.mV[VZ])&& (vec[3] == llcolor4u2.mV[VW])));		
+	}
+	
+	template<> template<>
+	void v4coloru_object::test<6>()
+	{
+		U8 alpha = 0x12;
+		LLColor4U llcolor4u;
+		llcolor4u.setAlpha(alpha);
+		ensure("setAlpha:Fail to set alpha value ", (alpha == llcolor4u.mV[VW]));
+	}
+	
+	template<> template<>
+	void v4coloru_object::test<7>()
+	{
+		U8 r = 0x12, g = 0xFF, b = 0xAF;
+		LLColor4U llcolor4u(r,g,b);
+		ensure("magVecSquared:Fail ", is_approx_equal(llcolor4u.magVecSquared(), (F32)(r*r + g*g + b*b)));
+		ensure("magVec:Fail ", is_approx_equal(llcolor4u.magVec(), fsqrtf(r*r + g*g + b*b)));
+	}
+
+	template<> template<>
+	void v4coloru_object::test<8>()
+	{
+		U8 r = 0x12, g = 0xFF, b = 0xAF;
+		std::ostringstream stream1, stream2;
+		LLColor4U llcolor4u1(r,g,b),llcolor4u2;
+		stream1 << llcolor4u1;
+		llcolor4u2.setVec(r,g,b);
+		stream2 << llcolor4u2;
+		ensure("operator << failed ", (stream1.str() == stream2.str()));	
+	}
+
+	template<> template<>
+	void v4coloru_object::test<9>()
+	{
+		U8 r1 = 0x12, g1 = 0xFF, b1 = 0xAF;
+		U8 r2 = 0x1C, g2 = 0x9A, b2 = 0x1B;
+		LLColor4U llcolor4u1(r1,g1,b1), llcolor4u2(r2,g2,b2),llcolor4u3;
+		llcolor4u3 = llcolor4u1 + llcolor4u2;
+		ensure("operator+:Fail to Add the values ",  ((r1+r2,llcolor4u3.mV[VX]) && (g1+g2,llcolor4u3.mV[VY]) && (b1+b2,llcolor4u3.mV[VZ])));
+
+		llcolor4u2 += llcolor4u1;
+		ensure("operator+=:Fail to Add the values ",  ((r1+r2,llcolor4u2.mV[VX]) && (g1+g2,llcolor4u2.mV[VY]) && (b1+b2,llcolor4u2.mV[VZ])));
+	}
+	
+	template<> template<>
+	void v4coloru_object::test<10>()
+	{
+		U8 r1 = 0x12, g1 = 0xFF, b1 = 0xAF;
+		U8 r2 = 0x1C, g2 = 0x9A, b2 = 0x1B;
+		LLColor4U llcolor4u1(r1,g1,b1), llcolor4u2(r2,g2,b2),llcolor4u3;
+		llcolor4u3 = llcolor4u1 - llcolor4u2;
+		ensure("operator-:Fail to Add the values ",  ((r1-r2,llcolor4u3.mV[VX]) && (g1-g2,llcolor4u3.mV[VY]) && (b1-b2,llcolor4u3.mV[VZ])));
+
+		llcolor4u1 -= llcolor4u2;
+		ensure("operator-=:Fail to Add the values ",  ((r1-r2,llcolor4u1.mV[VX]) && (g1-g2,llcolor4u1.mV[VY]) && (b1-b2,llcolor4u1.mV[VZ])));
+	}
+
+	template<> template<>
+	void v4coloru_object::test<11>()
+	{
+		U8 r1 = 0x12, g1 = 0xFF, b1 = 0xAF;
+		U8 r2 = 0x1C, g2 = 0x9A, b2 = 0x1B;
+		LLColor4U llcolor4u1(r1,g1,b1), llcolor4u2(r2,g2,b2),llcolor4u3;
+		llcolor4u3 = llcolor4u1 * llcolor4u2;
+		ensure("operator*:Fail to multiply the values",  ((r1*r2,llcolor4u3.mV[VX]) && (g1*g2,llcolor4u3.mV[VY]) && (b1*b2,llcolor4u3.mV[VZ])));
+		
+		U8 mulVal = 123;
+		llcolor4u1 *= mulVal;
+		ensure("operator*=:Fail to multiply the values",  ((r1*mulVal,llcolor4u1.mV[VX]) && (g1*mulVal,llcolor4u1.mV[VY]) && (b1*mulVal,llcolor4u1.mV[VZ])));
+	}
+
+	template<> template<>
+	void v4coloru_object::test<12>()
+	{
+		U8 r = 0x12, g = 0xFF, b = 0xAF;
+		LLColor4U llcolor4u(r,g,b),llcolor4u1;
+		llcolor4u1 = llcolor4u;
+		ensure("operator== failed to ensure the equality ", (llcolor4u1 == llcolor4u));	
+		llcolor4u1.setToBlack();
+		ensure("operator!= failed to ensure the equality ", (llcolor4u1 != llcolor4u));	
+	}
+
+	template<> template<>
+	void v4coloru_object::test<13>()
+	{
+		U8 r = 0x12, g = 0xFF, b = 0xAF, a = 12;
+		LLColor4U llcolor4u(r,g,b);
+		U8 modVal = 45;
+		llcolor4u %= modVal;
+		ensure("operator%=:Fail ",  ((a*modVal,llcolor4u.mV[VW])));
+	}
+
+	template<> template<>
+	void v4coloru_object::test<14>()
+	{
+		U8 r = 0x12, g = 0xFF, b = 0xAF, a = 12;
+		LLColor4U llcolor4u1(r,g,b,a);
+		const char *color = "12, 23, 132, 50";
+		LLColor4U::parseColor4U(color, &llcolor4u1);
+		ensure("parseColor4U() failed to parse the color value ", ((12 == llcolor4u1.mV[VX]) && (23 == llcolor4u1.mV[VY]) && (132 == llcolor4u1.mV[VZ])&& (50 == llcolor4u1.mV[VW])));
+
+		color = "12, 23, 132";
+		ensure("2:parseColor4U() failed to parse the color value ",  (FALSE == LLColor4U::parseColor4U(color, &llcolor4u1)));
+
+		color = "12";
+		ensure("2:parseColor4U() failed to parse the color value ",  (FALSE == LLColor4U::parseColor4U(color, &llcolor4u1)));
+	}
+
+	template<> template<>
+	void v4coloru_object::test<15>()
+	{
+		U8 r = 12, g = 123, b = 3, a = 2;
+		LLColor4U llcolor4u(r,g,b,a),llcolor4u1;
+		const F32 fVal = 3.f;
+		llcolor4u1 = llcolor4u.multAll(fVal);
+		ensure("multAll:Fail to multiply ", (((U8)llround(r * fVal) == llcolor4u1.mV[VX]) && (U8)llround(g * fVal) == llcolor4u1.mV[VY]
+											&& ((U8)llround(b * fVal) == llcolor4u1.mV[VZ])&& ((U8)llround(a * fVal) == llcolor4u1.mV[VW])));		
+	}
+
+	template<> template<>
+	void v4coloru_object::test<16>()
+	{
+		U8 r1 = 12, g1 = 123, b1 = 3, a1 = 2;
+		U8 r2 = 23, g2 = 230, b2 = 124, a2 = 255;
+		LLColor4U llcolor4u(r1,g1,b1,a1),llcolor4u1(r2,g2,b2,a2);
+		llcolor4u1 = llcolor4u1.addClampMax(llcolor4u);
+		ensure("1:addClampMax():Fail to add the value ",  ((r1+r2 == llcolor4u1.mV[VX]) && (255 == llcolor4u1.mV[VY]) && (b1+b2 == llcolor4u1.mV[VZ])&& (255 == llcolor4u1.mV[VW])));
+
+		r1 = 132, g1 = 3, b1 = 3, a1 = 2;
+		r2 = 123, g2 = 230, b2 = 154, a2 = 25;
+		LLColor4U llcolor4u2(r1,g1,b1,a1),llcolor4u3(r2,g2,b2,a2);
+		llcolor4u3 = llcolor4u3.addClampMax(llcolor4u2);
+		ensure("2:addClampMax():Fail to add the value ",  ((255 == llcolor4u3.mV[VX]) && (g1+g2 == llcolor4u3.mV[VY]) && (b1+b2 == llcolor4u3.mV[VZ])&& (a1+a2 == llcolor4u3.mV[VW])));
+	}
+
+	template<> template<>
+	void v4coloru_object::test<17>()
+	{
+		F32 r = 23.f, g = 12.32f, b = -12.3f;
+		LLColor3 color3(r,g,b);
+		LLColor4U llcolor4u;
+		llcolor4u.setVecScaleClamp(color3);
+		const S32 MAX_COLOR = 255;
+		F32 color_scale_factor = MAX_COLOR/r;
+		S32 r2 = llround(r * color_scale_factor);
+		S32 g2 = llround(g * color_scale_factor);
+		ensure("setVecScaleClamp():Fail to add the value ",  ((r2 == llcolor4u.mV[VX]) && (g2 == llcolor4u.mV[VY]) && (0 == llcolor4u.mV[VZ])&& (255 == llcolor4u.mV[VW])));
+	}
+}


More information about the SLDev mailing list