3#define BOOST_TEST_MODULE testConfigReader
5#include <boost/test/included/unit_test.hpp>
6using namespace boost::unit_test_framework;
19constexpr std::string_view
cdd{
"(dummy?map=configReaderDevice.map)"};
27 using ctk::ApplicationModule::ApplicationModule;
48 using ctk::VariableGroup::VariableGroup;
56 using ctk::VariableGroup::VariableGroup;
62 using ctk::VariableGroup::VariableGroup;
71 using ctk::VariableGroup::VariableGroup;
74 using ctk::VariableGroup::VariableGroup;
80 std::atomic<bool>
done{
false};
84 BOOST_CHECK_EQUAL(int8_t(
var8), -123);
85 BOOST_CHECK_EQUAL(uint8_t(
var8u), 34);
86 BOOST_CHECK_EQUAL(int16_t(
var16), -567);
87 BOOST_CHECK_EQUAL(uint16_t(
var16u), 678);
88 BOOST_CHECK_EQUAL(int32_t(
var32), -345678);
89 BOOST_CHECK_EQUAL(uint32_t(
var32u), 234567);
90 BOOST_CHECK_EQUAL(int64_t(
var64), -2345678901234567890);
91 BOOST_CHECK_EQUAL(uint64_t(
var64u), 12345678901234567890U);
92 BOOST_CHECK_CLOSE(
float(
varFloat), 3.1415, 0.000001);
93 BOOST_CHECK_CLOSE(
double(
varDouble), -2.8, 0.000001);
94 BOOST_CHECK_EQUAL(std::string(
varString),
"My dear mister singing club!");
96 BOOST_CHECK_EQUAL(
intArray.getNElements(), 10);
97 for(
unsigned int i = 0; i < 10; ++i) {
98 BOOST_CHECK_EQUAL(
intArray[i], 10 - i);
102 for(
unsigned int i = 0; i < 8; ++i) {
103 BOOST_CHECK_EQUAL(
stringArray[i],
"Hallo" + std::to_string(i + 1));
113 for(
unsigned int i = 0; i < 10; ++i) {
118 for(
unsigned int i = 0; i < 8; ++i) {
124 BOOST_CHECK(!
var8.readNonBlocking());
125 BOOST_CHECK(!
var8u.readNonBlocking());
126 BOOST_CHECK(!
var16.readNonBlocking());
127 BOOST_CHECK(!
var16u.readNonBlocking());
128 BOOST_CHECK(!
var32.readNonBlocking());
129 BOOST_CHECK(!
var32u.readNonBlocking());
130 BOOST_CHECK(!
var64.readNonBlocking());
131 BOOST_CHECK(!
var64u.readNonBlocking());
132 BOOST_CHECK(!
varFloat.readNonBlocking());
133 BOOST_CHECK(!
varDouble.readNonBlocking());
134 BOOST_CHECK(!
varString.readNonBlocking());
135 BOOST_CHECK(!
intArray.readNonBlocking());
167#pragma GCC diagnostic push
168#pragma GCC diagnostic ignored "-Wdeprecated"
169#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
172#pragma GCC diagnostic pop
190#pragma GCC diagnostic push
191#pragma GCC diagnostic ignored "-Wdeprecated"
192#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
194#pragma GCC diagnostic pop
212 std::cout <<
"==> testConfigReader" << std::endl;
217 BOOST_TEST(config.getOwner() !=
nullptr);
220 BOOST_CHECK_EQUAL(config.get<int8_t>(
"var8"), -123);
221 BOOST_CHECK_EQUAL(config.get<uint8_t>(
"var8u"), 34);
222 BOOST_CHECK_EQUAL(config.get<int16_t>(
"var16"), -567);
223 BOOST_CHECK_EQUAL(config.get<uint16_t>(
"var16u"), 678);
224 BOOST_CHECK_EQUAL(config.get<int32_t>(
"var32"), -345678);
225 BOOST_CHECK_EQUAL(config.get<uint32_t>(
"var32u"), 234567);
226 BOOST_CHECK_EQUAL(config.get<int64_t>(
"var64"), -2345678901234567890);
227 BOOST_CHECK_EQUAL(config.get<uint64_t>(
"var64u"), 12345678901234567890U);
228 BOOST_CHECK_CLOSE(config.get<
float>(
"varFloat"), 3.1415, 0.000001);
229 BOOST_CHECK_CLOSE(config.get<
double>(
"varDouble"), -2.8, 0.000001);
230 BOOST_CHECK_EQUAL(config.get<std::string>(
"varString"),
"My dear mister singing club!");
232 std::vector<int> arrayValue = config.get<std::vector<int>>(
"intArray");
233 BOOST_CHECK_EQUAL(arrayValue.size(), 10);
234 for(
size_t i = 0; i < 10; ++i) {
235 BOOST_CHECK_EQUAL(arrayValue[i], 10 - i);
238 std::vector<std::string> arrayValueString = config.get<std::vector<std::string>>(
"stringArray");
239 BOOST_CHECK_EQUAL(arrayValueString.size(), 8);
240 for(
size_t i = 0; i < 8; ++i) {
241 BOOST_CHECK_EQUAL(arrayValueString[i],
"Hallo" + std::to_string(i + 1));
244 BOOST_CHECK_EQUAL(config.get<int16_t>(
"module1/var16"), -567);
245 BOOST_CHECK_EQUAL(config.get<uint16_t>(
"module1/var16u"), 678);
246 BOOST_CHECK_EQUAL(config.get<int32_t>(
"module1/var32"), -345678);
247 BOOST_CHECK_EQUAL(config.get<uint32_t>(
"module1/var32u"), 234567);
248 BOOST_CHECK_EQUAL(config.get<uint32_t>(
"module1/submodule/var32u"), 234567);
249 BOOST_CHECK_EQUAL(config.get<uint32_t>(
"module1/submodule/subsubmodule/var32u"), 234568);
251 arrayValue = config.get<std::vector<int>>(
"module1/submodule/intArray");
252 BOOST_CHECK_EQUAL(arrayValue.size(), 10);
253 for(
size_t i = 0; i < 10; ++i) {
254 BOOST_CHECK_EQUAL(arrayValue[i], 10 - i);
257 arrayValueString = config.get<std::vector<std::string>>(
"module1/submodule/stringArray");
258 BOOST_CHECK_EQUAL(arrayValueString.size(), 8);
259 for(
size_t i = 0; i < 8; ++i) {
260 BOOST_CHECK_EQUAL(arrayValueString[i],
"Hallo" + std::to_string(i + 1));
279 std::cout <<
"==> testExceptions" << std::endl;
281 BOOST_CHECK_THROW(std::make_unique<TestApplicationTwoConfigs>(), ctk::logic_error);
284 BOOST_CHECK_THROW(std::make_unique<TestApplicationInvalidConfig>(), ctk::logic_error);
290 BOOST_CHECK_THROW(config.get<uint16_t>(
"var32u"), ctk::logic_error);
293 BOOST_CHECK_THROW(config.get<
int>(
"nonexistentVariable"), ctk::logic_error);
297 BOOST_CHECK_THROW(config.get<std::vector<float>>(
"module1/submodule/intArray"), ctk::logic_error);
300 BOOST_CHECK_THROW(config.get<std::vector<int>>(
"nonexistentVariable"), ctk::logic_error);
307 std::cout <<
"==> testDirectWriteToDevice" << std::endl;
316 auto var32u = device.getScalarRegisterAccessor<uint32_t>(
"var32u");
317 auto var16 = device.getScalarRegisterAccessor<int16_t>(
"var16");
318 auto module1var16 = device.getScalarRegisterAccessor<int16_t>(
"module1/var16");
319 auto intArray = device.getOneDRegisterAccessor<int32_t>(
"intArray");
324 BOOST_CHECK_EQUAL(var32u, 234567);
325 BOOST_CHECK_EQUAL(var16, -567);
326 BOOST_CHECK_EQUAL(module1var16, -567);
327 BOOST_CHECK_EQUAL(intArray.getNElements(), 10);
328 for(
unsigned int i = 0; i < 10; ++i) {
329 BOOST_CHECK_EQUAL(intArray[i], 10 - i);
340 BOOST_TEST(std::list<std::string>({
"module1",
"module2"}) == modules);
342 auto modules2 = config.getModules(
"module1");
343 BOOST_TEST(std::list<std::string>({
"submodule"}) == modules2);
345 BOOST_TEST(config.getModules(
"this/should/not/exist") == std::list<std::string>());
351 std::cout <<
"==> testOverrideTestFacility" << std::endl;
354 ctk::TestFacility::setConfigScalar<int8_t>(
"var8", 12);
355 ctk::TestFacility::setConfigScalar<std::string>(
"varString",
"another overridden value");
357 ctk::TestFacility::setConfigScalar<int8_t>(
"newVar8", -42);
359 std::vector<int> ref({1, 2, 4, 8, 16, 32, 64, 128, 256, 512});
360 ctk::TestFacility::setConfigArray<int>(
"module1/submodule/intArray", ref);
365 BOOST_TEST(config.get<int8_t>(
"var8") == 12);
366 BOOST_TEST(config.get<uint8_t>(
"var8u") == 34);
367 BOOST_TEST(config.get<std::string>(
"varString") ==
"another overridden value");
368 BOOST_TEST(config.get<int8_t>(
"newVar8") == -42);
370 auto arrayValue = config.get<std::vector<int>>(
"module1/submodule/intArray");
371 BOOST_TEST(arrayValue == ref);
375 ctk::TestFacility::setConfigScalar<int8_t>(
"var8", 12);
376 ctk::TestFacility::setConfigScalar<std::string>(
"varString",
"another overridden value");
378 ctk::TestFacility::setConfigScalar<int8_t>(
"newVar8", -42);
380 std::vector<int> ref({1, 2, 4, 8, 16, 32, 64, 128, 256, 512});
381 ctk::TestFacility::setConfigArray<int>(
"module1/submodule/intArray", ref);
386 BOOST_TEST(config.get<int8_t>(
"var8") == 12);
387 BOOST_CHECK_THROW(config.get<uint8_t>(
"var8u"), ChimeraTK::logic_error);
388 BOOST_TEST(config.get<std::string>(
"varString") ==
"another overridden value");
389 BOOST_TEST(config.get<int8_t>(
"newVar8") == -42);
391 auto arrayValue = config.get<std::vector<int>>(
"module1/submodule/intArray");
392 BOOST_TEST(arrayValue == ref);
ConfigReader & getConfigReader()
void shutdown() override
This will remove the global pointer to the instance and allows creating another instance afterwards.
Generic module to read an XML config file and provide the defined values as constant variables.
std::list< std::string > getModules(const std::string &path={}) const
Returns a list of names of modules which are direct children of path.
EntityOwner * getOwner() const
Helper class to facilitate tests of applications based on ApplicationCore.
void runApplication() const
Start the application in testable mode.
InvalidityTracer application module.
BOOST_AUTO_TEST_CASE(testConfigReader)
~TestApplication() override
TestApplication(const std::string &name="valid")
TestApplicationInvalidConfig()
~TestApplicationInvalidConfig() override
TestApplicationNoConfigs()
~TestApplicationNoConfigs() override
~TestApplicationTwoConfigs() override
TestApplicationTwoConfigs()
ctk::ConfigReader config2
~TestApplicationWithDevice() override
TestApplicationWithDevice()
ctk::ScalarPushInput< int32_t > var32
ctk::ScalarPushInput< uint32_t > var32u
ctk::ScalarPushInput< uint32_t > var32u
ctk::ArrayPushInput< int32_t > intArray
Tests::testConfigReader::TestModule::Module1::SubModule::SubSubModule subsubmodule
ctk::ArrayPushInput< std::string > stringArray
ctk::ScalarPushInput< std::string > varString
Tests::testConfigReader::TestModule::Module1::SubModule submodule
ctk::ScalarPushInput< uint32_t > var32u
ctk::ScalarPushInput< int32_t > var32
ctk::ScalarPushInput< int16_t > var16
ctk::ScalarPushInput< uint16_t > var16u
ctk::ScalarPushInput< double > var1
ctk::ScalarPushInput< double > var2
Tests::testConfigReader::TestModule::Module2::AnotherSubModule submodule2
Tests::testConfigReader::TestModule::Module2::AnotherSubModule submodule1
ctk::ScalarPushInput< uint16_t > var16u
void mainLoop() override
To be implemented by the user: function called in a separate thread executing the main loop of the mo...
Tests::testConfigReader::TestModule::Module1 module1
ctk::ScalarPushInput< float > varFloat
ctk::ScalarPushInput< double > varDouble
ctk::ScalarPushInput< uint8_t > var8u
ctk::ScalarPushInput< uint32_t > var32u
ctk::ScalarPushInput< int32_t > varAnotherInt
ctk::ArrayPushInput< int32_t > intArray
ctk::ScalarPushInput< int16_t > var16
ctk::ScalarPushInput< uint64_t > var64u
ctk::ScalarPushInput< int64_t > var64
ctk::ConfigReader * theConfigReader
Tests::testConfigReader::TestModule::Module2 module2
ctk::ScalarPushInput< int32_t > var32
ctk::ArrayPushInput< std::string > stringArray
ctk::ScalarPushInput< std::string > varString
ctk::ScalarPushInput< int8_t > var8
constexpr std::string_view cdd