Skip to content
Snippets Groups Projects
Forked from Stack Of Tasks / dynamic-graph
285 commits behind the upstream repository.
signal-time-dependent.cpp 7.21 KiB
// Copyright 2010 Thomas Moulard.
//

#include <boost/foreach.hpp>

#include <dynamic-graph/signal.h>
#include <dynamic-graph/signal-time-dependent.h>

#define BOOST_TEST_MODULE signal_time_dependent

#include <boost/test/unit_test.hpp>
#include <boost/test/output_test_stream.hpp>

using boost::test_tools::output_test_stream;

typedef dynamicgraph::SignalTimeDependent<double, int> sigDouble_t;
typedef dynamicgraph::SignalTimeDependent<std::string, int> sigString_t;

template<class T>
class DummyClass
{
public:

  std::string proname;
  std::list<sigDouble_t*> inputsig;
  std::list<sigString_t*> inputsigV;

  DummyClass (const std::string& n)
    : proname (n),
      res (),
      call (),
      timedata ()
  {}

  T& fun (T& res, int t)
  {
    ++call;
    timedata=t;

    BOOST_FOREACH (sigDouble_t* ptr, inputsig)
      ptr->access(timedata);

    BOOST_FOREACH (sigString_t* ptr,
		   inputsigV)
      ptr->access(timedata);

    res = (*this) ();
    return res;
  }

  void add (sigDouble_t& sig)
  {
    inputsig.push_back (&sig);
  }
  void add (sigString_t& sig)
  {
    inputsigV.push_back (&sig);
  }

  T operator() ();

  T res;
  int call;
  int timedata;
};

template<>
double
DummyClass<double>::operator() ()
{
  res=call * timedata;
  return res;
}
template<>
std::string
DummyClass<std::string>::operator() ()
{
  std::ostringstream oss;
  oss << call * timedata;
  return oss.str ();
}

template< class T >
T DummyClass<T>::operator() ()
{
  return this->res;
}

