143 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			143 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
|  | /*
 | ||
|  |  * @file testKey.cpp | ||
|  |  * @author Alex Cunningham | ||
|  |  */ | ||
|  | 
 | ||
|  | #include <boost/assign/std/list.hpp> // for operator +=
 | ||
|  | using namespace boost::assign; | ||
|  | 
 | ||
|  | #include <CppUnitLite/TestHarness.h>
 | ||
|  | #include "Key.h"
 | ||
|  | 	 | ||
|  | using namespace std; | ||
|  | using namespace gtsam; | ||
|  | 
 | ||
|  | class Pose3; | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST ( TypedSymbol, basic_operations ) { | ||
|  | 	typedef TypedSymbol<Pose3, 'x'> Key; | ||
|  | 
 | ||
|  | 	Key key1(0), | ||
|  | 		key2(0), | ||
|  | 		key3(1), | ||
|  | 		key4(2); | ||
|  | 
 | ||
|  | 	CHECK(key1.index()==0); | ||
|  | 	CHECK(key1 == key2); | ||
|  | 	CHECK(assert_equal(key1, key2)); | ||
|  | 	CHECK(!(key1 == key3)); | ||
|  | 	CHECK(key1 < key3); | ||
|  | 	CHECK(key3 < key4); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST ( TypedLabledSymbol, basic_operations ) { | ||
|  | 	typedef TypedLabeledSymbol<Pose3, 'x', int> RobotKey; | ||
|  | 
 | ||
|  | 	RobotKey key1(0, 1), | ||
|  | 			 key2(0, 1), | ||
|  | 			 key3(1, 1), | ||
|  | 			 key4(2, 1), | ||
|  | 			 key5(0, 2), | ||
|  | 			 key6(1, 2); | ||
|  | 
 | ||
|  | 	CHECK(key1.label()==1); | ||
|  | 	CHECK(key1.index()==0); | ||
|  | 	CHECK(key1 == key2); | ||
|  | 	CHECK(assert_equal(key1, key2)); | ||
|  | 	CHECK(!(key1 == key3)); | ||
|  | 	CHECK(key1 < key3); | ||
|  | 	CHECK(key3 < key4); | ||
|  | 	CHECK(!(key1 == key5)); | ||
|  | 	CHECK(key1 < key5); | ||
|  | 	CHECK(key5 < key6); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST ( TypedLabledSymbol, encoding ) { | ||
|  | 	typedef TypedLabeledSymbol<Pose3, 'x', char> RobotKey; | ||
|  | 
 | ||
|  | 	RobotKey key1(37, 'A'); | ||
|  | 
 | ||
|  | 	// Note: calculations done in test due to possible differences between machines
 | ||
|  | 	// take the upper two bytes for the label
 | ||
|  | 	short label = key1.label(); | ||
|  | 
 | ||
|  | 	// find the shift necessary
 | ||
|  | 	size_t shift = (sizeof(size_t)-sizeof(short)) * 8; | ||
|  | 	size_t modifier = label; | ||
|  | 	modifier = modifier << shift; | ||
|  | 	size_t index = key1.index() + modifier; | ||
|  | 
 | ||
|  | 	// check index encoding
 | ||
|  | 	Symbol act1(key1), exp('x', index); | ||
|  | 	CHECK(assert_equal(exp, act1)); | ||
|  | 
 | ||
|  | 	// check casting
 | ||
|  | 	Symbol act2 = (Symbol) key1; | ||
|  | 	CHECK(assert_equal(exp, act2)); | ||
|  | 
 | ||
|  | 	// decode
 | ||
|  | 	CHECK(assert_equal(key1, RobotKey(act1))); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* *
 | ||
|  | TEST ( TypedLabledSymbol, symbol_translation ) { | ||
|  | 	typedef TypedLabeledSymbol<Pose3, 'x', char> Key; | ||
|  | 
 | ||
|  | 	Key key1(0, 'A'), | ||
|  | 		key2(1, 'A'), | ||
|  | 		key3(0, 'B'), | ||
|  | 		key4(1, 'B'); | ||
|  | 
 | ||
|  | 	LabeledSymbol act1(key1), act2(key2), act3(key3), act4(key4); | ||
|  | 	LabeledSymbol exp1('x', 0, 'A'), | ||
|  | 				  exp2('x', 1, 'A'), | ||
|  | 				  exp3('x', 0, 'B'), | ||
|  | 				  exp4('x', 1, 'B'); | ||
|  | 	CHECK(assert_equal(exp1, act1)); | ||
|  | 	CHECK(assert_equal(exp2, act2)); | ||
|  | 	CHECK(assert_equal(exp3, act3)); | ||
|  | 	CHECK(assert_equal(exp4, act4)); | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* *
 | ||
|  | TEST ( TypedLabledSymbol, symbol_comparison ) { | ||
|  | 	typedef TypedLabeledSymbol<Pose3, 'x', char> Key1; | ||
|  | 	typedef TypedSymbol<Pose3, 'x'> Key2; | ||
|  | 
 | ||
|  | 	Key1 key1(0, 'A'), | ||
|  | 		 key2(1, 'A'), | ||
|  | 		 key3(0, 'B'), | ||
|  | 		 key4(1, 'B'); | ||
|  | 	Key2 key5(0), key6(1); | ||
|  | 
 | ||
|  | 	LabeledSymbol act1(key1), act2(key2), act3(key3), act4(key4); | ||
|  | 
 | ||
|  | 	CHECK(act1 != act2); | ||
|  | 	CHECK(act1 != act3); | ||
|  | 	CHECK(act1 != act4); | ||
|  | 	CHECK(act1 == act1); | ||
|  | 	CHECK(act1 < act2); | ||
|  | 	CHECK(act1 < act3); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST ( Key, keys2symbols ) | ||
|  | { | ||
|  | 	typedef TypedSymbol<int, 'x'> Key; | ||
|  | 	list<Symbol> expected; | ||
|  | 	expected += Key(1), Key(2), Key(3); | ||
|  | 
 | ||
|  | 	list<TypedSymbol<int, 'x'> > typeds; | ||
|  | 	typeds += 1, 2, 3; | ||
|  | 	CHECK(expected == keys2symbols(typeds)); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | int main() { TestResult tr; return TestRegistry::runAllTests(tr); } | ||
|  | /* ************************************************************************* */ | ||
|  | 
 |