diff options
| author | Adam Moss <moss@lindenlab.com> | 2009-10-08 12:42:58 +0000 | 
|---|---|---|
| committer | Adam Moss <moss@lindenlab.com> | 2009-10-08 12:42:58 +0000 | 
| commit | 256700f1092017a063ccd48ca50f3cd1098a5c2a (patch) | |
| tree | e237084197efb17f9f6834c09dfaa86b680c4d03 | |
| parent | 706f49601ce40841154a889e547fc48c7f6ad0c9 (diff) | |
DEV-41086 convert llmath legacy tut tests to integration tests.  batch 2.
| -rw-r--r-- | indra/llmath/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | indra/llmath/tests/llbbox_test.cpp | 371 | ||||
| -rw-r--r-- | indra/llmath/tests/llbboxlocal_test.cpp | 239 | ||||
| -rw-r--r-- | indra/llmath/tests/v2math_test.cpp | 454 | ||||
| -rw-r--r-- | indra/llmath/tests/v3math_test.cpp | 573 | ||||
| -rw-r--r-- | indra/llmath/tests/xform_test.cpp | 251 | 
6 files changed, 1893 insertions, 0 deletions
| diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt index 81ccdcdfad..890288936f 100644 --- a/indra/llmath/CMakeLists.txt +++ b/indra/llmath/CMakeLists.txt @@ -92,6 +92,11 @@ SET(llmath_TEST_SOURCE_FILES  LL_ADD_PROJECT_UNIT_TESTS(llmath "${llmath_TEST_SOURCE_FILES}")  set(test_libs llmath llcommon ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES}) +LL_ADD_INTEGRATION_TEST(v2math v2math.cpp "${test_libs}") +LL_ADD_INTEGRATION_TEST(v3math v3math.cpp "${test_libs}") +LL_ADD_INTEGRATION_TEST(xform xform.cpp "${test_libs}") +LL_ADD_INTEGRATION_TEST(llbbox llbbox.cpp "${test_libs}") +LL_ADD_INTEGRATION_TEST(llbboxlocal llbboxlocal.cpp "${test_libs}")  LL_ADD_INTEGRATION_TEST(v3color v3color.cpp "${test_libs}")  LL_ADD_INTEGRATION_TEST(v3dmath v3dmath.cpp "${test_libs}")  LL_ADD_INTEGRATION_TEST(v4color v4color.cpp "${test_libs}") diff --git a/indra/llmath/tests/llbbox_test.cpp b/indra/llmath/tests/llbbox_test.cpp new file mode 100644 index 0000000000..2cfdd8b36d --- /dev/null +++ b/indra/llmath/tests/llbbox_test.cpp @@ -0,0 +1,371 @@ +/** + * @file   llbbox_tut.cpp + * @author Martin Reddy + * @date   2009-06-25 + * @brief  Test for llbbox.cpp. + *  + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009-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$ + */ + +#include "../test/lltut.h" + +#include "../llbbox.h" + + +#define ANGLE                (3.14159265f / 2.0f) +#define APPROX_EQUAL(a, b)   dist_vec((a),(b)) < 1e-5 + +namespace tut +{ +	struct LLBBoxData +	{ +	}; + +	typedef test_group<LLBBoxData> factory; +	typedef factory::object object; +} + +namespace +{ +	tut::factory llbbox_test_factory("LLBBox"); +} + +namespace tut +{ +	template<> template<> +	void object::test<1>() +	{	 +		// +		// test the default constructor +		// +		 +		LLBBox bbox1; +		 +		ensure_equals("Default bbox min", bbox1.getMinLocal(), LLVector3(0.0f, 0.0f, 0.0f)); +		ensure_equals("Default bbox max", bbox1.getMaxLocal(), LLVector3(0.0f, 0.0f, 0.0f)); +		ensure_equals("Default bbox pos agent", bbox1.getPositionAgent(), LLVector3(0.0f, 0.0f, 0.0f)); +		ensure_equals("Default bbox rotation", bbox1.getRotation(), LLQuaternion(0.0f, 0.0f, 0.0f, 1.0f)); +	} +	 +	template<> template<> +	void object::test<2>() +	{	 +		// +		// test the non-default constructor +		// +		 +		LLBBox bbox2(LLVector3(1.0f, 2.0f, 3.0f), LLQuaternion(), +					 LLVector3(2.0f, 3.0f, 4.0f), LLVector3(4.0f, 5.0f, 6.0f)); +		 +		ensure_equals("Custom bbox min", bbox2.getMinLocal(), LLVector3(2.0f, 3.0f, 4.0f)); +		ensure_equals("Custom bbox max", bbox2.getMaxLocal(), LLVector3(4.0f, 5.0f, 6.0f)); +		ensure_equals("Custom bbox pos agent", bbox2.getPositionAgent(), LLVector3(1.0f, 2.0f, 3.0f)); +		ensure_equals("Custom bbox rotation", bbox2.getRotation(), LLQuaternion(0.0f, 0.0f, 0.0f, 1.0f));		 +	} +		 +	template<> template<> +	void object::test<3>() +	{	 +		// +		// test the setMinLocal() method +		// +		LLBBox bbox2; +		bbox2.setMinLocal(LLVector3(3.0f, 3.0f, 3.0f)); +		ensure_equals("Custom bbox min (2)", bbox2.getMinLocal(), LLVector3(3.0f, 3.0f, 3.0f)); +	} + +	template<> template<> +	void object::test<4>() +	{	 +		// +		// test the setMaxLocal() method +		// +		LLBBox bbox2; +		bbox2.setMaxLocal(LLVector3(5.0f, 5.0f, 5.0f)); +		ensure_equals("Custom bbox max (2)", bbox2.getMaxLocal(), LLVector3(5.0f, 5.0f, 5.0f)); +	} + +	template<> template<> +	void object::test<5>() +	{	 +		// +		// test the getCenterLocal() method +		// +		 +		ensure_equals("Default bbox local center", LLBBox().getCenterLocal(), LLVector3(0.0f, 0.0f, 0.0f)); +		 +		LLBBox bbox1(LLVector3(1.0f, 2.0f, 3.0f), LLQuaternion(), +					 LLVector3(2.0f, 4.0f, 6.0f), LLVector3(4.0f, 6.0f, 8.0f)); + +		ensure_equals("Custom bbox center local", bbox1.getCenterLocal(), LLVector3(3.0f, 5.0f, 7.0f)); + +		LLBBox bbox2(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(ANGLE, LLVector3(0.0f, 0.0f, 1.0f)), +					 LLVector3(2.0f, 2.0f, 2.0f), LLVector3(4.0f, 4.0f, 4.0f)); + +		ensure_equals("Custom bbox center local with rot", bbox2.getCenterLocal(), LLVector3(3.0f, 3.0f, 3.0f)); +	} + +	template<> template<> +	void object::test<6>() +	{	 +		// +		// test the getCenterAgent() +		// +		 +		ensure_equals("Default bbox agent center", LLBBox().getCenterAgent(), LLVector3(0.0f, 0.0f, 0.0f)); +		 +		LLBBox bbox1(LLVector3(1.0f, 2.0f, 3.0f), LLQuaternion(), +					 LLVector3(2.0f, 4.0f, 6.0f), LLVector3(4.0f, 6.0f, 8.0f)); +		 +		ensure_equals("Custom bbox center agent", bbox1.getCenterAgent(), LLVector3(4.0f, 7.0f, 10.0f)); +		 +		LLBBox bbox2(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(ANGLE, LLVector3(0.0f, 0.0f, 1.0f)), +					 LLVector3(2.0f, 2.0f, 2.0f), LLVector3(4.0f, 4.0f, 4.0f)); +		 +		ensure("Custom bbox center agent with rot", APPROX_EQUAL(bbox2.getCenterAgent(), LLVector3(-2.0f, 4.0f, 4.0f))); +	} +	 +	template<> template<> +	void object::test<7>() +	{	 +		// +		// test the getExtentLocal() method +		// +		 +		ensure_equals("Default bbox local extent", LLBBox().getExtentLocal(), LLVector3(0.0f, 0.0f, 0.0f)); +		 +		LLBBox bbox1(LLVector3(1.0f, 2.0f, 3.0f), LLQuaternion(), +					 LLVector3(2.0f, 4.0f, 6.0f), LLVector3(4.0f, 6.0f, 8.0f)); +		 +		ensure_equals("Custom bbox extent local", bbox1.getExtentLocal(), LLVector3(2.0f, 2.0f, 2.0f)); +		 +		LLBBox bbox2(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(ANGLE, LLVector3(0.0f, 0.0f, 1.0f)), +					 LLVector3(2.0f, 2.0f, 2.0f), LLVector3(4.0f, 4.0f, 4.0f)); +		 +		ensure_equals("Custom bbox extent local with rot", bbox1.getExtentLocal(), LLVector3(2.0f, 2.0f, 2.0f));		 +	} +	 +	template<> template<> +	void object::test<8>() +	{ +		// +		// test the addPointLocal() method +		// +		 +		LLBBox bbox1; +		bbox1.addPointLocal(LLVector3(1.0f, 1.0f, 1.0f)); +		bbox1.addPointLocal(LLVector3(3.0f, 3.0f, 3.0f)); +		 +		ensure_equals("addPointLocal center local (1)", bbox1.getCenterLocal(), LLVector3(2.0f, 2.0f, 2.0f)); +		ensure_equals("addPointLocal center agent (1)", bbox1.getCenterAgent(), LLVector3(2.0f, 2.0f, 2.0f)); +		ensure_equals("addPointLocal min (1)", bbox1.getMinLocal(), LLVector3(1.0f, 1.0f, 1.0f)); +		ensure_equals("addPointLocal max (1)", bbox1.getMaxLocal(), LLVector3(3.0f, 3.0f, 3.0f)); +		 +		bbox1.addPointLocal(LLVector3(0.0f, 0.0f, 0.0f)); +		bbox1.addPointLocal(LLVector3(1.0f, 1.0f, 1.0f)); +		bbox1.addPointLocal(LLVector3(2.0f, 2.0f, 2.0f)); +		 +		ensure_equals("addPointLocal center local (2)", bbox1.getCenterLocal(), LLVector3(1.5f, 1.5f, 1.5f)); +		ensure_equals("addPointLocal min (2)", bbox1.getMinLocal(), LLVector3(0.0f, 0.0f, 0.0f)); +		ensure_equals("addPointLocal max (2)", bbox1.getMaxLocal(), LLVector3(3.0f, 3.0f, 3.0f));		 +	} + +	template<> template<> +	void object::test<9>() +	{ +		// +		// test the addBBoxLocal() method +		// +		 +		LLBBox bbox1; +		bbox1.addBBoxLocal(LLBBox(LLVector3(), LLQuaternion(), +								  LLVector3(0.0f, 0.0f, 0.0f), LLVector3(3.0f, 3.0f, 3.0f))); +		 +		ensure_equals("addPointLocal center local (3)", bbox1.getCenterLocal(), LLVector3(1.5f, 1.5f, 1.5f)); +		ensure_equals("addPointLocal min (3)", bbox1.getMinLocal(), LLVector3(0.0f, 0.0f, 0.0f)); +		ensure_equals("addPointLocal max (3)", bbox1.getMaxLocal(), LLVector3(3.0f, 3.0f, 3.0f)); +		 +		bbox1.addBBoxLocal(LLBBox(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(), +								  LLVector3(5.0f, 5.0f, 5.0f), LLVector3(10.0f, 10.0f, 10.0f))); +		 +		ensure_equals("addPointLocal center local (4)", bbox1.getCenterLocal(), LLVector3(5.0f, 5.0f, 5.0f)); +		ensure_equals("addPointLocal center agent (4)", bbox1.getCenterAgent(), LLVector3(5.0f, 5.0f, 5.0f)); +		ensure_equals("addPointLocal min (4)", bbox1.getMinLocal(), LLVector3(0.0f, 0.0f, 0.0f)); +		ensure_equals("addPointLocal max (4)", bbox1.getMaxLocal(), LLVector3(10.0f, 10.0f, 10.0f));		 +	} +	 +	template<> template<> +	void object::test<10>() +	{ +		// +		// test the addPointAgent() method +		// +		 +		LLBBox bbox1(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(1.0, 0.0, 0.0, 1.0), +					 LLVector3(2.0f, 2.0f, 2.0f), LLVector3(4.0f, 4.0f, 4.0f)); + +		bbox1.addPointAgent(LLVector3(1.0f, 1.0f, 1.0f)); +		bbox1.addPointAgent(LLVector3(3.0f, 3.0f, 3.0f)); +		 +		ensure_equals("addPointAgent center local (1)", bbox1.getCenterLocal(), LLVector3(2.0f, 2.0f, -2.0f)); +		ensure_equals("addPointAgent center agent (1)", bbox1.getCenterAgent(), LLVector3(3.0f, 3.0f, 7.0f)); +		ensure_equals("addPointAgent min (1)", bbox1.getMinLocal(), LLVector3(0.0f, 0.0f, -4.0f)); +		ensure_equals("addPointAgent max (1)", bbox1.getMaxLocal(), LLVector3(4.0f, 4.0f, 0.0f)); +	} + +	template<> template<> +	void object::test<11>() +	{ +		// +		// test the addBBoxAgent() method +		// +		 +		LLBBox bbox1(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(1.0, 0.0, 0.0, 1.0), +					 LLVector3(2.0f, 2.0f, 2.0f), LLVector3(4.0f, 4.0f, 4.0f)); +		 +		bbox1.addPointAgent(LLVector3(1.0f, 1.0f, 1.0f)); +		bbox1.addPointAgent(LLVector3(3.0f, 3.0f, 3.0f)); +		 +		bbox1.addBBoxLocal(LLBBox(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(), +								  LLVector3(5.0f, 5.0f, 5.0f), LLVector3(10.0f, 10.0f, 10.0f))); +		 +		ensure_equals("addPointAgent center local (2)", bbox1.getCenterLocal(), LLVector3(5.0f, 5.0f, 3.0f)); +		ensure_equals("addPointAgent center agent (2)", bbox1.getCenterAgent(), LLVector3(6.0f, -10.0f, 8.0f)); +		ensure_equals("addPointAgent min (2)", bbox1.getMinLocal(), LLVector3(0.0f, 0.0f, -4.0f)); +		ensure_equals("addPointAgent max (2)", bbox1.getMaxLocal(), LLVector3(10.0f, 10.0f, 10.0f));		 +	} +	 +	template<> template<> +	void object::test<12>() +	{ +		// +		// test the expand() method +		// +		 +		LLBBox bbox1; +		bbox1.expand(0.0); + +		ensure_equals("Zero-expanded Default BBox center", bbox1.getCenterLocal(), LLVector3(0.0f, 0.0f, 0.0f)); + +		LLBBox bbox2(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(), +					 LLVector3(1.0f, 1.0f, 1.0f), LLVector3(3.0f, 3.0f, 3.0f)); +		bbox2.expand(0.0); +		 +		ensure_equals("Zero-expanded center local", bbox2.getCenterLocal(), LLVector3(2.0f, 2.0f, 2.0f)); +		ensure_equals("Zero-expanded center agent", bbox2.getCenterAgent(), LLVector3(3.0f, 3.0f, 3.0f)); +		ensure_equals("Zero-expanded min", bbox2.getMinLocal(), LLVector3(1.0f, 1.0f, 1.0f)); +		ensure_equals("Zero-expanded max", bbox2.getMaxLocal(), LLVector3(3.0f, 3.0f, 3.0f)); + +		bbox2.expand(0.5); + +		ensure_equals("Positive-expanded center", bbox2.getCenterLocal(), LLVector3(2.0f, 2.0f, 2.0f)); +		ensure_equals("Positive-expanded min", bbox2.getMinLocal(), LLVector3(0.5f, 0.5f, 0.5f)); +		ensure_equals("Positive-expanded max", bbox2.getMaxLocal(), LLVector3(3.5f, 3.5f, 3.5f)); + +		bbox2.expand(-1.0); +		 +		ensure_equals("Negative-expanded center", bbox2.getCenterLocal(), LLVector3(2.0f, 2.0f, 2.0f)); +		ensure_equals("Negative-expanded min", bbox2.getMinLocal(), LLVector3(1.5f, 1.5f, 1.5f)); +		ensure_equals("Negative-expanded max", bbox2.getMaxLocal(), LLVector3(2.5f, 2.5f, 2.5f));		 +	} +	 +	template<> template<> +	void object::test<13>() +	{ +		// +		// test the localToAgent() method +		// +		 +		LLBBox bbox1(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(), +					 LLVector3(1.0f, 1.0f, 1.0f), LLVector3(3.0f, 3.0f, 3.0f)); +		 +		ensure_equals("localToAgent(1,2,3)", bbox1.localToAgent(LLVector3(1.0f, 2.0f, 3.0f)), LLVector3(2.0f, 3.0f, 4.0f)); +		 +		LLBBox bbox2(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(ANGLE, LLVector3(1.0f, 0.0f, 0.0f)), +					 LLVector3(1.0f, 1.0f, 1.0f), LLVector3(3.0f, 3.0f, 3.0f)); +		 +		ensure("localToAgent(1,2,3) rot", APPROX_EQUAL(bbox2.localToAgent(LLVector3(1.0f, 2.0f, 3.0f)), LLVector3(2.0f, -2.0f, 3.0f))); +	} +	 +	template<> template<> +	void object::test<14>() +	{ +		// +		// test the agentToLocal() method +		// +		 +		LLBBox bbox1(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(), +					 LLVector3(1.0f, 1.0f, 1.0f), LLVector3(3.0f, 3.0f, 3.0f)); +		 +		ensure_equals("agentToLocal(1,2,3)", bbox1.agentToLocal(LLVector3(1.0f, 2.0f, 3.0f)), LLVector3(0.0f, 1.0f, 2.0f)); +		ensure_equals("agentToLocal(localToAgent)", bbox1.agentToLocal(bbox1.localToAgent(LLVector3(1.0f, 2.0f, 3.0f))), +					  LLVector3(1.0f, 2.0f, 3.0f)); +		 +		LLBBox bbox2(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(ANGLE, LLVector3(1.0f, 0.0f, 0.0f)), +					 LLVector3(1.0f, 1.0f, 1.0f), LLVector3(3.0f, 3.0f, 3.0f)); +		 +		ensure("agentToLocal(1,2,3) rot", APPROX_EQUAL(bbox2.agentToLocal(LLVector3(1.0f, 2.0f, 3.0f)), LLVector3(0.0f, 2.0f, -1.0f))); +		ensure("agentToLocal(localToAgent) rot", APPROX_EQUAL(bbox2.agentToLocal(bbox2.localToAgent(LLVector3(1.0f, 2.0f, 3.0f))), +															  LLVector3(1.0f, 2.0f, 3.0f))); +	} +	 +	template<> template<> +	void object::test<15>() +	{ +		// +		// test the containsPointLocal() method +		// +		 +		LLBBox bbox1(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(), +					 LLVector3(1.0f, 2.0f, 3.0f), LLVector3(3.0f, 4.0f, 5.0f)); + +		ensure("containsPointLocal(0,0,0)", bbox1.containsPointLocal(LLVector3(0.0f, 0.0f, 0.0f)) == FALSE); +		ensure("containsPointLocal(1,2,3)", bbox1.containsPointLocal(LLVector3(1.0f, 2.0f, 3.0f)) == TRUE); +		ensure("containsPointLocal(0.999,2,3)", bbox1.containsPointLocal(LLVector3(0.999f, 2.0f, 3.0f)) == FALSE); +		ensure("containsPointLocal(3,4,5)", bbox1.containsPointLocal(LLVector3(3.0f, 4.0f, 5.0f)) == TRUE); +		ensure("containsPointLocal(3,4,5.001)", bbox1.containsPointLocal(LLVector3(3.0f, 4.0f, 5.001f)) == FALSE); +	} + +	template<> template<> +	void object::test<16>() +	{ +		// +		// test the containsPointAgent() method +		// +		 +		LLBBox bbox1(LLVector3(1.0f, 1.0f, 1.0f), LLQuaternion(), +					 LLVector3(1.0f, 2.0f, 3.0f), LLVector3(3.0f, 4.0f, 5.0f)); +		 +		ensure("containsPointAgent(0,0,0)", bbox1.containsPointAgent(LLVector3(0.0f, 0.0f, 0.0f)) == FALSE); +		ensure("containsPointAgent(2,3,4)", bbox1.containsPointAgent(LLVector3(2.0f, 3.0f, 4.0f)) == TRUE); +		ensure("containsPointAgent(2,2.999,4)", bbox1.containsPointAgent(LLVector3(2.0f, 2.999f, 4.0f)) == FALSE); +		ensure("containsPointAgent(4,5,6)", bbox1.containsPointAgent(LLVector3(4.0f, 5.0f, 6.0f)) == TRUE); +		ensure("containsPointAgent(4,5.001,6)", bbox1.containsPointAgent(LLVector3(4.0f, 5.001f, 6.0f)) == FALSE); +	}				 +} + diff --git a/indra/llmath/tests/llbboxlocal_test.cpp b/indra/llmath/tests/llbboxlocal_test.cpp new file mode 100644 index 0000000000..92cdf1c8a2 --- /dev/null +++ b/indra/llmath/tests/llbboxlocal_test.cpp @@ -0,0 +1,239 @@ +/** + * @file   llbboxlocal_tut.cpp + * @author Martin Reddy + * @date   2009-06-25 + * @brief  Test for llbboxlocal.cpp. + *  + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009-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$ + */ + +#include "../test/lltut.h" + +#include "../llbboxlocal.h" + + +namespace tut +{ +	struct LLBBoxLocalData +	{ +	}; + +	typedef test_group<LLBBoxLocalData> factory; +	typedef factory::object object; +} + +namespace +{ +	tut::factory llbboxlocal_test_factory("LLBBoxLocal"); +} + +namespace tut +{ +	template<> template<> +	void object::test<1>() +	{	 +		// +		// test the default constructor +		// +		 +		LLBBoxLocal bbox1; +		 +		ensure_equals("Default bbox min", bbox1.getMin(), LLVector3(0.0f, 0.0f, 0.0f)); +		ensure_equals("Default bbox max", bbox1.getMax(), LLVector3(0.0f, 0.0f, 0.0f)); +	} + +	template<> template<> +	void object::test<2>() +	{	 +		// +		// test the non-default constructor +		// +		 +		LLBBoxLocal bbox2(LLVector3(-1.0f, -2.0f, 0.0f), LLVector3(1.0f, 2.0f, 3.0f)); +		 +		ensure_equals("Custom bbox min", bbox2.getMin(), LLVector3(-1.0f, -2.0f, 0.0f)); +		ensure_equals("Custom bbox max", bbox2.getMax(), LLVector3(1.0f, 2.0f, 3.0f));		 +	} +	 +	template<> template<> +	void object::test<3>() +	{	 +		// +		// test the setMin() +		// +		// N.B. no validation is currently performed to ensure that the min +		// and max vectors are actually the min/max values. +		// +		 +		LLBBoxLocal bbox2; +		bbox2.setMin(LLVector3(1.0f, 2.0f, 3.0f)); +		 +		ensure_equals("Custom bbox min (2)", bbox2.getMin(), LLVector3(1.0f, 2.0f, 3.0f)); +	} +	 +	template<> template<> +	void object::test<4>() +	{	 +		// +		// test the setMax() +		// +		// N.B. no validation is currently performed to ensure that the min +		// and max vectors are actually the min/max values. +		// +		 +		LLBBoxLocal bbox2; +		bbox2.setMax(LLVector3(10.0f, 20.0f, 30.0f)); +		 +		ensure_equals("Custom bbox max (2)", bbox2.getMax(), LLVector3(10.0f, 20.0f, 30.0f)); +	} +	 +	template<> template<> +	void object::test<5>() +	{	 +		// +		// test the getCenter() method +		// +		 +		ensure_equals("Default bbox center", LLBBoxLocal().getCenter(), LLVector3(0.0f, 0.0f, 0.0f)); +		 +		LLBBoxLocal bbox1(LLVector3(-1.0f, -1.0f, -1.0f), LLVector3(0.0f, 0.0f, 0.0f)); +		 +		ensure_equals("Custom bbox center", bbox1.getCenter(), LLVector3(-0.5f, -0.5f, -0.5f)); +		 +		LLBBoxLocal bbox2(LLVector3(0.0f, 0.0f, 0.0f), LLVector3(-1.0f, -1.0f, -1.0f)); +		 +		ensure_equals("Invalid bbox center", bbox2.getCenter(), LLVector3(-0.5f, -0.5f, -0.5f)); +	} + +	template<> template<> +	void object::test<6>() +	{	 +		// +		// test the getExtent() method +		// +		 +		LLBBoxLocal bbox2(LLVector3(0.0f, 0.0f, 0.0f), LLVector3(-1.0f, -1.0f, -1.0f)); +		 +		ensure_equals("Default bbox extent", LLBBoxLocal().getExtent(), LLVector3(0.0f, 0.0f, 0.0f)); +		 +		LLBBoxLocal bbox3(LLVector3(-1.0f, -1.0f, -1.0f), LLVector3(1.0f, 2.0f, 0.0f)); +		 +		ensure_equals("Custom bbox extent", bbox3.getExtent(), LLVector3(2.0f, 3.0f, 1.0f)); +	} +	 +	template<> template<> +	void object::test<7>() +	{ +		// +		// test the addPoint() method +		// +		// N.B. if you create an empty bbox and then add points, +		// the vector (0, 0, 0) will always be part of the bbox. +		// (Fixing this would require adding a bool to the class size). +		// +		 +		LLBBoxLocal bbox1; +		bbox1.addPoint(LLVector3(-1.0f, -2.0f, -3.0f)); +		bbox1.addPoint(LLVector3(3.0f, 4.0f, 5.0f)); +		 +		ensure_equals("Custom BBox center (1)", bbox1.getCenter(), LLVector3(1.0f, 1.0f, 1.0f)); +		ensure_equals("Custom BBox min (1)", bbox1.getMin(), LLVector3(-1.0f, -2.0f, -3.0f)); +		ensure_equals("Custom BBox max (1)", bbox1.getMax(), LLVector3(3.0f, 4.0f, 5.0f)); +		 +		bbox1.addPoint(LLVector3(0.0f, 0.0f, 0.0f)); +		bbox1.addPoint(LLVector3(1.0f, 2.0f, 3.0f)); +		bbox1.addPoint(LLVector3(2.0f, 2.0f, 2.0f)); +		 +		ensure_equals("Custom BBox center (2)", bbox1.getCenter(), LLVector3(1.0f, 1.0f, 1.0f)); +		ensure_equals("Custom BBox min (2)", bbox1.getMin(), LLVector3(-1.0f, -2.0f, -3.0f)); +		ensure_equals("Custom BBox max (2)", bbox1.getMax(), LLVector3(3.0f, 4.0f, 5.0f)); +		 +		bbox1.addPoint(LLVector3(5.0f, 5.0f, 5.0f)); +		 +		ensure_equals("Custom BBox center (3)", bbox1.getCenter(), LLVector3(2.0f, 1.5f, 1.0f)); +		ensure_equals("Custom BBox min (3)", bbox1.getMin(), LLVector3(-1.0f, -2.0f, -3.0f)); +		ensure_equals("Custom BBox max (3)", bbox1.getMax(), LLVector3(5.0f, 5.0f, 5.0f)); +	} +		 +	template<> template<> +	void object::test<8>() +	{ +		// +		// test the addBBox() methods +		// +		// N.B. if you create an empty bbox and then add points, +		// the vector (0, 0, 0) will always be part of the bbox. +		// (Fixing this would require adding a bool to the class size). +		// +		 +		LLBBoxLocal bbox2(LLVector3(1.0f, 1.0f, 1.0f), LLVector3(2.0f, 2.0f, 2.0f)); +		bbox2.addBBox(LLBBoxLocal(LLVector3(1.5f, 1.5f, 1.5f), LLVector3(3.0f, 3.0f, 3.0f))); +		 +		ensure_equals("Custom BBox center (4)", bbox2.getCenter(), LLVector3(2.0f, 2.0f, 2.0f)); +		ensure_equals("Custom BBox min (4)", bbox2.getMin(), LLVector3(1.0f, 1.0f, 1.0f)); +		ensure_equals("Custom BBox max (4)", bbox2.getMax(), LLVector3(3.0f, 3.0f, 3.0f)); +		 +		bbox2.addBBox(LLBBoxLocal(LLVector3(-1.0f, -1.0f, -1.0f), LLVector3(0.0f, 0.0f, 0.0f))); +		 +		ensure_equals("Custom BBox center (5)", bbox2.getCenter(), LLVector3(1.0f, 1.0f, 1.0f)); +		ensure_equals("Custom BBox min (5)", bbox2.getMin(), LLVector3(-1.0f, -1.0f, -1.0f)); +		ensure_equals("Custom BBox max (5)", bbox2.getMax(), LLVector3(3.0f, 3.0f, 3.0f)); +	} +	 +	template<> template<> +	void object::test<9>() +	{ +		// +		// test the expand() method +		// +		 +		LLBBoxLocal bbox1; +		bbox1.expand(0.0f); + +		ensure_equals("Zero-expanded Default BBox center", bbox1.getCenter(), LLVector3(0.0f, 0.0f, 0.0f)); + +		LLBBoxLocal bbox2(LLVector3(1.0f, 2.0f, 3.0f), LLVector3(3.0f, 4.0f, 5.0f)); +		bbox2.expand(0.0f); +		 +		ensure_equals("Zero-expanded BBox center", bbox2.getCenter(), LLVector3(2.0f, 3.0f, 4.0f)); +		ensure_equals("Zero-expanded BBox min", bbox2.getMin(), LLVector3(1.0f, 2.0f, 3.0f)); +		ensure_equals("Zero-expanded BBox max", bbox2.getMax(), LLVector3(3.0f, 4.0f, 5.0f)); + +		bbox2.expand(0.5f); + +		ensure_equals("Positive-expanded BBox center", bbox2.getCenter(), LLVector3(2.0f, 3.0f, 4.0f)); +		ensure_equals("Positive-expanded BBox min", bbox2.getMin(), LLVector3(0.5f, 1.5f, 2.5f)); +		ensure_equals("Positive-expanded BBox max", bbox2.getMax(), LLVector3(3.5f, 4.5f, 5.5f)); + +		bbox2.expand(-1.0f); +		 +		ensure_equals("Negative-expanded BBox center", bbox2.getCenter(), LLVector3(2.0f, 3.0f, 4.0f)); +		ensure_equals("Negative-expanded BBox min", bbox2.getMin(), LLVector3(1.5f, 2.5f, 3.5f)); +		ensure_equals("Negative-expanded BBox max", bbox2.getMax(), LLVector3(2.5f, 3.5f, 4.5f));		 +	} +} diff --git a/indra/llmath/tests/v2math_test.cpp b/indra/llmath/tests/v2math_test.cpp new file mode 100644 index 0000000000..748cdf913a --- /dev/null +++ b/indra/llmath/tests/v2math_test.cpp @@ -0,0 +1,454 @@ +/** + * @file v2math_tut.cpp + * @author Adroit + * @date 2007-02 + * @brief v2math test cases. + * + * $LicenseInfo:firstyear=2007&license=viewergpl$ + *  + * Copyright (c) 2007-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$ + */ + +#include "linden_common.h" +#include "../test/lltut.h"  + +#include "../v2math.h" + + +namespace tut +{ +	struct v2math_data +	{ +	}; +	typedef test_group<v2math_data> v2math_test; +	typedef v2math_test::object v2math_object; +	tut::v2math_test v2math_testcase("v2math"); + +	template<> template<> +	void v2math_object::test<1>() +	{ +		LLVector2 vec2; +		ensure("LLVector2:Fail to initialize ", (0.f == vec2.mV[VX] && 0.f == vec2.mV[VY])); + +		F32 x =2.0f, y = 3.2f ; +		LLVector2 vec3(x,y); +		ensure("LLVector2(F32 x, F32 y):Fail to initialize ", (x == vec3.mV[VX]) && (y == vec3.mV[VY])); + +		const F32 vec[2] = {3.2f, 4.5f}; +		LLVector2 vec4(vec); +		ensure("LLVector2(const F32 *vec):Fail to initialize ", (vec[0] == vec4.mV[VX]) && (vec[1] == vec4.mV[VY])); + +		vec4.clearVec(); +		ensure("clearVec():Fail to clean the values ", (0.f == vec4.mV[VX] && 0.f == vec4.mV[VY])); + +		vec3.zeroVec(); +		ensure("zeroVec():Fail to fill the zero ", (0.f == vec3.mV[VX] && 0.f == vec3.mV[VY])); +	} + +	template<> template<> +	void v2math_object::test<2>() +	{ +		F32 x = 123.356f, y = 2387.453f; +		LLVector2 vec2,vec3; +		vec2.setVec(x, y); +		ensure("1:setVec: Fail  ", (x == vec2.mV[VX]) && (y == vec2.mV[VY])); + +		vec3.setVec(vec2); +		ensure("2:setVec: Fail   " ,(vec2 == vec3)); + +		vec3.zeroVec(); +		const F32 vec[2] = {3.24653f, 457653.4f}; +		vec3.setVec(vec); +		ensure("3:setVec: Fail  ", (vec[0] == vec3.mV[VX]) && (vec[1] == vec3.mV[VY])); +	} + +	template<> template<> +	void v2math_object::test<3>() +	{ +		F32 x = 2.2345f, y = 3.5678f ; +		LLVector2 vec2(x,y); +		ensure("magVecSquared:Fail ", is_approx_equal(vec2.magVecSquared(), (x*x + y*y))); +		ensure("magVec:Fail ", is_approx_equal(vec2.magVec(), fsqrtf(x*x + y*y))); +	} + +	template<> template<> +	void v2math_object::test<4>() +	{ +		F32 x =-2.0f, y = -3.0f ; +		LLVector2 vec2(x,y); +		ensure_equals("abs():Fail", vec2.abs(), TRUE); +		ensure("abs() x", is_approx_equal(vec2.mV[VX], 2.f)); +		ensure("abs() y", is_approx_equal(vec2.mV[VY], 3.f)); + +		ensure("isNull():Fail ", FALSE == vec2.isNull());	//Returns TRUE if vector has a _very_small_ length + +		x =.00000001f, y = .000001001f; +		vec2.setVec(x, y); +		ensure("isNull(): Fail ", TRUE == vec2.isNull());	 +	} + +	template<> template<> +	void v2math_object::test<5>() +	{ +		F32 x =1.f, y = 2.f; +		LLVector2 vec2(x, y), vec3; +		vec3 = vec3.scaleVec(vec2); +		ensure("scaleVec: Fail ", vec3.mV[VX] == 0. && vec3.mV[VY] == 0.); +		ensure("isExactlyZero(): Fail", TRUE == vec3.isExactlyZero()); + +		vec3.setVec(2.f, 1.f); +		vec3 = vec3.scaleVec(vec2); +		ensure("scaleVec: Fail ", (2.f == vec3.mV[VX]) && (2.f == vec3.mV[VY])); +		ensure("isExactlyZero():Fail", FALSE == vec3.isExactlyZero()); +	} + +	template<> template<> +	void v2math_object::test<6>() +	{ +		F32 x1 =1.f, y1 = 2.f, x2 = -2.3f, y2 = 1.11f; +		F32 val1, val2; +		LLVector2 vec2(x1, y1), vec3(x2, y2), vec4; +		vec4 = vec2 + vec3 ; +		val1 = x1+x2; +		val2 = y1+y2; +		ensure("1:operator+ failed",(val1 == vec4.mV[VX]) && ((val2 == vec4.mV[VY])));  + +		vec2.clearVec(); +		vec3.clearVec(); +		x1 = -.235f, y1 = -24.32f,  x2 = -2.3f, y2 = 1.f; +		vec2.setVec(x1, y1); +		vec3.setVec(x2, y2); +		vec4 = vec2 + vec3; +		val1 = x1+x2; +		val2 = y1+y2; +		ensure("2:operator+ failed",(val1 == vec4.mV[VX]) && ((val2 == vec4.mV[VY])));  +	} + +	template<> template<> +	void v2math_object::test<7>() +	{ +		F32 x1 =1.f, y1 = 2.f,  x2 = -2.3f, y2 = 1.11f; +		F32 val1, val2; +		LLVector2 vec2(x1, y1), vec3(x2, y2), vec4; +		vec4 = vec2 - vec3 ; +		val1 = x1-x2; +		val2 = y1-y2; +		ensure("1:operator- failed",(val1 == vec4.mV[VX]) && ((val2 == vec4.mV[VY])));  + +		vec2.clearVec(); +		vec3.clearVec(); +		vec4.clearVec(); +		x1 = -.235f, y1 = -24.32f,  x2 = -2.3f, y2 = 1.f; +		vec2.setVec(x1, y1); +		vec3.setVec(x2, y2); +		vec4 = vec2 - vec3; +		val1 = x1-x2; +		val2 = y1-y2; +		ensure("2:operator- failed",(val1 == vec4.mV[VX]) && ((val2 == vec4.mV[VY])));  +	} + +	template<> template<> +	void v2math_object::test<8>() +	{ +		F32 x1 =1.f, y1 = 2.f,  x2 = -2.3f, y2 = 1.11f; +		F32 val1, val2; +		LLVector2 vec2(x1, y1), vec3(x2, y2); +		val1 = vec2 * vec3; +		val2 = x1*x2 + y1*y2; +		ensure("1:operator* failed",(val1 == val2)); + +		vec3.clearVec(); +		F32 mulVal = 4.332f; +		vec3 = vec2 * mulVal; +		val1 = x1*mulVal; +		val2 = y1*mulVal; +		ensure("2:operator* failed",(val1 == vec3.mV[VX]) && (val2 == vec3.mV[VY])); + +		vec3.clearVec(); +		vec3 = mulVal * vec2; +		ensure("3:operator* failed",(val1 == vec3.mV[VX]) && (val2 == vec3.mV[VY]));		 +	} + +	template<> template<> +	void v2math_object::test<9>() +	{ +		F32 x1 =1.f, y1 = 2.f, div = 3.2f; +		F32 val1, val2; +		LLVector2 vec2(x1, y1), vec3; +		vec3 = vec2 / div; +		val1 = x1 / div; +		val2 = y1 / div; +		ensure("1:operator/ failed", is_approx_equal(val1, vec3.mV[VX]) && is_approx_equal(val2, vec3.mV[VY]));		 + +		vec3.clearVec(); +		x1 = -.235f, y1 = -24.32f, div = -2.2f; +		vec2.setVec(x1, y1); +		vec3 = vec2 / div; +		val1 = x1 / div; +		val2 = y1 / div; +		ensure("2:operator/ failed", is_approx_equal(val1, vec3.mV[VX]) && is_approx_equal(val2, vec3.mV[VY]));		 +	} + +	template<> template<> +	void v2math_object::test<10>() +	{ +		F32 x1 =1.f, y1 = 2.f,  x2 = -2.3f, y2 = 1.11f; +		F32 val1, val2; +		LLVector2 vec2(x1, y1), vec3(x2, y2), vec4; +		vec4 = vec2 % vec3; +		val1 = x1*y2 - x2*y1; +		val2 = y1*x2 - y2*x1; +		ensure("1:operator% failed",(val1 == vec4.mV[VX]) && (val2 == vec4.mV[VY]));	 + +		vec2.clearVec(); +		vec3.clearVec(); +		vec4.clearVec(); +		x1 = -.235f, y1 = -24.32f,  x2 = -2.3f, y2 = 1.f; +		vec2.setVec(x1, y1); +		vec3.setVec(x2, y2); +		vec4 = vec2 % vec3; +		val1 = x1*y2 - x2*y1; +		val2 = y1*x2 - y2*x1; +		ensure("2:operator% failed",(val1 == vec4.mV[VX]) && (val2 == vec4.mV[VY]));	 +	} +	template<> template<> +	void v2math_object::test<11>() +	{ +		F32 x1 =1.f, y1 = 2.f; +		LLVector2 vec2(x1, y1), vec3(x1, y1); +		ensure("1:operator== failed",(vec2 == vec3)); +		 +		vec2.clearVec(); +		vec3.clearVec(); +		x1 = -.235f, y1 = -24.32f; +		vec2.setVec(x1, y1); +		vec3.setVec(vec2); +		ensure("2:operator== failed",(vec2 == vec3)); +	} + +	template<> template<> +	void v2math_object::test<12>() +	{ +		F32 x1 = 1.f, y1 = 2.f,x2 = 2.332f, y2 = -1.23f; +		LLVector2 vec2(x1, y1), vec3(x2, y2); +		ensure("1:operator!= failed",(vec2 != vec3)); +		 +		vec2.clearVec(); +		vec3.clearVec(); +		vec2.setVec(x1, y1); +		vec3.setVec(vec2); +		ensure("2:operator!= failed", (FALSE == (vec2 != vec3))); +	} +	template<> template<> +	void v2math_object::test<13>() +	{ +		F32 x1 = 1.f, y1 = 2.f,x2 = 2.332f, y2 = -1.23f; +		F32 val1, val2; +		LLVector2 vec2(x1, y1), vec3(x2, y2); +		vec2 +=vec3; +		val1 = x1+x2; +		val2 = y1+y2; +		ensure("1:operator+= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY])); +		 +		vec2.setVec(x1, y1); +		vec2 -=vec3; +		val1 = x1-x2; +		val2 = y1-y2; +		ensure("2:operator-= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY])); +		 +		vec2.clearVec(); +		vec3.clearVec(); +		x1 = -21.000466f, y1 = 2.98382f,x2 = 0.332f, y2 = -01.23f; +		vec2.setVec(x1, y1); +		vec3.setVec(x2, y2); +		vec2 +=vec3; +		val1 = x1+x2; +		val2 = y1+y2; +		ensure("3:operator+= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY])); + +		vec2.setVec(x1, y1); +		vec2 -=vec3; +		val1 = x1-x2; +		val2 = y1-y2; +		ensure("4:operator-= failed", is_approx_equal(val1, vec2.mV[VX]) && is_approx_equal(val2, vec2.mV[VY])); +	} + +	template<> template<> +	void v2math_object::test<14>() +	{ +		F32 x1 =1.f, y1 = 2.f; +		F32 val1, val2, mulVal = 4.332f; +		LLVector2 vec2(x1, y1); +		vec2 /=mulVal; +		val1 = x1 / mulVal; +		val2 = y1 / mulVal; +		ensure("1:operator/= failed", is_approx_equal(val1, vec2.mV[VX]) && is_approx_equal(val2, vec2.mV[VY])); +		 +		vec2.clearVec(); +		x1 = .213f, y1 = -2.34f, mulVal = -.23f; +		vec2.setVec(x1, y1); +		vec2 /=mulVal; +		val1 = x1 / mulVal; +		val2 = y1 / mulVal; +		ensure("2:operator/= failed", is_approx_equal(val1, vec2.mV[VX]) && is_approx_equal(val2, vec2.mV[VY])); +	} + +	template<> template<> +	void v2math_object::test<15>() +	{ +		F32 x1 =1.f, y1 = 2.f; +		F32 val1, val2, mulVal = 4.332f; +		LLVector2 vec2(x1, y1); +		vec2 *=mulVal; +		val1 = x1*mulVal; +		val2 = y1*mulVal; +		ensure("1:operator*= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY])); +		 +		vec2.clearVec(); +		x1 = .213f, y1 = -2.34f, mulVal = -.23f; +		vec2.setVec(x1, y1); +		vec2 *=mulVal; +		val1 = x1*mulVal; +		val2 = y1*mulVal; +		ensure("2:operator*= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY])); +	} +	 +	template<> template<> +	void v2math_object::test<16>() +	{ +		F32 x1 =1.f, y1 = 2.f,  x2 = -2.3f, y2 = 1.11f; +		F32 val1, val2; +		LLVector2 vec2(x1, y1), vec3(x2, y2); +		vec2 %= vec3; +		val1 = x1*y2 - x2*y1; +		val2 = y1*x2 - y2*x1; +		ensure("1:operator%= failed",(val1 == vec2.mV[VX]) && (val2 == vec2.mV[VY]));	 +	} + +	template<> template<> +	void v2math_object::test<17>() +	{ +		F32 x1 =1.f, y1 = 2.f; +		LLVector2 vec2(x1, y1),vec3; +		vec3 = -vec2; +		ensure("1:operator- failed",(-vec3 == vec2));	 +	} + +	template<> template<> +	void v2math_object::test<18>() +	{ +		F32 x1 =1.f, y1 = 2.f; +		std::ostringstream stream1, stream2; +		LLVector2 vec2(x1, y1),vec3; +		stream1 << vec2; +		vec3.setVec(x1, y1); +		stream2 << vec3; +		ensure("1:operator << failed",(stream1.str() == stream2.str()));	 +	} + +	template<> template<> +	void v2math_object::test<19>() +	{ +		F32 x1 =1.0f, y1 = 2.0f, x2 = -.32f, y2 = .2234f; +		LLVector2 vec2(x1, y1),vec3(x2, y2); +		ensure("1:operator < failed",(vec3 < vec2));	 + +		x1 = 1.0f, y1 = 2.0f, x2 = 1.0f, y2 = 3.2234f; +		vec2.setVec(x1, y1); +		vec3.setVec(x2, y2); +		ensure("2:operator < failed", (FALSE == vec3 < vec2));	 +	} + +	template<> template<> +	void v2math_object::test<20>() +	{ +		F32 x1 =1.0f, y1 = 2.0f; +		LLVector2 vec2(x1, y1); +		ensure("1:operator [] failed",( x1 ==  vec2[0]));	 +		ensure("2:operator [] failed",( y1 ==  vec2[1])); + +		vec2.clearVec(); +		x1 = 23.0f, y1 = -.2361f; +		vec2.setVec(x1, y1); +		F32 ref1 = vec2[0]; +		ensure("3:operator [] failed", ( ref1 ==  x1)); +		F32 ref2 = vec2[1]; +		ensure("4:operator [] failed", ( ref2 ==  y1)); +	} + +	template<> template<> +	void v2math_object::test<21>() +	{ +		F32 x1 =1.f, y1 = 2.f, x2 = -.32f, y2 = .2234f; +		F32 val1, val2; +		LLVector2 vec2(x1, y1),vec3(x2, y2);		 +		val1 = dist_vec_squared2D(vec2, vec3); +		val2 = (x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2); +		ensure_equals("dist_vec_squared2D values are not equal",val2, val1); + +		val1 = dist_vec_squared(vec2, vec3); +		ensure_equals("dist_vec_squared values are not equal",val2, val1); + +		val1 = 	dist_vec(vec2, vec3); +		val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2)); +		ensure_equals("dist_vec values are not equal",val2, val1); +	} + +	template<> template<> +	void v2math_object::test<22>() +	{ +		F32 x1 =1.f, y1 = 2.f, x2 = -.32f, y2 = .2234f,fVal = .0121f; +		F32 val1, val2; +		LLVector2 vec2(x1, y1),vec3(x2, y2); +		LLVector2 vec4 = lerp(vec2, vec3, fVal); +		val1 = x1 + (x2 - x1) * fVal; +		val2 = y1 + (y2 - y1) * fVal; +		ensure("lerp values are not equal", ((val1 == vec4.mV[VX]) && (val2 == vec4.mV[VY]))); +	} + +	template<> template<> +	void v2math_object::test<23>() +	{ +		F32 x1 =1.f, y1 = 2.f; +		F32 val1, val2; +		LLVector2 vec2(x1, y1); + +		F32 vecMag = vec2.normVec(); +		F32 mag = fsqrtf(x1*x1 + y1*y1); + +		F32 oomag = 1.f / mag; +		val1 = x1 * oomag; +		val2 = y1 * oomag; + +		ensure("normVec failed", is_approx_equal(val1, vec2.mV[VX]) && is_approx_equal(val2, vec2.mV[VY]) && is_approx_equal(vecMag, mag)); + +		x1 =.00000001f, y1 = 0.f; + +		vec2.setVec(x1, y1); +		vecMag = vec2.normVec(); +		ensure("normVec failed should be 0.", 0. == vec2.mV[VX] && 0. == vec2.mV[VY] && vecMag == 0.); +	} +} diff --git a/indra/llmath/tests/v3math_test.cpp b/indra/llmath/tests/v3math_test.cpp new file mode 100644 index 0000000000..00cffde367 --- /dev/null +++ b/indra/llmath/tests/v3math_test.cpp @@ -0,0 +1,573 @@ +/** + * @file v3math_tut.cpp + * @author Adroit + * @date 2007-02 + * @brief v3math test cases. + * + * $LicenseInfo:firstyear=2007&license=viewergpl$ + *  + * Copyright (c) 2007-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$ + */ +  +#include "linden_common.h" +#include "../test/lltut.h" +#include "llsd.h" + +#include "../llquaternion.h" +#include "../llquantize.h" +#include "../v3dmath.h" +#include "../m3math.h" +#include "../v4math.h" +#include "../v3math.h" + + +namespace tut +{ +	struct v3math_data +	{ +	}; +	typedef test_group<v3math_data> v3math_test; +	typedef v3math_test::object v3math_object; +	tut::v3math_test v3math_testcase("v3math"); + +	template<> template<> +	void v3math_object::test<1>() +	{ +		LLVector3 vec3; +		ensure("1:LLVector3:Fail to initialize ", ((0.f == vec3.mV[VX]) && (0.f == vec3.mV[VY]) && (0.f == vec3.mV[VZ]))); +		F32 x = 2.32f, y = 1.212f, z = -.12f; +		LLVector3 vec3a(x,y,z); +		ensure("2:LLVector3:Fail to initialize ", ((2.32f == vec3a.mV[VX]) && (1.212f == vec3a.mV[VY]) && (-.12f == vec3a.mV[VZ]))); +		const F32 vec[3] = {1.2f ,3.2f, -4.2f}; +		LLVector3 vec3b(vec); +		ensure("3:LLVector3:Fail to initialize ", ((1.2f == vec3b.mV[VX]) && (3.2f == vec3b.mV[VY]) && (-4.2f == vec3b.mV[VZ]))); +	} + +	template<> template<> +	void v3math_object::test<2>() +	{ +		F32 x = 2.32f, y = 1.212f, z = -.12f; +		LLVector3 vec3(x,y,z); +		LLVector3d vector3d(vec3); +		LLVector3 vec3a(vector3d); +		ensure("1:LLVector3:Fail to initialize ", vec3 == vec3a); +		LLVector4 vector4(vec3); +		LLVector3 vec3b(vector4); +		ensure("2:LLVector3:Fail to initialize ", vec3 == vec3b); +	} + +	template<> template<> +	void v3math_object::test<3>() +	{ +		S32 a = 231; +		LLSD llsd(a); +		LLVector3 vec3(llsd); +		LLSD sd = vec3.getValue(); +		LLVector3 vec3a(sd); +		ensure("1:LLVector3:Fail to initialize ", (vec3 == vec3a)); +	} + +	template<> template<> +	void v3math_object::test<4>() +	{ +		S32 a = 231; +		LLSD llsd(a); +		LLVector3 vec3(llsd),vec3a; +		vec3a = vec3; +		ensure("1:Operator= Fail to initialize " ,(vec3 == vec3a)); +	} +	 +	template<> template<> +	void v3math_object::test<5>() +	{ +		F32 x = 2.32f, y = 1.212f, z = -.12f; +		LLVector3 vec3(x,y,z); +		ensure("1:isFinite= Fail to initialize ", (TRUE == vec3.isFinite()));//need more test cases: +		vec3.clearVec(); +		ensure("2:clearVec:Fail to set values ", ((0.f == vec3.mV[VX]) && (0.f == vec3.mV[VY]) && (0.f == vec3.mV[VZ]))); +		vec3.setVec(x,y,z); +		ensure("3:setVec:Fail to set values ", ((2.32f == vec3.mV[VX]) && (1.212f == vec3.mV[VY]) && (-.12f == vec3.mV[VZ]))); +		vec3.zeroVec(); +		ensure("4:zeroVec:Fail to set values ", ((0.f == vec3.mV[VX]) && (0.f == vec3.mV[VY]) && (0.f == vec3.mV[VZ]))); +	} +	 +	template<> template<> +	void v3math_object::test<6>() +	{ +		F32 x = 2.32f, y = 1.212f, z = -.12f; +		LLVector3 vec3(x,y,z),vec3a; +		vec3.abs(); +		ensure("1:abs:Fail ", ((x == vec3.mV[VX]) && (y == vec3.mV[VY]) && (-z == vec3.mV[VZ]))); +		vec3a.setVec(vec3); +		ensure("2:setVec:Fail to initialize ", (vec3a == vec3));	 +		const F32 vec[3] = {1.2f ,3.2f, -4.2f}; +		vec3.clearVec(); +		vec3.setVec(vec); +		ensure("3:setVec:Fail to initialize ", ((1.2f == vec3.mV[VX]) && (3.2f == vec3.mV[VY]) && (-4.2f == vec3.mV[VZ]))); +		vec3a.clearVec(); +		LLVector3d vector3d(vec3); +		vec3a.setVec(vector3d); +		ensure("4:setVec:Fail to initialize ", (vec3 == vec3a)); +		LLVector4 vector4(vec3); +		vec3a.clearVec(); +		vec3a.setVec(vector4); +		ensure("5:setVec:Fail to initialize ", (vec3 == vec3a)); +	} + +	template<> template<> +	void v3math_object::test<7>() +	{ +		F32 x = 2.32f, y = 3.212f, z = -.12f; +		F32 min = 0.0001f, max = 3.0f; +		LLVector3 vec3(x,y,z);		 +		ensure("1:clamp:Fail  ", TRUE == vec3.clamp(min, max) && x == vec3.mV[VX] && max == vec3.mV[VY] && min == vec3.mV[VZ]); +		x = 1.f, y = 2.2f, z = 2.8f; +		vec3.setVec(x,y,z); +		ensure("2:clamp:Fail  ", FALSE == vec3.clamp(min, max)); +	} + +	template<> template<> +	void v3math_object::test<8>() +	{ +		F32 x = 2.32f, y = 1.212f, z = -.12f; +		LLVector3 vec3(x,y,z);		 +		ensure("1:magVecSquared:Fail ", is_approx_equal(vec3.magVecSquared(), (x*x + y*y + z*z))); +		ensure("2:magVec:Fail ", is_approx_equal(vec3.magVec(), fsqrtf(x*x + y*y + z*z))); +	} + +	template<> template<> +	void v3math_object::test<9>() +	{ +		F32 x =-2.0f, y = -3.0f, z = 1.23f ; +		LLVector3 vec3(x,y,z); +		ensure("1:abs():Fail ", (TRUE == vec3.abs()));	 +		ensure("2:isNull():Fail", (FALSE == vec3.isNull()));	//Returns TRUE if vector has a _very_small_ length +		x =.00000001f, y = .000001001f, z = .000001001f; +		vec3.setVec(x,y,z); +		ensure("3:isNull(): Fail ", (TRUE == vec3.isNull()));	 +	} + +	template<> template<> +	void v3math_object::test<10>() +	{ +		F32 x =-2.0f, y = -3.0f, z = 1.f ; +		LLVector3 vec3(x,y,z),vec3a; +		ensure("1:isExactlyZero():Fail ", (TRUE == vec3a.isExactlyZero())); +		vec3a = vec3a.scaleVec(vec3); +		ensure("2:scaleVec: Fail ", vec3a.mV[VX] == 0.f && vec3a.mV[VY] == 0.f && vec3a.mV[VZ] == 0.f); +		vec3a.setVec(x,y,z); +		vec3a = vec3a.scaleVec(vec3); +		ensure("3:scaleVec: Fail ", ((4 == vec3a.mV[VX]) && (9 == vec3a.mV[VY]) &&(1 == vec3a.mV[VZ]))); +		ensure("4:isExactlyZero():Fail ", (FALSE == vec3.isExactlyZero())); +	} + +	template<> template<> +	void v3math_object::test<11>() +	{ +		F32 x =20.0f, y = 30.0f, z = 15.f ; +		F32 angle = 100.f; +		LLVector3 vec3(x,y,z),vec3a(1.f,2.f,3.f); +		vec3a = vec3a.rotVec(angle, vec3); +		LLVector3 vec3b(1.f,2.f,3.f); +		vec3b = vec3b.rotVec(angle, vec3); +		ensure_equals("rotVec():Fail" ,vec3b,vec3a); +	} + +	template<> template<> +	void v3math_object::test<12>() +	{ +		F32 x =-2.0f, y = -3.0f, z = 1.f ; +		LLVector3 vec3(x,y,z); +		ensure("1:operator [] failed",( x ==  vec3[0]));	 +		ensure("2:operator [] failed",( y ==  vec3[1])); +		ensure("3:operator [] failed",( z ==  vec3[2])); + +		vec3.clearVec(); +		x = 23.f, y = -.2361f, z = 3.25; +		vec3.setVec(x,y,z); +		F32 &ref1 = vec3[0]; +		ensure("4:operator [] failed",( ref1 ==  vec3[0])); +		F32 &ref2 = vec3[1]; +		ensure("5:operator [] failed",( ref2 ==  vec3[1])); +		F32 &ref3 = vec3[2]; +		ensure("6:operator [] failed",( ref3 ==  vec3[2])); +	} + +	template<> template<> +	void v3math_object::test<13>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f; +		F32 val1, val2, val3; +		LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2), vec3b; +		vec3b = vec3 + vec3a ; +		val1 = x1+x2; +		val2 = y1+y2; +		val3 = z1+z2; +		ensure("1:operator+ failed",(val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ]));  + +		vec3.clearVec(); +		vec3a.clearVec(); +		vec3b.clearVec(); +		x1 = -.235f, y1 = -24.32f,z1 = 2.13f,  x2 = -2.3f, y2 = 1.f, z2 = 34.21f; +		vec3.setVec(x1,y1,z1); +		vec3a.setVec(x2,y2,z2); +		vec3b = vec3 + vec3a; +		val1 = x1+x2; +		val2 = y1+y2; +		val3 = z1+z2; +		ensure("2:operator+ failed",(val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ]));  +	} + +	template<> template<> +	void v3math_object::test<14>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f; +		F32 val1, val2, val3; +		LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2), vec3b; +		vec3b = vec3 - vec3a ; +		val1 = x1-x2; +		val2 = y1-y2; +		val3 = z1-z2; +		ensure("1:operator- failed",(val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ]));  + +		vec3.clearVec(); +		vec3a.clearVec(); +		vec3b.clearVec(); +		x1 = -.235f, y1 = -24.32f,z1 = 2.13f,  x2 = -2.3f, y2 = 1.f, z2 = 34.21f; +		vec3.setVec(x1,y1,z1); +		vec3a.setVec(x2,y2,z2); +		vec3b = vec3 - vec3a; +		val1 = x1-x2; +		val2 = y1-y2; +		val3 = z1-z2; +		ensure("2:operator- failed",(val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ]));  +	} + +	template<> template<> +	void v3math_object::test<15>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f; +		F32 val1, val2, val3; +		LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2); +		val1 = vec3 * vec3a; +		val2 = x1*x2 + y1*y2 + z1*z2; +		ensure_equals("1:operator* failed",val1,val2); + +		vec3a.clearVec(); +		F32 mulVal = 4.332f; +		vec3a = vec3 * mulVal; +		val1 = x1*mulVal; +		val2 = y1*mulVal; +		val3 = z1*mulVal; +		ensure("2:operator* failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY])&& (val3 == vec3a.mV[VZ])); +		vec3a.clearVec(); +		vec3a = mulVal * vec3; +		ensure("3:operator* failed ", (val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY])&& (val3 == vec3a.mV[VZ])); +	} + +	template<> template<> +	void v3math_object::test<16>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f; +		F32 val1, val2, val3; +		LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2), vec3b; +		vec3b = vec3 % vec3a ; +		val1 = y1*z2 - y2*z1; +		val2 = z1*x2 -z2*x1; +		val3 = x1*y2-x2*y1; +		ensure("1:operator% failed",(val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ]));  + +		vec3.clearVec(); +		vec3a.clearVec(); +		vec3b.clearVec(); +		x1 =112.f, y1 = 22.3f,z1 = 1.2f, x2 = -2.3f, y2 = 341.11f, z2 = 1234.234f; +		vec3.setVec(x1,y1,z1); +		vec3a.setVec(x2,y2,z2); +		vec3b = vec3 % vec3a ; +		val1 = y1*z2 - y2*z1; +		val2 = z1*x2 -z2*x1; +		val3 = x1*y2-x2*y1; +		ensure("2:operator% failed ", (val1 == vec3b.mV[VX]) && (val2 == vec3b.mV[VY]) && (val3 == vec3b.mV[VZ]));  +	} + +	template<> template<> +	void v3math_object::test<17>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, div = 3.2f; +		F32 t = 1.f / div, val1, val2, val3; +		LLVector3 vec3(x1,y1,z1), vec3a; +		vec3a = vec3 / div; +		val1 = x1 * t; +		val2 = y1 * t; +		val3 = z1 *t; +		ensure("1:operator/ failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY]) && (val3 == vec3a.mV[VZ]));		 + +		vec3a.clearVec(); +		x1 = -.235f, y1 = -24.32f, z1 = .342f, div = -2.2f; +		t = 1.f / div; +		vec3.setVec(x1,y1,z1); +		vec3a = vec3 / div; +		val1 = x1 * t; +		val2 = y1 * t; +		val3 = z1 *t; +		ensure("2:operator/ failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY]) && (val3 == vec3a.mV[VZ]));		 +	} + +	template<> template<> +	void v3math_object::test<18>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f; +		LLVector3 vec3(x1,y1,z1), vec3a(x1,y1,z1); +		ensure("1:operator== failed",(vec3 == vec3a));		 + +		vec3a.clearVec(); +		x1 = -.235f, y1 = -24.32f, z1 = .342f; +		vec3.clearVec(); +		vec3a.clearVec(); +		vec3.setVec(x1,y1,z1); +		vec3a.setVec(x1,y1,z1); +		ensure("2:operator== failed ", (vec3 == vec3a));		 +	} + +	template<> template<> +	void v3math_object::test<19>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 =112.f, y2 = 2.234f,z2 = 11.2f;; +		LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2); +		ensure("1:operator!= failed",(vec3a != vec3)); + +		vec3.clearVec(); +		vec3.clearVec(); +		vec3a.setVec(vec3); +		ensure("2:operator!= failed", ( FALSE == (vec3a != vec3))); +	} + +	template<> template<> +	void v3math_object::test<20>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 =112.f, y2 = 2.2f,z2 = 11.2f;; +		LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2); +		vec3a += vec3; +		F32 val1, val2, val3; +		val1 = x1+x2; +		val2 = y1+y2; +		val3 = z1+z2; +		ensure("1:operator+= failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY])&& (val3 == vec3a.mV[VZ])); +	} +	 +	template<> template<> +	void v3math_object::test<21>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 =112.f, y2 = 2.2f,z2 = 11.2f;; +		LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2); +		vec3a -= vec3; +		F32 val1, val2, val3; +		val1 = x2-x1; +		val2 = y2-y1; +		val3 = z2-z1; +		ensure("1:operator-= failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY])&& (val3 == vec3a.mV[VZ])); +	} + +	template<> template<> +	void v3math_object::test<22>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f; +		F32 val1,val2,val3; +		LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2); +		vec3a *= vec3; +		val1 = x1*x2; +		val2 = y1*y2; +		val3 = z1*z2; +		ensure("1:operator*= failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY])&& (val3 == vec3a.mV[VZ])); + +		F32 mulVal = 4.332f; +		vec3 *=mulVal; +		val1 = x1*mulVal; +		val2 = y1*mulVal; +		val3 = z1*mulVal; +		ensure("2:operator*= failed ", is_approx_equal(val1, vec3.mV[VX]) && is_approx_equal(val2, vec3.mV[VY]) && is_approx_equal(val3, vec3.mV[VZ])); +	} + +	template<> template<> +	void v3math_object::test<23>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, x2 = -2.3f, y2 = 1.11f, z2 = 1234.234f; +		LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2),vec3b; +		vec3b = vec3a % vec3; +		vec3a %= vec3; +		ensure_equals("1:operator%= failed",vec3a,vec3b);  +	} + +	template<> template<> +	void v3math_object::test<24>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f, div = 3.2f; +		F32 t = 1.f / div, val1, val2, val3; +		LLVector3 vec3a(x1,y1,z1); +		vec3a /= div; +		val1 = x1 * t; +		val2 = y1 * t; +		val3 = z1 *t; +		ensure("1:operator/= failed",(val1 == vec3a.mV[VX]) && (val2 == vec3a.mV[VY]) && (val3 == vec3a.mV[VZ]));		 +	} + +	template<> template<> +	void v3math_object::test<25>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f; +		LLVector3 vec3(x1,y1,z1), vec3a; +		vec3a = -vec3; +		ensure("1:operator- failed",(-vec3a == vec3));	 +	} + +	template<> template<> +	void v3math_object::test<26>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 1.2f; +		std::ostringstream stream1, stream2; +		LLVector3 vec3(x1,y1,z1), vec3a; +		stream1 << vec3; +		vec3a.setVec(x1,y1,z1); +		stream2 << vec3a; +		ensure("1:operator << failed",(stream1.str() == stream2.str()));	 +	} + +	template<> template<> +	void v3math_object::test<27>() +	{ +		F32 x1 =-2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f, y2 = 1.11f, z2 = 1234.234f; +		LLVector3 vec3(x1,y1,z1), vec3a(x2,y2,z2); +		ensure("1:operator< failed", (TRUE == vec3 < vec3a));	 +		x1 =-2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f, y2 = 2.f, z2 = 1234.234f; +		vec3.setVec(x1,y1,z1); +		vec3a.setVec(x2,y2,z2); +		ensure("2:operator< failed ", (TRUE == vec3 < vec3a));	 +		x1 =2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f, +		vec3.setVec(x1,y1,z1); +		vec3a.setVec(x2,y2,z2); +		ensure("3:operator< failed ", (FALSE == vec3 < vec3a));	 +	} + +	template<> template<> +	void v3math_object::test<28>() +	{ +		F32 x1 =1.23f, y1 = 2.f,z1 = 4.f; +		std::string buf("1.23 2. 4"); +		LLVector3 vec3, vec3a(x1,y1,z1); +		LLVector3::parseVector3(buf, &vec3); +		ensure_equals("1:parseVector3 failed", vec3, vec3a);	 +	} + +	template<> template<> +	void v3math_object::test<29>() +	{ +		F32 x1 =1.f, y1 = 2.f,z1 = 4.f; +		LLVector3 vec3(x1,y1,z1),vec3a,vec3b; +		vec3a.setVec(1,1,1); +		vec3a.scaleVec(vec3); +		ensure_equals("1:scaleVec failed", vec3, vec3a);	 +		vec3a.clearVec(); +		vec3a.setVec(x1,y1,z1); +		vec3a.scaleVec(vec3); +		ensure("2:scaleVec failed", ((1.f ==vec3a.mV[VX])&& (4.f ==vec3a.mV[VY]) && (16.f ==vec3a.mV[VZ])));		 +	} +	 +	template<> template<> +	void v3math_object::test<30>() +	{ +		F32 x1 =-2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f, y2 = 1.11f, z2 = 1234.234f; +		F32 val = 2.3f,val1,val2,val3; +		val1 = x1 + (x2 - x1)* val; +		val2 = y1 + (y2 - y1)* val; +		val3 = z1 + (z2 - z1)* val; +		LLVector3 vec3(x1,y1,z1),vec3a(x2,y2,z2); +		LLVector3 vec3b = lerp(vec3,vec3a,val); +		ensure("1:lerp failed", ((val1 ==vec3b.mV[VX])&& (val2 ==vec3b.mV[VY]) && (val3 ==vec3b.mV[VZ])));		 +	} + +	template<> template<> +	void v3math_object::test<31>() +	{ +		F32 x1 =-2.3f, y1 = 2.f,z1 = 1.2f, x2 = 1.3f, y2 = 1.f, z2 = 1.f; +		F32 val1,val2; +		LLVector3 vec3(x1,y1,z1),vec3a(x2,y2,z2); +		val1 = dist_vec(vec3,vec3a); +		val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2)); +		ensure_equals("1:dist_vec: Fail ",val2, val1); +		val1 = dist_vec_squared(vec3,vec3a); +		val2 =((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2)); +		ensure_equals("2:dist_vec_squared: Fail ",val2, val1); +		val1 = dist_vec_squared2D(vec3, vec3a); +		val2 =(x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2); +		ensure_equals("3:dist_vec_squared2D: Fail ",val2, val1); +	} + +	template<> template<> +	void v3math_object::test<32>() +	{ +		F32 x =12.3524f, y = -342.f,z = 4.126341f; +		LLVector3 vec3(x,y,z); +		F32 mag = vec3.normVec(); +		mag = 1.f/ mag; +		F32 val1 = x* mag, val2 = y* mag, val3 = z* mag; +		ensure("1:normVec: Fail ", is_approx_equal(val1, vec3.mV[VX]) && is_approx_equal(val2, vec3.mV[VY]) && is_approx_equal(val3, vec3.mV[VZ])); +		x = 0.000000001f, y = 0.f, z = 0.f; +		vec3.clearVec(); +		vec3.setVec(x,y,z); +		mag = vec3.normVec(); +		val1 = x* mag, val2 = y* mag, val3 = z* mag; +		ensure("2:normVec: Fail ", (mag == 0.) && (0. == vec3.mV[VX]) && (0. == vec3.mV[VY])&& (0. == vec3.mV[VZ])); +	} + +	template<> template<> +	void v3math_object::test<33>() +	{ +		F32 x = -202.23412f, y = 123.2312f, z = -89.f; +		LLVector3 vec(x,y,z); +		vec.snap(2); +		ensure("1:snap: Fail ", is_approx_equal(-202.23f, vec.mV[VX]) && is_approx_equal(123.23f, vec.mV[VY]) && is_approx_equal(-89.f, vec.mV[VZ])); +	} +		 +	template<> template<> +	void v3math_object::test<34>() +	{ +		F32 x = 10.f, y = 20.f, z = -15.f; +		F32 x1, y1, z1; +		F32 lowerxy = 0.f, upperxy = 1.0f, lowerz = -1.0f, upperz = 1.f; +		LLVector3 vec3(x,y,z); +		vec3.quantize16(lowerxy,upperxy,lowerz,upperz); +		x1 = U16_to_F32(F32_to_U16(x, lowerxy, upperxy), lowerxy, upperxy); +		y1 = U16_to_F32(F32_to_U16(y, lowerxy, upperxy), lowerxy, upperxy); +		z1 = U16_to_F32(F32_to_U16(z, lowerz,  upperz),  lowerz,  upperz); +		ensure("1:quantize16: Fail ", is_approx_equal(x1, vec3.mV[VX]) && is_approx_equal(y1, vec3.mV[VY]) && is_approx_equal(z1, vec3.mV[VZ])); +		LLVector3 vec3a(x,y,z); +		vec3a.quantize8(lowerxy,upperxy,lowerz,upperz); +		x1 = U8_to_F32(F32_to_U8(x, lowerxy, upperxy), lowerxy, upperxy); +		y1 = U8_to_F32(F32_to_U8(y, lowerxy, upperxy), lowerxy, upperxy); +		z1 = U8_to_F32(F32_to_U8(z, lowerz, upperz), lowerz, upperz); +		ensure("2:quantize8: Fail ", is_approx_equal(x1, vec3a.mV[VX]) && is_approx_equal(y1, vec3a.mV[VY]) && is_approx_equal(z1, vec3a.mV[VZ])); +	} +} diff --git a/indra/llmath/tests/xform_test.cpp b/indra/llmath/tests/xform_test.cpp new file mode 100644 index 0000000000..81116a58f0 --- /dev/null +++ b/indra/llmath/tests/xform_test.cpp @@ -0,0 +1,251 @@ +/**  + * @file xform_tut.cpp + * @author Adroit + * @date March 2007  + * @brief Test cases for LLXform + * + * $LicenseInfo:firstyear=2007&license=viewergpl$ + *  + * Copyright (c) 2007-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$ + */ + +#include "linden_common.h" +#include "../test/lltut.h" + +#include "../xform.h" + +namespace tut +{ +	struct xform_test +	{ +	}; +	typedef test_group<xform_test> xform_test_t; +	typedef xform_test_t::object xform_test_object_t; +	tut::xform_test_t tut_xform_test("xform_test"); + +	//test case for init(), getParent(), getRotation(), getPositionW(), getWorldRotation() fns. +	template<> template<> +	void xform_test_object_t::test<1>() +	{ +		LLXform xform_obj; +		LLVector3 emptyVec(0.f,0.f,0.f); +		LLVector3 initialScaleVec(1.f,1.f,1.f); + +		ensure("LLXform empty constructor failed: ", !xform_obj.getParent() && !xform_obj.isChanged() && +			xform_obj.getPosition() == emptyVec &&  +			(xform_obj.getRotation()).isIdentity() && +			xform_obj.getScale() == initialScaleVec &&  +			xform_obj.getPositionW() == emptyVec &&  +			(xform_obj.getWorldRotation()).isIdentity() && +			!xform_obj.getScaleChildOffset()); +	} + +	// test cases for  +	// setScale(const LLVector3& scale)  +	// setScale(const F32 x, const F32 y, const F32 z) +	// setRotation(const F32 x, const F32 y, const F32 z)  +	// setPosition(const F32 x, const F32 y, const F32 z)  +	// getLocalMat4(LLMatrix4 &mat) +	template<> template<> +	void xform_test_object_t::test<2>()	 +	{ +		LLMatrix4 llmat4; +		LLXform xform_obj; + +		F32 x = 3.6f; +		F32 y = 5.5f; +		F32 z = 4.2f; +		F32 w = 0.f; +		F32 posz = z + 2.122f; +		LLVector3 vec(x, y, z); +		xform_obj.setScale(x, y, z); +		xform_obj.setPosition(x, y, posz); +		ensure("setScale failed: ", xform_obj.getScale() == vec); + +		vec.setVec(x, y, posz); +		ensure("getPosition failed: ", xform_obj.getPosition() == vec); + +		x = x * 2.f; +		y = y + 2.3f; +		z = posz * 4.f;  +		vec.setVec(x, y, z); +		xform_obj.setPositionX(x); +		xform_obj.setPositionY(y); +		xform_obj.setPositionZ(z); +		ensure("setPositionX/Y/Z failed: ", xform_obj.getPosition() == vec); + +		xform_obj.setScaleChildOffset(TRUE); +		ensure("setScaleChildOffset failed: ", xform_obj.getScaleChildOffset()); + +		vec.setVec(x, y, z); + +		xform_obj.addPosition(vec); +		vec += vec; +		ensure("addPosition failed: ", xform_obj.getPosition() == vec); + +		xform_obj.setScale(vec); +		ensure("setScale vector failed: ", xform_obj.getScale() == vec); + +		LLQuaternion quat(x, y, z, w); +		xform_obj.setRotation(quat); +		ensure("setRotation quat failed: ", xform_obj.getRotation() == quat); + +		xform_obj.setRotation(x, y, z, w); +		ensure("getRotation 2 failed: ", xform_obj.getRotation() == quat); + +		xform_obj.setRotation(x, y, z); +		quat.setQuat(x,y,z);  +		ensure("setRotation xyz failed: ", xform_obj.getRotation() == quat); + +		// LLXform::setRotation(const F32 x, const F32 y, const F32 z)  +		//		Does normalization +		// LLXform::setRotation(const F32 x, const F32 y, const F32 z, const F32 s)  +		//		Simply copies the individual values - does not do any normalization.  +		// Is that the expected behavior? +	} + +	// test cases for inline BOOL setParent(LLXform *parent) and getParent() fn. +	template<> template<> +	void xform_test_object_t::test<3>()	 +	{		 +		LLXform xform_obj; +		LLXform par; +		LLXform grandpar; +		xform_obj.setParent(&par);  +		par.setParent(&grandpar);  +		ensure("setParent/getParent failed: ", &par == xform_obj.getParent()); +		ensure("getRoot failed: ", &grandpar == xform_obj.getRoot()); +		ensure("isRoot failed: ", grandpar.isRoot() && !par.isRoot() && !xform_obj.isRoot()); +		ensure("isRootEdit failed: ", grandpar.isRootEdit() && !par.isRootEdit() && !xform_obj.isRootEdit()); +	} + +	template<> template<> +	void xform_test_object_t::test<4>()	 +	{ +		LLXform xform_obj; +		xform_obj.setChanged(LLXform::TRANSLATED | LLXform::ROTATED | LLXform::SCALED); +		ensure("setChanged/isChanged failed: ", xform_obj.isChanged()); + +		xform_obj.clearChanged(LLXform::TRANSLATED | LLXform::ROTATED | LLXform::SCALED); +		ensure("clearChanged failed: ", !xform_obj.isChanged()); +		 +		LLVector3 llvect3(12.4f, -5.6f, 0.34f); +		xform_obj.setScale(llvect3); +		ensure("setScale did not set SCALED flag: ", xform_obj.isChanged(LLXform::SCALED)); +		xform_obj.setPosition(1.2f, 2.3f, 3.4f); +		ensure("setScale did not set TRANSLATED flag: ", xform_obj.isChanged(LLXform::TRANSLATED)); +		ensure("TRANSLATED reset SCALED flag: ", xform_obj.isChanged(LLXform::TRANSLATED | LLXform::SCALED)); +		xform_obj.clearChanged(LLXform::SCALED); +		ensure("reset SCALED failed: ", !xform_obj.isChanged(LLXform::SCALED)); +		xform_obj.setRotation(1, 2, 3, 4); +		ensure("ROTATION flag not set ", xform_obj.isChanged(LLXform::TRANSLATED | LLXform::ROTATED)); +		xform_obj.setScale(llvect3); +		ensure("ROTATION flag not set ", xform_obj.isChanged(LLXform::MOVED)); +	} + +	//to test init() and getWorldMatrix() fns. +	template<> template<> +	void xform_test_object_t::test<5>()	 +	{ +		LLXformMatrix formMatrix_obj; +		formMatrix_obj.init(); +		LLMatrix4 mat4_obj; +		 +		ensure("1. The value is not NULL", 1.f == formMatrix_obj.getWorldMatrix().mMatrix[0][0]); +		ensure("2. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[0][1]); +		ensure("3. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[0][2]); +		ensure("4. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[0][3]); +		ensure("5. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[1][0]); +		ensure("6. The value is not NULL", 1.f == formMatrix_obj.getWorldMatrix().mMatrix[1][1]); +		ensure("7. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[1][2]); +		ensure("8. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[1][3]); +		ensure("9. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[2][0]); +		ensure("10. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[2][1]); +		ensure("11. The value is not NULL", 1.f == formMatrix_obj.getWorldMatrix().mMatrix[2][2]); +		ensure("12. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[2][3]); +		ensure("13. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[3][0]); +		ensure("14. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[3][1]); +		ensure("15. The value is not NULL", 0.f == formMatrix_obj.getWorldMatrix().mMatrix[3][2]); +		ensure("16. The value is not NULL", 1.f == formMatrix_obj.getWorldMatrix().mMatrix[3][3]); +	} + +	//to test mMin.clearVec() and mMax.clearVec() fns +	template<> template<> +	void xform_test_object_t::test<6>()	 +	{ +		LLXformMatrix formMatrix_obj; +		formMatrix_obj.init(); +		LLVector3 llmin_vec3; +		LLVector3 llmax_vec3; +		formMatrix_obj.getMinMax(llmin_vec3, llmax_vec3); +		ensure("1. The value is not NULL", 0.f == llmin_vec3.mV[0]); +		ensure("2. The value is not NULL", 0.f == llmin_vec3.mV[1]); +		ensure("3. The value is not NULL", 0.f == llmin_vec3.mV[2]); +		ensure("4. The value is not NULL", 0.f == llmin_vec3.mV[0]); +		ensure("5. The value is not NULL", 0.f == llmin_vec3.mV[1]); +		ensure("6. The value is not NULL", 0.f == llmin_vec3.mV[2]); +	} + +	//test case of update() fn. +	template<> template<> +	void xform_test_object_t::test<7>()	 +	{ +		LLXformMatrix formMatrix_obj; + +		LLXformMatrix parent; +		LLVector3 llvecpos(1.0, 2.0, 3.0); +		LLVector3 llvecpospar(10.0, 20.0, 30.0); +		formMatrix_obj.setPosition(llvecpos); +		parent.setPosition(llvecpospar); + +		LLVector3 llvecparentscale(1.0, 2.0, 0); +		parent.setScaleChildOffset(TRUE); +		parent.setScale(llvecparentscale); + +		LLQuaternion quat(1, 2, 3, 4); +		LLQuaternion quatparent(5, 6, 7, 8); +		formMatrix_obj.setRotation(quat); +		parent.setRotation(quatparent); +		formMatrix_obj.setParent(&parent); + +		parent.update(); +		formMatrix_obj.update(); + +		LLVector3 worldPos = llvecpos; +		worldPos.scaleVec(llvecparentscale); +		worldPos *= quatparent; +		worldPos += llvecpospar; + +		LLQuaternion worldRot = quat * quatparent;  + +		ensure("getWorldPosition failed: ", formMatrix_obj.getWorldPosition() == worldPos); +		ensure("getWorldRotation failed: ", formMatrix_obj.getWorldRotation() == worldRot); + +		ensure("getWorldPosition for parent failed: ", parent.getWorldPosition() == llvecpospar); +		ensure("getWorldRotation for parent failed: ", parent.getWorldRotation() == quatparent); +	} +}	 + | 
