# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1238176165 -3600
# Node ID 4cc4140e7fbbb8a50f38d0cd838eb6ae7f780bde
# Parent 0f40b9d26049f0b3179fd38b429218845ae6876d
Improve timer and counter tests (#253)
- Do not print the output of counter_test.cc.
- Check the output of counter_test.cc.
- Shorten the running time of time_measure_test.cc.
diff --git a/test/counter_test.cc b/test/counter_test.cc
a
|
b
|
|
18 | 18 | |
19 | 19 | #include <lemon/counter.h> |
20 | 20 | #include <vector> |
| 21 | #include <sstream> |
| 22 | |
| 23 | #include "test/test_tools.h" |
21 | 24 | |
22 | 25 | using namespace lemon; |
23 | 26 | |
24 | 27 | template <typename T> |
25 | 28 | void bubbleSort(std::vector<T>& v) { |
26 | | Counter op("Bubble Sort - Operations: "); |
27 | | Counter::NoSubCounter as(op, "Assignments: "); |
28 | | Counter::NoSubCounter co(op, "Comparisons: "); |
29 | | for (int i = v.size()-1; i > 0; --i) { |
30 | | for (int j = 0; j < i; ++j) { |
31 | | if (v[j] > v[j+1]) { |
32 | | T tmp = v[j]; |
33 | | v[j] = v[j+1]; |
34 | | v[j+1] = tmp; |
35 | | as += 3; |
| 29 | std::stringstream s1, s2, s3; |
| 30 | { |
| 31 | Counter op("Bubble Sort - Operations: ", s1); |
| 32 | Counter::SubCounter as(op, "Assignments: ", s2); |
| 33 | Counter::SubCounter co(op, "Comparisons: ", s3); |
| 34 | for (int i = v.size()-1; i > 0; --i) { |
| 35 | for (int j = 0; j < i; ++j) { |
| 36 | if (v[j] > v[j+1]) { |
| 37 | T tmp = v[j]; |
| 38 | v[j] = v[j+1]; |
| 39 | v[j+1] = tmp; |
| 40 | as += 3; |
| 41 | } |
| 42 | ++co; |
36 | 43 | } |
37 | | ++co; |
38 | 44 | } |
39 | 45 | } |
| 46 | check(s1.str() == "Bubble Sort - Operations: 102\n", "Wrong counter"); |
| 47 | check(s2.str() == "Assignments: 57\n", "Wrong subcounter"); |
| 48 | check(s3.str() == "Comparisons: 45\n", "Wrong subcounter"); |
40 | 49 | } |
41 | 50 | |
42 | 51 | template <typename T> |
43 | 52 | void insertionSort(std::vector<T>& v) { |
44 | | Counter op("Insertion Sort - Operations: "); |
45 | | Counter::NoSubCounter as(op, "Assignments: "); |
46 | | Counter::NoSubCounter co(op, "Comparisons: "); |
47 | | for (int i = 1; i < int(v.size()); ++i) { |
48 | | T value = v[i]; |
49 | | ++as; |
50 | | int j = i; |
51 | | while (j > 0 && v[j-1] > value) { |
52 | | v[j] = v[j-1]; |
53 | | --j; |
54 | | ++co; ++as; |
| 53 | std::stringstream s1, s2, s3; |
| 54 | { |
| 55 | Counter op("Insertion Sort - Operations: ", s1); |
| 56 | Counter::SubCounter as(op, "Assignments: ", s2); |
| 57 | Counter::SubCounter co(op, "Comparisons: ", s3); |
| 58 | for (int i = 1; i < int(v.size()); ++i) { |
| 59 | T value = v[i]; |
| 60 | ++as; |
| 61 | int j = i; |
| 62 | while (j > 0 && v[j-1] > value) { |
| 63 | v[j] = v[j-1]; |
| 64 | --j; |
| 65 | ++co; ++as; |
| 66 | } |
| 67 | v[j] = value; |
| 68 | ++as; |
55 | 69 | } |
56 | | v[j] = value; |
57 | | ++as; |
58 | 70 | } |
| 71 | check(s1.str() == "Insertion Sort - Operations: 56\n", "Wrong counter"); |
| 72 | check(s2.str() == "Assignments: 37\n", "Wrong subcounter"); |
| 73 | check(s3.str() == "Comparisons: 19\n", "Wrong subcounter"); |
59 | 74 | } |
60 | 75 | |
61 | 76 | template <typename MyCounter> |
62 | | void counterTest() { |
63 | | MyCounter c("Main Counter: "); |
64 | | c++; |
65 | | typename MyCounter::SubCounter d(c, "SubCounter: "); |
66 | | d++; |
67 | | typename MyCounter::SubCounter::NoSubCounter e(d, "SubSubCounter: "); |
68 | | e++; |
69 | | d+=3; |
70 | | c-=4; |
71 | | e-=2; |
72 | | c.reset(2); |
73 | | c.reset(); |
| 77 | void counterTest(bool output) { |
| 78 | std::stringstream s1, s2, s3; |
| 79 | { |
| 80 | MyCounter c("Main Counter: ", s1); |
| 81 | c++; |
| 82 | typename MyCounter::SubCounter d(c, "SubCounter: ", s2); |
| 83 | d++; |
| 84 | typename MyCounter::SubCounter::NoSubCounter e(d, "SubSubCounter: ", s3); |
| 85 | e++; |
| 86 | d+=3; |
| 87 | c-=4; |
| 88 | e-=2; |
| 89 | c.reset(2); |
| 90 | c.reset(); |
| 91 | } |
| 92 | if (output) { |
| 93 | check(s1.str() == "Main Counter: 3\n", "Wrong Counter"); |
| 94 | check(s2.str() == "SubCounter: 3\n", "Wrong SubCounter"); |
| 95 | check(s3.str() == "", "Wrong NoSubCounter"); |
| 96 | } else { |
| 97 | check(s1.str() == "", "Wrong NoCounter"); |
| 98 | check(s2.str() == "", "Wrong SubCounter"); |
| 99 | check(s3.str() == "", "Wrong NoSubCounter"); |
| 100 | } |
74 | 101 | } |
75 | 102 | |
76 | 103 | void init(std::vector<int>& v) { |
… |
… |
|
80 | 107 | |
81 | 108 | int main() |
82 | 109 | { |
83 | | counterTest<Counter>(); |
84 | | counterTest<NoCounter>(); |
| 110 | counterTest<Counter>(true); |
| 111 | counterTest<NoCounter>(false); |
85 | 112 | |
86 | 113 | std::vector<int> x(10); |
87 | 114 | init(x); bubbleSort(x); |
diff --git a/test/time_measure_test.cc b/test/time_measure_test.cc
a
|
b
|
|
39 | 39 | { |
40 | 40 | Timer T; |
41 | 41 | unsigned int n; |
42 | | for(n=0;T.realTime()<1.0;n++) ; |
| 42 | for(n=0;T.realTime()<0.1;n++) ; |
43 | 43 | std::cout << T << " (" << n << " time queries)\n"; |
44 | | T.restart(); |
45 | | while(T.realTime()<2.0) ; |
46 | | std::cout << T << '\n'; |
| 44 | |
47 | 45 | TimeStamp full; |
48 | 46 | TimeStamp t; |
49 | | t=runningTimeTest(f,1,&n,&full); |
| 47 | t=runningTimeTest(f,0.1,&n,&full); |
50 | 48 | std::cout << t << " (" << n << " tests)\n"; |
51 | 49 | std::cout << "Total: " << full << "\n"; |
52 | 50 | |
53 | | t=runningTimeTest(g,1,&n,&full); |
| 51 | t=runningTimeTest(g,0.1,&n,&full); |
54 | 52 | std::cout << t << " (" << n << " tests)\n"; |
55 | 53 | std::cout << "Total: " << full << "\n"; |
56 | 54 | |