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 <<
"testFloatRegisterAccessor" << std::endl;
173 boost::shared_ptr<DummyBackend> backend =
175 BOOST_CHECK(backend != NULL);
185 float requiredVal = dummy;
186 BOOST_CHECK_CLOSE(requiredVal, 5.3, 1);
189 float val = accessor;
191 BOOST_CHECK_CLOSE(val, requiredVal, 0.01);
192 BOOST_CHECK_CLOSE(
float(accessor), requiredVal, 0.01);
193 BOOST_CHECK_CLOSE(2. * accessor, 2 * requiredVal, 0.01);
194 BOOST_CHECK_CLOSE(accessor + 2, 2 + requiredVal, 0.01);
196 BOOST_CHECK_CLOSE(
float(accessor), requiredVal, 0.01);
198 BOOST_CHECK_CLOSE(
float(accessor), 0, 0.01);
203 BOOST_CHECK_CLOSE(
float(dummy), 0, 0.01);
206 BOOST_CHECK_CLOSE(
float(dummy), 10.3125, 0.01);
216 std::cout <<
"testWordOffset" << std::endl;
220 boost::shared_ptr<DummyBackend> backend =
222 BOOST_CHECK(backend != NULL);
232 BOOST_CHECK(accessor ==
static_cast<int>(3.5 * (1 << 5)));
238 BOOST_CHECK(dummy == 3.53125);
247 std::cout <<
"testUniqueID" << std::endl;
257 BOOST_CHECK(accessor1.
getId() == accessor1.
getId());
258 BOOST_CHECK(!(accessor1.
getId() != accessor1.
getId()));
259 BOOST_CHECK(accessor2.getId() == accessor2.getId());
260 BOOST_CHECK(!(accessor2.getId() != accessor2.getId()));
261 BOOST_CHECK(accessor1.
getId() != accessor2.getId());
262 BOOST_CHECK(!(accessor1.
getId() == accessor2.getId()));
263 BOOST_CHECK(accessor2.getId() != accessor1.
getId());
264 BOOST_CHECK(!(accessor2.getId() == accessor1.
getId()));
268 accessor1Copied.
replace(accessor1);
269 BOOST_CHECK(accessor1Copied.
getId() == accessor1.
getId());
270 BOOST_CHECK(accessor1Copied.
getId() != accessor2.getId());
272 accessor2Copied.
replace(accessor2);
273 BOOST_CHECK(accessor2Copied.
getId() == accessor2.getId());
274 BOOST_CHECK(accessor2Copied.
getId() != accessor1.
getId());
278 BOOST_CHECK(accessor1a.
getId() == accessor1a.
getId());
279 BOOST_CHECK(accessor1.
getId() != accessor1a.
getId());
280 BOOST_CHECK(accessor2.getId() != accessor1a.
getId());
284 BOOST_CHECK(myId != myId);
285 myId = accessor1.
getId();
286 BOOST_CHECK(myId == accessor1.
getId());
287 BOOST_CHECK(myId == accessor1Copied.
getId());
288 BOOST_CHECK(myId != accessor2.getId());
289 BOOST_CHECK(myId != accessor1a.
getId());
292 std::unordered_map<TransferElementID, std::string> map1;
293 map1.insert({myId,
"SomeTest"});
294 BOOST_CHECK(map1[accessor1.
getId()] ==
"SomeTest");
297 std::unordered_map<std::string, TransferElementID> map2;
298 map2.insert({
"AnotherTest", myId});
299 BOOST_CHECK(map2[
"AnotherTest"] == accessor1.
getId());
302 std::map<TransferElementID, std::string> map3;
303 map3.insert({myId,
"SomeTest"});
304 BOOST_CHECK(map3[accessor1.
getId()] ==
"SomeTest");
307 std::unordered_map<std::string, TransferElementID> map4;
308 map4.insert({
"AnotherTest", myId});
309 BOOST_CHECK(map4[
"AnotherTest"] == accessor1.
getId());
312 std::vector<TransferElementID> vector;
313 vector.push_back(myId);
314 BOOST_CHECK(vector[0] == accessor1.
getId());
322 std::cout <<
"testWriteIfDifferent" << std::endl;
326 device.
open(
"(WriteCountingDummy?map=goodMapFile.map)");
327 auto backend = boost::dynamic_pointer_cast<WriteCountingBackend>(
329 BOOST_CHECK(backend != NULL);
343 size_t counterBefore = backend->writeCount;
345 size_t counterAfter = backend->writeCount;
346 BOOST_CHECK(counterBefore == counterAfter);
349 counterBefore = backend->writeCount;
351 counterAfter = backend->writeCount;
352 BOOST_CHECK(counterAfter == counterBefore + 1);
355 counterBefore = backend->writeCount;
357 counterAfter = backend->writeCount;
358 BOOST_CHECK(counterAfter == counterBefore);
361 counterBefore = backend->writeCount;
363 counterAfter = backend->writeCount;
364 BOOST_CHECK(counterAfter == counterBefore + 1);
367 counterBefore = backend->writeCount;
369 counterAfter = backend->writeCount;
370 BOOST_CHECK(counterAfter == counterBefore + 1);
373 counterBefore = backend->writeCount;
375 counterAfter = backend->writeCount;
376 BOOST_CHECK(counterAfter == counterBefore + 1);
380 counterBefore = backend->writeCount;
386 counterAfter = backend->writeCount;
387 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)