Added wxStopWatch::TimeInMicro() for better precision time measurement.
[wxWidgets.git] / tests / events / stopwatch.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: tests/events/stopwatch.cpp
3 // Purpose: Test wxStopWatch class
4 // Author: Francesco Montorsi (extracted from console sample)
5 // Created: 2010-05-16
6 // RCS-ID: $Id$
7 // Copyright: (c) 2010 wxWidgets team
8 ///////////////////////////////////////////////////////////////////////////////
9
10
11 // ----------------------------------------------------------------------------
12 // headers
13 // ----------------------------------------------------------------------------
14
15 #include "testprec.h"
16
17 #ifdef __BORLANDC__
18 #pragma hdrstop
19 #endif
20
21 #ifndef WX_PRECOMP
22 #endif // WX_PRECOMP
23
24 #include <time.h>
25
26 #include "wx/stopwatch.h"
27 #include "wx/utils.h"
28
29 // --------------------------------------------------------------------------
30 // test class
31 // --------------------------------------------------------------------------
32
33 class StopWatchTestCase : public CppUnit::TestCase
34 {
35 public:
36 StopWatchTestCase() {}
37
38 private:
39 CPPUNIT_TEST_SUITE( StopWatchTestCase );
40 CPPUNIT_TEST( Misc );
41 CPPUNIT_TEST( BackwardsClockBug );
42 CPPUNIT_TEST_SUITE_END();
43
44 void Misc();
45 void BackwardsClockBug();
46
47 DECLARE_NO_COPY_CLASS(StopWatchTestCase)
48 };
49
50 // register in the unnamed registry so that these tests are run by default
51 CPPUNIT_TEST_SUITE_REGISTRATION( StopWatchTestCase );
52
53 // also include in its own registry so that these tests can be run alone
54 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( StopWatchTestCase, "StopWatchTestCase" );
55
56 void StopWatchTestCase::Misc()
57 {
58 static const long tolerance = 10; // in ms
59
60 wxStopWatch sw;
61 long t;
62 wxLongLong usec;
63
64 sw.Pause(); // pause it immediately
65
66 // verify that almost no time elapsed
67 usec = sw.TimeInMicro();
68 WX_ASSERT_MESSAGE
69 (
70 ("Elapsed time was %" wxLongLongFmtSpec "dus", usec),
71 usec < tolerance*1000
72 );
73
74 wxSleep(1);
75 t = sw.Time();
76
77 // check that the stop watch doesn't advance while paused
78 WX_ASSERT_MESSAGE
79 (
80 ("Actual time value is %ld", t),
81 t >= 0 && t < tolerance
82 );
83
84 static const int sleepTime = 500;
85 sw.Resume();
86 wxMilliSleep(sleepTime);
87 t = sw.Time();
88 // check that it did advance now by ~1.5s
89 WX_ASSERT_MESSAGE
90 (
91 ("Actual time value is %ld", t),
92 t > sleepTime - tolerance && t < sleepTime + tolerance
93 );
94
95 sw.Pause();
96
97 // check that this sleep won't be taken into account below
98 wxMilliSleep(sleepTime);
99 sw.Resume();
100
101 wxMilliSleep(sleepTime);
102 t = sw.Time();
103
104 // and it should advance again
105 WX_ASSERT_MESSAGE
106 (
107 ("Actual time value is %ld", t),
108 t > 2*sleepTime - tolerance && t < 2*sleepTime + tolerance
109 );
110 }
111
112 void StopWatchTestCase::BackwardsClockBug()
113 {
114 wxStopWatch sw;
115 wxStopWatch sw2;
116
117 for ( size_t n = 0; n < 10; n++ )
118 {
119 sw2.Start();
120
121 for ( size_t m = 0; m < 10000; m++ )
122 {
123 CPPUNIT_ASSERT ( sw.Time() >= 0 && sw2.Time() >= 0 );
124 }
125 }
126 }