From 07c4c95f1854c63ab0fe0454a241d07d5fb65ca7 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Wed, 8 May 2013 13:23:46 +0000 Subject: [PATCH] Added serialization unit tests for binary files --- gtsam/base/serializationTestHelpers.h | 53 +++++++++++++ gtsam/base/tests/testSerializationBase.cpp | 7 ++ .../tests/testSerializationGeometry.cpp | 21 +++++ .../tests/testSerializationInference.cpp | 3 + .../linear/tests/testSerializationLinear.cpp | 29 +++++-- .../tests/testSerializationNonlinear.cpp | 1 + tests/testSerializationSLAM.cpp | 76 +++++++++++++++++++ 7 files changed, 185 insertions(+), 5 deletions(-) diff --git a/gtsam/base/serializationTestHelpers.h b/gtsam/base/serializationTestHelpers.h index d3cdba095..3d5bf4d71 100644 --- a/gtsam/base/serializationTestHelpers.h +++ b/gtsam/base/serializationTestHelpers.h @@ -36,6 +36,8 @@ #include #include #include +#include +#include // whether to print the serialized text to stdout const bool verbose = false; @@ -146,4 +148,55 @@ bool equalsDereferencedXML(const T& input = T()) { return input->equals(*output); } +/* ************************************************************************* */ +template +std::string serializeBinary(const T& input) { + std::ostringstream out_archive_stream; + boost::archive::binary_oarchive out_archive(out_archive_stream); + out_archive << boost::serialization::make_nvp("data", input); + return out_archive_stream.str(); +} + +template +void deserializeBinary(const std::string& serialized, T& output) { + std::istringstream in_archive_stream(serialized); + boost::archive::binary_iarchive in_archive(in_archive_stream); + in_archive >> boost::serialization::make_nvp("data", output); +} + +// Templated round-trip serialization using XML +template +void roundtripBinary(const T& input, T& output) { + // Serialize + std::string serialized = serializeBinary(input); + if (verbose) std::cout << serialized << std::endl << std::endl; + + // De-serialize + deserializeBinary(serialized, output); +} + +// This version requires equality operator +template +bool equalityBinary(const T& input = T()) { + T output; + roundtripBinary(input,output); + return input==output; +} + +// This version requires equals +template +bool equalsBinary(const T& input = T()) { + T output; + roundtripBinary(input,output); + return input.equals(output); +} + +// This version is for pointers +template +bool equalsDereferencedBinary(const T& input = T()) { + T output; + roundtripBinary(input,output); + return input->equals(*output); +} + } } diff --git a/gtsam/base/tests/testSerializationBase.cpp b/gtsam/base/tests/testSerializationBase.cpp index e144b3576..3bb88f759 100644 --- a/gtsam/base/tests/testSerializationBase.cpp +++ b/gtsam/base/tests/testSerializationBase.cpp @@ -43,6 +43,7 @@ TEST (Serialization, FastList) { EXPECT(equality(list)); EXPECT(equalityXML(list)); + EXPECT(equalityBinary(list)); } /* ************************************************************************* */ @@ -54,6 +55,7 @@ TEST (Serialization, FastMap) { EXPECT(equality(map)); EXPECT(equalityXML(map)); + EXPECT(equalityBinary(map)); } /* ************************************************************************* */ @@ -65,6 +67,7 @@ TEST (Serialization, FastSet) { EXPECT(equality(set)); EXPECT(equalityXML(set)); + EXPECT(equalityBinary(set)); } /* ************************************************************************* */ @@ -76,6 +79,7 @@ TEST (Serialization, FastVector) { EXPECT(equality(vector)); EXPECT(equalityXML(vector)); + EXPECT(equalityBinary(vector)); } /* ************************************************************************* */ @@ -85,6 +89,9 @@ TEST (Serialization, matrix_vector) { EXPECT(equalityXML(Vector_(4, 1.0, 2.0, 3.0, 4.0))); EXPECT(equalityXML(Matrix_(2, 2, 1.0, 2.0, 3.0, 4.0))); + + EXPECT(equalityBinary(Vector_(4, 1.0, 2.0, 3.0, 4.0))); + EXPECT(equalityBinary(Matrix_(2, 2, 1.0, 2.0, 3.0, 4.0))); } /* ************************************************************************* */ diff --git a/gtsam/geometry/tests/testSerializationGeometry.cpp b/gtsam/geometry/tests/testSerializationGeometry.cpp index 17a0b1eca..95001a033 100644 --- a/gtsam/geometry/tests/testSerializationGeometry.cpp +++ b/gtsam/geometry/tests/testSerializationGeometry.cpp @@ -93,6 +93,27 @@ TEST (Serialization, xml_geometry) { EXPECT(equalsXML(spt)); } +/* ************************************************************************* */ +TEST (Serialization, binary_geometry) { + EXPECT(equalsBinary(Point2(1.0, 2.0))); + EXPECT(equalsBinary(Pose2(1.0, 2.0, 0.3))); + EXPECT(equalsBinary(Rot2::fromDegrees(30.0))); + + EXPECT(equalsBinary(pt3)); + EXPECT(equalsBinary(rt3)); + EXPECT(equalsBinary(Pose3(rt3, pt3))); + + EXPECT(equalsBinary(cal1)); + EXPECT(equalsBinary(cal2)); + EXPECT(equalsBinary(cal3)); + EXPECT(equalsBinary(cal4)); + EXPECT(equalsBinary(cal5)); + + EXPECT(equalsBinary(cam1)); + EXPECT(equalsBinary(cam2)); + EXPECT(equalsBinary(spt)); +} + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */ diff --git a/gtsam/inference/tests/testSerializationInference.cpp b/gtsam/inference/tests/testSerializationInference.cpp index d4c8ea62a..b2b300440 100644 --- a/gtsam/inference/tests/testSerializationInference.cpp +++ b/gtsam/inference/tests/testSerializationInference.cpp @@ -38,6 +38,7 @@ TEST (Serialization, symbolic_graph) { EXPECT(equalsObj(sfg)); EXPECT(equalsXML(sfg)); + EXPECT(equalsBinary(sfg)); } /* ************************************************************************* */ @@ -53,6 +54,7 @@ TEST (Serialization, symbolic_bn) { EXPECT(equalsObj(sbn)); EXPECT(equalsXML(sbn)); + EXPECT(equalsBinary(sbn)); } /* ************************************************************************* */ @@ -78,6 +80,7 @@ TEST (Serialization, symbolic_bayes_tree ) { EXPECT(equalsObj(bayesTree)); EXPECT(equalsXML(bayesTree)); + EXPECT(equalsBinary(bayesTree)); } /* ************************************************************************* */ diff --git a/gtsam/linear/tests/testSerializationLinear.cpp b/gtsam/linear/tests/testSerializationLinear.cpp index e8a53c504..b258fb52e 100644 --- a/gtsam/linear/tests/testSerializationLinear.cpp +++ b/gtsam/linear/tests/testSerializationLinear.cpp @@ -56,20 +56,25 @@ static noiseModel::Unit::shared_ptr unit3 = noiseModel::Unit::Create(3); /* ************************************************************************* */ TEST (Serialization, noiseModels) { // tests using pointers to the derived class - EXPECT( equalsDereferenced(diag3)); + EXPECT(equalsDereferenced(diag3)); EXPECT(equalsDereferencedXML(diag3)); + EXPECT(equalsDereferencedBinary(diag3)); - EXPECT( equalsDereferenced(gaussian3)); + EXPECT(equalsDereferenced(gaussian3)); EXPECT(equalsDereferencedXML(gaussian3)); + EXPECT(equalsDereferencedBinary(gaussian3)); - EXPECT( equalsDereferenced(iso3)); + EXPECT(equalsDereferenced(iso3)); EXPECT(equalsDereferencedXML(iso3)); + EXPECT(equalsDereferencedBinary(iso3)); - EXPECT( equalsDereferenced(constrained3)); + EXPECT(equalsDereferenced(constrained3)); EXPECT(equalsDereferencedXML(constrained3)); + EXPECT(equalsDereferencedBinary(constrained3)); - EXPECT( equalsDereferenced(unit3)); + EXPECT(equalsDereferenced(unit3)); EXPECT(equalsDereferencedXML(unit3)); + EXPECT(equalsDereferencedBinary(unit3)); } /* ************************************************************************* */ @@ -77,36 +82,46 @@ TEST (Serialization, SharedNoiseModel_noiseModels) { SharedNoiseModel diag3_sg = diag3; EXPECT(equalsDereferenced(diag3_sg)); EXPECT(equalsDereferencedXML(diag3_sg)); + EXPECT(equalsDereferencedBinary(diag3_sg)); EXPECT(equalsDereferenced(diag3)); EXPECT(equalsDereferencedXML(diag3)); + EXPECT(equalsDereferencedBinary(diag3)); EXPECT(equalsDereferenced(iso3)); EXPECT(equalsDereferencedXML(iso3)); + EXPECT(equalsDereferencedBinary(iso3)); EXPECT(equalsDereferenced(gaussian3)); EXPECT(equalsDereferencedXML(gaussian3)); + EXPECT(equalsDereferencedBinary(gaussian3)); EXPECT(equalsDereferenced(unit3)); EXPECT(equalsDereferencedXML(unit3)); + EXPECT(equalsDereferencedBinary(unit3)); EXPECT(equalsDereferenced(constrained3)); EXPECT(equalsDereferencedXML(constrained3)); + EXPECT(equalsDereferencedBinary(constrained3)); } /* ************************************************************************* */ TEST (Serialization, SharedDiagonal_noiseModels) { EXPECT(equalsDereferenced(diag3)); EXPECT(equalsDereferencedXML(diag3)); + EXPECT(equalsDereferencedBinary(diag3)); EXPECT(equalsDereferenced(iso3)); EXPECT(equalsDereferencedXML(iso3)); + EXPECT(equalsDereferencedBinary(iso3)); EXPECT(equalsDereferenced(unit3)); EXPECT(equalsDereferencedXML(unit3)); + EXPECT(equalsDereferencedBinary(unit3)); EXPECT(equalsDereferenced(constrained3)); EXPECT(equalsDereferencedXML(constrained3)); + EXPECT(equalsDereferencedBinary(constrained3)); } /* ************************************************************************* */ @@ -126,6 +141,7 @@ TEST (Serialization, linear_factors) { values.insert(2, Vector_(2, 4.0,5.0)); EXPECT(equalsObj(values)); EXPECT(equalsXML(values)); + EXPECT(equalsBinary(values)); Index i1 = 4, i2 = 7; Matrix A1 = eye(3), A2 = -1.0 * eye(3); @@ -134,10 +150,12 @@ TEST (Serialization, linear_factors) { JacobianFactor jacobianfactor(i1, A1, i2, A2, b, model); EXPECT(equalsObj(jacobianfactor)); EXPECT(equalsXML(jacobianfactor)); + EXPECT(equalsBinary(jacobianfactor)); HessianFactor hessianfactor(jacobianfactor); EXPECT(equalsObj(hessianfactor)); EXPECT(equalsXML(hessianfactor)); + EXPECT(equalsBinary(hessianfactor)); } /* ************************************************************************* */ @@ -150,6 +168,7 @@ TEST (Serialization, gaussian_conditional) { EXPECT(equalsObj(cg)); EXPECT(equalsXML(cg)); + EXPECT(equalsBinary(cg)); } diff --git a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp index 57e2c0a34..95bb4d93e 100644 --- a/gtsam/nonlinear/tests/testSerializationNonlinear.cpp +++ b/gtsam/nonlinear/tests/testSerializationNonlinear.cpp @@ -63,6 +63,7 @@ TEST (Serialization, TemplatedValues) { values.insert(Symbol('a',5), PinholeCal3S2(pose3, cal1)); EXPECT(equalsObj(values)); EXPECT(equalsXML(values)); + EXPECT(equalsBinary(values)); } /* ************************************************************************* */ diff --git a/tests/testSerializationSLAM.cpp b/tests/testSerializationSLAM.cpp index 544d5b6b1..f9229eac6 100644 --- a/tests/testSerializationSLAM.cpp +++ b/tests/testSerializationSLAM.cpp @@ -232,13 +232,16 @@ TEST (Serialization, smallExample_linear) { GaussianFactorGraph fg = createGaussianFactorGraph(ordering); EXPECT(equalsObj(ordering)); EXPECT(equalsXML(ordering)); + EXPECT(equalsBinary(ordering)); EXPECT(equalsObj(fg)); EXPECT(equalsXML(fg)); + EXPECT(equalsBinary(fg)); GaussianBayesNet cbn = createSmallGaussianBayesNet(); EXPECT(equalsObj(cbn)); EXPECT(equalsXML(cbn)); + EXPECT(equalsBinary(cbn)); } /* ************************************************************************* */ @@ -252,6 +255,7 @@ TEST (Serialization, gaussianISAM) { EXPECT(equalsObj(isam)); EXPECT(equalsXML(isam)); + EXPECT(equalsBinary(isam)); } /* ************************************************************************* */ @@ -267,9 +271,11 @@ TEST (Serialization, smallExample_nonlinear) { Values c1 = createValues(); EXPECT(equalsObj(nfg)); EXPECT(equalsXML(nfg)); + EXPECT(equalsBinary(nfg)); EXPECT(equalsObj(c1)); EXPECT(equalsXML(c1)); + EXPECT(equalsBinary(c1)); } /* ************************************************************************* */ @@ -586,9 +592,79 @@ TEST (Serialization, factors) { EXPECT(equalsXML(generalSFMFactor2Cal3_S2)); EXPECT(equalsXML(genericStereoFactor3D)); + + + // binary + EXPECT(equalsBinary(a01)); + EXPECT(equalsBinary(b02)); + EXPECT(equalsBinary(values)); + EXPECT(equalsBinary(graph)); + + EXPECT(equalsBinary(priorFactorLieVector)); + EXPECT(equalsBinary(priorFactorLieMatrix)); + EXPECT(equalsBinary(priorFactorPoint2)); + EXPECT(equalsBinary(priorFactorStereoPoint2)); + EXPECT(equalsBinary(priorFactorPoint3)); + EXPECT(equalsBinary(priorFactorRot2)); + EXPECT(equalsBinary(priorFactorRot3)); + EXPECT(equalsBinary(priorFactorPose2)); + EXPECT(equalsBinary(priorFactorPose3)); + EXPECT(equalsBinary(priorFactorCal3_S2)); + EXPECT(equalsBinary(priorFactorCal3DS2)); + EXPECT(equalsBinary(priorFactorCalibratedCamera)); + EXPECT(equalsBinary(priorFactorSimpleCamera)); + EXPECT(equalsBinary(priorFactorStereoCamera)); + + EXPECT(equalsBinary(betweenFactorLieVector)); + EXPECT(equalsBinary(betweenFactorLieMatrix)); + EXPECT(equalsBinary(betweenFactorPoint2)); + EXPECT(equalsBinary(betweenFactorPoint3)); + EXPECT(equalsBinary(betweenFactorRot2)); + EXPECT(equalsBinary(betweenFactorRot3)); + EXPECT(equalsBinary(betweenFactorPose2)); + EXPECT(equalsBinary(betweenFactorPose3)); + + EXPECT(equalsBinary(nonlinearEqualityLieVector)); + EXPECT(equalsBinary(nonlinearEqualityLieMatrix)); + EXPECT(equalsBinary(nonlinearEqualityPoint2)); + EXPECT(equalsBinary(nonlinearEqualityStereoPoint2)); + EXPECT(equalsBinary(nonlinearEqualityPoint3)); + EXPECT(equalsBinary(nonlinearEqualityRot2)); + EXPECT(equalsBinary(nonlinearEqualityRot3)); + EXPECT(equalsBinary(nonlinearEqualityPose2)); + EXPECT(equalsBinary(nonlinearEqualityPose3)); + EXPECT(equalsBinary(nonlinearEqualityCal3_S2)); + EXPECT(equalsBinary(nonlinearEqualityCal3DS2)); + EXPECT(equalsBinary(nonlinearEqualityCalibratedCamera)); + EXPECT(equalsBinary(nonlinearEqualitySimpleCamera)); + EXPECT(equalsBinary(nonlinearEqualityStereoCamera)); + + EXPECT(equalsBinary(rangeFactorPosePoint2)); + EXPECT(equalsBinary(rangeFactorPosePoint3)); + EXPECT(equalsBinary(rangeFactorPose2)); + EXPECT(equalsBinary(rangeFactorPose3)); + EXPECT(equalsBinary(rangeFactorCalibratedCameraPoint)); + EXPECT(equalsBinary(rangeFactorSimpleCameraPoint)); + EXPECT(equalsBinary(rangeFactorCalibratedCamera)); + EXPECT(equalsBinary(rangeFactorSimpleCamera)); + + EXPECT(equalsBinary(bearingFactor2D)); + + EXPECT(equalsBinary(bearingRangeFactor2D)); + + EXPECT(equalsBinary(genericProjectionFactorCal3_S2)); + EXPECT(equalsBinary(genericProjectionFactorCal3DS2)); + + EXPECT(equalsBinary(generalSFMFactorCal3_S2)); + + EXPECT(equalsBinary(generalSFMFactor2Cal3_S2)); + + EXPECT(equalsBinary(genericStereoFactor3D)); + } + /* ************************************************************************* */ int main() { TestResult tr; return TestRegistry::runAllTests(tr); } /* ************************************************************************* */