diff --git a/tests/executables_src/testControlSystemAccessors.cc b/tests/executables_src/testControlSystemAccessors.cc index 000b83a24904c1231d0f2151b1f875db77e2fe3a..8f78b036effac740aac6941daf57955ee851269a 100644 --- a/tests/executables_src/testControlSystemAccessors.cc +++ b/tests/executables_src/testControlSystemAccessors.cc @@ -339,71 +339,6 @@ BOOST_AUTO_TEST_CASE_TEMPLATE( testMultipleRePublications, T, test_types ) { } -/*********************************************************************************************************************/ -/* test direct control system to device connections */ - -BOOST_AUTO_TEST_CASE_TEMPLATE( testDirectCStoDev, T, test_types ) { - - TestApplication<T> app; - - auto pvManagers = ctk::createPVManager(); - app.setPVManager(pvManagers.second); - - app.cs("myFeeder", typeid(T), 1) >> app.dev("/MyModule/actuator"); - app.initialise(); - app.run(); - - ChimeraTK::Device dev; - dev.open("Dummy0"); - - BOOST_CHECK_EQUAL(pvManagers.first->getAllProcessVariables().size(), 1); - auto myFeeder = pvManagers.first->getProcessArray<T>("/myFeeder"); - BOOST_CHECK( myFeeder->getName() == "/myFeeder" ); - - myFeeder->accessData(0) = 18; - myFeeder->write(); - CHECK_TIMEOUT( dev.read<T>("/MyModule/actuator") == 18, 3000); - - myFeeder->accessData(0) = 20; - myFeeder->write(); - CHECK_TIMEOUT( dev.read<T>("/MyModule/actuator") == 20, 3000); - -} - -/*********************************************************************************************************************/ -/* test direct control system to device connections with fan out */ - -BOOST_AUTO_TEST_CASE_TEMPLATE( testDirectCStoDevFanOut, T, test_types ) { - - TestApplication<T> app; - - auto pvManagers = ctk::createPVManager(); - app.setPVManager(pvManagers.second); - - app.cs("myFeeder", typeid(T), 1) >> app.dev("/MyModule/actuator") - >> app.dev("/MyModule/readBack"); - app.initialise(); - app.run(); - - ChimeraTK::Device dev; - dev.open("Dummy0"); - - BOOST_CHECK_EQUAL(pvManagers.first->getAllProcessVariables().size(), 1); - auto myFeeder = pvManagers.first->getProcessArray<T>("/myFeeder"); - BOOST_CHECK( myFeeder->getName() == "/myFeeder" ); - - myFeeder->accessData(0) = 18; - myFeeder->write(); - CHECK_TIMEOUT( dev.read<T>("/MyModule/actuator") == 18, 3000); - CHECK_TIMEOUT( dev.read<T>("/MyModule/readBack") == 18, 3000); - - myFeeder->accessData(0) = 20; - myFeeder->write(); - CHECK_TIMEOUT( dev.read<T>("/MyModule/actuator") == 20, 3000); - CHECK_TIMEOUT( dev.read<T>("/MyModule/readBack") == 20, 3000); - -} - /*********************************************************************************************************************/ /* test direct control system to control system connections */ diff --git a/tests/executables_src/testDirectDeviceToCS.cc b/tests/executables_src/testDirectDeviceToCS.cc index 093a4048a3c4dc233ee186b419f0c9f131ecdf5b..574c01759ceaa3908b2e0a20f41bf1594ec0faae 100644 --- a/tests/executables_src/testDirectDeviceToCS.cc +++ b/tests/executables_src/testDirectDeviceToCS.cc @@ -19,6 +19,12 @@ using namespace boost::unit_test_framework; namespace ctk = ChimeraTK; +// list of user types the accessors are tested with +typedef boost::mpl::list<int8_t,uint8_t, + int16_t,uint16_t, + int32_t,uint32_t, + float,double> test_types; + #define CHECK_TIMEOUT(condition, maxMilliseconds) \ { \ std::chrono::steady_clock::time_point t0 = std::chrono::steady_clock::now(); \ @@ -30,13 +36,45 @@ namespace ctk = ChimeraTK; } \ } +/*********************************************************************************************************************/ +/* the ApplicationModule for the test is a template of the user type */ + +template<typename T> +struct TestModule : public ctk::ApplicationModule { + using ctk::ApplicationModule::ApplicationModule; + + ctk::ScalarPushInput<T> consumer{this, "consumer", "", "No comment."}; + ctk::ScalarOutput<T> feeder{this, "feeder", "MV/m", "Some fancy explanation about this variable"}; + + void mainLoop() {} +}; + /*********************************************************************************************************************/ /* dummy application */ -struct TestApplication : ctk::Application { - TestApplication() : Application("testSuite") {} +template<typename T> +struct TestApplication : public ctk::Application { + TestApplication() : Application("testSuite") { + ChimeraTK::BackendFactory::getInstance().setDMapFilePath("test.dmap"); + } ~TestApplication() { shutdown(); } + using Application::makeConnections; // we call makeConnections() manually in the tests to catch exceptions etc. + void defineConnections() {} // the setup is done in the tests + + TestModule<T> testModule{this, "TestModule", "The test module"}; + ctk::ControlSystemModule cs; + + ctk::DeviceModule dev{"Dummy0"}; +}; + +/*********************************************************************************************************************/ +/* dummy application for connectTo() test */ + +struct TestApplicationConnectTo : ctk::Application { + TestApplicationConnectTo() : Application("testSuite") {} + ~TestApplicationConnectTo() { shutdown(); } + using Application::makeConnections; // we call makeConnections() manually in the tests to catch exceptions etc. void defineConnections() { dev.connectTo(cs, trigger.tick); @@ -96,6 +134,71 @@ void testDirectRegister(ctk::TestFacility &test, ChimeraTK::ScalarRegisterAccess } +/*********************************************************************************************************************/ +/* test direct control system to device connections */ + +BOOST_AUTO_TEST_CASE_TEMPLATE( testDirectCStoDev, T, test_types ) { + + TestApplication<T> app; + + auto pvManagers = ctk::createPVManager(); + app.setPVManager(pvManagers.second); + + app.cs("myFeeder", typeid(T), 1) >> app.dev("/MyModule/actuator"); + app.initialise(); + app.run(); + + ChimeraTK::Device dev; + dev.open("Dummy0"); + + BOOST_CHECK_EQUAL(pvManagers.first->getAllProcessVariables().size(), 1); + auto myFeeder = pvManagers.first->getProcessArray<T>("/myFeeder"); + BOOST_CHECK( myFeeder->getName() == "/myFeeder" ); + + myFeeder->accessData(0) = 18; + myFeeder->write(); + CHECK_TIMEOUT( dev.read<T>("/MyModule/actuator") == 18, 3000); + + myFeeder->accessData(0) = 20; + myFeeder->write(); + CHECK_TIMEOUT( dev.read<T>("/MyModule/actuator") == 20, 3000); + +} + +/*********************************************************************************************************************/ +/* test direct control system to device connections with fan out */ + +BOOST_AUTO_TEST_CASE_TEMPLATE( testDirectCStoDevFanOut, T, test_types ) { + + TestApplication<T> app; + + auto pvManagers = ctk::createPVManager(); + app.setPVManager(pvManagers.second); + + app.cs("myFeeder", typeid(T), 1) >> app.dev("/MyModule/actuator") + >> app.dev("/MyModule/readBack"); + app.initialise(); + app.run(); + + ChimeraTK::Device dev; + dev.open("Dummy0"); + + BOOST_CHECK_EQUAL(pvManagers.first->getAllProcessVariables().size(), 1); + auto myFeeder = pvManagers.first->getProcessArray<T>("/myFeeder"); + BOOST_CHECK( myFeeder->getName() == "/myFeeder" ); + + myFeeder->accessData(0) = 18; + myFeeder->write(); + CHECK_TIMEOUT( dev.read<T>("/MyModule/actuator") == 18, 3000); + CHECK_TIMEOUT( dev.read<T>("/MyModule/readBack") == 18, 3000); + + myFeeder->accessData(0) = 20; + myFeeder->write(); + CHECK_TIMEOUT( dev.read<T>("/MyModule/actuator") == 20, 3000); + CHECK_TIMEOUT( dev.read<T>("/MyModule/readBack") == 20, 3000); + +} + /*********************************************************************************************************************/ /* test connectTo */ @@ -105,7 +208,7 @@ BOOST_AUTO_TEST_CASE( testConnectTo ) { ctk::Device dev; dev.open("(dummy?map=test3.map)"); - TestApplication app; + TestApplicationConnectTo app; ctk::TestFacility test; auto devActuator = dev.getScalarRegisterAccessor<int32_t>("/MyModule/actuator");