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); }
|
|
/* ************************************************************************* */
|
|
|