add wx/window.h for MSVC compilation
[wxWidgets.git] / tests / events / timertest.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: tests/events/timertest.cpp
3 // Purpose: Test wxTimer events
4 // Author: Vadim Zeitlin
5 // Created: 2008-10-22
6 // RCS-ID: $Id$
7 // Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
8 ///////////////////////////////////////////////////////////////////////////////
9
10 // ----------------------------------------------------------------------------
11 // headers
12 // ----------------------------------------------------------------------------
13
14 #include "testprec.h"
15
16 #ifdef __BORLANDC__
17 #pragma hdrstop
18 #endif
19
20 #ifndef WX_PRECOMP
21 #endif // WX_PRECOMP
22
23 #include <time.h>
24
25 #include "wx/evtloop.h"
26 #include "wx/timer.h"
27
28 // helper class counting the number of timer events
29 class TimerCounterHandler : public wxEvtHandler
30 {
31 public:
32 TimerCounterHandler()
33 {
34 m_events = 0;
35
36 Connect(wxEVT_TIMER, wxTimerEventHandler(TimerCounterHandler::OnTimer));
37 }
38
39 int GetNumEvents() const { return m_events; }
40
41 private:
42 void OnTimer(wxTimerEvent& WXUNUSED(event))
43 {
44 m_events++;
45
46 Tick();
47 }
48
49 virtual void Tick() { /* nothing to do in the base class */ }
50
51 int m_events;
52
53 DECLARE_NO_COPY_CLASS(TimerCounterHandler)
54 };
55
56 // --------------------------------------------------------------------------
57 // test class
58 // --------------------------------------------------------------------------
59
60 class TimerEventTestCase : public CppUnit::TestCase
61 {
62 public:
63 TimerEventTestCase() {}
64
65 private:
66 CPPUNIT_TEST_SUITE( TimerEventTestCase );
67 CPPUNIT_TEST( OneShot );
68 CPPUNIT_TEST( Multiple );
69 CPPUNIT_TEST_SUITE_END();
70
71 void OneShot();
72 void Multiple();
73
74 DECLARE_NO_COPY_CLASS(TimerEventTestCase)
75 };
76
77 // register in the unnamed registry so that these tests are run by default
78 CPPUNIT_TEST_SUITE_REGISTRATION( TimerEventTestCase );
79
80 // also include in it's own registry so that these tests can be run alone
81 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TimerEventTestCase, "TimerEventTestCase" );
82
83 void TimerEventTestCase::OneShot()
84 {
85 class ExitOnTimerHandler : public TimerCounterHandler
86 {
87 public:
88 ExitOnTimerHandler(wxEventLoopBase& loop)
89 : TimerCounterHandler(),
90 m_loop(loop)
91 {
92 }
93
94 private:
95 virtual void Tick() { m_loop.Exit(); }
96
97 wxEventLoopBase& m_loop;
98
99 // don't use DECLARE_NO_COPY_CLASS() to avoid upsetting MSVC
100 };
101
102 wxEventLoop loop;
103
104 ExitOnTimerHandler handler(loop);
105 wxTimer timer(&handler);
106 timer.Start(200, true);
107
108 loop.Run();
109
110 CPPUNIT_ASSERT_EQUAL( 1, handler.GetNumEvents() );
111 }
112
113 void TimerEventTestCase::Multiple()
114 {
115 wxEventLoop loop;
116
117 TimerCounterHandler handler;
118 wxTimer timer(&handler);
119 timer.Start(100);
120
121 // run the loop for 2 seconds
122 time_t t;
123 time(&t);
124 const time_t tEnd = t + 2;
125 while ( time(&t) < tEnd )
126 {
127 loop.Dispatch();
128 }
129
130 // we can't count on getting exactly 20 ticks but we shouldn't get more
131 // than this
132 const int numTicks = handler.GetNumEvents();
133 CPPUNIT_ASSERT( numTicks <= 20 );
134
135 // and we should get a decent number of them (unless the system is horribly
136 // loaded so if it does happen that this test fails we may need to remove
137 // it)
138 CPPUNIT_ASSERT( numTicks > 10 );
139 }