GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: tests/value.cpp Lines: 214 219 97.7 %
Date: 2023-03-15 12:04:10 Branches: 857 1714 50.0 %

Line Branch Exec Source
1
// Copyright 2011 Florent Lamiraux, Thomas Moulard.
2
//
3
4
#include "dynamic-graph/value.h"
5
6
#include <dynamic-graph/exception-factory.h>
7
8
#include <iostream>
9
10
#define BOOST_TEST_MODULE value
11
12
#include <boost/version.hpp>
13
14
#if BOOST_VERSION >= 105900
15
#include <boost/test/tools/output_test_stream.hpp>
16
#else
17
#include <boost/test/output_test_stream.hpp>
18
#endif
19
#include <boost/test/unit_test.hpp>
20
21
using boost::test_tools::output_test_stream;
22
23
namespace dg = dynamicgraph;
24
25
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_none) {
26
  using dg::command::Value;
27
28
✓✗
4
  Value value1;
29
✓✗
4
  Value value(value1);
30
31
  // Similar to NaN != NaN
32
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(!(value1 == value));
33
34
  {
35
✓✗✓✗
4
    output_test_stream output;
36
✓✗
2
    output << value1;
37
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=unknown, value="));
38
  }
39
2
}
40
41
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_bool) {
42
  using dg::command::Value;
43
44
2
  bool abool1(false);
45
✓✗
4
  Value value1(abool1);
46
✓✗
4
  Value value = value1;
47
48
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(value1 == value);
49
50
  {
51
✓✗✓✗
4
    output_test_stream output;
52
✓✗
2
    output << value1;
53
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=bool, value=0"));
54
  }
55
56
  {
57
✓✗✓✗
4
    output_test_stream output;
58
✓✗
2
    output << value;
59
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=bool, value=0"));
60
  }
61
2
}
62
63
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_exceptions) {
64
  using dg::command::Value;
65
66
✓✗
4
  Value value1;
67
✓✗
4
  dg::command::EitherType anet(value1);
68
✓✗✓✗
✓✗✓✗
4
  output_test_stream output, output2;
69
70
  // Check if the exception is working when calling intValue
71
  // while we are having a none.
72
2
  bool res = false;
73
  try {
74
✗✓
2
    int aInt(anet);
75
    aInt++;  // silence unused variable warnings to have a stable release in the
76
             // ros buildfarm
77
2
  } catch (const dg::ExceptionAbstract &aea) {
78
✓✗✓✗
2
    output << aea.getExceptionName();
79
✓✗
2
    output2 << aea.what();
80
✓✗
2
    res = (aea.getCode() == dg::ExceptionAbstract::TOOLS);
81
  }
82
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK(res);
83
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(output.is_equal("Abstract"));
84
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(output2.is_equal("value is not an int"));
85
86
  // Check if the exception is working when calling boolValue
87
  // while we are having a none.
88
2
  res = false;
89
  try {
90
✗✓
2
    bool abool(anet);
91
    abool = !abool;  // silence unused variable warnings to have a stable
92
                     // release in the ros buildfarm
93
2
  } catch (const dg::ExceptionAbstract &aea) {
94
✓✗
2
    res = (aea.getCode() == dg::ExceptionAbstract::TOOLS);
95
  }
96
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK(res);
97
98
  // Check if the exception is working when calling unsignedintValue
99
  // while we are having a none.
100
2
  res = false;
101
  try {
102
✗✓
2
    unsigned int aint(anet);
103
    aint++;  // silence unused variable warnings to have a stable release in the
104
             // ros buildfarm
105
2
  } catch (const dg::ExceptionAbstract &aea) {
106
✓✗
2
    res = (aea.getCode() == dg::ExceptionAbstract::TOOLS);
107
  }
108
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK(res);
109
110
  // Check if the exception is working when calling doubleValue
111
  // while we are having a none.
112
2
  res = false;
113
  try {
114
✗✓
2
    double adouble(anet);
115
    adouble++;  // silence unused variable warnings to have a stable release in
116
                // the ros buildfarm
117
2
  } catch (const dg::ExceptionAbstract &aea) {
118
✓✗
2
    res = (aea.getCode() == dg::ExceptionAbstract::TOOLS);
119
  }
120
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK(res);
121
122
  // Check if the exception is working when calling floatValue
123
  // while we are having a none.
124
2
  res = false;
125
  try {
126
✗✓
2
    float afloat(anet);
127
    afloat++;  // silence unused variable warnings to have a stable release in
128
               // the ros buildfarm
129
2
  } catch (const dg::ExceptionAbstract &aea) {
130
✓✗
2
    res = (aea.getCode() == dg::ExceptionAbstract::TOOLS);
131
  }
132
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK(res);
133
134
  // Check if the exception is working when calling stringValue
135
  // while we are having a none.
136
2
  res = false;
137
  try {
138
✗✓
2
    std::string astring(anet);
139
2
  } catch (const dg::ExceptionAbstract &aea) {
140
✓✗
2
    res = (aea.getCode() == dg::ExceptionAbstract::TOOLS);
141
  }
142
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK(res);
143
144
  // Check if the exception is working when calling vectorValue
145
  // while we are having a none.
146
2
  res = false;
147
  try {
148
✓✗
4
    dg::Vector avector;
149
✗✓
2
    avector = anet;
150
2
  } catch (const dg::ExceptionAbstract &aea) {
151
✓✗
2
    res = (aea.getCode() == dg::ExceptionAbstract::TOOLS);
152
  }
153
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK(res);
154
155
  // Check if the exception is working when calling matrixXdValue
156
  // while we are having a none.
157
2
  res = false;
158
  try {
159
✓✗
4
    Eigen::MatrixXd amatrixXd;
160
✗✓
2
    amatrixXd = anet;
161
2
  } catch (const dg::ExceptionAbstract &aea) {
162
✓✗
2
    res = (aea.getCode() == dg::ExceptionAbstract::TOOLS);
163
  }
164
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK(res);
165
166
  // Check if the exception is working when calling matrix4dValue
167
  // while we are having a none.
168
2
  res = false;
169
  try {
170
✓✗
2
    Eigen::Matrix4d amatrix4d;
171
✗✓
2
    amatrix4d = anet;
172
2
  } catch (const dg::ExceptionAbstract &aea) {
173
✓✗
2
    res = (aea.getCode() == dg::ExceptionAbstract::TOOLS);
174
  }
175
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK(res);
176
2
}
177
178
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_unsigned_int) {
179
  using dg::command::Value;
180
181
2
  unsigned int aint1(5);
182
✓✗
4
  Value value1(aint1);
183
✓✗
4
  Value value = value1;
184
185
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(value1 == value);
186
187
  {
188
✓✗✓✗
4
    output_test_stream output;
189
✓✗
2
    output << value1;
190
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=unsigned int, value=5"));
191
  }
192
193
  {
194
✓✗✓✗
4
    output_test_stream output;
195
✓✗
2
    output << value;
196
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=unsigned int, value=5"));
197
  }
198
2
}
199
200
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_int) {
201
  using dg::command::Value;
202
203
2
  int aint1(5);
204
✓✗
4
  Value value1(aint1);
205
✓✗
4
  Value value = value1;
206
207
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(value1 == value);
208
209
  {
210
✓✗✓✗
4
    output_test_stream output;
211
✓✗
2
    output << value1;
212
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=int, value=5"));
213
  }
214
215
  {
216
✓✗✓✗
4
    output_test_stream output;
217
✓✗
2
    output << value;
218
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=int, value=5"));
219
  }
220
2
}
221
222
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_float) {
223
  using dg::command::Value;
224
225
2
  float afloat1(0.5);
226
✓✗
4
  Value value1(afloat1);
227
✓✗
4
  Value value = value1;
228
229
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(value1 == value);
230
231
  {
232
✓✗✓✗
4
    output_test_stream output;
233
✓✗
2
    output << value1;
234
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=float, value=0.5"));
235
  }
236
237
  {
238
✓✗✓✗
4
    output_test_stream output;
239
✓✗
2
    output << value;
240
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=float, value=0.5"));
241
  }
242
2
}
243
244
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_double) {
245
  using dg::command::Value;
246
247
2
  double adouble1(0.5);
248
✓✗
4
  Value value1(adouble1);
249
✓✗
4
  Value value = value1;
250
251
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(value1 == value);
252
253
  {
254
✓✗✓✗
4
    output_test_stream output;
255
✓✗
2
    output << value1;
256
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=double, value=0.5"));
257
  }
258
259
  {
260
✓✗✓✗
4
    output_test_stream output;
261
✓✗
2
    output << value;
262
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=double, value=0.5"));
263
  }
264
2
}
265
266
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_vector) {
267
  using dg::command::Value;
268
269
✓✗
4
  dg::Vector avector1;
270
✓✗
2
  avector1.resize(2);
271
✓✗
2
  avector1[0] = 0.5;
272
✓✗
2
  avector1[1] = 1.5;
273
✓✗
4
  Value value1(avector1);
274
✓✗
4
  Value value = value1;
275
276
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(value1 == value);
277
278
  {
279
✓✗✓✗
4
    output_test_stream output;
280
✓✗
2
    output << value1;
281
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=vector, value=0.5\n1.5"));
282
  }
283
284
  {
285
✓✗✓✗
4
    output_test_stream output;
286
✓✗
2
    output << value;
287
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=vector, value=0.5\n1.5"));
288
  }
289
2
}
290
291
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_string) {
292
  using dg::command::Value;
293
294
✓✗
4
  std::string str1("value #1");
295
✓✗
4
  Value value1(str1);
296
✓✗
4
  Value value = value1;
297
298
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(value1 == value);
299
300
  {
301
✓✗✓✗
4
    output_test_stream output;
302
✓✗
2
    output << value1;
303
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=string, value=value #1"));
304
  }
305
306
  {
307
✓✗✓✗
4
    output_test_stream output;
308
✓✗
2
    output << value;
309
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=string, value=value #1"));
310
  }
311
312
✓✗
4
  std::string str2("value #2");
313
✓✗
4
  Value value2(str2);
314
✓✗
2
  value = value2;
315
316
  {
317
✓✗✓✗
4
    output_test_stream output;
318
✓✗
2
    output << value2;
319
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=string, value=value #2"));
320
  }
321
322
  {
323
✓✗✓✗
4
    output_test_stream output;
324
✓✗
2
    output << value;
325
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=string, value=value #2"));
326
  }
327
2
}
328
329
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_matrixXd) {
330
  using dg::command::Value;
331
332
✓✗
4
  Eigen::MatrixXd avector1;
333
✓✗
2
  avector1.resize(2, 2);
334
✓✗
2
  avector1(0, 0) = 0.5;
335
✓✗
2
  avector1(0, 1) = 1.5;
336
✓✗
2
  avector1(1, 0) = 2.5;
337
✓✗
2
  avector1(1, 1) = 3.5;
338
✓✗
4
  Value value1(avector1);
339
✓✗
4
  Value value = value1;
340
341
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(value1 == value);
342
343
  {
344
✓✗✓✗
4
    output_test_stream output;
345
✓✗
2
    output << value1;
346
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=matrixXd, value=0.5 1.5\n2.5 3.5"));
347
  }
348
349
  {
350
✓✗✓✗
4
    output_test_stream output;
351
✓✗
2
    output << value;
352
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(output.is_equal("Type=matrixXd, value=0.5 1.5\n2.5 3.5"));
353
  }
354
2
}
355
356
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_matrix4d) {
357
  using dg::command::Value;
358
359
✓✗
2
  Eigen::Matrix4d avector1;
360
✓✗
2
  avector1.setZero();
361
✓✗
2
  avector1(0, 0) = 0.5;
362
✓✗
2
  avector1(0, 1) = 1.5;
363
✓✗
2
  avector1(1, 0) = 2.5;
364
✓✗
2
  avector1(1, 1) = 3.5;
365
✓✗
4
  Value value1(avector1);
366
✓✗
4
  Value value = value1;
367
368
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
  BOOST_CHECK(value1 == value);
369
370
  {
371
✓✗✓✗
4
    output_test_stream output;
372
✓✗
2
    output << value1;
373
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(
374
        output.is_equal("Type=matrix4d, value=0.5 1.5   0   0\n"
375
                        "2.5 3.5   0   0\n  0   0   0   0\n"
376
                        "  0   0   0   0"));
377
  }
378
379
  {
380
✓✗✓✗
4
    output_test_stream output;
381
✓✗
2
    output << value;
382
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(
383
        output.is_equal("Type=matrix4d, value=0.5 1.5   0   0\n"
384
                        "2.5 3.5   0   0\n  0   0   0   0\n"
385
                        "  0   0   0   0"));
386
  }
387
2
}
388
389
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗✓✗
✓✗
4
BOOST_AUTO_TEST_CASE(value_values) {
390
  using namespace dynamicgraph::command;
391
392
✓✗
4
  std::string s1("value #1");
393
2
  double d1 = 0.3;
394
395
✓✗
4
  Value vs1(s1);
396
✓✗
4
  Value vd1(d1);
397
398
4
  Values values;
399
✓✗
2
  values.push_back(vs1);
400
✓✗
2
  values.push_back(vd1);
401
402
✓✗
4
  Value vvalues(values);
403
404
✓✗✓✗
✓✗✓✗
✓✗✗✓
2
  BOOST_CHECK_EQUAL(vvalues.type(), Value::VALUES);
405
406
  {  // Const ref
407
✓✗
2
    const Values &vs = vvalues.constValuesValue();
408
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK_EQUAL(vs.size(), values.size());
409
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(vs == values);
410
  }
411
  {
412
      // Cast does not work.
413
      // dg::command::EitherType eitherType (vvalues);
414
      // Values vs = static_cast<Values>(eitherType);
415
      // BOOST_CHECK_EQUAL(vs.size(), values.size());
416
      // BOOST_CHECK(vs == values);
417
  } {  // Constructor
418
✓✗
4
    Value vvs(vvalues);
419
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(vvs == vvalues);
420
  }
421
422
  {
423
✓✗✓✗
4
    output_test_stream output;
424
✓✗
2
    output << vvalues;
425
✓✗✓✗
✓✗✓✗
✓✗✓✗
✗✓
2
    BOOST_CHECK(
426
        output.is_equal("Type=values, value=[ "
427
                        "Value(Type=string, value=value #1), "
428
                        "Value(Type=double, value=0.3), "
429
                        "]"));
430
  }
431
2
}