4#define BOOST_TEST_DYN_LINK
5#define BOOST_TEST_MODULE ScalarRegisterAccessorTest
6#include <boost/test/unit_test.hpp>
7using namespace boost::unit_test_framework;
16#include <boost/bind/bind.hpp>
17#include <boost/function.hpp>
18#include <boost/lambda/lambda.hpp>
19#include <boost/make_shared.hpp>
24#include <unordered_map>
26using namespace boost::unit_test_framework;
33 std::cout <<
"testCreation" << std::endl;
37 boost::shared_ptr<DummyBackend> backend =
39 BOOST_CHECK(backend != NULL);
43 BOOST_CHECK(intRegisterDisconnected.
isInitialised() ==
false);
58 std::cout <<
"testRegisterAccessor" << std::endl;
62 boost::shared_ptr<DummyBackend> backend =
64 BOOST_CHECK(backend != NULL);
78 BOOST_CHECK(accessor == 5);
79 BOOST_CHECK(
int(accessor) == 5);
80 BOOST_CHECK(2 * accessor == 10);
81 BOOST_CHECK(accessor + 2 == 7);
83 BOOST_CHECK(accessor == 5);
85 BOOST_CHECK(accessor == -654);
90 BOOST_CHECK(dummy == -666);
93 BOOST_CHECK(dummy == 222);
98 BOOST_CHECK(accessor == 223);
99 BOOST_CHECK(copy == 223);
100 BOOST_CHECK(dummy == 222);
102 BOOST_CHECK(dummy == 223);
104 BOOST_CHECK(accessor == 3);
106 BOOST_CHECK(dummy == 3);
111 BOOST_CHECK(accessor == 2);
112 BOOST_CHECK(copy == 2);
113 BOOST_CHECK(dummy == 3);
115 BOOST_CHECK(dummy == 2);
117 BOOST_CHECK(accessor == 42);
119 BOOST_CHECK(dummy == 42);
122 int oldValue = accessor++;
124 BOOST_CHECK(accessor == 43);
125 BOOST_CHECK(copy == 43);
126 BOOST_CHECK(oldValue == 42);
127 BOOST_CHECK(dummy == 42);
129 BOOST_CHECK(dummy == 43);
133 oldValue = accessor--;
135 BOOST_CHECK(accessor == 119);
136 BOOST_CHECK(copy == 119);
137 BOOST_CHECK(oldValue == 120);
138 BOOST_CHECK(dummy == 43);
140 BOOST_CHECK(dummy == 119);
148 BOOST_CHECK(dummy == 4711);
169 std::cout <<
"TestStringAccessor" << std::endl;
173 boost::shared_ptr<DummyBackend> backend =
175 BOOST_TEST(backend !=
nullptr);
179 BOOST_TEST(accessor.isReadOnly() ==
false);
180 BOOST_TEST(accessor.isReadable());
181 BOOST_TEST(accessor.isWriteable());
188 BOOST_TEST(std::string(accessor) ==
"5.000000");
192 BOOST_TEST(dummy == 1234);
199 std::cout <<
"testFloatRegisterAccessor" << std::endl;
203 boost::shared_ptr<DummyBackend> backend =
205 BOOST_CHECK(backend != NULL);
215 float requiredVal = dummy;
216 BOOST_CHECK_CLOSE(requiredVal, 5.3, 1);
219 float val = accessor;
221 BOOST_CHECK_CLOSE(val, requiredVal, 0.01);
222 BOOST_CHECK_CLOSE(
float(accessor), requiredVal, 0.01);
223 BOOST_CHECK_CLOSE(2. * accessor, 2 * requiredVal, 0.01);
224 BOOST_CHECK_CLOSE(accessor + 2, 2 + requiredVal, 0.01);
226 BOOST_CHECK_CLOSE(
float(accessor), requiredVal, 0.01);
228 BOOST_CHECK_CLOSE(
float(accessor), 0, 0.01);
233 BOOST_CHECK_CLOSE(
float(dummy), 0, 0.01);
236 BOOST_CHECK_CLOSE(
float(dummy), 10.3125, 0.01);
246 std::cout <<
"testWordOffset" << std::endl;
250 boost::shared_ptr<DummyBackend> backend =
252 BOOST_CHECK(backend != NULL);
262 BOOST_CHECK(accessor ==
static_cast<int>(3.5 * (1 << 5)));
268 BOOST_CHECK(dummy == 3.53125);
277 std::cout <<
"testUniqueID" << std::endl;
287 BOOST_CHECK(accessor1.
getId() == accessor1.
getId());
288 BOOST_CHECK(!(accessor1.
getId() != accessor1.
getId()));
289 BOOST_CHECK(accessor2.getId() == accessor2.getId());
290 BOOST_CHECK(!(accessor2.getId() != accessor2.getId()));
291 BOOST_CHECK(accessor1.
getId() != accessor2.getId());
292 BOOST_CHECK(!(accessor1.
getId() == accessor2.getId()));
293 BOOST_CHECK(accessor2.getId() != accessor1.
getId());
294 BOOST_CHECK(!(accessor2.getId() == accessor1.
getId()));
298 accessor1Copied.
replace(accessor1);
299 BOOST_CHECK(accessor1Copied.
getId() == accessor1.
getId());
300 BOOST_CHECK(accessor1Copied.
getId() != accessor2.getId());
302 accessor2Copied.
replace(accessor2);
303 BOOST_CHECK(accessor2Copied.
getId() == accessor2.getId());
304 BOOST_CHECK(accessor2Copied.
getId() != accessor1.
getId());
308 BOOST_CHECK(accessor1a.
getId() == accessor1a.
getId());
309 BOOST_CHECK(accessor1.
getId() != accessor1a.
getId());
310 BOOST_CHECK(accessor2.getId() != accessor1a.
getId());
314 BOOST_CHECK(myId != myId);
315 myId = accessor1.
getId();
316 BOOST_CHECK(myId == accessor1.
getId());
317 BOOST_CHECK(myId == accessor1Copied.
getId());
318 BOOST_CHECK(myId != accessor2.getId());
319 BOOST_CHECK(myId != accessor1a.
getId());
322 std::unordered_map<TransferElementID, std::string> map1;
323 map1.insert({myId,
"SomeTest"});
324 BOOST_CHECK(map1[accessor1.
getId()] ==
"SomeTest");
327 std::unordered_map<std::string, TransferElementID> map2;
328 map2.insert({
"AnotherTest", myId});
329 BOOST_CHECK(map2[
"AnotherTest"] == accessor1.
getId());
332 std::map<TransferElementID, std::string> map3;
333 map3.insert({myId,
"SomeTest"});
334 BOOST_CHECK(map3[accessor1.
getId()] ==
"SomeTest");
337 std::unordered_map<std::string, TransferElementID> map4;
338 map4.insert({
"AnotherTest", myId});
339 BOOST_CHECK(map4[
"AnotherTest"] == accessor1.
getId());
342 std::vector<TransferElementID> vector;
343 vector.push_back(myId);
344 BOOST_CHECK(vector[0] == accessor1.
getId());
352 std::cout <<
"testWriteIfDifferent" << std::endl;
356 device.
open(
"(WriteCountingDummy?map=goodMapFile.map)");
357 auto backend = boost::dynamic_pointer_cast<WriteCountingBackend>(
359 BOOST_CHECK(backend != NULL);
373 size_t counterBefore = backend->writeCount;
375 size_t counterAfter = backend->writeCount;
376 BOOST_CHECK(counterBefore == counterAfter);
379 counterBefore = backend->writeCount;
381 counterAfter = backend->writeCount;
382 BOOST_CHECK(counterAfter == counterBefore + 1);
385 counterBefore = backend->writeCount;
387 counterAfter = backend->writeCount;
388 BOOST_CHECK(counterAfter == counterBefore);
391 counterBefore = backend->writeCount;
393 counterAfter = backend->writeCount;
394 BOOST_CHECK(counterAfter == counterBefore + 1);
397 counterBefore = backend->writeCount;
399 counterAfter = backend->writeCount;
400 BOOST_CHECK(counterAfter == counterBefore + 1);
403 counterBefore = backend->writeCount;
405 counterAfter = backend->writeCount;
406 BOOST_CHECK(counterAfter == counterBefore + 1);
410 counterBefore = backend->writeCount;
416 counterAfter = backend->writeCount;
417 BOOST_CHECK(counterBefore != counterAfter);
static BackendFactory & getInstance()
Static function to get an instance of factory.
Class allows to read/write registers from device.
void close()
Close the device.
ScalarRegisterAccessor< UserType > getScalarRegisterAccessor(const RegisterPath ®isterPathName, size_t wordOffsetInRegister=0, const AccessModeFlags &flags=AccessModeFlags({})) const
Get a ScalarRegisterObject object for the given register.
void open(std::string const &aliasName)
Open a device by the given alias name from the DMAP file.
Register accessor for accessing single word or 1D array registers internally of a DummyBackend implem...
void replace(const NDRegisterAccessorAbstractor< UserType > &newAccessor)
Assign a new accessor to this NDRegisterAccessorAbstractor.
Accessor class to read and write scalar registers transparently by using the accessor object like a v...
UserType readAndGet()
Convenience function to read and return a value of UserType.
void writeIfDifferent(UserType newValue, VersionNumber versionNumber=VersionNumber{nullptr}, DataValidity validity=DataValidity::ok)
Convenience function to set and write new value if it differes from the current value.
void setAndWrite(UserType newValue, VersionNumber versionNumber={})
Convenience function to set and write new value.
ChimeraTK::VersionNumber getVersionNumber() const
Returns the version number that is associated with the last transfer (i.e.
bool write(ChimeraTK::VersionNumber versionNumber={})
Write the data to device.
bool isInitialised() const
Return if the accessor is properly initialised.
bool isReadable() const
Check if transfer element is readable.
void read()
Read the data from the device.
bool isWriteable() const
Check if transfer element is writeable.
bool isReadOnly() const
Check if transfer element is read only, i.e.
TransferElementID getId() const
Obtain unique ID for the actual implementation of this TransferElement.
Simple class holding a unique ID for a TransferElement.
Class for generating and holding version numbers without exposing a numeric representation.
void setDMapFilePath(std::string dmapFilePath)
Set the location of the dmap file.
BOOST_AUTO_TEST_CASE(testCreation)