From 35e200881c38eb6c1bfd1f14ef440d4bc4da8c74 Mon Sep 17 00:00:00 2001
From: Xiaohong Bao <bao@lindenlab.com>
Date: Fri, 6 Nov 2009 06:52:24 +0000
Subject: merge QAR-1829: texture pipeline branch in viewer-2.0.0.3

---
 indra/newview/tests/lltextureinfo_test.cpp         | 284 +++++++++++
 indra/newview/tests/lltextureinfodetails_test.cpp  |  98 ++++
 .../newview/tests/lltexturestatsuploader_test.cpp  | 156 ++++++
 indra/newview/tests/llworldmap_test.cpp            | 523 +++++++++++++++++++++
 indra/newview/tests/llworldmipmap_test.cpp         | 176 +++++++
 5 files changed, 1237 insertions(+)
 create mode 100644 indra/newview/tests/lltextureinfo_test.cpp
 create mode 100644 indra/newview/tests/lltextureinfodetails_test.cpp
 create mode 100644 indra/newview/tests/lltexturestatsuploader_test.cpp
 create mode 100644 indra/newview/tests/llworldmap_test.cpp
 create mode 100644 indra/newview/tests/llworldmipmap_test.cpp

(limited to 'indra/newview/tests')

diff --git a/indra/newview/tests/lltextureinfo_test.cpp b/indra/newview/tests/lltextureinfo_test.cpp
new file mode 100644
index 0000000000..8dfba46262
--- /dev/null
+++ b/indra/newview/tests/lltextureinfo_test.cpp
@@ -0,0 +1,284 @@
+/** 
+ * @file llwtextureinfo_test.cpp
+ * @author Si & Gabriel
+ * @date 2009-03-30
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ * 
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header: almost always required for newview cpp files
+#include "../llviewerprecompiledheaders.h"
+// Class to test
+#include "../lltextureinfo.h"
+// Dependencies
+#include "../lltextureinfodetails.cpp"
+
+// Tut header
+#include "../test/lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes: 
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+
+namespace tut
+{
+	// Test wrapper declarations
+	struct textureinfo_test
+	{
+		// Constructor and destructor of the test wrapper
+		textureinfo_test()
+		{
+		}
+		~textureinfo_test()
+		{
+		}
+	};
+
+	// Tut templating thingamagic: test group, object and test instance
+	typedef test_group<textureinfo_test> textureinfo_t;
+	typedef textureinfo_t::object textureinfo_object_t;
+	tut::textureinfo_t tut_textureinfo("textureinfo");
+
+	
+	// ---------------------------------------------------------------------------------------
+	// Test functions
+	// Notes:
+	// * Test as many as you possibly can without requiring a full blown simulation of everything
+	// * The tests are executed in sequence so the test instance state may change between calls
+	// * Remember that you cannot test private methods with tut
+	// ---------------------------------------------------------------------------------------
+
+	// ---------------------------------------------------------------------------------------
+	// Test the LLTextureInfo
+	// ---------------------------------------------------------------------------------------
+
+
+	// Test instantiation
+	template<> template<>
+	void textureinfo_object_t::test<1>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+		ensure("have we crashed?", true);
+	}
+
+	// Check lltextureinfo does not contain UUIDs we haven't added
+	template<> template<>
+	void textureinfo_object_t::test<2>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+
+		LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1");
+		ensure(!tex_info.has(nonExistant));
+	}
+
+	// Check we can add a request time for a texture
+	template<> template<>
+	void textureinfo_object_t::test<3>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+
+		LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3");
+		tex_info.setRequestStartTime(id, 200);
+
+		ensure_equals(tex_info.getRequestStartTime(id), 200);
+	}
+
+	// Check time for non-existant texture
+	template<> template<>
+	void textureinfo_object_t::test<4>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+
+		LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1");
+		ensure_equals(tex_info.getRequestStartTime(nonExistant), 0);
+	}
+
+	// Check download complete time for non existant texture
+	template<> template<>
+	void textureinfo_object_t::test<5>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+
+		LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1");
+		ensure_equals(tex_info.getRequestCompleteTime(nonExistant), 0);
+	}
+
+	// requested size is passed in correctly
+	template<> template<>
+	void textureinfo_object_t::test<6>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+
+		LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3");
+		tex_info.setRequestSize(id, 600);
+
+		ensure_equals(tex_info.getRequestSize(id), 600);
+	}
+
+	// transport type is recorded correctly (http)
+	template<> template<>
+	void textureinfo_object_t::test<7>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+
+		LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3");
+		tex_info.setRequestType(id, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+
+		ensure_equals(tex_info.getRequestType(id), LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+	}
+
+	// transport type is recorded correctly (udp)
+	template<> template<>
+	void textureinfo_object_t::test<8>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+
+		LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3");
+		tex_info.setRequestType(id, LLTextureInfoDetails::REQUEST_TYPE_UDP);
+
+		ensure_equals(tex_info.getRequestType(id), LLTextureInfoDetails::REQUEST_TYPE_UDP);
+	}
+
+	// request offset is recorded correctly
+	template<> template<>
+	void textureinfo_object_t::test<9>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+
+		LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3");
+		tex_info.setRequestOffset(id, 1234);
+
+		ensure_equals(tex_info.getRequestOffset(id), 1234);
+	}
+
+	// ask for averages gives us correct figure
+	template<> template<>
+	void textureinfo_object_t::test<10>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+
+		S32 requestStartTimeOne = 200;
+		S32 requestEndTimeOne = 400;
+		S32 requestSizeOne = 1024;
+		S32 requestSizeOneBits = requestSizeOne * 8;
+		LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3");
+		tex_info.setRequestStartTime(id1, requestStartTimeOne);
+		tex_info.setRequestSize(id1, requestSizeOne);
+		tex_info.setRequestType(id1, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+		tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne);
+
+		U32 requestStartTimeTwo = 100;
+		U32 requestEndTimeTwo = 500;
+		U32 requestSizeTwo = 2048;
+		S32 requestSizeTwoBits = requestSizeTwo * 8;
+		LLUUID id2("10e65d70-46fd-429f-841a-bf698e9424d4");
+		tex_info.setRequestStartTime(id2, requestStartTimeTwo);
+		tex_info.setRequestSize(id2, requestSizeTwo);
+		tex_info.setRequestType(id2, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+		tex_info.setRequestCompleteTimeAndLog(id2, requestEndTimeTwo);
+
+		S32 averageBitRate = ((requestSizeOneBits/(requestEndTimeOne - requestStartTimeOne)) +
+							(requestSizeTwoBits/(requestEndTimeTwo - requestStartTimeTwo))) / 2;
+
+		S32 totalBytes = requestSizeOne + requestSizeTwo;
+
+		LLSD results = tex_info.getAverages();
+		ensure_equals("is average bits per second correct", results["bits_per_second"].asInteger(), averageBitRate);
+		ensure_equals("is total bytes is correct", results["bytes_downloaded"].asInteger(), totalBytes);
+		ensure_equals("is transport correct", results["transport"].asString(), std::string("HTTP"));
+	}
+
+	// make sure averages cleared when reset is called
+	template<> template<>
+	void textureinfo_object_t::test<11>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+
+		S32 requestStartTimeOne = 200;
+		S32 requestEndTimeOne = 400;
+		S32 requestSizeOne = 1024;
+		LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3");
+		tex_info.setRequestStartTime(id1, requestStartTimeOne);
+		tex_info.setRequestSize(id1, requestSizeOne);
+		tex_info.setRequestType(id1, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+		tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne);
+
+		tex_info.getAverages();
+		tex_info.reset();
+		LLSD results = tex_info.getAverages();
+		ensure_equals("is average bits per second correct", results["bits_per_second"].asInteger(), 0);
+		ensure_equals("is total bytes is correct", results["bytes_downloaded"].asInteger(), 0);
+		ensure_equals("is transport correct", results["transport"].asString(), std::string("NONE"));
+	}
+
+	// make sure map item removed when expired
+	template<> template<>
+	void textureinfo_object_t::test<12>()
+	{
+		LLTextureInfo tex_info;
+		tex_info.setUpLogging(true, true);
+
+		S32 requestStartTimeOne = 200;
+		S32 requestEndTimeOne = 400;
+		S32 requestSizeOne = 1024;
+		LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3");
+		tex_info.setRequestStartTime(id1, requestStartTimeOne);
+		tex_info.setRequestSize(id1, requestSizeOne);
+		tex_info.setRequestType(id1, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
+
+		ensure_equals("map item created", tex_info.getTextureInfoMapSize(), 1);
+
+		tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne);
+
+		ensure_equals("map item removed when consumed", tex_info.getTextureInfoMapSize(), 0);
+	}
+}
+
diff --git a/indra/newview/tests/lltextureinfodetails_test.cpp b/indra/newview/tests/lltextureinfodetails_test.cpp
new file mode 100644
index 0000000000..aa2697fb8e
--- /dev/null
+++ b/indra/newview/tests/lltextureinfodetails_test.cpp
@@ -0,0 +1,98 @@
+/** 
+ * @file llwtextureinfodetails_test.cpp
+ * @author Si & Gabriel
+ * @date 2009-03-30
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ * 
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header: almost always required for newview cpp files
+#include "../llviewerprecompiledheaders.h"
+// Class to test
+#include "../lltextureinfodetails.h"
+// Dependencies
+
+// Tut header
+#include "../test/lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes: 
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+
+namespace tut
+{
+	// Test wrapper declarations
+	struct textureinfodetails_test
+	{
+		// Constructor and destructor of the test wrapper
+		textureinfodetails_test()
+		{
+		}
+		~textureinfodetails_test()
+		{
+		}
+	};
+
+	// Tut templating thingamagic: test group, object and test instance
+	typedef test_group<textureinfodetails_test> textureinfodetails_t;
+	typedef textureinfodetails_t::object textureinfodetails_object_t;
+	tut::textureinfodetails_t tut_textureinfodetails("textureinfodetails");
+
+	
+	// ---------------------------------------------------------------------------------------
+	// Test functions
+	// Notes:
+	// * Test as many as you possibly can without requiring a full blown simulation of everything
+	// * The tests are executed in sequence so the test instance state may change between calls
+	// * Remember that you cannot test private methods with tut
+	// ---------------------------------------------------------------------------------------
+
+	// ---------------------------------------------------------------------------------------
+	// Test the LLTextureInfo
+	// ---------------------------------------------------------------------------------------
+
+
+	// Test instantiation
+	template<> template<>
+	void textureinfodetails_object_t::test<1>()
+	{
+		ensure("have we crashed?", true);
+	}
+}
diff --git a/indra/newview/tests/lltexturestatsuploader_test.cpp b/indra/newview/tests/lltexturestatsuploader_test.cpp
new file mode 100644
index 0000000000..77a3e2c3d8
--- /dev/null
+++ b/indra/newview/tests/lltexturestatsuploader_test.cpp
@@ -0,0 +1,156 @@
+/** 
+ * @file lltexturestatsuploader_test.cpp
+ * @author Si
+ * @date 2009-05-27
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ * 
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header: almost always required for newview cpp files
+#include "../llviewerprecompiledheaders.h"
+// Class to test
+#include "../lltexturestatsuploader.h"
+// Dependencies
+
+// Tut header
+#include "../test/lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes: 
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+#include "boost/intrusive_ptr.hpp"
+void boost::intrusive_ptr_add_ref(LLCurl::Responder*){}
+void boost::intrusive_ptr_release(LLCurl::Responder* p){}
+const F32 HTTP_REQUEST_EXPIRY_SECS = 0.0f;
+
+static std::string most_recent_url;
+static LLSD most_recent_body;
+
+void LLHTTPClient::post(
+		const std::string& url,
+		const LLSD& body,
+		ResponderPtr,
+		const LLSD& headers,
+		const F32 timeout)
+{
+	// set some sensor code
+	most_recent_url = url;
+	most_recent_body = body;
+	return;
+}
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+
+namespace tut
+{
+	// Test wrapper declarations
+	struct texturestatsuploader_test
+	{
+		// Constructor and destructor of the test wrapper
+		texturestatsuploader_test()
+		{
+			most_recent_url = "some sort of default text that should never match anything the tests are expecting!";
+			LLSD blank_llsd;
+			most_recent_body = blank_llsd;
+		}
+		~texturestatsuploader_test()
+		{
+		}
+	};
+
+	// Tut templating thingamagic: test group, object and test instance
+	typedef test_group<texturestatsuploader_test> texturestatsuploader_t;
+	typedef texturestatsuploader_t::object texturestatsuploader_object_t;
+	tut::texturestatsuploader_t tut_texturestatsuploader("texturestatsuploader");
+
+	
+	// ---------------------------------------------------------------------------------------
+	// Test functions
+	// Notes:
+	// * Test as many as you possibly can without requiring a full blown simulation of everything
+	// * The tests are executed in sequence so the test instance state may change between calls
+	// * Remember that you cannot test private methods with tut
+	// ---------------------------------------------------------------------------------------
+
+	// ---------------------------------------------------------------------------------------
+	// Test the LLTextureInfo
+	// ---------------------------------------------------------------------------------------
+
+
+	// Test instantiation
+	template<> template<>
+	void texturestatsuploader_object_t::test<1>()
+	{
+		LLTextureStatsUploader tsu;
+		llinfos << &tsu << llendl;
+		ensure("have we crashed?", true);
+	}
+
+	// does it call out to the provided url if we ask it to?
+	template<> template<>
+	void texturestatsuploader_object_t::test<2>()
+	{	
+		LLTextureStatsUploader tsu;
+		std::string url = "http://blahblahblah";
+		LLSD texture_stats;
+		tsu.uploadStatsToSimulator(url, texture_stats);
+		ensure_equals("did the right url get called?", most_recent_url, url);
+		ensure_equals("did the right body get sent?", most_recent_body, texture_stats);
+	}
+
+	// does it not call out to the provided url if we send it an ungranted cap?
+	template<> template<>
+	void texturestatsuploader_object_t::test<3>()
+	{	
+		LLTextureStatsUploader tsu;
+
+		// this url left intentionally blank to mirror
+		// not getting a cap in the caller.
+		std::string url_for_ungranted_cap = ""; 
+							  
+		LLSD texture_stats;
+		std::string most_recent_url_before_test = most_recent_url;
+		tsu.uploadStatsToSimulator(url_for_ungranted_cap, texture_stats);
+
+		ensure_equals("hopefully no url got called!", most_recent_url, most_recent_url_before_test);
+	}
+
+	// does it call out if the data is empty?
+	// should it even do that?
+}
+
diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp
new file mode 100644
index 0000000000..56cf86f6df
--- /dev/null
+++ b/indra/newview/tests/llworldmap_test.cpp
@@ -0,0 +1,523 @@
+/** 
+ * @file llworldmap_test.cpp
+ * @author Merov Linden
+ * @date 2009-03-09
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ * 
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header: almost always required for newview cpp files
+#include "../llviewerprecompiledheaders.h"
+// Class to test
+#include "../llworldmap.h"
+// Dependencies
+#include "../llviewerimagelist.h"
+#include "../llworldmapmessage.h"
+// Tut header
+#include "../test/lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes: 
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+// Stub image calls
+LLViewerImageList::LLViewerImageList() { }
+LLViewerImageList::~LLViewerImageList() { }
+LLViewerImageList gImageList;
+LLViewerImage* LLViewerImageList::getImage(const LLUUID &image_id,
+												   BOOL usemipmaps,
+												   BOOL level_immediate,
+												   LLGLint internal_format,
+												   LLGLenum primary_format,
+												   LLHost request_from_host)
+{ return NULL; }
+void LLViewerImage::setBoostLevel(S32 level) { }
+void LLImageGL::setAddressMode(LLTexUnit::eTextureAddressMode mode) { }
+
+// Stub related map calls
+LLWorldMapMessage::LLWorldMapMessage() { }
+LLWorldMapMessage::~LLWorldMapMessage() { }
+void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle) { }
+void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent) { }
+LLWorldMipmap::LLWorldMipmap() { }
+LLWorldMipmap::~LLWorldMipmap() { }
+void LLWorldMipmap::reset() { }
+void LLWorldMipmap::dropBoostLevels() { }
+void LLWorldMipmap::equalizeBoostLevels() { }
+LLPointer<LLViewerImage> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load)
+{ return NULL; }
+
+// Stub other stuff
+BOOL gPacificDaylightTime;
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+
+const F32 X_WORLD_TEST = 1000.0f * REGION_WIDTH_METERS;
+const F32 Y_WORLD_TEST = 2000.0f * REGION_WIDTH_METERS;
+const F32 Z_WORLD_TEST = 240.0f;
+const std::string ITEM_NAME_TEST = "Item Foo";
+const std::string TOOLTIP_TEST = "Tooltip Foo";
+
+const std::string SIM_NAME_TEST = "Sim Foo";
+
+namespace tut
+{
+	// Test wrapper declarations
+	struct iteminfo_test
+	{
+		// Instance to be tested
+		LLItemInfo* mItem;
+
+		// Constructor and destructor of the test wrapper
+		iteminfo_test()
+		{
+			LLUUID id;
+			mItem = new LLItemInfo(X_WORLD_TEST, Y_WORLD_TEST, ITEM_NAME_TEST, id);
+		}
+		~iteminfo_test()
+		{
+			delete mItem;
+		}
+	};
+
+	struct siminfo_test
+	{
+		// Instance to be tested
+		LLSimInfo* mSim;
+
+		// Constructor and destructor of the test wrapper
+		siminfo_test()
+		{
+			U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST);
+			mSim = new LLSimInfo(handle);
+		}
+		~siminfo_test()
+		{
+			delete mSim;
+		}
+	};
+
+	struct worldmap_test
+	{
+		// Instance to be tested
+		LLWorldMap* mWorld;
+
+		// Constructor and destructor of the test wrapper
+		worldmap_test()
+		{
+			mWorld = LLWorldMap::getInstance();
+		}
+		~worldmap_test()
+		{
+			mWorld = NULL;
+		}
+	};
+
+	// Tut templating thingamagic: test group, object and test instance
+	typedef test_group<iteminfo_test> iteminfo_t;
+	typedef iteminfo_t::object iteminfo_object_t;
+	tut::iteminfo_t tut_iteminfo("iteminfo");
+
+	typedef test_group<siminfo_test> siminfo_t;
+	typedef siminfo_t::object siminfo_object_t;
+	tut::siminfo_t tut_siminfo("siminfo");
+
+	typedef test_group<worldmap_test> worldmap_t;
+	typedef worldmap_t::object worldmap_object_t;
+	tut::worldmap_t tut_worldmap("worldmap");
+
+	// ---------------------------------------------------------------------------------------
+	// Test functions
+	// Notes:
+	// * Test as many as you possibly can without requiring a full blown simulation of everything
+	// * The tests are executed in sequence so the test instance state may change between calls
+	// * Remember that you cannot test private methods with tut
+	// ---------------------------------------------------------------------------------------
+
+	// ---------------------------------------------------------------------------------------
+	// Test the LLItemInfo interface
+	// ---------------------------------------------------------------------------------------
+	template<> template<>
+	void iteminfo_object_t::test<1>()
+	{
+		// Test 1 : setCount() / getCount()
+		mItem->setCount(10);
+		ensure("LLItemInfo::setCount() test failed", mItem->getCount() == 10);
+		// Test 2 : setTooltip() / getToolTip()
+		std::string tooltip = TOOLTIP_TEST;
+		mItem->setTooltip(tooltip);
+		ensure("LLItemInfo::setTooltip() test failed", mItem->getToolTip() == TOOLTIP_TEST);
+		// Test 3 : setElevation() / getGlobalPosition()
+		mItem->setElevation(Z_WORLD_TEST);
+		LLVector3d pos = mItem->getGlobalPosition();
+		LLVector3d ref(X_WORLD_TEST, Y_WORLD_TEST, Z_WORLD_TEST);
+		ensure("LLItemInfo::getGlobalPosition() test failed", pos == ref);
+		// Test 4 : getName()
+		std::string name = mItem->getName();
+		ensure("LLItemInfo::getName() test failed", name == ITEM_NAME_TEST);
+		// Test 5 : isName()
+		ensure("LLItemInfo::isName() test failed", mItem->isName(name));
+		// Test 6 : getUUID()
+		LLUUID id;
+		ensure("LLItemInfo::getUUID() test failed", mItem->getUUID() == id);
+		// Test 7 : getRegionHandle()
+		U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST);
+		ensure("LLItemInfo::getRegionHandle() test failed", mItem->getRegionHandle() == handle);
+	}
+	// ---------------------------------------------------------------------------------------
+	// Test the LLSimInfo interface
+	// ---------------------------------------------------------------------------------------
+	// Test Setters and Accessors methods
+	template<> template<>
+	void siminfo_object_t::test<1>()
+	{
+		// Test 1 : setName() / getName()
+		std::string name = SIM_NAME_TEST;
+		mSim->setName(name);
+		ensure("LLSimInfo::setName() test failed", mSim->getName() == SIM_NAME_TEST);
+		// Test 2 : isName()
+		ensure("LLSimInfo::isName() test failed", mSim->isName(name));
+		// Test 3 : getGlobalPos()
+		LLVector3 local;
+		LLVector3d ref(X_WORLD_TEST, Y_WORLD_TEST, 0.0f);
+		LLVector3d pos = mSim->getGlobalPos(local);
+		ensure("LLSimInfo::getGlobalPos() test failed", pos == ref);
+		// Test 4 : getGlobalOrigin()
+		pos = mSim->getGlobalOrigin();
+		ensure("LLSimInfo::getGlobalOrigin() test failed", pos == ref);
+		// Test 5 : clearImage()
+		try {
+			mSim->clearImage();
+		} catch (...) {
+			fail("LLSimInfo::clearImage() test failed");
+		}
+		// Test 6 : dropImagePriority()
+		try {
+			mSim->dropImagePriority();
+		} catch (...) {
+			fail("LLSimInfo::dropImagePriority() test failed");
+		}
+		// Test 7 : updateAgentCount()
+		try {
+			mSim->updateAgentCount(0.0f);
+		} catch (...) {
+			fail("LLSimInfo::updateAgentCount() test failed");
+		}
+		// Test 8 : getAgentCount()
+		S32 agents = mSim->getAgentCount();
+		ensure("LLSimInfo::getAgentCount() test failed", agents == 0);
+		// Test 9 : setLandForSaleImage() / getLandForSaleImage()
+		LLUUID id;
+		mSim->setLandForSaleImage(id);
+		LLPointer<LLViewerImage> image = mSim->getLandForSaleImage();
+		ensure("LLSimInfo::getLandForSaleImage() test failed", image.isNull());
+		// Test 10 : isPG()
+		mSim->setAccess(SIM_ACCESS_PG);
+		ensure("LLSimInfo::isPG() test failed", mSim->isPG());
+		// Test 11 : isDown()
+		mSim->setAccess(SIM_ACCESS_DOWN);
+		ensure("LLSimInfo::isDown() test failed", mSim->isDown());
+		// Test 12 : Access strings can't be accessed from unit test...
+		//ensure("LLSimInfo::getAccessString() test failed", mSim->getAccessString() == "Offline");
+		// Test 13 : Region strings can't be accessed from unit test...
+		//mSim->setRegionFlags(REGION_FLAGS_SANDBOX);
+		//ensure("LLSimInfo::setRegionFlags() test failed", mSim->getFlagsString() == "Sandbox");
+	}
+	// Test management of LLInfoItem lists
+	template<> template<>
+	void siminfo_object_t::test<2>()
+	{
+		// Test 14 : clearItems()
+		try {
+			mSim->clearItems();
+		} catch (...) {
+			fail("LLSimInfo::clearItems() at init test failed");
+		}
+
+		// Test 15 : Verify that all the lists are empty
+		LLSimInfo::item_info_list_t list;
+		list = mSim->getTeleHub();
+		ensure("LLSimInfo::getTeleHub() empty at init test failed", list.empty());
+		list = mSim->getInfoHub();
+		ensure("LLSimInfo::getInfoHub() empty at init test failed", list.empty());
+		list = mSim->getPGEvent();
+		ensure("LLSimInfo::getPGEvent() empty at init test failed", list.empty());
+		list = mSim->getMatureEvent();
+		ensure("LLSimInfo::getMatureEvent() empty at init test failed", list.empty());
+		list = mSim->getLandForSale();
+		ensure("LLSimInfo::getLandForSale() empty at init test failed", list.empty());
+		list = mSim->getAgentLocation();
+		ensure("LLSimInfo::getAgentLocation() empty at init test failed", list.empty());
+
+		// Create an item to be inserted
+		LLUUID id;
+		LLItemInfo item(X_WORLD_TEST, Y_WORLD_TEST, ITEM_NAME_TEST, id);
+
+		// Insert the item in each list
+		mSim->insertTeleHub(item);
+		mSim->insertInfoHub(item);
+		mSim->insertPGEvent(item);
+		mSim->insertMatureEvent(item);
+		mSim->insertLandForSale(item);
+		mSim->insertAgentLocation(item);
+
+		// Test 16 : Verify that the lists contain 1 item each
+		list = mSim->getTeleHub();
+		ensure("LLSimInfo::insertTeleHub() test failed", list.size() == 1);
+		list = mSim->getInfoHub();
+		ensure("LLSimInfo::insertInfoHub() test failed", list.size() == 1);
+		list = mSim->getPGEvent();
+		ensure("LLSimInfo::insertPGEvent() test failed", list.size() == 1);
+		list = mSim->getMatureEvent();
+		ensure("LLSimInfo::insertMatureEvent() test failed", list.size() == 1);
+		list = mSim->getLandForSale();
+		ensure("LLSimInfo::insertLandForSale() test failed", list.size() == 1);
+		list = mSim->getAgentLocation();
+		ensure("LLSimInfo::insertAgentLocation() test failed", list.size() == 1);
+
+		// Test 17 : clearItems()
+		try {
+			mSim->clearItems();
+		} catch (...) {
+			fail("LLSimInfo::clearItems() at end test failed");
+		}
+
+		// Test 18 : Verify that all the lists are empty again... *except* agent which is persisted!! (on purpose)
+		list = mSim->getTeleHub();
+		ensure("LLSimInfo::getTeleHub() empty after clear test failed", list.empty());
+		list = mSim->getInfoHub();
+		ensure("LLSimInfo::getInfoHub() empty after clear test failed", list.empty());
+		list = mSim->getPGEvent();
+		ensure("LLSimInfo::getPGEvent() empty after clear test failed", list.empty());
+		list = mSim->getMatureEvent();
+		ensure("LLSimInfo::getMatureEvent() empty after clear test failed", list.empty());
+		list = mSim->getLandForSale();
+		ensure("LLSimInfo::getLandForSale() empty after clear test failed", list.empty());
+		list = mSim->getAgentLocation();
+		ensure("LLSimInfo::getAgentLocation() empty after clear test failed", list.size() == 1);
+	}
+
+	// ---------------------------------------------------------------------------------------
+	// Test the LLWorldMap interface
+	// ---------------------------------------------------------------------------------------
+	// Test Setters and Accessors methods
+	template<> template<>
+	void worldmap_object_t::test<1>()
+	{
+		// Test 1 : reset()
+		try {
+			mWorld->reset();
+		} catch (...) {
+			fail("LLWorldMap::reset() at init test failed");
+		}
+		// Test 2 : clearImageRefs()
+		try {
+			mWorld->clearImageRefs();
+		} catch (...) {
+			fail("LLWorldMap::clearImageRefs() test failed");
+		}
+		// Test 3 : dropImagePriorities()
+		try {
+			mWorld->dropImagePriorities();
+		} catch (...) {
+			fail("LLWorldMap::dropImagePriorities() test failed");
+		}
+		// Test 4 : reloadItems()
+		try {
+			mWorld->reloadItems(true);
+		} catch (...) {
+			fail("LLWorldMap::reloadItems() test failed");
+		}
+		// Test 5 : updateRegions()
+		try {
+			mWorld->updateRegions(1000, 1000, 1004, 1004);
+		} catch (...) {
+			fail("LLWorldMap::updateRegions() test failed");
+		}
+		// Test 6 : equalizeBoostLevels()
+ 		try {
+ 			mWorld->equalizeBoostLevels();
+ 		} catch (...) {
+ 			fail("LLWorldMap::equalizeBoostLevels() test failed");
+ 		}
+		// Test 7 : getObjectsTile()
+		try {
+			LLPointer<LLViewerImage> image = mWorld->getObjectsTile((U32)(X_WORLD_TEST/REGION_WIDTH_METERS), (U32)(Y_WORLD_TEST/REGION_WIDTH_METERS), 1);
+			ensure("LLWorldMap::getObjectsTile() failed", image.isNull());
+		} catch (...) {
+			fail("LLWorldMap::getObjectsTile() test failed with exception");
+		}
+	}
+	// Test management of LLSimInfo lists
+	template<> template<>
+	void worldmap_object_t::test<2>()
+	{
+		// Test 8 : reset()
+		try {
+			mWorld->reset();
+		} catch (...) {
+			fail("LLWorldMap::reset() at init test failed");
+		}
+
+		// Test 9 : Verify that all the region list is empty
+		LLWorldMap::sim_info_map_t list;
+		list = mWorld->getRegionMap();
+		ensure("LLWorldMap::getRegionMap() empty at init test failed", list.empty());
+
+		// Test 10 : Insert a region
+		bool success;
+		LLUUID id;
+		std::string name_sim = SIM_NAME_TEST;
+		success = mWorld->insertRegion(	U32(X_WORLD_TEST), 
+						U32(Y_WORLD_TEST), 
+										name_sim,
+										id,
+										SIM_ACCESS_PG,
+										REGION_FLAGS_SANDBOX);
+		list = mWorld->getRegionMap();
+		ensure("LLWorldMap::insertRegion() failed", success && (list.size() == 1));
+
+		// Test 11 : Insert an item in the same region -> number of regions doesn't increase
+		std::string name_item = ITEM_NAME_TEST;
+		success = mWorld->insertItem(	U32(X_WORLD_TEST + REGION_WIDTH_METERS/2),
+						U32(Y_WORLD_TEST + REGION_WIDTH_METERS/2), 
+										name_item,
+										id,
+										MAP_ITEM_LAND_FOR_SALE,
+										0, 0);
+		list = mWorld->getRegionMap();
+		ensure("LLWorldMap::insertItem() in existing region failed", success && (list.size() == 1));
+
+		// Test 12 : Insert an item in another region -> number of regions increases
+		success = mWorld->insertItem(	U32(X_WORLD_TEST + REGION_WIDTH_METERS*2), 
+						U32(Y_WORLD_TEST + REGION_WIDTH_METERS*2), 
+										name_item,
+										id,
+										MAP_ITEM_LAND_FOR_SALE,
+										0, 0);
+		list = mWorld->getRegionMap();
+		ensure("LLWorldMap::insertItem() in unexisting region failed", success && (list.size() == 2));
+
+		// Test 13 : simInfoFromPosGlobal() in region
+		LLVector3d pos1(	X_WORLD_TEST + REGION_WIDTH_METERS*2 + REGION_WIDTH_METERS/2, 
+							Y_WORLD_TEST + REGION_WIDTH_METERS*2 + REGION_WIDTH_METERS/2, 
+							0.0f);
+		LLSimInfo* sim;
+		sim = mWorld->simInfoFromPosGlobal(pos1);
+		ensure("LLWorldMap::simInfoFromPosGlobal() test on existing region failed", sim != NULL);
+
+		// Test 14 : simInfoFromPosGlobal() outside region
+		LLVector3d pos2(	X_WORLD_TEST + REGION_WIDTH_METERS*4 + REGION_WIDTH_METERS/2, 
+							Y_WORLD_TEST + REGION_WIDTH_METERS*4 + REGION_WIDTH_METERS/2, 
+							0.0f);
+		sim = mWorld->simInfoFromPosGlobal(pos2);
+		ensure("LLWorldMap::simInfoFromPosGlobal() test outside region failed", sim == NULL);
+
+		// Test 15 : simInfoFromName()
+		sim = mWorld->simInfoFromName(name_sim);
+		ensure("LLWorldMap::simInfoFromName() test on existing region failed", sim != NULL);
+
+		// Test 16 : simInfoFromHandle()
+		U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST);
+		sim = mWorld->simInfoFromHandle(handle);
+		ensure("LLWorldMap::simInfoFromHandle() test on existing region failed", sim != NULL);
+
+		// Test 17 : simNameFromPosGlobal()
+		LLVector3d pos3(	X_WORLD_TEST + REGION_WIDTH_METERS/2, 
+							Y_WORLD_TEST + REGION_WIDTH_METERS/2, 
+							0.0f);
+		success = mWorld->simNameFromPosGlobal(pos3, name_sim);
+		ensure("LLWorldMap::simNameFromPosGlobal() test on existing region failed", success && (name_sim == SIM_NAME_TEST));
+		
+		// Test 18 : reset()
+		try {
+			mWorld->reset();
+		} catch (...) {
+			fail("LLWorldMap::reset() at end test failed");
+		}
+
+		// Test 19 : Verify that all the region list is empty
+		list = mWorld->getRegionMap();
+		ensure("LLWorldMap::getRegionMap() empty at end test failed", list.empty());
+	}
+	// Test tracking
+	template<> template<>
+	void worldmap_object_t::test<3>()
+	{
+		// Point to track
+		LLVector3d pos( X_WORLD_TEST + REGION_WIDTH_METERS/2, Y_WORLD_TEST + REGION_WIDTH_METERS/2, Z_WORLD_TEST);
+
+		// Test 20 : no tracking
+		mWorld->cancelTracking();
+		ensure("LLWorldMap::cancelTracking() at begin test failed", mWorld->isTracking() == false);
+
+		// Test 21 : set tracking
+		mWorld->setTracking(pos);
+		ensure("LLWorldMap::setTracking() failed", mWorld->isTracking() && !mWorld->isTrackingValidLocation());
+
+		// Test 22 : set click and commit flags
+		mWorld->setTrackingDoubleClick();
+		ensure("LLWorldMap::setTrackingDoubleClick() failed", mWorld->isTrackingDoubleClick());
+		mWorld->setTrackingCommit();
+		ensure("LLWorldMap::setTrackingCommit() failed", mWorld->isTrackingCommit());
+
+		// Test 23 : in rectangle test
+		bool inRect = mWorld->isTrackingInRectangle(	X_WORLD_TEST, Y_WORLD_TEST,  
+														X_WORLD_TEST + REGION_WIDTH_METERS, 
+														Y_WORLD_TEST + REGION_WIDTH_METERS);
+		ensure("LLWorldMap::isTrackingInRectangle() in rectangle failed", inRect);
+		inRect = mWorld->isTrackingInRectangle(			X_WORLD_TEST + REGION_WIDTH_METERS, 
+														Y_WORLD_TEST + REGION_WIDTH_METERS,  
+														X_WORLD_TEST + 2 * REGION_WIDTH_METERS, 
+														Y_WORLD_TEST + 2 * REGION_WIDTH_METERS);
+		ensure("LLWorldMap::isTrackingInRectangle() outside rectangle failed", !inRect);
+
+		// Test 24 : set tracking to valid and invalid
+		mWorld->setTrackingValid();
+		ensure("LLWorldMap::setTrackingValid() failed", mWorld->isTrackingValidLocation() && !mWorld->isTrackingInvalidLocation());
+		mWorld->setTrackingInvalid();
+		ensure("LLWorldMap::setTrackingInvalid() failed", !mWorld->isTrackingValidLocation() && mWorld->isTrackingInvalidLocation());
+
+		// Test 25 : getTrackedPositionGlobal()
+		LLVector3d res = mWorld->getTrackedPositionGlobal();
+		ensure("LLWorldMap::getTrackedPositionGlobal() failed", res == pos);
+
+		// Test 26 : reset tracking
+		mWorld->cancelTracking();
+		ensure("LLWorldMap::cancelTracking() at end test failed", mWorld->isTracking() == false);
+	}
+}
diff --git a/indra/newview/tests/llworldmipmap_test.cpp b/indra/newview/tests/llworldmipmap_test.cpp
new file mode 100644
index 0000000000..9938175c55
--- /dev/null
+++ b/indra/newview/tests/llworldmipmap_test.cpp
@@ -0,0 +1,176 @@
+/** 
+ * @file llworldmipmap_test.cpp
+ * @author Merov Linden
+ * @date 2009-02-03
+ *
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ * 
+ * Copyright (c) 2006-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header: almost always required for newview cpp files
+#include "../llviewerprecompiledheaders.h"
+// Class to test
+#include "../llworldmipmap.h"
+// Dependencies
+#include "../llviewerimagelist.h"
+// Tut header
+#include "../test/lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes: 
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+LLViewerImageList::LLViewerImageList() { }
+LLViewerImageList::~LLViewerImageList() { }
+
+LLViewerImageList gImageList;
+
+LLViewerImage* LLViewerImageList::getImageFromUrl(const std::string& url,
+												   BOOL usemipmaps,
+												   BOOL level_immediate,
+												   LLGLint internal_format,
+												   LLGLenum primary_format, 
+												   const LLUUID& force_id)
+{ return NULL; }
+void LLViewerImage::setBoostLevel(S32 level) { }
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+namespace tut
+{
+	// Test wrapper declaration
+	struct worldmipmap_test
+	{
+		// Derived test class
+		class LLTestWorldMipmap : public LLWorldMipmap
+		{
+			// Put here stubbs of virtual methods we shouldn't call all the way down
+		};
+		// Instance to be tested
+		LLTestWorldMipmap* mMap;
+
+		// Constructor and destructor of the test wrapper
+		worldmipmap_test()
+		{
+			mMap = new LLTestWorldMipmap;
+		}
+		~worldmipmap_test()
+		{
+			delete mMap;
+		}
+	};
+
+	// Tut templating thingamagic: test group, object and test instance
+	typedef test_group<worldmipmap_test> worldmipmap_t;
+	typedef worldmipmap_t::object worldmipmap_object_t;
+	tut::worldmipmap_t tut_worldmipmap("worldmipmap");
+
+	// ---------------------------------------------------------------------------------------
+	// Test functions
+	// Notes:
+	// * Test as many as you possibly can without requiring a full blown simulation of everything
+	// * The tests are executed in sequence so the test instance state may change between calls
+	// * Remember that you cannot test private methods with tut
+	// ---------------------------------------------------------------------------------------
+	// Test static methods
+	// Test 1 : scaleToLevel()
+	template<> template<>
+	void worldmipmap_object_t::test<1>()
+	{
+		S32 level = mMap->scaleToLevel(0.0);
+		ensure("scaleToLevel() test 1 failed", level == LLWorldMipmap::MAP_LEVELS);
+		level = mMap->scaleToLevel(LLWorldMipmap::MAP_TILE_SIZE);
+		ensure("scaleToLevel() test 2 failed", level == 1);
+		level = mMap->scaleToLevel(10 * LLWorldMipmap::MAP_TILE_SIZE);
+		ensure("scaleToLevel() test 3 failed", level == 1);
+	}
+	// Test 2 : globalToMipmap()
+	template<> template<>
+	void worldmipmap_object_t::test<2>()
+	{
+		U32 grid_x, grid_y;
+		mMap->globalToMipmap(1000.f*REGION_WIDTH_METERS, 1000.f*REGION_WIDTH_METERS, 1, &grid_x, &grid_y);
+		ensure("globalToMipmap() test 1 failed", (grid_x == 1000) && (grid_y == 1000));
+		mMap->globalToMipmap(0.0, 0.0, LLWorldMipmap::MAP_LEVELS, &grid_x, &grid_y);
+		ensure("globalToMipmap() test 2 failed", (grid_x == 0) && (grid_y == 0));
+	}
+	// Test 3 : getObjectsTile()
+	template<> template<>
+	void worldmipmap_object_t::test<3>()
+	{
+		// Depends on some inline methods in LLViewerImage... Thinking about how to make this work
+		// LLPointer<LLViewerImage> img = mMap->getObjectsTile(0, 0, 1);
+		// ensure("getObjectsTile() test failed", img.isNull());
+	}
+	// Test 4 : equalizeBoostLevels()
+	template<> template<>
+	void worldmipmap_object_t::test<4>()
+	{
+		try
+		{
+			mMap->equalizeBoostLevels();
+		} 
+		catch (...)
+		{
+			fail("equalizeBoostLevels() test failed");
+		}
+	}
+	// Test 5 : dropBoostLevels()
+	template<> template<>
+	void worldmipmap_object_t::test<5>()
+	{
+		try
+		{
+			mMap->dropBoostLevels();
+		} 
+		catch (...)
+		{
+			fail("dropBoostLevels() test failed");
+		}
+	}
+	// Test 6 : reset()
+	template<> template<>
+	void worldmipmap_object_t::test<6>()
+	{
+		try
+		{
+			mMap->reset();
+		} 
+		catch (...)
+		{
+			fail("reset() test failed");
+		}
+	}
+}
-- 
cgit v1.2.3