]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 | |
4 | ||
5 | #define BOOST_CHRONO_VERSION 2 | |
6 | ||
7 | #include <iostream> | |
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> | |
12 | ||
13 | #if !defined(BOOST_NO_CXX11_STATIC_ASSERT) | |
14 | #define NOTHING "" | |
15 | #endif | |
16 | ||
17 | ||
18 | template <typename Stopwatch> | |
19 | void check_invariants() | |
20 | { | |
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, ()); | |
25 | } | |
26 | ||
27 | template <typename Stopwatch> | |
28 | void check_default_constructor() | |
29 | { | |
30 | Stopwatch sw; | |
31 | BOOST_TEST(sw.is_running()); | |
32 | } | |
33 | ||
34 | template <typename Stopwatch> | |
35 | void check_dont_start_constructor() | |
36 | { | |
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()); | |
42 | } | |
43 | ||
44 | #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING | |
45 | template <typename Stopwatch> | |
46 | void check_constructor_ec() | |
47 | { | |
48 | boost::system::error_code ec; | |
49 | Stopwatch sw(ec); | |
50 | BOOST_TEST(sw.is_running()); | |
51 | BOOST_TEST(ec.value()==0); | |
52 | } | |
53 | ||
54 | template <typename Stopwatch> | |
55 | void check_constructor_throws() | |
56 | { | |
57 | Stopwatch sw(boost::throws()); | |
58 | BOOST_TEST(sw.is_running()); | |
59 | } | |
60 | #endif | |
61 | ||
62 | template <typename Stopwatch> | |
63 | void check_elapsed() | |
64 | { | |
65 | Stopwatch sw; | |
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)); | |
71 | } | |
72 | ||
73 | template <typename Stopwatch> | |
74 | void check_start_start() | |
75 | { | |
76 | Stopwatch sw; | |
77 | BOOST_TEST(sw.is_running()); | |
78 | ex::sleep_for<typename Stopwatch::clock>(boost::chrono::milliseconds(100)); | |
79 | sw.start(); | |
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)); | |
86 | } | |
87 | ||
88 | template <typename Stopwatch> | |
89 | void check_dont_start_start() | |
90 | { | |
91 | Stopwatch sw(boost::chrono::dont_start); | |
92 | BOOST_TEST(!sw.is_running()); | |
93 | ex::sleep_for<typename Stopwatch::clock>(boost::chrono::milliseconds(100)); | |
94 | sw.start(); | |
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)); | |
101 | } | |
102 | ||
103 | template <typename Stopwatch> | |
104 | void check_dont_start_start_stop() | |
105 | { | |
106 | Stopwatch sw(boost::chrono::dont_start); | |
107 | BOOST_TEST(!sw.is_running()); | |
108 | sw.start(); | |
109 | BOOST_TEST(sw.is_running()); | |
110 | ex::sleep_for<typename Stopwatch::clock>(boost::chrono::milliseconds(100)); | |
111 | sw.stop(); | |
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)); | |
116 | } | |
117 | ||
118 | template <typename Stopwatch> | |
119 | void check_dont_start_scoped_run() | |
120 | { | |
121 | Stopwatch sw(boost::chrono::dont_start); | |
122 | BOOST_TEST(!sw.is_running()); | |
123 | { | |
124 | typename Stopwatch::scoped_run _(sw); | |
125 | BOOST_TEST(sw.is_running()); | |
126 | ex::sleep_for<typename Stopwatch::clock>(boost::chrono::milliseconds(100)); | |
127 | } | |
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)); | |
132 | } | |
133 | ||
134 | template <typename Stopwatch> | |
135 | void check_stop() | |
136 | { | |
137 | Stopwatch sw; | |
138 | BOOST_TEST(sw.is_running()); | |
139 | ex::sleep_for<typename Stopwatch::clock>(boost::chrono::milliseconds(100)); | |
140 | sw.stop(); | |
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)); | |
145 | } | |
146 | ||
147 | template <typename Stopwatch> | |
148 | void check_stop_stop() | |
149 | { | |
150 | Stopwatch sw; | |
151 | BOOST_TEST(sw.is_running()); | |
152 | ex::sleep_for<typename Stopwatch::clock>(boost::chrono::milliseconds(100)); | |
153 | sw.stop(); | |
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)); | |
158 | sw.stop(); | |
159 | BOOST_TEST(!sw.is_running()); | |
160 | d=sw.elapsed(); | |
161 | BOOST_TEST(!sw.is_running()); | |
162 | BOOST_TEST(d == boost::chrono::milliseconds(0)); | |
163 | } | |
164 | ||
165 | ||
166 | template <typename Stopwatch> | |
167 | void check_all() | |
168 | { | |
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>(); | |
174 | #endif | |
175 | check_elapsed<Stopwatch>(); | |
176 | ||
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>(); | |
184 | ||
185 | } | |
186 | ||
187 | ||
188 | int main() | |
189 | { | |
190 | std::cout << "cycle_count="; | |
191 | check_all<boost::chrono::stopwatch< ex::cycle_count<1500> > >(); | |
192 | ||
193 | return boost::report_errors(); | |
194 | } |