1 // Copyright 2010-2011 Vicente J. Botet Escriba
2 // Distributed under the Boost Software License, Version 1.0.
3 // See http://www.boost.org/LICENSE_1_0.txt
5 #define BOOST_CHRONO_VERSION 2
8 #include <boost/type_traits/is_same.hpp>
9 #include <boost/chrono/stopwatches/reporters/stopclock.hpp>
10 #include "../cycle_count.hpp"
11 #include <boost/chrono/stopwatches/reporters/system_default_formatter.hpp>
13 #include <boost/chrono/chrono_io.hpp>
14 #include <boost/system/system_error.hpp>
15 #include <boost/detail/lightweight_test.hpp>
17 #if !defined(BOOST_NO_CXX11_STATIC_ASSERT)
21 using namespace boost::chrono
;
24 template <typename Stopwatch
>
25 void check_invariants()
27 BOOST_CHRONO_STATIC_ASSERT((boost::is_same
<typename
Stopwatch::rep
, typename
Stopwatch::clock::duration::rep
>::value
), NOTHING
, ());
28 BOOST_CHRONO_STATIC_ASSERT((boost::is_same
<typename
Stopwatch::period
, typename
Stopwatch::clock::duration::period
>::value
), NOTHING
, ());
29 BOOST_CHRONO_STATIC_ASSERT((boost::is_same
<typename
Stopwatch::duration
, typename
Stopwatch::clock::time_point::duration
>::value
), NOTHING
, ());
30 BOOST_CHRONO_STATIC_ASSERT(Stopwatch::is_steady
== Stopwatch::clock::is_steady
, NOTHING
, ());
33 template <typename Stopwatch
>
34 void check_default_constructor()
37 BOOST_TEST(sw
.is_running());
40 template <typename Stopwatch
>
41 void check_dont_start_constructor()
43 Stopwatch
sw(boost::chrono::dont_start
);
44 BOOST_TEST(!sw
.is_running());
45 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
46 typename
Stopwatch::duration d
=sw
.elapsed();
47 BOOST_TEST(d
== Stopwatch::duration::zero());
50 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
51 template <typename Stopwatch
>
52 void check_constructor_ec()
54 boost::system::error_code ec
;
56 BOOST_TEST(sw
.is_running());
57 BOOST_TEST(ec
.value()==0);
60 template <typename Stopwatch
>
61 void check_constructor_throws()
63 Stopwatch
sw(boost::throws());
64 BOOST_TEST(sw
.is_running());
68 template <typename Stopwatch
>
72 BOOST_TEST(sw
.is_running());
73 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
74 typename
Stopwatch::duration d
=sw
.elapsed();
75 BOOST_TEST(sw
.is_running());
76 BOOST_TEST(d
>= boost::chrono::milliseconds(100));
79 template <typename Stopwatch
>
80 void check_start_start()
83 BOOST_TEST(sw
.is_running());
84 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
86 BOOST_TEST(sw
.is_running());
87 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
88 typename
Stopwatch::duration d
=sw
.elapsed();
89 BOOST_TEST(sw
.is_running());
90 BOOST_TEST(d
>= boost::chrono::milliseconds(100));
91 BOOST_TEST(d
< boost::chrono::milliseconds(200));
94 template <typename Stopwatch
>
95 void check_dont_start_start()
97 Stopwatch
sw(boost::chrono::dont_start
);
98 BOOST_TEST(!sw
.is_running());
99 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
101 BOOST_TEST(sw
.is_running());
102 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
103 typename
Stopwatch::duration d
=sw
.elapsed();
104 BOOST_TEST(sw
.is_running());
105 BOOST_TEST(d
>= boost::chrono::milliseconds(100));
106 BOOST_TEST(d
< boost::chrono::milliseconds(200));
109 template <typename Stopwatch
>
110 void check_dont_start_start_stop()
112 Stopwatch
sw(boost::chrono::dont_start
);
113 BOOST_TEST(!sw
.is_running());
115 BOOST_TEST(sw
.is_running());
116 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
118 BOOST_TEST(!sw
.is_running());
119 typename
Stopwatch::duration d
=sw
.elapsed();
120 BOOST_TEST(!sw
.is_running());
121 BOOST_TEST(d
>= boost::chrono::milliseconds(0));
124 template <typename Stopwatch
>
125 void check_dont_start_scoped_run()
127 Stopwatch
sw(boost::chrono::dont_start
);
128 BOOST_TEST(!sw
.is_running());
130 typename
Stopwatch::scoped_run
_(sw
);
131 BOOST_TEST(sw
.is_running());
132 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
134 BOOST_TEST(!sw
.is_running());
135 typename
Stopwatch::duration d
=sw
.elapsed();
136 BOOST_TEST(!sw
.is_running());
137 BOOST_TEST(d
>= boost::chrono::milliseconds(0));
140 template <typename Stopwatch
>
144 BOOST_TEST(sw
.is_running());
145 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
147 BOOST_TEST(!sw
.is_running());
148 typename
Stopwatch::duration d
=sw
.elapsed();
149 BOOST_TEST(!sw
.is_running());
150 BOOST_TEST(d
== boost::chrono::milliseconds(0));
153 template <typename Stopwatch
>
154 void check_stop_stop()
157 BOOST_TEST(sw
.is_running());
158 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
160 BOOST_TEST(!sw
.is_running());
161 typename
Stopwatch::duration d
=sw
.elapsed();
162 BOOST_TEST(!sw
.is_running());
163 BOOST_TEST(d
== boost::chrono::milliseconds(0));
165 BOOST_TEST(!sw
.is_running());
167 BOOST_TEST(!sw
.is_running());
168 BOOST_TEST(d
== boost::chrono::milliseconds(0));
174 file_line(const char* file
, std::size_t line
)
175 : fmt("%1%[%2%] Elapsed time:")
187 template <typename Reporter
>
188 void check_file_line2()
191 file_line
fl(__FILE__
, __LINE__
);
192 ex::sleep_for
<typename
Reporter::clock
>(milliseconds(100));
195 template <typename Reporter
>
196 void check_file_line()
198 Reporter
rp("%1%[%2%] Elapsed time: %3%\n");
199 rp
.format() % __FILE__
% __LINE__
;
201 ex::sleep_for
<typename
Reporter::clock
>(milliseconds(100));
205 template <typename Reporter
>
209 ex::sleep_for
<typename
Reporter::clock
>(milliseconds(100));
216 template <typename Clock
>
219 typedef stopclock
<Clock
> Reporter
;
220 typedef stopclock
<Clock
, no_memory
<typename
Clock::duration
>, elapsed_formatter
> ReporterE
;
222 check_invariants
<Reporter
>();
223 check_default_constructor
<Reporter
>();
224 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
225 check_constructor_ec
<Reporter
>();
226 check_constructor_throws
<Reporter
>();
228 check_elapsed
<Reporter
>();
230 check_report
<Reporter
>();
231 check_file_line
<ReporterE
>();
233 check_start_start
<Reporter
>();
234 check_dont_start_constructor
<Reporter
>();
235 check_dont_start_start
<Reporter
>();
236 check_dont_start_start_stop
<Reporter
>();
237 check_dont_start_scoped_run
<Reporter
>();
238 check_stop
<Reporter
>();
239 check_stop_stop
<Reporter
>();
246 typedef stopclock
<high_resolution_clock
> Reporter
;
248 static Reporter::formatter_type fmtr
;
253 check_all
<ex::cycle_count
<1500> >();
255 return boost::report_errors();