BOOST_AUTO_TEST_CASE (signaltimedependent)
{
  DummyClass<double> pro1 ("pro1"), pro3 ("pro3"), pro5 ("pro5");
  DummyClass<std::string> pro2 ("pro2"), pro4 ("pro4"), pro6 ("pro6");

  sigDouble_t sig5 ("Sig5");
  sigString_t sig6 ("Sig6");

  sigString_t sig4(sig5, "Sig4");
  sigString_t sig2(sig4 << sig4 << sig4 << sig6, "Sig2");
  sigDouble_t sig3(sig2 << sig5 << sig6, "Sig3");
  sigDouble_t sig1
    (boost::bind (&DummyClass<double>::fun, &pro1, _1, _2),
     sig2 << sig3, "Sig1");

  sig2.setFunction (boost::bind (&DummyClass<std::string>::fun,&pro2, _1, _2));
  sig3.setFunction (boost::bind (&DummyClass<double>::fun,&pro3, _1, _2));
  sig4.setFunction (boost::bind (&DummyClass<std::string>::fun,&pro4, _1, _2));
  sig5.setFunction (boost::bind (&DummyClass<double>::fun,&pro5, _1, _2));
  sig6.setFunction (boost::bind (&DummyClass<std::string>::fun,&pro6, _1, _2));

  pro1.add(sig2);
  pro1.add(sig3);
  pro2.add(sig4);
  pro2.add(sig4);
  pro2.add(sig4);
  pro3.add(sig2);
  pro4.add(sig5);
  pro2.add(sig6);
  pro3.add(sig5);
  pro3.add(sig6);

  sig5.setDependencyType (dynamicgraph::TimeDependency<int>::ALWAYS_READY);
  sig6.setDependencyType (dynamicgraph::TimeDependency<int>::BOOL_DEPENDENT);

  sig6.setReady();

  {
    output_test_stream output;
    sig1.displayDependencies (output);
    BOOST_CHECK (output.is_equal
		 ("-- Sig:Sig1 (Type Fun) (t=0 (/1) )\n"
		  "   |-- Sig:Sig3 (Type Fun) (t=0 (/1) )\n"
		  "   |   |-- Sig:Sig6 (Type Fun) (ready=TRUE)\n"
		  "   |   |-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |   `-- Sig:Sig2 (Type Fun) (t=0 (/1) )\n"
		  "   |       |-- Sig:Sig6 (Type Fun) (ready=TRUE)\n"
		  "   |       |-- Sig:Sig4 (Type Fun) (t=0 (/1) )\n"
		  "   |       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |       |-- Sig:Sig4 (Type Fun) (t=0 (/1) )\n"
		  "   |       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |       `-- Sig:Sig4 (Type Fun) (t=0 (/1) )\n"
		  "   |           `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   `-- Sig:Sig2 (Type Fun) (t=0 (/1) )\n"
		  "       |-- Sig:Sig6 (Type Fun) (ready=TRUE)\n"
		  "       |-- Sig:Sig4 (Type Fun) (t=0 (/1) )\n"
		  "       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "       |-- Sig:Sig4 (Type Fun) (t=0 (/1) )\n"
		  "       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "       `-- Sig:Sig4 (Type Fun) (t=0 (/1) )\n"
		  "           `-- Sig:Sig5 (Type Fun) (A)"
		  ));
  }

  BOOST_CHECK (sig1.needUpdate (2));
  sig1.access (2);

  {
    output_test_stream output;
    sig1.displayDependencies (output);
    BOOST_CHECK (output.is_equal
		 (
		  "-- Sig:Sig1 (Type Fun) (t=2 (/1) )\n"
		  "   |-- Sig:Sig3 (Type Fun) (t=2 (/1) )\n"
		  "   |   |-- Sig:Sig6 (Type Fun) (ready=FALSE)\n"
		  "   |   |-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |   `-- Sig:Sig2 (Type Fun) (t=2 (/1) )\n"
		  "   |       |-- Sig:Sig6 (Type Fun) (ready=FALSE)\n"
		  "   |       |-- Sig:Sig4 (Type Fun) (t=2 (/1) )\n"
		  "   |       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |       |-- Sig:Sig4 (Type Fun) (t=2 (/1) )\n"
		  "   |       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |       `-- Sig:Sig4 (Type Fun) (t=2 (/1) )\n"
		  "   |           `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   `-- Sig:Sig2 (Type Fun) (t=2 (/1) )\n"
		  "       |-- Sig:Sig6 (Type Fun) (ready=FALSE)\n"
		  "       |-- Sig:Sig4 (Type Fun) (t=2 (/1) )\n"
		  "       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "       |-- Sig:Sig4 (Type Fun) (t=2 (/1) )\n"
		  "       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "       `-- Sig:Sig4 (Type Fun) (t=2 (/1) )\n"
		  "           `-- Sig:Sig5 (Type Fun) (A)"
		  ));
  }
  sig2.access (4);

  {
    output_test_stream output;
    sig1.displayDependencies (output);
    BOOST_CHECK (output.is_equal
		 (
		  "-- Sig:Sig1 (Type Fun) (t=2 (/1) )\n"
		  "   |-- Sig:Sig3 (Type Fun) (t=2 (/1) )\n"
		  "   |   |-- Sig:Sig6 (Type Fun) (ready=FALSE)\n"
		  "   |   |-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |   `-- Sig:Sig2 (Type Fun) (t=4 (/1) )\n"
		  "   |       |-- Sig:Sig6 (Type Fun) (ready=FALSE)\n"
		  "   |       |-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "   |       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |       |-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "   |       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |       `-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "   |           `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   `-- Sig:Sig2 (Type Fun) (t=4 (/1) )\n"
		  "       |-- Sig:Sig6 (Type Fun) (ready=FALSE)\n"
		  "       |-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "       |-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "       `-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "           `-- Sig:Sig5 (Type Fun) (A)"
		  ));
  }
  sig1.access (4);

  {
    output_test_stream output;
    sig1.displayDependencies (output);
    BOOST_CHECK (output.is_equal
		 (
		  "-- Sig:Sig1 (Type Fun) (t=4 (/1) )\n"
		  "   |-- Sig:Sig3 (Type Fun) (t=4 (/1) )\n"
		  "   |   |-- Sig:Sig6 (Type Fun) (ready=FALSE)\n"
		  "   |   |-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |   `-- Sig:Sig2 (Type Fun) (t=4 (/1) )\n"
		  "   |       |-- Sig:Sig6 (Type Fun) (ready=FALSE)\n"
		  "   |       |-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "   |       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |       |-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "   |       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   |       `-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "   |           `-- Sig:Sig5 (Type Fun) (A)\n"
		  "   `-- Sig:Sig2 (Type Fun) (t=4 (/1) )\n"
		  "       |-- Sig:Sig6 (Type Fun) (ready=FALSE)\n"
		  "       |-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "       |-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "       |   `-- Sig:Sig5 (Type Fun) (A)\n"
		  "       `-- Sig:Sig4 (Type Fun) (t=4 (/1) )\n"
		  "           `-- Sig:Sig5 (Type Fun) (A)"
		  ));
  }

  sig1.needUpdate (6);
  sig1.needUpdate (6);
}