From 438febca6ee2e6df8dcde85eb9d7bc0504046b74 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 27 Oct 2008 22:04:42 +0000 Subject: [PATCH] don't sleep too long to avoid missing the timers; added a simple test for timer events processing in console apps git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56537 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/unix/evtloopunix.cpp | 23 +++--- tests/Makefile.in | 4 ++ tests/events/timertest.cpp | 139 +++++++++++++++++++++++++++++++++++++ tests/test.bkl | 1 + tests/test_test.dsp | 4 ++ tests/test_vc7_test.vcproj | 3 + tests/test_vc8_test.vcproj | 4 ++ tests/test_vc9_test.vcproj | 4 ++ 8 files changed, 170 insertions(+), 12 deletions(-) create mode 100644 tests/events/timertest.cpp diff --git a/src/unix/evtloopunix.cpp b/src/unix/evtloopunix.cpp index 76272844d3..fc1f469ae4 100644 --- a/src/unix/evtloopunix.cpp +++ b/src/unix/evtloopunix.cpp @@ -148,18 +148,6 @@ bool wxConsoleEventLoop::Pending() const } bool wxConsoleEventLoop::Dispatch() -{ - m_dispatcher->Dispatch(); - wxTheApp->ProcessPendingEvents(); - return true; -} - -void wxConsoleEventLoop::WakeUp() -{ - m_wakeupPipe.WakeUp(); -} - -void wxConsoleEventLoop::OnNextIteration() { // calculate the timeout until the next timer expiration int timeout; @@ -183,6 +171,17 @@ void wxConsoleEventLoop::OnNextIteration() wxTimerScheduler::Get().NotifyExpired(); #endif + wxTheApp->ProcessPendingEvents(); + return true; +} + +void wxConsoleEventLoop::WakeUp() +{ + m_wakeupPipe.WakeUp(); +} + +void wxConsoleEventLoop::OnNextIteration() +{ // call the signal handlers for any signals we caught recently wxTheApp->CheckSignal(); } diff --git a/tests/Makefile.in b/tests/Makefile.in index 13f628203d..59e1d55f5a 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -60,6 +60,7 @@ TEST_OBJECTS = \ test_cmdlinetest.o \ test_fileconf.o \ test_datetimetest.o \ + test_timertest.o \ test_filekind.o \ test_filenametest.o \ test_filesystest.o \ @@ -365,6 +366,9 @@ test_fileconf.o: $(srcdir)/config/fileconf.cpp $(TEST_ODEP) test_datetimetest.o: $(srcdir)/datetime/datetimetest.cpp $(TEST_ODEP) $(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/datetime/datetimetest.cpp +test_timertest.o: $(srcdir)/events/timertest.cpp $(TEST_ODEP) + $(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/events/timertest.cpp + test_filekind.o: $(srcdir)/filekind/filekind.cpp $(TEST_ODEP) $(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/filekind/filekind.cpp diff --git a/tests/events/timertest.cpp b/tests/events/timertest.cpp new file mode 100644 index 0000000000..1aed5c4f00 --- /dev/null +++ b/tests/events/timertest.cpp @@ -0,0 +1,139 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: tests/events/timertest.cpp +// Purpose: Test wxTimer events +// Author: Vadim Zeitlin +// Created: 2008-10-22 +// RCS-ID: $Id$ +// Copyright: (c) 2008 Vadim Zeitlin +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "testprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#endif // WX_PRECOMP + +#include + +#include "wx/evtloop.h" +#include "wx/timer.h" + +// helper class counting the number of timer events +class TimerCounterHandler : public wxEvtHandler +{ +public: + TimerCounterHandler() + { + m_events = 0; + + Connect(wxEVT_TIMER, wxTimerEventHandler(TimerCounterHandler::OnTimer)); + } + + int GetNumEvents() const { return m_events; } + +private: + void OnTimer(wxTimerEvent& WXUNUSED(event)) + { + m_events++; + + Tick(); + } + + virtual void Tick() { /* nothing to do in the base class */ } + + int m_events; + + DECLARE_NO_COPY_CLASS(TimerCounterHandler) +}; + +// -------------------------------------------------------------------------- +// test class +// -------------------------------------------------------------------------- + +class TimerEventTestCase : public CppUnit::TestCase +{ +public: + TimerEventTestCase() {} + +private: + CPPUNIT_TEST_SUITE( TimerEventTestCase ); + CPPUNIT_TEST( OneShot ); + CPPUNIT_TEST( Multiple ); + CPPUNIT_TEST_SUITE_END(); + + void OneShot(); + void Multiple(); + + DECLARE_NO_COPY_CLASS(TimerEventTestCase) +}; + +// register in the unnamed registry so that these tests are run by default +CPPUNIT_TEST_SUITE_REGISTRATION( TimerEventTestCase ); + +// also include in it's own registry so that these tests can be run alone +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TimerEventTestCase, "TimerEventTestCase" ); + +void TimerEventTestCase::OneShot() +{ + class ExitOnTimerHandler : public TimerCounterHandler + { + public: + ExitOnTimerHandler(wxEventLoopBase& loop) + : TimerCounterHandler(), + m_loop(loop) + { + } + + private: + virtual void Tick() { m_loop.Exit(); } + + wxEventLoopBase& m_loop; + + // don't use DECLARE_NO_COPY_CLASS() to avoid upsetting MSVC + }; + + wxEventLoop loop; + + ExitOnTimerHandler handler(loop); + wxTimer timer(&handler); + timer.Start(200, true); + + loop.Run(); + + CPPUNIT_ASSERT_EQUAL( 1, handler.GetNumEvents() ); +} + +void TimerEventTestCase::Multiple() +{ + wxEventLoop loop; + + TimerCounterHandler handler; + wxTimer timer(&handler); + timer.Start(100); + + // run the loop for 2 seconds + time_t t; + time(&t); + const time_t tEnd = t + 2; + while ( time(&t) < tEnd ) + { + loop.Dispatch(); + } + + // we can't count on getting exactly 20 ticks but we shouldn't get more + // than this + const int numTicks = handler.GetNumEvents(); + CPPUNIT_ASSERT( numTicks <= 20 ); + + // and we should get a decent number of them (unless the system is horribly + // loaded so if it does happen that this test fails we may need to remove + // it) + CPPUNIT_ASSERT( numTicks > 10 ); +} diff --git a/tests/test.bkl b/tests/test.bkl index 9d639115fa..ecde829c6a 100644 --- a/tests/test.bkl +++ b/tests/test.bkl @@ -37,6 +37,7 @@ cmdline/cmdlinetest.cpp config/fileconf.cpp datetime/datetimetest.cpp + events/timertest.cpp filekind/filekind.cpp filename/filenametest.cpp filesys/filesystest.cpp diff --git a/tests/test_test.dsp b/tests/test_test.dsp index be63a023b1..b5c8f58123 100644 --- a/tests/test_test.dsp +++ b/tests/test_test.dsp @@ -417,6 +417,10 @@ SOURCE=.\streams\textstreamtest.cpp # End Source File # Begin Source File +SOURCE=.\events\timertest.cpp +# End Source File +# Begin Source File + SOURCE=.\thread\tls.cpp # End Source File # Begin Source File diff --git a/tests/test_vc7_test.vcproj b/tests/test_vc7_test.vcproj index d561d6c0a7..6dafda7a87 100644 --- a/tests/test_vc7_test.vcproj +++ b/tests/test_vc7_test.vcproj @@ -732,6 +732,9 @@ + + diff --git a/tests/test_vc8_test.vcproj b/tests/test_vc8_test.vcproj index 677cd015ae..70770ff1ae 100644 --- a/tests/test_vc8_test.vcproj +++ b/tests/test_vc8_test.vcproj @@ -1055,6 +1055,10 @@ RelativePath=".\streams\textstreamtest.cpp" > + + diff --git a/tests/test_vc9_test.vcproj b/tests/test_vc9_test.vcproj index 768814209f..387a08c444 100644 --- a/tests/test_vc9_test.vcproj +++ b/tests/test_vc9_test.vcproj @@ -1027,6 +1027,10 @@ RelativePath=".\streams\textstreamtest.cpp" > + +