Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / date_time / test / posix_time / testmicrosec_time_clock.cpp
1 /* Copyright (c) 2002,2003 CrystalClear Software, Inc.
2  * Use, modification and distribution is subject to the
3  * Boost Software License, Version 1.0. (See accompanying
4  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
5
6  */
7
8 #include "boost/date_time/posix_time/posix_time.hpp"
9 #include "boost/date_time/microsec_time_clock.hpp"
10 #include "../testfrmwk.hpp"
11 #if defined(BOOST_HAS_FTIME)
12 #include <windows.h>
13 #endif
14
15 void
16 sync_to_next_second()
17 {
18   using namespace boost::posix_time;
19
20   ptime t_prev;
21   ptime t_now = second_clock::local_time();
22
23   // Wait the next seconds
24   do
25   {
26     t_prev = t_now;
27     t_now = second_clock::local_time();
28   } while (t_now.time_of_day().seconds() == t_prev.time_of_day().seconds());
29
30   // Wait 300ms in order to avoid seconds of second_clock > microsec_clock.
31   t_now = microsec_clock::local_time();
32   t_prev = t_now;
33   do
34   {
35     t_now = microsec_clock::local_time();
36   } while (t_now - t_prev < milliseconds(300));
37
38 }
39
40
41 int
42 main()
43 {
44 #ifdef BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
45
46   using namespace boost::posix_time;
47
48   std::cout << "Check local time of microsec_clock against second_clock" << std::endl;
49
50   ptime last = microsec_clock::local_time();
51   int max = 30;
52   for (int i=0; i<max; i++)
53   {
54     // Some systems loop too fast so "last is less" tests fail due to
55     // 'last' & 't2' being equal. These calls slow it down enough to
56     // make 'last' & 't2' different. Moreover, we must wait the next
57     // second to avoid a change in hour, minute or second field
58     // between acquisition of t1 and t2.
59     sync_to_next_second();
60
61     ptime t1 = second_clock::local_time();
62     std::cout << to_simple_string(t1) << std::endl;
63
64     ptime t2 = microsec_clock::local_time();
65     std::cout << to_simple_string(t2) << std::endl;
66
67     check("check equality of hours "
68           "between second_clock and microsec_clock timestamps",
69           t1.time_of_day().hours() == t2.time_of_day().hours());
70
71     check("check equality of minutes "
72           "between second_clock and microsec_clock timestamps",
73           t1.time_of_day().minutes() == t2.time_of_day().minutes());
74
75     check("check equality of seconds "
76           "between second_clock and microsec_clock timestamps",
77           t1.time_of_day().seconds() == t2.time_of_day().seconds());
78
79     check("check equality of date"
80           "between second_clock and microsec_clock timestamps",
81           t1.date() == t2.date());
82
83     if( !check("check that previous microsec_clock timestamp "
84                "is less than the current", last < t2) ) {
85       std::cout << to_simple_string(last) << " < "
86                 << to_simple_string(t2) << std::endl;
87     }
88
89     last = t2;
90   }
91
92
93   std::cout << "Check universal time of microsec_clock against second_clock" << std::endl;
94   max = 10;
95   last = microsec_clock::universal_time();
96   for (int i=0; i<max; i++)
97   {
98     // Some systems loop too fast so "last is less" tests fail due to
99     // 'last' & 't2' being equal. These calls slow it down enough to
100     // make 'last' & 't2' different. Moreover, we must wait the next
101     // second to avoid a change in hour, minute or second field
102     // between acquisition of t1 and t2.
103     sync_to_next_second();
104
105     ptime t1 = second_clock::universal_time();
106     std::cout << to_simple_string(t1) << std::endl;
107
108     ptime t2 = microsec_clock::universal_time();
109     std::cout << to_simple_string(t2) << std::endl;
110
111     check("check equality of hours "
112           "between second_clock and microsec_clock timestamps",
113           t1.time_of_day().hours() == t2.time_of_day().hours());
114
115     check("check equality of minutes "
116           "between second_clock and microsec_clock timestamps",
117           t1.time_of_day().minutes() == t2.time_of_day().minutes());
118
119     check("check equality of seconds "
120           "between second_clock and microsec_clock timestamps",
121           t1.time_of_day().seconds() == t2.time_of_day().seconds());
122
123     check("check equality of date"
124           "between second_clock and microsec_clock timestamps",
125           t1.date() == t2.date());
126
127     if( !check("check that previous microsec_clock timestamp "
128                "is less than the current", last < t2) ) {
129       std::cout << to_simple_string(last) << " < "
130                 << to_simple_string(t2) << std::endl;
131     }
132
133     last = t2;
134   }
135
136 #else
137   check("Get time of day micro second clock not supported due to inadequate compiler/platform", false);
138 #endif
139   return printTestStats();
140
141 }