GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: tests/entity.cpp Lines: 120 128 93.8 %
Date: 2023-03-15 12:04:10 Branches: 510 1052 48.5 %

Line Branch Exec Source
1
/* Copyright 2010-2019 LAAS, CNRS
2
 * Thomas Moulard.
3
 *
4
 */
5
6
#define ENABLE_RT_LOG
7
8
#include <dynamic-graph/command-direct-getter.h>
9
#include <dynamic-graph/command-direct-setter.h>
10
#include <dynamic-graph/entity.h>
11
#include <dynamic-graph/exception-factory.h>
12
#include <dynamic-graph/real-time-logger.h>
13
#include <dynamic-graph/signal-ptr.h>
14
#include <dynamic-graph/signal-time-dependent.h>
15
16
#include <sstream>
17
18
#include "dynamic-graph/factory.h"
19
#include "dynamic-graph/pool.h"
20
21
#define BOOST_TEST_MODULE entity
22
23
#if BOOST_VERSION >= 105900
24
#include <boost/test/tools/output_test_stream.hpp>
25
#else
26
#include <boost/test/output_test_stream.hpp>
27
#endif
28
#include <boost/test/unit_test.hpp>
29
30
using boost::test_tools::output_test_stream;
31
32
namespace dynamicgraph {
33
class CustomEntity : public Entity {
34
 public:
35
  dynamicgraph::SignalPtr<double, int> m_sigdSIN, m_sigdSIN2;
36
  dynamicgraph::SignalTimeDependent<double, int> m_sigdTimeDepSOUT;
37
38
  static const std::string CLASS_NAME;
39
3
  virtual const std::string &getClassName() const { return CLASS_NAME; }
40
2
  explicit CustomEntity(const std::string &n)
41
2
      : Entity(n),
42
✓✗
4
        m_sigdSIN(NULL, "CustomEntity(" + name + ")::input(double)::in_double"),
43
        m_sigdSIN2(NULL,
44
✓✗
4
                   "CustomEntity(" + name + ")::input(double)::in_double"),
45
        m_sigdTimeDepSOUT(
46
            boost::bind(&CustomEntity::update, this, _1, _2), m_sigdSIN,
47
✓✗
4
            "CustomEntity(" + name + ")::input(double)::out_double"),
48
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
14
        m_value(0.0) {}
49
50
2
  ~CustomEntity() { entityDeregistration(); }
51
52
1
  void addSignal() {
53
✓✗
1
    signalRegistration(m_sigdSIN << m_sigdTimeDepSOUT);
54
    /// Try a second time to generate an exception
55
    try {
56
✓✗✗✓
2
      signalRegistration(m_sigdSIN2 << m_sigdTimeDepSOUT);
57
2
    } catch (ExceptionFactory &aef) {
58
✓✗✓✗
✓✗✓✗
✓✗✗✓
1
      BOOST_CHECK_EQUAL(aef.getCode(),
59
                        dynamicgraph::ExceptionFactory::SIGNAL_CONFLICT);
60
    }
61
1
  }
62
63
2
  void rmValidSignal() {
64
✓✗✓✓
4
    signalDeregistration("in_double");
65
✓✗✓✗
1
    signalDeregistration("out_double");
66
1
  }
67
68
  double &update(double &res, const int &inTime) {
69
    const double &aDouble = m_sigdSIN(inTime);
70
    res = aDouble;
71
    return res;
72
  }
73
74
 public:
75
  double m_value;
76
};
77
✓✗
1
DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(CustomEntity, "CustomEntity");
78
}  // namespace dynamicgraph
79
80
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(constructor) {
81
  namespace dg = dynamicgraph;
82
  namespace dgc = dynamicgraph::command;
83
84
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK_EQUAL(dg::CustomEntity::CLASS_NAME, "CustomEntity");
85
86
✓✗✓✗
✓✗✓✗
2
  dg::Entity &entity = *dg::FactoryStorage::getInstance()->newEntity(
87
      "CustomEntity", "my-entity");
88
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK_EQUAL(entity.getName(), "my-entity");
89
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK_EQUAL(entity.getClassName(), dg::CustomEntity::CLASS_NAME);
90
91
✓✗✓✗
6
  dg::CustomEntity entity2("");
92
93
  // Test Commands
94
  dgc::DirectGetter<dg::CustomEntity, double> a_direct_getter(
95
      entity2, &entity2.m_value,
96
✓✗✓✗
✓✗✓✗
6
      dgc::docDirectGetter("Get value m_value", "double"));
97
98
  dgc::DirectSetter<dg::CustomEntity, double> a_direct_setter(
99
      entity2, &entity2.m_value,
100
✓✗✓✗
✓✗✓✗
6
      dgc::docDirectSetter("Set value m_value", "double"));
101
102
✓✗
4
  dgc::Value aValue(2.0);
103
4
  std::vector<dgc::Value> values;
104
✓✗
2
  values.push_back(aValue);
105
✓✗
2
  a_direct_setter.setParameterValues(values);
106
✓✗
2
  a_direct_setter.execute();
107
✓✗
2
  a_direct_getter.execute();
108
109
✓✗✓✗
2
  output_test_stream output;
110
✓✗
2
  output << entity2.m_value;
111
✓✗
2
  output << entity2;
112
113
✓✗
2
  entity.getDocString();
114
2
}
115
116
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(signal) {
117
  dynamicgraph::Entity &entity =
118
✓✗✓✗
2
      dynamicgraph::PoolStorage::getInstance()->getEntity("my-entity");
119
120
  // Non const getter.
121
  try {
122
✓✗✗✓
6
    entity.getSignal("I do not exist");
123
    BOOST_ERROR("Should never happen.");
124
4
  } catch (const dynamicgraph::ExceptionFactory &exception) {
125
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
    BOOST_CHECK_EQUAL(exception.getCode(),
126
                      dynamicgraph::ExceptionFactory::UNREFERED_SIGNAL);
127
  }
128
129
  // Const getter.
130
  try {
131
2
    const dynamicgraph::Entity &entityConst = entity;
132
✓✗✗✓
6
    entityConst.getSignal("I do not exist");
133
    BOOST_ERROR("Should never happen.");
134
4
  } catch (const dynamicgraph::ExceptionFactory &exception) {
135
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
    BOOST_CHECK_EQUAL(exception.getCode(),
136
                      dynamicgraph::ExceptionFactory::UNREFERED_SIGNAL);
137
  }
138
  // deregistration
139
  try {
140
2
    dynamicgraph::CustomEntity *customEntity =
141
✓✗
2
        dynamic_cast<dynamicgraph::CustomEntity *>(&entity);
142
✓✗
2
    customEntity->addSignal();
143
✓✗
4
    std::string signame("CustomEntity(my-entity)::input(double)::in_double");
144
✓✗
2
    customEntity->Entity::hasSignal(signame);
145
✓✗✓✗
4
    output_test_stream output;
146
✓✗
2
    customEntity->Entity::displaySignalList(output);
147
✓✗
4
    dynamicgraph::Entity::SignalMap asigmap = customEntity->getSignalMap();
148
✓✗
2
    output << customEntity;
149
    // Removing signals is working the first time
150
✓✗
2
    customEntity->rmValidSignal();
151
    // Removing signals generates an exception the second time.
152
✗✓
2
    customEntity->rmValidSignal();
153
    BOOST_ERROR("Should never happen.");
154
4
  } catch (const dynamicgraph::ExceptionFactory &exception) {
155
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
    BOOST_CHECK_EQUAL(exception.getCode(),
156
                      dynamicgraph::ExceptionFactory::UNREFERED_SIGNAL);
157
  }
158
2
}
159
160
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(displaySignalList) {
161
  dynamicgraph::Entity &entity =
162
✓✗✓✗
✓✗
2
      dynamicgraph::PoolStorage::getInstance()->getEntity("my-entity");
163
164
✓✗✓✗
4
  output_test_stream output;
165
166
✓✗
2
  entity.displaySignalList(output);
167
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(output.is_equal("--- <my-entity> signal list: \n"));
168
2
}
169
170
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(display) {
171
  dynamicgraph::Entity &entity =
172
✓✗✓✗
✓✗
2
      dynamicgraph::PoolStorage::getInstance()->getEntity("my-entity");
173
174
✓✗✓✗
4
  output_test_stream output;
175
176
✓✗
2
  entity.display(output);
177
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(output.is_equal("CustomEntity: my-entity"));
178
2
}
179
180
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(getCommandList) {
181
  dynamicgraph::Entity &entity =
182
✓✗✓✗
2
      dynamicgraph::PoolStorage::getInstance()->getEntity("my-entity");
183
184
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK_EQUAL(entity.getCommandList(), "print\nsignals\nsignalDep");
185
2
}
186
187
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(writeGraph) {
188
  dynamicgraph::Entity &entity =
189
✓✗✓✗
✓✗
2
      dynamicgraph::PoolStorage::getInstance()->getEntity("my-entity");
190
191
✓✗✓✗
4
  output_test_stream output;
192
✓✗
2
  entity.writeGraph(output);
193
194
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(output.is_equal(""));
195
2
}
196
197
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(writeCompletionList) {
198
  dynamicgraph::Entity &entity =
199
✓✗✓✗
✓✗
2
      dynamicgraph::PoolStorage::getInstance()->getEntity("my-entity");
200
201
✓✗✓✗
4
  output_test_stream output;
202
✓✗
2
  entity.writeCompletionList(output);
203
204
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(output.is_equal("print\nsignals\nsignalDep\n"));
205
2
}
206
207
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(sendMsg) {
208
✓✗
4
  std::ofstream of;
209
✓✗
2
  of.open("/tmp/dg-LOGS.txt", std::ofstream::out | std::ofstream::app);
210
✓✗✓✗
✓✗✓✗
2
  dgADD_OSTREAM_TO_RTLOG(of);
211
212
  dynamicgraph::Entity &entity =
213
✓✗✓✗
✓✗
2
      dynamicgraph::PoolStorage::getInstance()->getEntity("my-entity");
214
215
✓✗✓✗
4
  output_test_stream output;
216
217
✓✓
10
  for (unsigned int i = 0; i < 4; i++) {
218
✓✓
16008
    for (unsigned int j = 0; j < 2000; j++) {
219
16000
      dynamicgraph::LoggerVerbosity aLoggerVerbosityLevel =
220
          (dynamicgraph::LoggerVerbosity)i;
221
✓✗
16000
      entity.setLoggerVerbosityLevel(aLoggerVerbosityLevel);
222
✓✗✗✓
16000
      if (entity.getLoggerVerbosityLevel() != aLoggerVerbosityLevel)
223
        output << "Mismatch output";
224
225
#define __FILELINE__ __FILE__ BOOST_PP_STRINGIZE(__LINE__)
226
✓✗✓✗
32000
      entity.logger().stream(dynamicgraph::MSG_TYPE_DEBUG, __FILELINE__)
227
✓✗
16000
          << "Auto Test Case"
228
✓✗✓✗
16000
          << " DEBUG" << '\n';
229
✓✗✓✗
32000
      entity.logger().stream(dynamicgraph::MSG_TYPE_INFO, __FILELINE__)
230
✓✗
16000
          << "Auto Test Case"
231
✓✗✓✗
16000
          << " INFO" << '\n';
232
✓✗✓✗
32000
      entity.logger().stream(dynamicgraph::MSG_TYPE_WARNING, __FILELINE__)
233
✓✗
16000
          << "Auto Test Case"
234
✓✗✓✗
16000
          << " WARNING" << '\n';
235
✓✗✓✗
32000
      entity.logger().stream(dynamicgraph::MSG_TYPE_ERROR, __FILELINE__)
236
✓✗
16000
          << "Auto Test Case"
237
✓✗✓✗
16000
          << " ERROR" << '\n';
238
#undef __FILELINE__
239
    };
240
  };
241
242
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(output.is_equal(""));
243
✓✗
2
  dynamicgraph::RealTimeLogger::destroy();
244
2
}
245
246
// WTF?
247
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(wtf) {
248
  dynamicgraph::Entity &entity =
249
✓✗✓✗
2
      dynamicgraph::PoolStorage::getInstance()->getEntity("my-entity");
250
251
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK_EQUAL(entity.test(),
252
                    static_cast<dynamicgraph::SignalBase<int> *>(0));
253
254
2
  entity.test2(static_cast<dynamicgraph::SignalBase<int> *>(0));
255
2
}