1.1 --- a/test/counter_test.cc Sun Mar 29 23:08:20 2009 +0200
1.2 +++ b/test/counter_test.cc Sun Mar 29 22:19:14 2009 +0100
1.3 @@ -18,59 +18,86 @@
1.4
1.5 #include <lemon/counter.h>
1.6 #include <vector>
1.7 +#include <sstream>
1.8 +
1.9 +#include "test/test_tools.h"
1.10
1.11 using namespace lemon;
1.12
1.13 template <typename T>
1.14 void bubbleSort(std::vector<T>& v) {
1.15 - Counter op("Bubble Sort - Operations: ");
1.16 - Counter::NoSubCounter as(op, "Assignments: ");
1.17 - Counter::NoSubCounter co(op, "Comparisons: ");
1.18 - for (int i = v.size()-1; i > 0; --i) {
1.19 - for (int j = 0; j < i; ++j) {
1.20 - if (v[j] > v[j+1]) {
1.21 - T tmp = v[j];
1.22 - v[j] = v[j+1];
1.23 - v[j+1] = tmp;
1.24 - as += 3;
1.25 + std::stringstream s1, s2, s3;
1.26 + {
1.27 + Counter op("Bubble Sort - Operations: ", s1);
1.28 + Counter::SubCounter as(op, "Assignments: ", s2);
1.29 + Counter::SubCounter co(op, "Comparisons: ", s3);
1.30 + for (int i = v.size()-1; i > 0; --i) {
1.31 + for (int j = 0; j < i; ++j) {
1.32 + if (v[j] > v[j+1]) {
1.33 + T tmp = v[j];
1.34 + v[j] = v[j+1];
1.35 + v[j+1] = tmp;
1.36 + as += 3;
1.37 + }
1.38 + ++co;
1.39 }
1.40 - ++co;
1.41 }
1.42 }
1.43 + check(s1.str() == "Bubble Sort - Operations: 102\n", "Wrong counter");
1.44 + check(s2.str() == "Assignments: 57\n", "Wrong subcounter");
1.45 + check(s3.str() == "Comparisons: 45\n", "Wrong subcounter");
1.46 }
1.47
1.48 template <typename T>
1.49 void insertionSort(std::vector<T>& v) {
1.50 - Counter op("Insertion Sort - Operations: ");
1.51 - Counter::NoSubCounter as(op, "Assignments: ");
1.52 - Counter::NoSubCounter co(op, "Comparisons: ");
1.53 - for (int i = 1; i < int(v.size()); ++i) {
1.54 - T value = v[i];
1.55 - ++as;
1.56 - int j = i;
1.57 - while (j > 0 && v[j-1] > value) {
1.58 - v[j] = v[j-1];
1.59 - --j;
1.60 - ++co; ++as;
1.61 + std::stringstream s1, s2, s3;
1.62 + {
1.63 + Counter op("Insertion Sort - Operations: ", s1);
1.64 + Counter::SubCounter as(op, "Assignments: ", s2);
1.65 + Counter::SubCounter co(op, "Comparisons: ", s3);
1.66 + for (int i = 1; i < int(v.size()); ++i) {
1.67 + T value = v[i];
1.68 + ++as;
1.69 + int j = i;
1.70 + while (j > 0 && v[j-1] > value) {
1.71 + v[j] = v[j-1];
1.72 + --j;
1.73 + ++co; ++as;
1.74 + }
1.75 + v[j] = value;
1.76 + ++as;
1.77 }
1.78 - v[j] = value;
1.79 - ++as;
1.80 }
1.81 + check(s1.str() == "Insertion Sort - Operations: 56\n", "Wrong counter");
1.82 + check(s2.str() == "Assignments: 37\n", "Wrong subcounter");
1.83 + check(s3.str() == "Comparisons: 19\n", "Wrong subcounter");
1.84 }
1.85
1.86 template <typename MyCounter>
1.87 -void counterTest() {
1.88 - MyCounter c("Main Counter: ");
1.89 - c++;
1.90 - typename MyCounter::SubCounter d(c, "SubCounter: ");
1.91 - d++;
1.92 - typename MyCounter::SubCounter::NoSubCounter e(d, "SubSubCounter: ");
1.93 - e++;
1.94 - d+=3;
1.95 - c-=4;
1.96 - e-=2;
1.97 - c.reset(2);
1.98 - c.reset();
1.99 +void counterTest(bool output) {
1.100 + std::stringstream s1, s2, s3;
1.101 + {
1.102 + MyCounter c("Main Counter: ", s1);
1.103 + c++;
1.104 + typename MyCounter::SubCounter d(c, "SubCounter: ", s2);
1.105 + d++;
1.106 + typename MyCounter::SubCounter::NoSubCounter e(d, "SubSubCounter: ", s3);
1.107 + e++;
1.108 + d+=3;
1.109 + c-=4;
1.110 + e-=2;
1.111 + c.reset(2);
1.112 + c.reset();
1.113 + }
1.114 + if (output) {
1.115 + check(s1.str() == "Main Counter: 3\n", "Wrong Counter");
1.116 + check(s2.str() == "SubCounter: 3\n", "Wrong SubCounter");
1.117 + check(s3.str() == "", "Wrong NoSubCounter");
1.118 + } else {
1.119 + check(s1.str() == "", "Wrong NoCounter");
1.120 + check(s2.str() == "", "Wrong SubCounter");
1.121 + check(s3.str() == "", "Wrong NoSubCounter");
1.122 + }
1.123 }
1.124
1.125 void init(std::vector<int>& v) {
1.126 @@ -80,8 +107,8 @@
1.127
1.128 int main()
1.129 {
1.130 - counterTest<Counter>();
1.131 - counterTest<NoCounter>();
1.132 + counterTest<Counter>(true);
1.133 + counterTest<NoCounter>(false);
1.134
1.135 std::vector<int> x(10);
1.136 init(x); bubbleSort(x);