4#define BOOST_TEST_DYN_LINK
5#define BOOST_TEST_MODULE LMapBackendUnifiedTest
6#include <boost/test/unit_test.hpp>
7using namespace boost::unit_test_framework;
18BOOST_AUTO_TEST_SUITE(LMapBackendUnifiedTestSuite)
22static boost::shared_ptr<ExceptionDummy> exceptionDummyLikeMtcadummy, exceptionDummyMuxed, exceptionDummyPush;
23static boost::shared_ptr<LogicalNameMappingBackend> lmapBackend;
29template<
typename Derived>
31 Derived*
derived{
static_cast<Derived*
>(
this)};
35 .disableAsyncReadInconsistency()
36 .disableSwitchReadOnly()
37 .disableSwitchWriteOnly()
38 .disableTestWriteNeverLosesData()
39 .enableTestRawTransfer();
57 dummy.throwExceptionWrite = enable;
58 dummy.throwExceptionOpen = enable;
59 if(
derived->isPush() && enable) {
60 dummy.triggerInterrupt(6);
66template<
typename Derived>
74 template<
typename UserType>
76 std::vector<UserType> v;
77 for(
size_t k = 0; k <
derived->nElementsPerChannel(); ++k) {
83 template<
typename UserType>
85 std::vector<UserType> v;
86 for(
size_t k = 0; k <
derived->nElementsPerChannel(); ++k) {
93 auto v = generateValue<typename Derived::minimumUserType>()[0];
94 for(
size_t k = 0; k <
derived->nElementsPerChannel(); ++k) {
105template<
typename Derived>
114 template<
typename T,
typename Traw>
116 return static_cast<T
>(value);
119 template<
typename UserType>
123 template<
typename Type>
126 typedef typename Derived::rawUserType Traw;
127 typedef typename Derived::minimumUserType T;
128 auto cv =
derived->template getRemoteValue<Traw>(
true)[0];
129 for(
size_t i = 0; i <
derived->nElementsPerChannel(); ++i) {
130 Traw e = cv[i] +
derived->increment * (
static_cast<Traw
>(i) + 1);
132 v.push_back(
derived->template convertRawToCooked<T, Traw>(e));
135 v.push_back(
static_cast<T
>(e));
142 template<
typename UserType>
144 typedef typename Derived::rawUserType Traw;
146 std::vector<UserType> cookedValues(
derived->nElementsPerChannel());
147 std::vector<Traw> rawValues(
derived->nElementsPerChannel());
153 auto bufferLock =
derived->acc.getBufferLock();
155 for(
size_t i = 0; i <
derived->nElementsPerChannel(); ++i) {
160 for(
size_t i = 0; i <
derived->nElementsPerChannel(); ++i) {
162 cookedValues[i] =
derived->template convertRawToCooked<UserType, Traw>(rawValues[i]);
165 cookedValues[i] =
static_cast<UserType
>(rawValues[i]);
169 return {cookedValues};
173 auto v = generateValue<typename Derived::rawUserType>(
true)[0];
175 auto bufferLock =
derived->acc.getBufferLock();
176 for(
size_t i = 0; i <
derived->nElementsPerChannel(); ++i) {
187template<
typename Derived>
193template<
typename Derived>
205 template<
typename UserType>
207 return this->getRemoteValue<UserType>();
210 template<
typename UserType>
212 std::vector<UserType> v;
213 for(
size_t k = 0; k <
derived->nElementsPerChannel(); ++k) {
214 v.push_back(
derived->value[k]);
225template<
typename Derived>
235 template<
typename UserType>
244 bool backendWasOpened = lmapBackend->isOpen();
245 bool backendWasFunctional = lmapBackend->isFunctional();
246 if(!backendWasOpened || !backendWasFunctional) {
249 auto acc = lmapBackend->getRegisterAccessor<
typename Derived::minimumUserType>(
derived->path(), 0, 0, {});
251 if(!backendWasOpened) {
252 lmapBackend->close();
254 else if(!backendWasFunctional) {
255 lmapBackend->setException(
"Some message");
257 std::vector<UserType> v;
258 for(
size_t k = 0; k <
derived->nElementsPerChannel(); ++k) {
259 v.push_back(acc->accessData(k));
265 auto acc = lmapBackend->getRegisterAccessor<
typename Derived::minimumUserType>(
derived->path(), 0, 0, {});
266 auto v =
derived->template generateValue<typename Derived::minimumUserType>()[0];
267 for(
size_t k = 0; k <
derived->nElementsPerChannel(); ++k) {
268 acc->accessData(k) = v[k];
270 bool backendWasOpened = lmapBackend->isOpen();
271 if(!backendWasOpened) {
281 if(!backendWasOpened) {
282 lmapBackend->close();
290template<
typename Derived>
305 template<
typename UserType>
307 return {{!this->
template getRemoteValue<uint64_t>()[0][0]}};
310 template<
typename UserType>
312 uint64_t v =
derived->target.template getRemoteValue<uint64_t>()[0][0];
313 uint64_t mask = 1 <<
derived->bit;
314 bool result = v & mask;
319 derived->target.setRemoteValue();
322 exceptionDummyPush->triggerInterrupt(6);
334 std::string
path() {
return "/SingleWord"; }
346 std::string
path() {
return "/SingleWord"; }
357 std::string
path() {
return "/SingleWord_push"; }
360 std::cout <<
"Warning: Writing test for /SingleWord_push has been disabled due to missing support in the dummy."
374 std::string
path() {
return "/FullArea"; }
386 std::string
path() {
return "/PartOfArea"; }
399 std::string
path() {
return "/Channel3"; }
415 std::string
path() {
return "/Channel4_push"; }
432 std::string
path() {
return "/LastChannelInRegister"; }
448 std::string
path() {
return "/Constant"; }
451 const std::vector<int32_t>
value{42};
459 std::string
path() {
return "/Constant2"; }
462 const std::vector<int32_t>
value{666};
470 std::string
path() {
return "/MyModule/SomeSubmodule/Variable"; }
481 std::string
path() {
return "/ArrayConstant"; }
483 const std::vector<int32_t>
value{1111, 2222, 3333, 4444, 5555};
492 std::string
path() {
return "/ArrayVariable"; }
503 std::string
path() {
return "/Bit0ofVar"; }
511 std::string
path() {
return "/Bit3ofVar"; }
519 std::string
path() {
return "/Bit2ofWordFirmwareA"; }
527 std::string
path() {
return "/Bit2ofWordFirmwareB"; }
539 std::string
path() {
return "/Bit2ofWordFirmware_push"; }
543 <<
"Warning: Writing test for /Bit2ofWordFirmware_push has been disabled due to missing support in the dummy."
553template<
typename Derived>
555 std::string
path() {
return "/SingleWord_Scaled"; }
573 template<
typename T,
typename Traw>
586 template<
typename T,
typename Traw>
593 std::string
path() {
return "/SingleWord_NotScaled"; }
597 template<
typename T,
typename Traw>
605 std::string
path() {
return "/SingleWord_Scaled_Twice_push"; }
611 template<
typename T,
typename Traw>
627 std::string
path() {
return "/FullArea_Scaled"; }
638 template<
typename T,
typename Traw>
652 std::string
path() {
return "/WordFirmwareForcedReadOnly"; }
664 std::string
path() {
return "/WordFirmwareForcedReadOnly_push"; }
676template<
typename Derived>
689 std::string
path() {
return "/WordFirmwareWithMath_r"; }
692 template<
typename T,
typename Traw>
694 return value + 2.345;
701 std::string
path() {
return "/WordFirmwareWithMath_push"; }
703 template<
typename T,
typename Traw>
705 return value + 2.345;
712 std::string
path() {
return "/WordFirmwareWithMath_w"; }
716 template<
typename T,
typename Traw>
718 return value - 2.345;
724 std::string
path() {
return "/WordFirmwareAsParameterInMath"; }
731 template<
typename T,
typename Traw>
749static double RegVariableAsPushParameterInMathBase_lastX;
761template<
typename Derived,
typename RawToCookedProv
ider>
766 .disableTestRawTransfer()
767 .disableTestCatalogue();
776 template<
typename T,
typename Traw>
778 return RawToCookedProvider::convertRawToCooked_impl(value, lmapBackend);
790 auto variable2 = lmapBackend->getRegisterAccessor<
double>(
"/VariableForMathTest2", 0, 0, {});
792 return (value - variable2->accessData(0) * 121 - RegVariableAsPushParameterInMathBase_lastX) / 120;
798 std::string
path() {
return "/VariableForMathTest1"; }
802 template<
typename UserType>
807 lmapBackend->activateAsyncRead();
811 auto x = lmapBackend->getRegisterAccessor<
double>(
"/RegisterWithVariableAsPushParameterInMath", 0, 0, {});
812 x->accessData(0) = RegVariableAsPushParameterInMathBase_lastX;
814 auto p2 = lmapBackend->getRegisterAccessor<
double>(
"/VariableForMathTest2", 0, 0, {});
820template<
typename Derived,
typename RawToCookedProv
ider>
823 template<
typename UserType>
828 auto generatedValue =
831 return generatedValue;
834 template<
typename UserType>
840 auto remoteRawValue =
848 return remoteRawValue;
862 std::cout <<
"FAILED TEST: Register content altered when it should not have been. (" << remoteRawValue[0][0]
867 return {{convertedValue}};
879 RawToCookedProvider_Var1> {
880 std::string
path() {
return "/VariableForMathTest1"; }
884 template<
typename UserType>
889 lmapBackend->close();
891 lmapBackend->activateAsyncRead();
893 auto x = lmapBackend->getRegisterAccessor<
double>(
"/RegisterWithVariableAsPushParameterInMath", 0, 0, {});
894 x->accessData(0) = RegVariableAsPushParameterInMathBase_lastX;
901 RawToCookedProvider_Var1> {
902 std::string
path() {
return "/VariableForMathTest1"; }
906 template<
typename UserType>
911 lmapBackend->close();
913 lmapBackend->activateAsyncRead();
915 auto p2 = lmapBackend->getRegisterAccessor<
double>(
"/VariableForMathTest2", 0, 0, {});
923 auto variable1 = lmapBackend->getRegisterAccessor<
double>(
"/VariableForMathTest1", 0, 0, {});
925 return (value - variable1->accessData(0) * 120 - RegVariableAsPushParameterInMathBase_lastX) / 121;
931 std::string
path() {
return "/VariableForMathTest2"; }
935 template<
typename UserType>
940 lmapBackend->activateAsyncRead();
944 auto x = lmapBackend->getRegisterAccessor<
double>(
"/RegisterWithVariableAsPushParameterInMath", 0, 0, {});
945 x->accessData(0) = RegVariableAsPushParameterInMathBase_lastX;
947 auto p1 = lmapBackend->getRegisterAccessor<
double>(
"/VariableForMathTest1", 0, 0, {});
955 auto variable1 = lmapBackend->getRegisterAccessor<
double>(
"/VariableForMathTest1", 0, 0, {});
957 auto variable2 = lmapBackend->getRegisterAccessor<
double>(
"/VariableForMathTest2", 0, 0, {});
959 return value - variable1->accessData(0) * 120 - variable2->accessData(0) * 121;
966 std::string
path() {
return "/RegisterWithVariableAsPushParameterInMath"; }
970 template<
typename UserType>
974 RegVariableAsPushParameterInMathBase_lastX = v[0];
978 lmapBackend->activateAsyncRead();
981 auto p1 = lmapBackend->getRegisterAccessor<
double>(
"/VariableForMathTest1", 0, 0, {});
984 auto p2 = lmapBackend->getRegisterAccessor<
double>(
"/VariableForMathTest2", 0, 0, {});
992 std::string
path() {
return "/RegisterWithVariableAsPushParameterInMath"; }
996 template<
typename UserType>
1000 RegVariableAsPushParameterInMathBase_lastX = v[0];
1004 lmapBackend->close();
1005 lmapBackend->open();
1006 lmapBackend->activateAsyncRead();
1008 auto p1 = lmapBackend->getRegisterAccessor<
double>(
"/VariableForMathTest1", 0, 0, {});
1017 std::string
path() {
return "/RegisterWithVariableAsPushParameterInMath"; }
1021 template<
typename UserType>
1025 RegVariableAsPushParameterInMathBase_lastX = v[0];
1029 lmapBackend->close();
1030 lmapBackend->open();
1031 lmapBackend->activateAsyncRead();
1033 auto p2 = lmapBackend->getRegisterAccessor<
double>(
"/VariableForMathTest2", 0, 0, {});
1045 return ((uint32_t(value) >> 3) & 1) +
theOffset;
1051 std::string
path() {
return "/RedirectedBitWithMath"; }
1056 template<
typename UserType>
1061 lmapBackend->activateAsyncRead();
1065 auto x = lmapBackend->getRegisterAccessor<
double>(
"/RedirectedBitWithMath_helper", 0, 0, {});
1073 std::string
path() {
return "/MonostableTrigger"; }
1082 template<
typename UserType>
1090 template<
typename UserType>
1092 return generateValue<UserType>();
1107template<
typename Derived>
1119 template<
typename UserType>
1121 return derived->target.template generateValue<UserType>();
1124 template<
typename UserType>
1126 uint64_t v =
derived->target.template getRemoteValue<uint64_t>()[0][0];
1128 UserType result = (v & mask) >>
derived->shift;
1138 std::string
path() {
return "/BOARD.WORD_FIRMWARE"; }
1148 std::string
path() {
return "/BitRangeLower"; }
1159 std::string
path() {
return "/BitRangeUpper"; }
1170 std::string
path() {
return "/BitRangeMiddle"; }
1182 static std::string
path() {
return "/WithFanOut"; }
1199 static std::string
path() {
return "/WithFanOut"; }
1216 static std::string
path() {
return "/WithFanOut"; }
1234 std::string dummyCdd =
"(ExceptionDummy?map=mtcadummy.map)";
1235 std::string muxedDummyCdd =
"(ExceptionDummy?map=muxedDataAcessor.map)";
1236 std::string pushDummyCdd =
"(ExceptionDummy?map=mtcadummyB.map)";
1237 std::string lmapCdd =
"(logicalNameMap?map=unifiedTest.xlmap&target=" + dummyCdd +
"&target2=" + muxedDummyCdd +
1238 "&target3=" + pushDummyCdd +
")";
1239 exceptionDummyLikeMtcadummy =
1241 exceptionDummyMuxed =
1244 exceptionDummyPush =
1251 .addRegister<RegSingleWord_push>()
1253 .addRegister<RegPartOfArea>()
1255 .addRegister<RegChannel4_push>()
1257 .addRegister<RegConstant>()
1259 .addRegister<RegVariable>()
1261 .addRegister<RegArrayVariable>()
1263 .addRegister<RegBit3OfVar>()
1265 .addRegister<RegBit2OfWordFirmwareB>()
1267 .addRegister<RegSingleWordScaled_R>()
1269 .addRegister<RegSingleWordScaled_RW>()
1271 .addRegister<RegFullAreaScaled>()
1273 .addRegister<RegWordFirmwareForcedReadOnly_push>()
1275 .addRegister<RegWordFirmwareWithMath_R_push>()
1277 .addRegister<RegWordFirmwareAsParameterInMath>()
1279 .addRegister<RegVariableAsPushParameterInMath_var1_not_written1>()
1281 .addRegister<RegVariableAsPushParameterInMath_var2>()
1283 .addRegister<RegVariableAsPushParameterInMath_x_not_written1>()
1285 .addRegister<RegRedirectedBitWithMath>()
1287 .addRegister<RegLowerHalfOfFirmware>()
1289 .addRegister<Reg9BitsInChar>()
1291 .addRegister<RegWithFanOutTarget2>()
1298BOOST_AUTO_TEST_SUITE_END()
Set of AccessMode flags with additional functionality for an easier handling.
void add(AccessMode flag)
Add the given flag to the set.
static BackendFactory & getInstance()
Static function to get an instance of factory.
Wrapper Class to avoid vector<bool> problems.
std::atomic< bool > throwExceptionRead
The dummy device opens a mapping file instead of a device, and implements all registers defined in th...
Register accessor for accessing multiplexed 2D array registers internally of a DummyBackend implement...
Register accessor for accessing single word or 1D array registers internally of a DummyBackend implem...
Class to test any backend for correct behaviour.
UnifiedBackendTest< typename boost::mpl::push_back< VECTOR_OF_REGISTERS_T, REG_T >::type > addRegister()
Add a register to be used by the test.
@ wait_for_new_data
Make any read blocking until new data has arrived since the last read.
@ raw
Raw access: disable any possible conversion from the original hardware data type into the given UserT...
DummyRegisterAccessor< minimumUserType > acc
size_t nRuntimeErrorCases()
void setForceRuntimeError(bool enable, size_t caseIndex)
size_t nElementsPerChannel()
std::vector< std::vector< UserType > > getRemoteValue()
static constexpr auto capabilities
ChimeraTK::AccessModeFlags supportedFlags()
std::vector< std::vector< UserType > > generateValue()
ChimeraTK::Boolean minimumUserType
Base descriptor for channel accessors.
static constexpr auto capabilities
std::vector< std::vector< UserType > > generateValue()
std::vector< std::vector< UserType > > getRemoteValue()
Descriptor for the test capabilities for each register.
constexpr TestCapabilities< _syncRead, TestCapability::disabled, _asyncReadInconsistency, _switchReadOnly, _switchWriteOnly, _writeNeverLosesData, _testWriteOnly, _testReadOnly, _testRawTransfer, _testCatalogue, _setRemoteValueIncrementsVersion, _testPartialAccessor > disableForceDataLossWrite() const
Base descriptor for constant accessors.
std::vector< std::vector< UserType > > generateValue()
size_t nRuntimeErrorCases()
void setForceRuntimeError(bool, size_t)
static constexpr auto capabilities
ChimeraTK::AccessModeFlags supportedFlags()
std::vector< std::vector< UserType > > getRemoteValue()
Base descriptor for 1D accessors (and scalars)
std::vector< std::vector< UserType > > getRemoteValue(bool getRaw=false)
void generateValueHook(std::vector< UserType > &)
T convertRawToCooked(Traw value)
std::vector< std::vector< Type > > generateValue(bool getRaw=false)
static constexpr double theOffset
static double convertRawToCooked_impl(double value, boost::shared_ptr< LogicalNameMappingBackend > &)
static double convertRawToCooked_impl(double value, boost::shared_ptr< LogicalNameMappingBackend > &lmapBackend)
static double convertRawToCooked_impl(double value, boost::shared_ptr< LogicalNameMappingBackend > &lmapBackend)
static double convertRawToCooked_impl(double value, boost::shared_ptr< LogicalNameMappingBackend > &lmapBackend)
BitRangeAccessorTarget target
Test constant accessor with arrays.
size_t nElementsPerChannel()
const std::vector< int32_t > value
Test variable accessor with arrays.
size_t nElementsPerChannel()
Test bit accessor with a variable accessor as target.
Test bit accessor with a real dummy accessor as target.
Test bit accessor with another instance of a real dummy accessor as target.
boost::shared_ptr< NDRegisterAccessor< minimumUserType > > fixAccessorOnA
Test bit accessor with a real dummy accessor as target.
Test bit accessor with a variable accessor as target.
void setForceRuntimeError(bool enable, size_t caseIndex)
std::vector< std::vector< UserType > > generateValue()
static constexpr auto capabilities
size_t nRuntimeErrorCases()
std::vector< std::vector< UserType > > getRemoteValue()
size_t nElementsPerChannel()
ChimeraTK::AccessModeFlags supportedFlags()
ChimeraTK::AccessModeFlags supportedFlags()
DummyMultiplexedRegisterAccessor< minimumUserType > acc
size_t nElementsPerChannel()
size_t nElementsPerChannel()
ChimeraTK::AccessModeFlags supportedFlags()
DummyMultiplexedRegisterAccessor< minimumUserType > acc
ChimeraTK::AccessModeFlags supportedFlags()
size_t nElementsPerChannel()
DummyMultiplexedRegisterAccessor< minimumUserType > acc
size_t nElementsPerChannel()
const std::vector< int32_t > value
const std::vector< int32_t > value
size_t nElementsPerChannel()
Test passing through 1D array accessors.
DummyRegisterAccessor< minimumUserType > acc
size_t nElementsPerChannel()
Test multiply plugin applied to array (just one direction for sake of simplicity)
T convertRawToCooked(Traw value)
DummyRegisterAccessor< minimumUserType > acc
static constexpr auto capabilities
ChimeraTK::AccessModeFlags supportedFlags()
size_t nElementsPerChannel()
BitRangeAccessorTarget target
Test monostable trigger plugin (rather minimal test, needs extension!)
static constexpr auto capabilities
std::vector< std::vector< UserType > > getRemoteValue(bool=false)
ChimeraTK::Boolean minimumUserType
ChimeraTK::AccessModeFlags supportedFlags()
DummyRegisterAccessor< minimumUserType > acc
minimumUserType rawUserType
std::vector< std::vector< UserType > > generateValue()
Test passing through partial array accessors.
size_t nElementsPerChannel()
DummyRegisterAccessor< minimumUserType > acc
void generateValueHook(std::vector< UserType > &)
Test passing through push-type scalar accessors.
DummyRegisterAccessor< minimumUserType > acc
Test passing through scalar accessors - use another target.
DummyRegisterAccessor< minimumUserType > acc
Test passing through scalar accessors.
DummyRegisterAccessor< minimumUserType > acc
static constexpr auto capabilities
T convertRawToCooked(Traw value)
T convertRawToCooked(Traw value)
T convertRawToCooked(Traw value)
static constexpr auto capabilities
Test multiply plugin - needs to be done separately for reading and writing (see below)
static constexpr auto capabilities
ChimeraTK::AccessModeFlags supportedFlags()
DummyRegisterAccessor< rawUserType > acc
Test multiply plugin applied twice (just one direction for sake of simplicity)
DummyRegisterAccessor< minimumUserType > acc
minimumUserType rawUserType
ChimeraTK::AccessModeFlags supportedFlags()
T convertRawToCooked(Traw value)
static constexpr auto capabilities
BitRangeAccessorTarget target
std::vector< std::vector< UserType > > generateValue(bool=false)
double lastGeneratedValue
double lastReportedRemoteValue
double lastReportedValueBeforeWrite
double registerValueBeforeWrite
std::vector< std::vector< UserType > > getRemoteValue(bool getRaw=false)
void generateValueHook(std::vector< UserType > &)
void generateValueHook(std::vector< UserType > &)
void generateValueHook(std::vector< UserType > &)
void generateValueHook(std::vector< UserType > &)
void generateValueHook(std::vector< UserType > &v)
void generateValueHook(std::vector< UserType > &v)
void generateValueHook(std::vector< UserType > &v)
static constexpr auto capabilities
ChimeraTK::AccessModeFlags supportedFlags()
void setForceRuntimeError(bool, size_t)
DummyRegisterAccessor< rawUserType > acc
T convertRawToCooked(Traw value)
size_t nRuntimeErrorCases()
minimumUserType rawUserType
size_t nElementsPerChannel()
Test for fanOut plugin - define 3 registers to check, one for each target of the fan out.
static std::string path()
static constexpr auto capabilities
static ChimeraTK::AccessModeFlags supportedFlags()
DummyRegisterAccessor< minimumUserType > acc
static bool isWriteable()
Test for fanOut plugin - define 3 registers to check, one for each target of the fan out.
static bool isWriteable()
static std::string path()
static ChimeraTK::AccessModeFlags supportedFlags()
static constexpr auto capabilities
DummyRegisterAccessor< minimumUserType > acc
Test for fanOut plugin - define 3 registers to check, one for each target of the fan out.
static bool isWriteable()
static ChimeraTK::AccessModeFlags supportedFlags()
static std::string path()
DummyRegisterAccessor< minimumUserType > acc
static constexpr auto capabilities
Test math plugin with real dummy register as parameter (exception handling...)
T convertRawToCooked(Traw value)
DummyRegisterAccessor< rawUserType > acc
ChimeraTK::AccessModeFlags supportedFlags()
minimumUserType rawUserType
static constexpr auto capabilities
Test force readonly plugin with wait_for_new_data.
DummyRegisterAccessor< minimumUserType > acc
Test force readonly plugin.
DummyRegisterAccessor< minimumUserType > acc
ChimeraTK::AccessModeFlags supportedFlags()
T convertRawToCooked(Traw value)
T convertRawToCooked(Traw value)
T convertRawToCooked(Traw value)
Test math plugin - needs to be done separately for reading and writing (see below)
ChimeraTK::AccessModeFlags supportedFlags()
DummyRegisterAccessor< rawUserType > acc
static constexpr auto capabilities
Base descriptor with defaults, used for all registers.
ChimeraTK::AccessModeFlags supportedFlags()
size_t writeQueueLength()
void setForceRuntimeError(bool enable, size_t)
size_t nRuntimeErrorCases()
static constexpr auto capabilities
Base descriptor for scalars.
size_t nElementsPerChannel()
Base descriptor for variable accessors.
static constexpr auto capabilities
std::vector< std::vector< UserType > > getRemoteValue(bool=false)
ChimeraTK::AccessModeFlags supportedFlags()
size_t nRuntimeErrorCases()
void setForceRuntimeError(bool, size_t)
BOOST_AUTO_TEST_CASE(unifiedBackendTest)