source: trunk/test/stats_test.cc @ 809

Last change on this file since 809 was 744, checked in by Peter Johansson, 13 years ago

fixes #355 - skipping tests. Added some support in test::Suite to handle the test repo. There is a bool in constructor telling if the tests needs the test repo. test::Suite uses a new script svn_update.sh to check out and update the test repo. This script is used in test_repo.sh as well.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.2 KB
Line 
1// $Id: stats_test.cc 744 2009-01-08 22:37:12Z peter $
2
3/*
4  Copyright (C) 2008 Jari Häkkinen, Peter Johansson
5  Copyright (C) 2009 Peter Johansson
6
7  This file is part of svndigest, http://dev.thep.lu.se/svndigest
8
9  svndigest is free software; you can redistribute it and/or modify it
10  under the terms of the GNU General Public License as published by
11  the Free Software Foundation; either version 3 of the License, or
12  (at your option) any later version.
13
14  svndigest is distributed in the hope that it will be useful, but
15  WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with svndigest. If not, see <http://www.gnu.org/licenses/>.
21*/
22
23#include "Suite.h"
24
25#include "AddStats.h"
26#include "BlameStats.h"
27#include "ClassicStats.h"
28#include "Configuration.h"
29#include "Stats.h"
30#include "SVN.h"
31
32#include <algorithm>
33#include <cassert>
34#include <cstddef>
35#include <iterator>
36#include <iostream>
37#include <numeric>
38#include <string>
39#include <sstream>
40#include <vector>
41
42namespace theplu{
43namespace svndigest{
44
45  bool check(const Stats& stats, const std::vector<int>& correct,
46             int linetype, const std::string& descr, const std::string& author);
47  std::string path(void);
48  bool test_add(void);
49  bool test_blame(void);
50  bool test_classic(void);
51  bool test_base_class(const Stats&);
52  bool test_cache(const Stats&);
53 
54}} // end of namespace svndigest and theplu
55
56
57int main( int argc, char* argv[])
58{
59  using namespace theplu::svndigest;
60  test::Suite suite(argc, argv, true);
61
62  bool verbose=suite.verbose();
63  bool ok=true;
64
65  SVN* svn=SVN::instance(test::filename("toy_project"));
66  if (!svn){
67    std::cerr << "error: cannot create SVN instance\n";
68    return 1;
69  }
70
71  ok &= test_add();
72  ok &= test_blame();
73  ok &= test_classic();
74                                                                               
75  if (verbose) {
76    if (ok)
77      std::cout << "Test is ok.\n";
78    else
79      std::cout << "Test failed.\n";
80  }
81  if (ok)
82    return 0;
83  return 1;
84}
85
86
87namespace theplu{
88namespace svndigest{
89
90  std::string path(void)
91  {
92    return test::filename("toy_project/bin/svnstat.cc");
93  }
94
95  bool test_add(void)
96  {
97    bool ok =true;
98    AddStats cs(path());
99    cs.parse(path());
100    ok &= test_base_class(cs);
101
102    std::vector<int> correct(62,0);
103    correct[15] = 71;
104    correct[16] = 3;
105    correct[17] = 7;
106    correct[28] = 35;
107    correct[30] = 63;
108    ok &= check(cs, correct, LineTypeParser::total, "total", "jari");
109    correct[42] = 1;
110    correct[43] = 1;
111    correct[44] = 2;
112    correct[47] = 2;
113    ok &= check(cs, correct, LineTypeParser::total, "total", "all");
114    std::fill(correct.begin(), correct.end(), 0);
115    correct[42] = 1;
116    correct[43] = 1;
117    correct[44] = 2;
118    correct[47] = 2;
119    ok &= check(cs, correct, LineTypeParser::copyright, "copyright", "peter");
120    std::fill(correct.begin(), correct.end(), 0);
121    correct[15] = 49;
122    correct[16] = 3;
123    correct[17] = 7;
124    correct[28] = 11;
125    correct[30] = 54;
126    ok &= check(cs, correct, LineTypeParser::code, "code", "jari");
127    std::fill(correct.begin(), correct.end(), 0);
128    correct[15] = 5;
129    correct[28] = 13;
130    correct[30] = 7;
131    ok &= check(cs, correct, LineTypeParser::comment, "comment", "jari");
132    std::fill(correct.begin(), correct.end(), 0);
133    correct[15] = 17;
134    correct[28] = 10;
135    correct[30] = 2;
136    ok &= check(cs, correct, LineTypeParser::other, "other", "jari");
137
138    return ok;
139  }
140 
141 
142  bool test_blame(void)
143  {
144    bool ok =true;
145    BlameStats cs(path());
146    cs.parse(path());
147    ok &= test_base_class(cs);
148
149    std::vector<int> correct(62,0);
150    correct[15] = 71;
151    correct[16] = -1;
152    correct[17] = 2;
153    correct[28] = 31;
154    correct[30] = 25;
155    correct[42] = -1;
156    ok &= check(cs, correct, LineTypeParser::total, "total", "jari");
157    correct[42] = 0;
158    correct[43] = 1;
159    ok &= check(cs, correct, LineTypeParser::total, "total", "all");
160    std::fill(correct.begin(), correct.end(), 0);
161    correct[42] = 1;
162    correct[43] = 1;
163    ok &= check(cs, correct, LineTypeParser::copyright, "copyright", "peter");
164    std::fill(correct.begin(), correct.end(), 0);
165    correct[15] = 49;
166    correct[17] = 2;
167    correct[28] = 8;
168    correct[30] = 54-29;
169    ok &= check(cs, correct, LineTypeParser::code, "code", "jari");
170    std::fill(correct.begin(), correct.end(), 0);
171    correct[15] = 5;
172    correct[16] = -1;
173    correct[28] = 13;
174    correct[30] = 7-3;
175    ok &= check(cs, correct, LineTypeParser::comment, "comment", "jari");
176    std::fill(correct.begin(), correct.end(), 0);
177    correct[15] = 17;
178    correct[28] = 10-1;
179    correct[30] = 2-6;
180    ok &= check(cs, correct, LineTypeParser::other, "other", "jari");
181
182    return ok;
183  }
184
185 
186  bool test_cache(const Stats& stats)
187  {
188    std::stringstream out;
189    stats.print(out);
190    std::stringstream in(out.str());
191    ClassicStats stats2(path());
192    assert(in.good());
193    if (!stats2.load_cache(in)){
194      std::cout << "load_cache() failed\n";
195      return false;
196    }
197
198    std::stringstream out2;
199    stats2.print(out2);
200   
201    if (out.str()!=out2.str()) {
202      std::cout << "test_cache() failed\n";
203      return false;
204    }
205    return true;
206  }
207
208
209  bool test_classic(void)
210  {
211    bool ok =true;
212    ClassicStats cs(path());
213    cs.parse(path());
214    ok &= test_base_class(cs);
215
216    // testing copyright lines for peter
217    std::vector<int> correct(48,0);
218    correct[47]=2;
219    ok &= check(cs, correct, LineTypeParser::copyright, "copyright", "peter");
220
221    // testing code lines for jari
222    correct.resize(0);
223    correct.resize(48,0);
224    correct[15]=20;
225    correct[16]=1;
226    correct[17]=1;
227    correct[28]=8;
228    correct[30]=54;
229    ok &= check(cs, correct, LineTypeParser::code, "code", "jari");
230
231    // testing comment lines for jari
232    correct.resize(0);
233    correct.resize(48,0);
234    correct[15]=1;
235    correct[28]=13;
236    correct[30]=7;
237    ok &= check(cs, correct, LineTypeParser::comment, "comment", "jari");
238
239    // testing blank lines for jari
240    correct.resize(0);
241    correct.resize(48,0);
242    correct[15]=10;
243    correct[28]=10;
244    correct[30]=2;
245    ok &= check(cs, correct, LineTypeParser::other, "other", "jari");
246
247    // testing code all lines for total
248    correct.resize(0);
249    correct.resize(48,0);
250    correct[15]=31;
251    correct[16]=1;
252    correct[17]=1;
253    correct[28]=31;
254    correct[30]=63;
255    correct[47]=2;
256    ok &= check(cs, correct, LineTypeParser::total, "total", "all");
257
258    return ok;
259  }
260 
261  bool check(const Stats& stats, const std::vector<int>& correct,
262             int linetype, const std::string& descr, const std::string& author)
263  {
264    bool ok=true;
265    std::vector<size_t> sum(correct.size());
266    std::partial_sum(correct.begin(), correct.end(), sum.begin());
267    for (size_t rev=0; rev<sum.size(); ++rev){
268      size_t n = stats(linetype, author, rev);
269      if (n != sum[rev]){
270        std::cout << "error: " << descr << " " << author << " rev:" << rev
271                  << ": found " << n << " expected " << sum[rev] << "\n";
272        ok = false;
273      }
274    }
275    return ok;
276  }
277
278  bool test_base_class(const Stats& s)
279  {
280    if (!test_cache(s))
281      return false;
282    if (s.code()+s.comments()+s.empty()!=s.lines()){
283      std::cerr << "Code plus comments plus empty do not add up to lines\n";
284      std::cerr << "code: " << s.code() << "\n";
285      std::cerr << "comment: " << s.comments() << "\n";
286      std::cerr << "empty: " << s.empty() << "\n";
287      std::cerr << "lines: " << s.lines() << "\n";
288      return false;
289    }
290    return true;
291  }
292
293}} // end of namespace svndigest and theplu
Note: See TracBrowser for help on using the repository browser.