rvm  1.11
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
test-timer.cc
Go to the documentation of this file.
1 #include "config.h"
2 
3 #include <iostream>
4 #include <cassert>
5 
6 #ifdef HAVE_UNISTD_H
7 #include <unistd.h>
8 #endif
9 
10 #include "asserts.h"
11 #include "error.h"
12 #include "timer.h"
13 
14 // #define ERR_OUT(s) std::cerr << s
15 #define ERR_OUT(s)
16 
17 template<class T>
18 T absolute(const T& num)
19 {
20  if (num < 0) {
21  return(-num);
22  }
23  return(num);
24 }
25 
26 void test1(void)
27 {
28  bool done = false;
29  int retry = 0;
30 
31  while (!done && (retry++ < 3)) {
32  timer t;
33 
34  t.start();
35  sleep(5);
36  t.stop();
37 
38  if (t.duration() != "00:05.0") {
39  std::cout << "Once in a blue moon this test fails -- I don't know why."
40  << std::endl;
41  std::cout << "t.duration() = " << t.duration() << std::endl;
42  std::cout << "t.duration() should be 00:05.0" << std::endl;
43  }
44  if (t.duration() == "00:05.0") {
45  done = true;
46  }
47  }
48  assert(done);
49 }
50 
51 void test2(void)
52 {
53  timer t;
54  timer::duration_type d1, d2, d;
55  int retry = 0;
56 
57  d1 = 0.0;
58  while ((d1 != 5.0) && (retry++ < 10)) {
59  t.start();
60  sleep(5);
61  t.stop();
62 
63  d1 = t.duration_secs();
64  }
65 
66  if (d1 != 5.0) {
67  std::cout << "Once in a blue moon this test fails -- I don't know why."
68  << std::endl;
69  std::cout << "d1 = " << d1 << std::endl;
70  std::cout << "d1 should be 5.0" << std::endl;
71  }
72  d = absolute(d1-5.0);
73  assert(d < 1.0);
74 
75  d1 = t.duration_mins();
76  d2 = t.duration_secs()/60;
77  d = absolute(d1-d2);
78  assert(d < 1.0);
79 
80  d1 = t.duration_hours();
81  d2 = t.duration_secs()/60/60;
82  d = absolute(d1-d2);
83  assert(d < 1.0);
84 
85  d1 = t.duration_days();
86  d2 = t.duration_secs()/60/60/24;
87  d = absolute(d1-d2);
88  assert(d < 1.0);
89 
90  d1 = t.duration_years();
91  d2 = t.duration_secs()/60/60/24/365;
92  d = absolute(d1-d2);
93  assert(d < 1.0);
94 }
95 
96 void test3(void)
97 {
98  timer::value_type base_value = 1067356170;
99  timer::value_type start_value;
100  timer::value_type stop_value;
101  timer t(base_value, base_value+5);
102 
103  t.use_localtime(false);
104  /*
105  std::cout << "t.start_value() = " << t.start_value() << std::endl;
106  std::cout << " t.stop_value() = " << t.stop_value() << std::endl;
107  std::cout << " t.started_at() = " << t.started_at() << std::endl;
108  std::cout << " t.stopped_at() = " << t.stopped_at() << std::endl;
109  std::cout << " t.duration() = " << t.duration() << std::endl;
110  */
111  assert(t.start_value() == base_value);
112  assert(t.stop_value() == base_value+5);
113  assert(t.started_at() == "2003 Oct 28 15:49:30");
114  assert(t.stopped_at() == "2003 Oct 28 15:49:35");
115  assert(t.duration() == "00:05.0");
116 
117  t.assign(base_value, base_value+(5*60));
118  t.use_localtime(false);
119  /*
120  std::cout << "t.start_value() = " << t.start_value() << std::endl;
121  std::cout << " t.stop_value() = " << t.stop_value() << std::endl;
122  std::cout << " t.started_at() = " << t.started_at() << std::endl;
123  std::cout << " t.stopped_at() = " << t.stopped_at() << std::endl;
124  std::cout << " t.duration() = " << t.duration() << std::endl;
125  */
126  assert(t.start_value() == base_value);
127  assert(t.stop_value() == base_value+(5*60));
128  assert(t.started_at() == "2003 Oct 28 15:49:30");
129  assert(t.stopped_at() == "2003 Oct 28 15:54:30");
130  assert(t.duration() == "05:00.0");
131 
132  t.assign(base_value, base_value+(5*60*60));
133  t.use_localtime(false);
134  /*
135  std::cout << "t.start_value() = " << t.start_value() << std::endl;
136  std::cout << " t.stop_value() = " << t.stop_value() << std::endl;
137  std::cout << " t.started_at() = " << t.started_at() << std::endl;
138  std::cout << " t.stopped_at() = " << t.stopped_at() << std::endl;
139  std::cout << " t.duration() = " << t.duration() << std::endl;
140  */
141  assert(t.start_value() == base_value);
142  assert(t.stop_value() == base_value+(5*60*60));
143  assert(t.started_at() == "2003 Oct 28 15:49:30");
144  assert(t.stopped_at() == "2003 Oct 28 20:49:30");
145  assert(t.duration() == "05:00:00.0");
146 
147  t.assign(base_value, base_value+(3*60*60*24));
148  t.use_localtime(false);
149  /*
150  std::cout << "t.start_value() = " << t.start_value() << std::endl;
151  std::cout << " t.stop_value() = " << t.stop_value() << std::endl;
152  std::cout << " t.started_at() = " << t.started_at() << std::endl;
153  std::cout << " t.stopped_at() = " << t.stopped_at() << std::endl;
154  std::cout << " t.duration() = " << t.duration() << std::endl;
155  */
156  assert(t.start_value() == base_value);
157  assert(t.stop_value() == base_value+(3*60*60*24));
158  assert(t.started_at() == "2003 Oct 28 15:49:30");
159  assert(t.stopped_at() == "2003 Oct 31 15:49:30");
160  assert(t.duration() == "3d 00:00:00.0");
161 
162  t.assign(base_value, base_value+(5*60*60*24));
163  t.use_localtime(false);
164  /*
165  std::cout << "t.start_value() = " << t.start_value() << std::endl;
166  std::cout << " t.stop_value() = " << t.stop_value() << std::endl;
167  std::cout << " t.started_at() = " << t.started_at() << std::endl;
168  std::cout << " t.stopped_at() = " << t.stopped_at() << std::endl;
169  std::cout << " t.duration() = " << t.duration() << std::endl;
170  */
171  assert(t.start_value() == base_value);
172  assert(t.stop_value() == base_value+(5*60*60*24));
173  assert(t.started_at() == "2003 Oct 28 15:49:30");
174  assert(t.stopped_at() == "2003 Nov 2 15:49:30");
175  assert(t.duration() == "5d 00:00:00.0");
176 
177  t.assign(base_value, base_value+(64*60*60*24));
178  t.use_localtime(false);
179  /*
180  std::cout << "t.start_value() = " << t.start_value() << std::endl;
181  std::cout << " t.stop_value() = " << t.stop_value() << std::endl;
182  std::cout << " t.started_at() = " << t.started_at() << std::endl;
183  std::cout << " t.stopped_at() = " << t.stopped_at() << std::endl;
184  std::cout << " t.duration() = " << t.duration() << std::endl;
185  */
186  assert(t.start_value() == base_value);
187  assert(t.stop_value() == base_value+(64*60*60*24));
188  assert(t.started_at() == "2003 Oct 28 15:49:30");
189  assert(t.stopped_at() == "2003 Dec 31 15:49:30");
190  assert(t.duration() == "64d 00:00:00.0");
191 
192  t.assign(base_value, base_value+(65*60*60*24));
193  t.use_localtime(false);
194  /*
195  std::cout << "t.start_value() = " << t.start_value() << std::endl;
196  std::cout << " t.stop_value() = " << t.stop_value() << std::endl;
197  std::cout << " t.started_at() = " << t.started_at() << std::endl;
198  std::cout << " t.stopped_at() = " << t.stopped_at() << std::endl;
199  std::cout << " t.duration() = " << t.duration() << std::endl;
200  */
201  assert(t.start_value() == base_value);
202  assert(t.stop_value() == base_value+(65*60*60*24));
203  assert(t.started_at() == "2003 Oct 28 15:49:30");
204  assert(t.stopped_at() == "2004 Jan 1 15:49:30");
205  assert(t.duration() == "65d 00:00:00.0");
206 
207  start_value = base_value;
208  stop_value = base_value +5;
209  t.assign(start_value, stop_value);
210  t.use_localtime(false);
211  /*
212  std::cout << "t.start_value() = " << t.start_value() << std::endl;
213  std::cout << " t.stop_value() = " << t.stop_value() << std::endl;
214  std::cout << " t.started_at() = " << t.started_at() << std::endl;
215  std::cout << " t.stopped_at() = " << t.stopped_at() << std::endl;
216  std::cout << " t.duration() = " << t.duration() << std::endl;
217  std::cout << " t.eta(0) = " << t.eta(0) << std::endl;
218  std::cout << " t.eta(1) = " << t.eta(1) << std::endl;
219  std::cout << " t.eta(10) = " << t.eta(10) << std::endl;
220  std::cout << " t.eta(50) = " << t.eta(50) << std::endl;
221  std::cout << " t.eta(75) = " << t.eta(75) << std::endl;
222  std::cout << " t.eta(93) = " << t.eta(93) << std::endl;
223  std::cout << " t.eta(99) = " << t.eta(99) << std::endl;
224  std::cout << " t.eta(100) = " << t.eta(100) << std::endl;
225  std::cout << " t.eta(101) = " << t.eta(101) << std::endl;
226  std::cout << " t.eta(107) = " << t.eta(107) << std::endl;
227  std::cout << " t.eta(125) = " << t.eta(125) << std::endl;
228  std::cout << " t.eta(150) = " << t.eta(150) << std::endl;
229  std::cout << " t.eta(190) = " << t.eta(190) << std::endl;
230  std::cout << " t.eta(199) = " << t.eta(199) << std::endl;
231  std::cout << " t.eta(200) = " << t.eta(200) << std::endl;
232  std::cout << " t.eta(0,100) = " << t.eta(0,100) << std::endl;
233  std::cout << " t.eta(1,100) = " << t.eta(1,100) << std::endl;
234  std::cout << " t.eta(10,100) = " << t.eta(10,100) << std::endl;
235  std::cout << " t.eta(50,100) = " << t.eta(50,100) << std::endl;
236  std::cout << " t.eta(75,100) = " << t.eta(75,100) << std::endl;
237  std::cout << " t.eta(93,100) = " << t.eta(93,100) << std::endl;
238  std::cout << " t.eta(99,100) = " << t.eta(99,100) << std::endl;
239  std::cout << " t.eta(100,100) = " << t.eta(100,100) << std::endl;
240  std::cout << " t.eta(101,100) = " << t.eta(101,100) << std::endl;
241  std::cout << " t.eta(107,100) = " << t.eta(107,100) << std::endl;
242  std::cout << " t.eta(125,100) = " << t.eta(125,100) << std::endl;
243  std::cout << " t.eta(150,100) = " << t.eta(150,100) << std::endl;
244  std::cout << " t.eta(190,100) = " << t.eta(190,100) << std::endl;
245  std::cout << " t.eta(199,100) = " << t.eta(199,100) << std::endl;
246  std::cout << " t.eta(200,100) = " << t.eta(200,100) << std::endl;
247  */
248  assert(t.start_value() == start_value);
249  assert(t.stop_value() == stop_value);
250  assert(t.started_at() == "2003 Oct 28 15:49:30");
251  assert(t.stopped_at() == "2003 Oct 28 15:49:35");
252  assert(t.duration() == "00:05.0");
253  assert(t.eta(0) == "??:??.?");
254  assert(t.eta(1) == "08:15.0");
255  assert(t.eta(10) == "00:45.0");
256  assert(t.eta(50) == "00:05.0");
257  assert(t.eta(75) == "00:01.6");
258  assert(t.eta(93) == "00:00.3");
259  assert(t.eta(99) == "00:00.0");
260  assert(t.eta(100) == "00:00.0");
261  assert(t.eta(101) == "-00:00.0");
262  assert(t.eta(107) == "-00:00.3");
263  assert(t.eta(125) == "-00:01.0");
264  assert(t.eta(150) == "-00:01.6");
265  assert(t.eta(190) == "-00:02.3");
266  assert(t.eta(199) == "-00:02.4");
267  assert(t.eta(200) == "-00:02.5");
268  assert(t.eta(0,100) == "??:??.?");
269  assert(t.eta(1,100) == "08:15.0");
270  assert(t.eta(10,100) == "00:45.0");
271  assert(t.eta(50,100) == "00:05.0");
272  assert(t.eta(75,100) == "00:01.6");
273  assert(t.eta(93,100) == "00:00.3");
274  assert(t.eta(99,100) == "00:00.0");
275  assert(t.eta(100,100) == "00:00.0");
276  assert(t.eta(101,100) == "-00:00.0");
277  assert(t.eta(107,100) == "-00:00.3");
278  assert(t.eta(125,100) == "-00:01.0");
279  assert(t.eta(150,100) == "-00:01.6");
280  assert(t.eta(190,100) == "-00:02.3");
281  assert(t.eta(199,100) == "-00:02.4");
282  assert(t.eta(200,100) == "-00:02.5");
283 
284  start_value = base_value;
285  stop_value = base_value +5*60*60*24*365 +6*60*60*24 +7*60*60 +8*60 +9;
286  t.assign(start_value, stop_value);
287  t.use_localtime(false);
288  /*
289  std::cout << "t.start_value() = " << t.start_value() << std::endl;
290  std::cout << " t.stop_value() = " << t.stop_value() << std::endl;
291  std::cout << " t.started_at() = " << t.started_at() << std::endl;
292  std::cout << " t.stopped_at() = " << t.stopped_at() << std::endl;
293  std::cout << " t.duration() = " << t.duration() << std::endl;
294  std::cout << " t.eta(0) = " << t.eta(0) << std::endl;
295  std::cout << " t.eta(1) = " << t.eta(1) << std::endl;
296  std::cout << " t.eta(10) = " << t.eta(10) << std::endl;
297  std::cout << " t.eta(50) = " << t.eta(50) << std::endl;
298  std::cout << " t.eta(75) = " << t.eta(75) << std::endl;
299  std::cout << " t.eta(93) = " << t.eta(93) << std::endl;
300  std::cout << " t.eta(99) = " << t.eta(99) << std::endl;
301  std::cout << " t.eta(100) = " << t.eta(100) << std::endl;
302  std::cout << " t.eta(101) = " << t.eta(101) << std::endl;
303  std::cout << " t.eta(107) = " << t.eta(107) << std::endl;
304  std::cout << " t.eta(125) = " << t.eta(125) << std::endl;
305  std::cout << " t.eta(150) = " << t.eta(150) << std::endl;
306  std::cout << " t.eta(190) = " << t.eta(190) << std::endl;
307  std::cout << " t.eta(199) = " << t.eta(199) << std::endl;
308  std::cout << " t.eta(200) = " << t.eta(200) << std::endl;
309  std::cout << " t.eta(0,100) = " << t.eta(0,100) << std::endl;
310  std::cout << " t.eta(1,100) = " << t.eta(1,100) << std::endl;
311  std::cout << " t.eta(10,100) = " << t.eta(10,100) << std::endl;
312  std::cout << " t.eta(50,100) = " << t.eta(50,100) << std::endl;
313  std::cout << " t.eta(75,100) = " << t.eta(75,100) << std::endl;
314  std::cout << " t.eta(93,100) = " << t.eta(93,100) << std::endl;
315  std::cout << " t.eta(99,100) = " << t.eta(99,100) << std::endl;
316  std::cout << " t.eta(100,100) = " << t.eta(100,100) << std::endl;
317  std::cout << " t.eta(101,100) = " << t.eta(101,100) << std::endl;
318  std::cout << " t.eta(107,100) = " << t.eta(107,100) << std::endl;
319  std::cout << " t.eta(125,100) = " << t.eta(125,100) << std::endl;
320  std::cout << " t.eta(150,100) = " << t.eta(150,100) << std::endl;
321  std::cout << " t.eta(190,100) = " << t.eta(190,100) << std::endl;
322  std::cout << " t.eta(199,100) = " << t.eta(199,100) << std::endl;
323  std::cout << " t.eta(200,100) = " << t.eta(200,100) << std::endl;
324  */
325  assert(t.start_value() == 1067356170);
326  assert(t.stop_value() == 1225580259);
327  assert(t.started_at() == "2003 Oct 28 15:49:30");
328  assert(t.stopped_at() == "2008 Nov 1 22:57:39");
329  assert(t.duration() == "5y 6d 07:08:09.0");
330  assert(t.eta(0) == "??:??.?");
331  assert(t.eta(1) == "496y 258d 10:26:51.0");
332  assert(t.eta(10) == "45y 56d 16:13:21.0");
333  assert(t.eta(50) == "5y 6d 07:08:09.0");
334  assert(t.eta(75) == "1y 245d 10:22:43.0");
335  assert(t.eta(93) == "137d 20:09:00.0");
336  assert(t.eta(99) == "18d 11:57:03.1");
337  assert(t.eta(100) == "00:00.0");
338  assert(t.eta(101) == "-18d 03:09:35.1");
339  assert(t.eta(107) == "-119d 19:18:28.6");
340  assert(
341  (t.eta(125) == "-1y 1d 06:13:37.8")
342  || (t.eta(125) == "-1y 1d 06:13:37.7")
343  );
344  assert(t.eta(150) == "-1y 245d 10:22:43.0");
345  assert(t.eta(190) == "-2y 137d 10:57:32.6");
346  assert(t.eta(199) == "-2y 181d 01:08:16.5");
347  assert(t.eta(200) == "-2y 185d 15:34:04.5");
348  assert(t.eta(0,100) == "??:??.?");
349  assert(t.eta(1,100) == "496y 258d 10:26:51.0");
350  assert(t.eta(10,100) == "45y 56d 16:13:21.0");
351  assert(t.eta(50,100) == "5y 6d 07:08:09.0");
352  assert(t.eta(75,100) == "1y 245d 10:22:43.0");
353  assert(t.eta(93,100) == "137d 20:09:00.0");
354  assert(t.eta(99,100) == "18d 11:57:03.1");
355  assert(t.eta(100,100) == "00:00.0");
356  assert(t.eta(101,100) == "-18d 03:09:35.1");
357  assert(t.eta(107,100) == "-119d 19:18:28.6");
358  assert(
359  (t.eta(125,100) == "-1y 1d 06:13:37.8")
360  || (t.eta(125,100) == "-1y 1d 06:13:37.7")
361  );
362  assert(t.eta(150,100) == "-1y 245d 10:22:43.0");
363  assert(t.eta(190,100) == "-2y 137d 10:57:32.6");
364  assert(t.eta(199,100) == "-2y 181d 01:08:16.5");
365  assert(t.eta(200,100) == "-2y 185d 15:34:04.5");
366 }
367 
368 int main(int argc, char const * argv[])
369 {
370  try {
371  test1();
372  test2();
373  test3();
374  }
375  catch(error e) {
376  std::cerr << e;
377  assert(0);
378  }
379  catch(...) {
380  std::cerr << err_unknown;
381  assert(0);
382  }
383  return(0);
384 }
385 
void test3(void)
Definition: test-timer.cc:96
const duration_type duration_secs(void) const
Reutrn the duration in seconds.
Definition: timer.cc:411
T absolute(const T &num)
Definition: test-timer.cc:18
int main(int argc, char const *argv[])
Definition: test-timer.cc:368
double duration_type
Definition: timer.h:33
const duration_type duration_hours(void) const
Return the duration in hours.
Definition: timer.cc:432
void use_localtime(const bool a_switch)
Set whether to use localtime or GMT when constructing strings.
Definition: timer.cc:200
#define err_unknown
Definition: error.h:114
void test1(void)
Definition: test-timer.cc:26
void assign(const timer &a_timer)
Assign timer values from another timer instance.
Definition: timer.cc:162
void start(void)
Start (or restart) the timer.
Definition: timer.cc:137
const std::string stopped_at(void) const
Generate a stopped-at string.
Definition: timer.cc:371
const value_type start_value(void) const
Return the timer start value.
Definition: timer.cc:150
An error class.
Definition: error.h:72
const std::string started_at(void) const
Generate a started-at string.
Definition: timer.cc:359
time_t value_type
Definition: timer.h:32
const duration_type duration_years(void) const
Return the duration in years.
Definition: timer.cc:452
void test2(void)
Definition: test-timer.cc:51
const value_type stop_value(void) const
Return the timer stop value.
Definition: timer.cc:156
const std::string duration(void) const
Generate a duration string.
Definition: timer.cc:385
const std::string eta(unsigned int a_percent_complete) const
Given a percent-complete for some unknown task, estimate a time to completion.
Definition: timer.cc:463
const duration_type duration_days(void) const
Return the duration in days.
Definition: timer.cc:442
const duration_type duration_mins(void) const
Return the duration in minutes.
Definition: timer.cc:422
void stop(void)
Stop the timer.
Definition: timer.cc:143
Used as a stopwatch.
Definition: timer.h:29