Commit a510d139 authored by Pavel Vainerman's avatar Pavel Vainerman

(tests): написал тесты для класса CallbackTimer. Переименовал его

из "CallBackTimer" --> "CallbackTimer"
parent 32d6f59b
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
* \author Pavel Vainerman * \author Pavel Vainerman
*/ */
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
# ifndef CallBackTimer_H_ # ifndef CallbackTimer_H_
# define CallBackTimer_H_ # define CallbackTimer_H_
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
#include <list> #include <list>
#include "Exceptions.h" #include "Exceptions.h"
...@@ -45,7 +45,7 @@ namespace UniSetTypes ...@@ -45,7 +45,7 @@ namespace UniSetTypes
/*! Конструктор позволяющий вывести в сообщении об ошибке дополнительную информацию err */ /*! Конструктор позволяющий вывести в сообщении об ошибке дополнительную информацию err */
LimitTimers(const std::string& err):Exception(err){ printException(); } LimitTimers(const std::string& err):Exception(err){ printException(); }
}; };
}; }
//@} //@}
// end of UniSetException group // end of UniSetException group
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
...@@ -54,9 +54,9 @@ namespace UniSetTypes ...@@ -54,9 +54,9 @@ namespace UniSetTypes
* \brief Таймер * \brief Таймер
* \author Pavel Vainerman * \author Pavel Vainerman
* \par * \par
* Создает поток, в котором происходит отсчет тактов (10ms). Позволяет заказывать до CallBackTimer::MAXCallBackTimer таймеров. * Создает поток, в котором происходит отсчет тактов (10ms). Позволяет заказывать до CallbackTimer::MAXCallbackTimer таймеров.
* При срабатывании будет вызвана указанная функция с указанием \b Id таймера, который сработал. * При срабатывании будет вызвана указанная функция с указанием \b Id таймера, который сработал.
* Функция обратного вызова должна удовлетворять шаблону CallBackTimer::Action. * Функция обратного вызова должна удовлетворять шаблону CallbackTimer::Action.
* Пример создания таймера: * Пример создания таймера:
* *
\code \code
...@@ -68,29 +68,29 @@ namespace UniSetTypes ...@@ -68,29 +68,29 @@ namespace UniSetTypes
MyClass* rec = new MyClass(); MyClass* rec = new MyClass();
... ...
CallBackTimer<MyClass> *timer1 = new CallBackTimer<MyClass>(rec); CallbackTimer<MyClass> *timer1 = new CallbackTimer<MyClass>(rec);
timer1->add(1, &MyClass::Time, 1000); timer1->add(1, &MyClass::Time, 1000);
timer1->add(5, &MyClass::Time, 1200); timer1->add(5, &MyClass::Time, 1200);
timer1->run(); timer1->run();
\endcode \endcode
* *
* \note Каждый экземпляр класса CallBackTimer создает поток, поэтому \b желательно не создавать больше одного экземпляра, * \note Каждый экземпляр класса CallbackTimer создает поток, поэтому \b желательно не создавать больше одного экземпляра,
* для одного процесса (чтобы не порождать много потоков). * для одного процесса (чтобы не порождать много потоков).
*/ */
template <class Caller> template <class Caller>
class CallBackTimer class CallbackTimer
// public PassiveTimer // public PassiveTimer
{ {
public: public:
/*! Максимальное количество таймеров */ /*! Максимальное количество таймеров */
static const int MAXCallBackTimer = 20; static const int MAXCallbackTimer = 20;
/*! прототип функции вызова */ /*! прототип функции вызова */
typedef void(Caller::* Action)( int id ); typedef void(Caller::* Action)( int id );
CallBackTimer(Caller* r, Action a); CallbackTimer(Caller* r, Action a);
~CallBackTimer(); ~CallbackTimer();
// Управление таймером // Управление таймером
void run(); /*!< запуск таймера */ void run(); /*!< запуск таймера */
...@@ -108,7 +108,7 @@ class CallBackTimer ...@@ -108,7 +108,7 @@ class CallBackTimer
protected: protected:
CallBackTimer(); CallbackTimer();
void work(); void work();
void startTimers(); void startTimers();
...@@ -116,7 +116,7 @@ class CallBackTimer ...@@ -116,7 +116,7 @@ class CallBackTimer
private: private:
typedef CallBackTimer<Caller> CBT; typedef CallbackTimer<Caller> CBT;
friend class ThreadCreator<CBT>; friend class ThreadCreator<CBT>;
Caller* cal; Caller* cal;
Action act; Action act;
...@@ -137,7 +137,7 @@ class CallBackTimer ...@@ -137,7 +137,7 @@ class CallBackTimer
TimersList lst; TimersList lst;
// функция-объект для поиска по id // функция-объект для поиска по id
struct FindId_eq: public unary_function<TimerInfo, bool> struct FindId_eq: public std::unary_function<TimerInfo, bool>
{ {
FindId_eq(const int id):id(id){} FindId_eq(const int id):id(id){}
inline bool operator()(const TimerInfo& ti) const{return ti.id==id;} inline bool operator()(const TimerInfo& ti) const{return ti.id==id;}
...@@ -145,5 +145,5 @@ class CallBackTimer ...@@ -145,5 +145,5 @@ class CallBackTimer
}; };
}; };
#include "CallBackTimer.tcc" #include "CallbackTimer.tcc"
# endif //CallBackTimer_H_ # endif //CallbackTimer_H_
...@@ -21,41 +21,41 @@ ...@@ -21,41 +21,41 @@
* \author Pavel Vainerman * \author Pavel Vainerman
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
# ifndef CallBackTimer_TCC_H_ # ifndef CallbackTimer_TCC_H_
# define CallBackTimer_TCC_H_ # define CallbackTimer_TCC_H_
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <unistd.h> #include <unistd.h>
#include <sstream> #include <sstream>
#include "CallBackTimer.h" #include "CallbackTimer.h"
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> class CallBackTimer; template <class Caller> class CallbackTimer;
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
/*! Создание таймера /*! Создание таймера
\param r - указатель на заказчика \param r - указатель на заказчика
*/ */
template <class Caller> template <class Caller>
CallBackTimer<Caller>::CallBackTimer( Caller* r, Action a ): CallbackTimer<Caller>::CallbackTimer( Caller* r, Action a ):
cal(r), cal(r),
act(a), act(a),
terminated(false) terminated(false)
{ {
thr = new ThreadCreator<CallBackTimer>(this, &CallBackTimer<Caller>::work); thr = new ThreadCreator<CallbackTimer>(this, &CallbackTimer<Caller>::work);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
CallBackTimer<Caller>::CallBackTimer(): CallbackTimer<Caller>::CallbackTimer():
cal(null), cal(nullptr),
terminated(false) terminated(false)
{ {
thr = new ThreadCreator<CallBackTimer>(this, &CallBackTimer<Caller>::work); thr = new ThreadCreator<CallbackTimer>(this, &CallbackTimer<Caller>::work);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
CallBackTimer<Caller>::~CallBackTimer() CallbackTimer<Caller>::~CallbackTimer()
{ {
terminate(); terminate();
clearTimers(); clearTimers();
...@@ -64,12 +64,12 @@ CallBackTimer<Caller>::~CallBackTimer() ...@@ -64,12 +64,12 @@ CallBackTimer<Caller>::~CallBackTimer()
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
void CallBackTimer<Caller>::work() void CallbackTimer<Caller>::work()
{ {
terminated = false; terminated = false;
while( !terminated ) while( !terminated )
{ {
usleep(UniSetTimer::MIN_QUANTITY_TIME_MKS); usleep(UniSetTimer::MinQuantityTime);
for( typename TimersList::iterator li=lst.begin(); li!=lst.end(); ++li ) for( typename TimersList::iterator li=lst.begin(); li!=lst.end(); ++li )
{ {
...@@ -84,7 +84,7 @@ void CallBackTimer<Caller>::work() ...@@ -84,7 +84,7 @@ void CallBackTimer<Caller>::work()
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
void CallBackTimer<Caller>::run() void CallbackTimer<Caller>::run()
{ {
if( !terminated ) if( !terminated )
terminate(); terminate();
...@@ -95,7 +95,7 @@ void CallBackTimer<Caller>::run() ...@@ -95,7 +95,7 @@ void CallBackTimer<Caller>::run()
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
void CallBackTimer<Caller>::terminate() void CallbackTimer<Caller>::terminate()
{ {
// timeAct = 0; // timeAct = 0;
terminated = true; terminated = true;
...@@ -104,12 +104,12 @@ void CallBackTimer<Caller>::terminate() ...@@ -104,12 +104,12 @@ void CallBackTimer<Caller>::terminate()
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
void CallBackTimer<Caller>::add( int id, int timeMS )throw(UniSetTypes::LimitTimers) void CallbackTimer<Caller>::add( int id, int timeMS )throw(UniSetTypes::LimitTimers)
{ {
if( lst.size() >= MAXCallBackTimer ) if( lst.size() >= MAXCallbackTimer )
{ {
ostringstream err; std::ostringstream err;
err << "CallBackTimers: превышено максимальное количество таймеров" << MAXCallBackTimer; err << "CallbackTimers: exceeded the maximum number of timers (" << MAXCallbackTimer << ")";
throw UniSetTypes::LimitTimers(err.str()); throw UniSetTypes::LimitTimers(err.str());
} }
...@@ -121,7 +121,7 @@ void CallBackTimer<Caller>::add( int id, int timeMS )throw(UniSetTypes::LimitTim ...@@ -121,7 +121,7 @@ void CallBackTimer<Caller>::add( int id, int timeMS )throw(UniSetTypes::LimitTim
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
void CallBackTimer<Caller>::remove( int id ) void CallbackTimer<Caller>::remove( int id )
{ {
// STL - способ поиска // STL - способ поиска
typename TimersList::iterator li= find_if(lst.begin(),lst.end(),FindId_eq(id)); typename TimersList::iterator li= find_if(lst.begin(),lst.end(),FindId_eq(id));
...@@ -130,7 +130,7 @@ void CallBackTimer<Caller>::remove( int id ) ...@@ -130,7 +130,7 @@ void CallBackTimer<Caller>::remove( int id )
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
void CallBackTimer<Caller>::startTimers() void CallbackTimer<Caller>::startTimers()
{ {
for( typename TimersList::iterator li=lst.begin(); li!=lst.end(); ++li) for( typename TimersList::iterator li=lst.begin(); li!=lst.end(); ++li)
{ {
...@@ -139,13 +139,13 @@ void CallBackTimer<Caller>::startTimers() ...@@ -139,13 +139,13 @@ void CallBackTimer<Caller>::startTimers()
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
void CallBackTimer<Caller>::clearTimers() void CallbackTimer<Caller>::clearTimers()
{ {
lst.clear(); lst.clear();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
void CallBackTimer<Caller>::reset( int id ) void CallbackTimer<Caller>::reset( int id )
{ {
typename TimersList::iterator li= find_if(lst.begin(),lst.end(),FindId_eq(id)); typename TimersList::iterator li= find_if(lst.begin(),lst.end(),FindId_eq(id));
if( li!=lst.end() ) if( li!=lst.end() )
...@@ -153,7 +153,7 @@ void CallBackTimer<Caller>::reset( int id ) ...@@ -153,7 +153,7 @@ void CallBackTimer<Caller>::reset( int id )
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
void CallBackTimer<Caller>::setTiming( int id, int timeMS ) void CallbackTimer<Caller>::setTiming( int id, int timeMS )
{ {
typename TimersList::iterator li= find_if(lst.begin(),lst.end(),FindId_eq(id)); typename TimersList::iterator li= find_if(lst.begin(),lst.end(),FindId_eq(id));
if( li!=lst.end() ) if( li!=lst.end() )
...@@ -161,7 +161,7 @@ void CallBackTimer<Caller>::setTiming( int id, int timeMS ) ...@@ -161,7 +161,7 @@ void CallBackTimer<Caller>::setTiming( int id, int timeMS )
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
int CallBackTimer<Caller>::getInterval( int id ) int CallbackTimer<Caller>::getInterval( int id )
{ {
typename TimersList::iterator li= find_if(lst.begin(),lst.end(),FindId_eq(id)); typename TimersList::iterator li= find_if(lst.begin(),lst.end(),FindId_eq(id));
if( li!=lst.end() ) if( li!=lst.end() )
...@@ -170,7 +170,7 @@ int CallBackTimer<Caller>::getInterval( int id ) ...@@ -170,7 +170,7 @@ int CallBackTimer<Caller>::getInterval( int id )
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
template <class Caller> template <class Caller>
int CallBackTimer<Caller>::getCurrent( int id ) int CallbackTimer<Caller>::getCurrent( int id )
{ {
typename TimersList::iterator li= find_if(lst.begin(),lst.end(),FindId_eq(id)); typename TimersList::iterator li= find_if(lst.begin(),lst.end(),FindId_eq(id));
if( li!=lst.end() ) if( li!=lst.end() )
...@@ -180,4 +180,4 @@ int CallBackTimer<Caller>::getCurrent( int id ) ...@@ -180,4 +180,4 @@ int CallBackTimer<Caller>::getCurrent( int id )
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
# endif //CallBackTimer_TCC_H_ # endif //CallbackTimer_TCC_H_
...@@ -5,9 +5,10 @@ ...@@ -5,9 +5,10 @@
check_PROGRAMS = tests tests_with_conf check_PROGRAMS = tests tests_with_conf
#umutex threadtst dlog #umutex threadtst dlog
tests_SOURCES = tests.cc passivetimer.cc hourglass.cc delaytimer.cc unixml.cc sscanf_hex.cc tests_SOURCES = tests.cc passivetimer.cc hourglass.cc delaytimer.cc unixml.cc sscanf_hex.cc \
tests_LDADD = $(top_builddir)/lib/libUniSet2.la callbacktimer.cc
tests_CPPFLAGS = -I$(top_builddir)/include -I$(includedir)/Catch tests_LDADD = $(top_builddir)/lib/libUniSet2.la $(SIGC_LIBS) $(COMCPP_LIBS)
tests_CPPFLAGS = -I$(top_builddir)/include -I$(includedir)/Catch $(SIGC_CFLAGS) $(COMCPP_CFLAGS)
tests_with_conf_SOURCES = tests_with_conf.cc conftest.cc ui.cc tests_with_conf_SOURCES = tests_with_conf.cc conftest.cc ui.cc
tests_with_conf_LDADD = $(top_builddir)/lib/libUniSet2.la tests_with_conf_LDADD = $(top_builddir)/lib/libUniSet2.la
......
#include <catch.hpp>
#include "CallbackTimer.h"
#include "UniSetTypes.h"
using namespace std;
class MyTestClass
{
public:
MyTestClass():num1(0),num2(0),num3(0){}
~MyTestClass(){}
void Time( int id )
{
if( id == 1 )
num1++;
else if( id == 2 )
num2++;
else if( id == 3 )
num3++;
}
inline int getNum1(){ return num1; }
inline int getNum2(){ return num2; }
inline int getNum3(){ return num3; }
private:
int num1;
int num2;
int num3;
};
TEST_CASE("CallbackTimer", "[CallbackTimer]" )
{
SECTION("Basic tests")
{
MyTestClass tc;
CallbackTimer<MyTestClass> tmr(&tc,&MyTestClass::Time);
tmr.add(1, 50 );
tmr.add(2, 150 );
tmr.add(3, 300 );
tmr.run();
msleep(60);
REQUIRE( tc.getNum1() == 1 );
REQUIRE( tc.getNum2() == 0 );
REQUIRE( tc.getNum3() == 0 );
msleep(110);
REQUIRE( tc.getNum1() == 3 );
REQUIRE( tc.getNum2() == 1 );
REQUIRE( tc.getNum3() == 0 );
msleep(210);
REQUIRE( tc.getNum1() == 7 );
REQUIRE( tc.getNum2() == 2 );
REQUIRE( tc.getNum3() == 1 );
tmr.remove(1);
msleep(60);
REQUIRE( tc.getNum1() == 7 );
tmr.terminate();
REQUIRE( tc.getNum2() == 2 );
REQUIRE( tc.getNum3() == 1 );
}
SECTION("other tests")
{
MyTestClass tc;
CallbackTimer<MyTestClass> tmr(&tc,&MyTestClass::Time);
int i=0;
for( ;i<tmr.MAXCallbackTimer; i++ )
tmr.add(i,100 );
REQUIRE_THROWS_AS( tmr.add(++i,100), UniSetTypes::LimitTimers );
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment