/** * @file Testable * @brief Abstract base class for values that can be used in unit tests * @author Frank Dellaert */ // \callgraph #pragma once #include #include namespace gtsam { /** * The Testable class should be templated with the derived class, e.g. * class Rot3 : public Testable. This allows us to define the * input type of equals as a Rot3 as well. */ template class Testable { public: virtual ~Testable() {}; /** * print * @param s optional string naming the object */ virtual void print(const std::string& name) const = 0; /** * equality up to tolerance * tricky to implement, see NonLinearFactor1 for an example * equals is not supposed to print out *anything*, just return true|false */ virtual bool equals(const Derived& expected, double tol) const = 0; }; // Testable class /** * This template works for any type with equals */ template bool assert_equal(const V& expected, const V& actual, double tol = 1e-9) { if (actual.equals(expected, tol)) return true; printf("Not equal:\n"); expected.print("expected"); actual.print("actual"); return false; } /** * Template to create a binary predicate */ template struct equals : public std::binary_function { double tol_; equals(double tol = 1e-9) : tol_(tol) {} bool operator()(const V& expected, const V& actual) { return (actual.equals(expected, tol_)); } }; /** * Binary predicate on shared pointers */ template struct equals_star : public std::binary_function&, const boost::shared_ptr&, bool> { double tol_; equals_star(double tol = 1e-9) : tol_(tol) {} bool operator()(const boost::shared_ptr& expected, const boost::shared_ptr& actual) { return (actual->equals(*expected, tol_)); } }; } // gtsam