commit
c5daeb5fdd
|
@ -23,6 +23,7 @@
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace gtsam {
|
namespace gtsam {
|
||||||
|
@ -349,4 +350,44 @@ bool assert_inequal(const V& expected, const V& actual, double tol = 1e-9) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Capture std out via cout stream and compare against string.
|
||||||
|
*/
|
||||||
|
template<class V>
|
||||||
|
bool assert_stdout_equal(const std::string& expected, const V& actual) {
|
||||||
|
// Redirect output to buffer so we can compare
|
||||||
|
std::stringstream buffer;
|
||||||
|
// Save the original output stream so we can reset later
|
||||||
|
std::streambuf* old = std::cout.rdbuf(buffer.rdbuf());
|
||||||
|
|
||||||
|
// We test against actual std::cout for faithful reproduction
|
||||||
|
std::cout << actual;
|
||||||
|
|
||||||
|
// Get output string and reset stdout
|
||||||
|
std::string actual_ = buffer.str();
|
||||||
|
std::cout.rdbuf(old);
|
||||||
|
|
||||||
|
return assert_equal(expected, actual_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Capture print function output and compare against string.
|
||||||
|
*/
|
||||||
|
template<class V>
|
||||||
|
bool assert_print_equal(const std::string& expected, const V& actual) {
|
||||||
|
// Redirect output to buffer so we can compare
|
||||||
|
std::stringstream buffer;
|
||||||
|
// Save the original output stream so we can reset later
|
||||||
|
std::streambuf* old = std::cout.rdbuf(buffer.rdbuf());
|
||||||
|
|
||||||
|
// We test against actual std::cout for faithful reproduction
|
||||||
|
actual.print();
|
||||||
|
|
||||||
|
// Get output string and reset stdout
|
||||||
|
std::string actual_ = buffer.str();
|
||||||
|
std::cout.rdbuf(old);
|
||||||
|
|
||||||
|
return assert_equal(expected, actual_);
|
||||||
|
}
|
||||||
|
|
||||||
} // \namespace gtsam
|
} // \namespace gtsam
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include <CppUnitLite/TestHarness.h>
|
#include <CppUnitLite/TestHarness.h>
|
||||||
#include <gtsam/base/Testable.h>
|
#include <gtsam/base/Testable.h>
|
||||||
|
#include <gtsam/base/TestableAssertions.h>
|
||||||
#include <gtsam/base/numericalDerivative.h>
|
#include <gtsam/base/numericalDerivative.h>
|
||||||
#include <gtsam/geometry/Cal3_S2.h>
|
#include <gtsam/geometry/Cal3_S2.h>
|
||||||
|
|
||||||
|
@ -127,6 +128,16 @@ TEST(Cal3_S2, between) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST(Cal3_S2, Print) {
|
||||||
|
Cal3_S2 cal(5, 5, 5, 5, 5);
|
||||||
|
std::stringstream os;
|
||||||
|
os << "{fx: " << cal.fx() << ", fy: " << cal.fy() << ", s:" << cal.skew() << ", px:" << cal.px()
|
||||||
|
<< ", py:" << cal.py() << "}";
|
||||||
|
|
||||||
|
EXPECT(assert_stdout_equal(os.str(), cal));
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
int main() {
|
int main() {
|
||||||
TestResult tr;
|
TestResult tr;
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <gtsam/geometry/Pose2.h>
|
#include <gtsam/geometry/Pose2.h>
|
||||||
#include <gtsam/base/testLie.h>
|
#include <gtsam/base/testLie.h>
|
||||||
#include <gtsam/base/lieProxies.h>
|
#include <gtsam/base/lieProxies.h>
|
||||||
|
#include <gtsam/base/TestableAssertions.h>
|
||||||
|
|
||||||
#include <boost/assign/std/vector.hpp> // for operator +=
|
#include <boost/assign/std/vector.hpp> // for operator +=
|
||||||
using namespace boost::assign;
|
using namespace boost::assign;
|
||||||
|
@ -1028,32 +1029,13 @@ TEST(Pose3, Create) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
TEST(Pose3, print) {
|
TEST(Pose3, Print) {
|
||||||
std::stringstream redirectStream;
|
|
||||||
std::streambuf* ssbuf = redirectStream.rdbuf();
|
|
||||||
std::streambuf* oldbuf = std::cout.rdbuf();
|
|
||||||
// redirect cout to redirectStream
|
|
||||||
std::cout.rdbuf(ssbuf);
|
|
||||||
|
|
||||||
Pose3 pose(Rot3::identity(), Point3(1, 2, 3));
|
Pose3 pose(Rot3::identity(), Point3(1, 2, 3));
|
||||||
// output is captured to redirectStream
|
|
||||||
pose.print();
|
|
||||||
|
|
||||||
// Generate the expected output
|
// Generate the expected output
|
||||||
std::stringstream expected;
|
std::string expected = "R: [\n\t1, 0, 0;\n\t0, 1, 0;\n\t0, 0, 1\n]\nt: 1 2 3\n";
|
||||||
Point3 translation(1, 2, 3);
|
|
||||||
|
|
||||||
// Add expected rotation
|
EXPECT(assert_print_equal(expected, pose));
|
||||||
expected << "R: [\n\t1, 0, 0;\n\t0, 1, 0;\n\t0, 0, 1\n]\n";
|
|
||||||
expected << "t: 1 2 3\n";
|
|
||||||
|
|
||||||
// reset cout to the original stream
|
|
||||||
std::cout.rdbuf(oldbuf);
|
|
||||||
|
|
||||||
// Get substring corresponding to translation part
|
|
||||||
std::string actual = redirectStream.str();
|
|
||||||
|
|
||||||
CHECK_EQUAL(expected.str(), actual);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include <CppUnitLite/TestHarness.h>
|
#include <CppUnitLite/TestHarness.h>
|
||||||
#include <gtsam/base/Testable.h>
|
#include <gtsam/base/Testable.h>
|
||||||
|
#include <gtsam/base/TestableAssertions.h>
|
||||||
#include <gtsam/inference/Symbol.h>
|
#include <gtsam/inference/Symbol.h>
|
||||||
#include <gtsam/nonlinear/FunctorizedFactor.h>
|
#include <gtsam/nonlinear/FunctorizedFactor.h>
|
||||||
#include <gtsam/nonlinear/factorTesting.h>
|
#include <gtsam/nonlinear/factorTesting.h>
|
||||||
|
@ -115,16 +116,6 @@ TEST(FunctorizedFactor, Print) {
|
||||||
auto factor =
|
auto factor =
|
||||||
MakeFunctorizedFactor<Matrix>(key, X, model, MultiplyFunctor(multiplier));
|
MakeFunctorizedFactor<Matrix>(key, X, model, MultiplyFunctor(multiplier));
|
||||||
|
|
||||||
// redirect output to buffer so we can compare
|
|
||||||
stringstream buffer;
|
|
||||||
streambuf *old = cout.rdbuf(buffer.rdbuf());
|
|
||||||
|
|
||||||
factor.print();
|
|
||||||
|
|
||||||
// get output string and reset stdout
|
|
||||||
string actual = buffer.str();
|
|
||||||
cout.rdbuf(old);
|
|
||||||
|
|
||||||
string expected =
|
string expected =
|
||||||
" keys = { X0 }\n"
|
" keys = { X0 }\n"
|
||||||
" noise model: unit (9) \n"
|
" noise model: unit (9) \n"
|
||||||
|
@ -135,7 +126,7 @@ TEST(FunctorizedFactor, Print) {
|
||||||
"]\n"
|
"]\n"
|
||||||
" noise model sigmas: 1 1 1 1 1 1 1 1 1\n";
|
" noise model sigmas: 1 1 1 1 1 1 1 1 1\n";
|
||||||
|
|
||||||
CHECK_EQUAL(expected, actual);
|
EXPECT(assert_print_equal(expected, factor));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
|
@ -595,15 +595,7 @@ TEST(Values, Demangle) {
|
||||||
values.insert(key1, v);
|
values.insert(key1, v);
|
||||||
string expected = "Values with 1 values:\nValue v1: (Eigen::Matrix<double, 1, 3, 1, 1, 3>)\n[\n 5, 6, 7\n]\n\n";
|
string expected = "Values with 1 values:\nValue v1: (Eigen::Matrix<double, 1, 3, 1, 1, 3>)\n[\n 5, 6, 7\n]\n\n";
|
||||||
|
|
||||||
stringstream buffer;
|
EXPECT(assert_print_equal(expected, values));
|
||||||
streambuf * old = cout.rdbuf(buffer.rdbuf());
|
|
||||||
|
|
||||||
values.print();
|
|
||||||
|
|
||||||
string actual = buffer.str();
|
|
||||||
cout.rdbuf(old);
|
|
||||||
|
|
||||||
EXPECT(assert_equal(expected, actual));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
Loading…
Reference in New Issue