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/stopwatch.hpp>
10 #include "../cycle_count.hpp"
11 #include <boost/detail/lightweight_test.hpp>
13 #if !defined(BOOST_NO_CXX11_STATIC_ASSERT)
18 template <typename Stopwatch
>
19 void check_invariants()
21 BOOST_CHRONO_STATIC_ASSERT((boost::is_same
<typename
Stopwatch::rep
, typename
Stopwatch::clock::duration::rep
>::value
), NOTHING
, ());
22 BOOST_CHRONO_STATIC_ASSERT((boost::is_same
<typename
Stopwatch::period
, typename
Stopwatch::clock::duration::period
>::value
), NOTHING
, ());
23 BOOST_CHRONO_STATIC_ASSERT((boost::is_same
<typename
Stopwatch::duration
, typename
Stopwatch::clock::time_point::duration
>::value
), NOTHING
, ());
24 BOOST_CHRONO_STATIC_ASSERT(Stopwatch::is_steady
== Stopwatch::clock::is_steady
, NOTHING
, ());
27 template <typename Stopwatch
>
28 void check_default_constructor()
31 BOOST_TEST(sw
.is_running());
34 template <typename Stopwatch
>
35 void check_dont_start_constructor()
37 Stopwatch
sw(boost::chrono::dont_start
);
38 BOOST_TEST(!sw
.is_running());
39 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
40 typename
Stopwatch::duration d
=sw
.elapsed();
41 BOOST_TEST(d
== Stopwatch::duration::zero());
44 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
45 template <typename Stopwatch
>
46 void check_constructor_ec()
48 boost::system::error_code ec
;
50 BOOST_TEST(sw
.is_running());
51 BOOST_TEST(ec
.value()==0);
54 template <typename Stopwatch
>
55 void check_constructor_throws()
57 Stopwatch
sw(boost::throws());
58 BOOST_TEST(sw
.is_running());
62 template <typename Stopwatch
>
66 BOOST_TEST(sw
.is_running());
67 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
68 typename
Stopwatch::duration d
=sw
.elapsed();
69 BOOST_TEST(sw
.is_running());
70 BOOST_TEST(d
>= boost::chrono::milliseconds(100));
73 template <typename Stopwatch
>
74 void check_start_start()
77 BOOST_TEST(sw
.is_running());
78 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
80 BOOST_TEST(sw
.is_running());
81 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
82 typename
Stopwatch::duration d
=sw
.elapsed();
83 BOOST_TEST(sw
.is_running());
84 BOOST_TEST(d
>= boost::chrono::milliseconds(100));
85 BOOST_TEST(d
< boost::chrono::milliseconds(200));
88 template <typename Stopwatch
>
89 void check_dont_start_start()
91 Stopwatch
sw(boost::chrono::dont_start
);
92 BOOST_TEST(!sw
.is_running());
93 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
95 BOOST_TEST(sw
.is_running());
96 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
97 typename
Stopwatch::duration d
=sw
.elapsed();
98 BOOST_TEST(sw
.is_running());
99 BOOST_TEST(d
>= boost::chrono::milliseconds(100));
100 BOOST_TEST(d
< boost::chrono::milliseconds(200));
103 template <typename Stopwatch
>
104 void check_dont_start_start_stop()
106 Stopwatch
sw(boost::chrono::dont_start
);
107 BOOST_TEST(!sw
.is_running());
109 BOOST_TEST(sw
.is_running());
110 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
112 BOOST_TEST(!sw
.is_running());
113 typename
Stopwatch::duration d
=sw
.elapsed();
114 BOOST_TEST(!sw
.is_running());
115 BOOST_TEST(d
>= boost::chrono::milliseconds(0));
118 template <typename Stopwatch
>
119 void check_dont_start_scoped_run()
121 Stopwatch
sw(boost::chrono::dont_start
);
122 BOOST_TEST(!sw
.is_running());
124 typename
Stopwatch::scoped_run
_(sw
);
125 BOOST_TEST(sw
.is_running());
126 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
128 BOOST_TEST(!sw
.is_running());
129 typename
Stopwatch::duration d
=sw
.elapsed();
130 BOOST_TEST(!sw
.is_running());
131 BOOST_TEST(d
>= boost::chrono::milliseconds(0));
134 template <typename Stopwatch
>
138 BOOST_TEST(sw
.is_running());
139 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
141 BOOST_TEST(!sw
.is_running());
142 typename
Stopwatch::duration d
=sw
.elapsed();
143 BOOST_TEST(!sw
.is_running());
144 BOOST_TEST(d
== boost::chrono::milliseconds(0));
147 template <typename Stopwatch
>
148 void check_stop_stop()
151 BOOST_TEST(sw
.is_running());
152 ex::sleep_for
<typename
Stopwatch::clock
>(boost::chrono::milliseconds(100));
154 BOOST_TEST(!sw
.is_running());
155 typename
Stopwatch::duration d
=sw
.elapsed();
156 BOOST_TEST(!sw
.is_running());
157 BOOST_TEST(d
== boost::chrono::milliseconds(0));
159 BOOST_TEST(!sw
.is_running());
161 BOOST_TEST(!sw
.is_running());
162 BOOST_TEST(d
== boost::chrono::milliseconds(0));
166 template <typename Stopwatch
>
169 check_invariants
<Stopwatch
>();
170 check_default_constructor
<Stopwatch
>();
171 #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
172 check_constructor_ec
<Stopwatch
>();
173 check_constructor_throws
<Stopwatch
>();
175 check_elapsed
<Stopwatch
>();
177 check_start_start
<Stopwatch
>();
178 check_dont_start_constructor
<Stopwatch
>();
179 check_dont_start_start
<Stopwatch
>();
180 check_dont_start_start_stop
<Stopwatch
>();
181 check_dont_start_scoped_run
<Stopwatch
>();
182 check_stop
<Stopwatch
>();
183 check_stop_stop
<Stopwatch
>();
190 std::cout
<< "cycle_count=";
191 check_all
<boost::chrono::stopwatch
< ex::cycle_count
<1500> > >();
193 return boost::report_errors();