00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <boost/make_shared.hpp>
00014 #include <algorithm>
00015 #include <iterator>
00016 #include <iostream>
00017
00018
00019
00020
00021 #include "psana/EventLoop.h"
00022 #include "psana/InputModule.h"
00023 #include "PSEnv/Env.h"
00024
00025 using namespace psana ;
00026
00027 #define BOOST_TEST_MODULE EventLoopTest
00028 #include <boost/test/included/unit_test.hpp>
00029
00030
00031
00032
00033
00034
00035 namespace {
00036
00037
00038 class TestInputModule: public InputModule {
00039 public:
00040
00041 TestInputModule(const InputModule::Status states[], int nstates) : InputModule("TestInputModule")
00042 {
00043 std::copy(states, states+nstates, std::back_inserter(m_states));
00044 }
00045
00046 virtual void beginJob(Event& evt, Env& env) {}
00047
00048 virtual Status event(Event& evt, Env& env) {
00049 InputModule::Status state = InputModule::Stop;
00050 if (not m_states.empty()) {
00051 state = m_states.front();
00052 m_states.pop_front();
00053 }
00054 return state;
00055 }
00056
00057 virtual void endJob(Event& evt, Env& env) {}
00058
00059 private:
00060
00061 std::deque<psana::InputModule::Status> m_states;
00062 };
00063
00064 struct Fixture {
00065
00066 Fixture(const InputModule::Status states[], int nstates)
00067 {
00068 boost::shared_ptr<AliasMap> amap = boost::make_shared<AliasMap>();
00069 boost::shared_ptr<PSEnv::IExpNameProvider> expNameProvider;
00070 boost::shared_ptr<PSEnv::Env> env = boost::make_shared<PSEnv::Env>("", expNameProvider, "", amap, 0);
00071 boost::shared_ptr<InputModule> input = boost::make_shared<TestInputModule>(states, nstates);
00072 const std::vector<boost::shared_ptr<Module> > modules;
00073 evtLoop = boost::make_shared<EventLoop>(input, modules, env);
00074 }
00075
00076 boost::shared_ptr<EventLoop> evtLoop;
00077 };
00078
00079
00080 }
00081
00082
00083
00084 BOOST_AUTO_TEST_CASE( test_1 )
00085 {
00086 InputModule::Status states[] = {
00087 InputModule::BeginRun,
00088 InputModule::BeginCalibCycle,
00089 InputModule::DoEvent,
00090 InputModule::DoEvent,
00091 InputModule::EndCalibCycle,
00092 InputModule::EndRun,
00093 };
00094
00095 Fixture f(states, sizeof states/sizeof states[0]);
00096
00097 EventLoop::value_type evt;
00098
00099 evt = f.evtLoop->next();
00100 BOOST_CHECK_EQUAL(evt.first, EventLoop::BeginJob);
00101 evt = f.evtLoop->next();
00102 BOOST_CHECK_EQUAL(evt.first, EventLoop::BeginRun);
00103 evt = f.evtLoop->next();
00104 BOOST_CHECK_EQUAL(evt.first, EventLoop::BeginCalibCycle);
00105 evt = f.evtLoop->next();
00106 BOOST_CHECK_EQUAL(evt.first, EventLoop::Event);
00107 evt = f.evtLoop->next();
00108 BOOST_CHECK_EQUAL(evt.first, EventLoop::Event);
00109 evt = f.evtLoop->next();
00110 BOOST_CHECK_EQUAL(evt.first, EventLoop::EndCalibCycle);
00111 evt = f.evtLoop->next();
00112 BOOST_CHECK_EQUAL(evt.first, EventLoop::EndRun);
00113 evt = f.evtLoop->next();
00114 BOOST_CHECK_EQUAL(evt.first, EventLoop::EndJob);
00115 evt = f.evtLoop->next();
00116 BOOST_CHECK_EQUAL(evt.first, EventLoop::None);
00117 }
00118
00119
00120
00121 BOOST_AUTO_TEST_CASE( test_2 )
00122 {
00123 InputModule::Status states[] = {
00124 InputModule::BeginRun,
00125 InputModule::BeginCalibCycle,
00126 InputModule::DoEvent,
00127 InputModule::DoEvent,
00128 InputModule::EndCalibCycle,
00129 InputModule::EndRun,
00130 };
00131
00132 Fixture f(states, sizeof states/sizeof states[0]);
00133
00134 EventLoop::value_type evt;
00135
00136 evt = f.evtLoop->next();
00137 BOOST_CHECK_EQUAL(evt.first, EventLoop::BeginJob);
00138 f.evtLoop->putback(evt);
00139 evt = f.evtLoop->next();
00140 BOOST_CHECK_EQUAL(evt.first, EventLoop::BeginJob);
00141
00142 evt = f.evtLoop->next();
00143 BOOST_CHECK_EQUAL(evt.first, EventLoop::BeginRun);
00144 f.evtLoop->putback(evt);
00145 evt = f.evtLoop->next();
00146 BOOST_CHECK_EQUAL(evt.first, EventLoop::BeginRun);
00147
00148 evt = f.evtLoop->next();
00149 BOOST_CHECK_EQUAL(evt.first, EventLoop::BeginCalibCycle);
00150 f.evtLoop->putback(evt);
00151 evt = f.evtLoop->next();
00152 BOOST_CHECK_EQUAL(evt.first, EventLoop::BeginCalibCycle);
00153
00154 evt = f.evtLoop->next();
00155 BOOST_CHECK_EQUAL(evt.first, EventLoop::Event);
00156 f.evtLoop->putback(evt);
00157 evt = f.evtLoop->next();
00158 BOOST_CHECK_EQUAL(evt.first, EventLoop::Event);
00159
00160 evt = f.evtLoop->next();
00161 BOOST_CHECK_EQUAL(evt.first, EventLoop::Event);
00162 f.evtLoop->putback(evt);
00163 evt = f.evtLoop->next();
00164 BOOST_CHECK_EQUAL(evt.first, EventLoop::Event);
00165
00166 evt = f.evtLoop->next();
00167 BOOST_CHECK_EQUAL(evt.first, EventLoop::EndCalibCycle);
00168 f.evtLoop->putback(evt);
00169 evt = f.evtLoop->next();
00170 BOOST_CHECK_EQUAL(evt.first, EventLoop::EndCalibCycle);
00171
00172 evt = f.evtLoop->next();
00173 BOOST_CHECK_EQUAL(evt.first, EventLoop::EndRun);
00174 f.evtLoop->putback(evt);
00175 evt = f.evtLoop->next();
00176 BOOST_CHECK_EQUAL(evt.first, EventLoop::EndRun);
00177
00178 evt = f.evtLoop->next();
00179 BOOST_CHECK_EQUAL(evt.first, EventLoop::EndJob);
00180 f.evtLoop->putback(evt);
00181 evt = f.evtLoop->next();
00182 BOOST_CHECK_EQUAL(evt.first, EventLoop::EndJob);
00183
00184 evt = f.evtLoop->next();
00185 BOOST_CHECK_EQUAL(evt.first, EventLoop::None);
00186 f.evtLoop->putback(evt);
00187 evt = f.evtLoop->next();
00188 BOOST_CHECK_EQUAL(evt.first, EventLoop::None);
00189
00190 }
00191
00192
00193