source: trunk/test/stats.cc

Last change on this file was 1418, checked in by Peter Johansson, 10 years ago

avoid warnings (-Wall)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.3 KB
Line 
1// $Id: stats.cc 1418 2011-10-25 01:00:49Z peter $
2
3/*
4  Copyright (C) 2008 Jari Häkkinen, Peter Johansson
5  Copyright (C) 2009, 2010 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 "lib/AddStats.h"
26#include "lib/BlameStats.h"
27#include "lib/ClassicStats.h"
28#include "lib/Configuration.h"
29#include "lib/Stats.h"
30#include "lib/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
42using namespace theplu::svndigest;
43
44namespace theplu{
45namespace svndigest{
46
47  bool check(const Stats& stats, const std::vector<int>& correct,
48             int linetype, const std::string& descr, const std::string& author);
49  std::string path(void);
50  bool test_add(test::Suite&);
51  bool test_blame(test::Suite&);
52  bool test_classic(test::Suite&);
53  bool test_base_class(const Stats&);
54  bool test_cache(const Stats&);
55 
56}} // end of namespace svndigest and theplu
57
58
59int main( int argc, char* argv[])
60{
61  test::Suite suite(argc, argv, true);
62
63  SVN* svn=SVN::instance("toy_project");
64  if (!svn){
65    std::cerr << "error: cannot create SVN instance\n";
66    return 1;
67  }
68
69  suite.add(test_add(suite));
70  suite.add(test_blame(suite));
71  suite.add(test_classic(suite));
72                                                                               
73  return suite.exit_status();
74}
75
76
77namespace theplu{
78namespace svndigest{
79
80  std::string path(void)
81  {
82    return "toy_project/bin/svnstat.cc";
83  }
84
85  bool test_add(test::Suite& suite)
86  {
87    suite.out() << "testing add\n";
88    bool ok =true;
89    AddStats cs(path());
90    cs.parse(path());
91    ok &= test_base_class(cs);
92
93    std::vector<int> correct(62,0);
94    correct[15] = 71;
95    correct[16] = 3;
96    correct[17] = 7;
97    correct[28] = 35;
98    correct[30] = 63;
99    ok &= check(cs, correct, LineTypeParser::total, "total", "jari");
100    correct[42] = 1;
101    correct[43] = 1;
102    correct[44] = 2;
103    correct[47] = 2;
104    ok &= check(cs, correct, LineTypeParser::total, "total", "all");
105    std::fill(correct.begin(), correct.end(), 0);
106    correct[42] = 1;
107    correct[43] = 1;
108    correct[44] = 2;
109    correct[47] = 2;
110    ok &= check(cs, correct, LineTypeParser::copyright, "copyright", "peter");
111    std::fill(correct.begin(), correct.end(), 0);
112    correct[15] = 49;
113    correct[16] = 3;
114    correct[17] = 7;
115    correct[28] = 11;
116    correct[30] = 54;
117    ok &= check(cs, correct, LineTypeParser::code, "code", "jari");
118    std::fill(correct.begin(), correct.end(), 0);
119    correct[15] = 5;
120    correct[28] = 13;
121    correct[30] = 7;
122    ok &= check(cs, correct, LineTypeParser::comment, "comment", "jari");
123    std::fill(correct.begin(), correct.end(), 0);
124    correct[15] = 17;
125    correct[28] = 10;
126    correct[30] = 2;
127    ok &= check(cs, correct, LineTypeParser::other, "other", "jari");
128
129    return ok;
130  }
131 
132 
133  bool test_blame(test::Suite& suite)
134  {
135    suite.out() << "testing blame\n";
136    bool ok =true;
137    BlameStats cs(path());
138    cs.parse(path());
139    ok &= test_base_class(cs);
140
141    std::vector<int> correct(62,0);
142    correct[15] = 71;
143    correct[16] = -1;
144    correct[17] = 2;
145    correct[28] = 31;
146    correct[30] = 25;
147    correct[42] = -1;
148    ok &= check(cs, correct, LineTypeParser::total, "total", "jari");
149    correct[42] = 0;
150    correct[43] = 1;
151    ok &= check(cs, correct, LineTypeParser::total, "total", "all");
152    std::fill(correct.begin(), correct.end(), 0);
153    correct[42] = 1;
154    correct[43] = 1;
155    ok &= check(cs, correct, LineTypeParser::copyright, "copyright", "peter");
156    std::fill(correct.begin(), correct.end(), 0);
157    correct[15] = 49;
158    correct[17] = 2;
159    correct[28] = 8;
160    correct[30] = 54-29;
161    ok &= check(cs, correct, LineTypeParser::code, "code", "jari");
162    std::fill(correct.begin(), correct.end(), 0);
163    correct[15] = 5;
164    correct[16] = -1;
165    correct[28] = 13;
166    correct[30] = 7-3;
167    ok &= check(cs, correct, LineTypeParser::comment, "comment", "jari");
168    std::fill(correct.begin(), correct.end(), 0);
169    correct[15] = 17;
170    correct[28] = 10-1;
171    correct[30] = 2-6;
172    ok &= check(cs, correct, LineTypeParser::other, "other", "jari");
173
174    return ok;
175  }
176
177 
178  bool test_cache(const Stats& stats)
179  {
180    std::stringstream out;
181    stats.print(out);
182    std::stringstream in(out.str());
183    ClassicStats stats2(path());
184    assert(in.good());
185    bool new_cache=true;
186    if (!stats2.load_cache(in, new_cache)){
187      std::cout << "load_cache() failed\n";
188      return false;
189    }
190
191    std::stringstream out2;
192    stats2.print(out2);
193   
194    if ( test::diff(out.str(),out2.str()) ) {
195      std::cout << "test_cache() failed\n";
196      return false;
197    }
198    return true;
199  }
200
201
202  bool test_classic(test::Suite& suite)
203  {
204    suite.out() << "testing classic\n";
205    bool ok =true;
206    ClassicStats cs(path());
207    cs.parse(path());
208    ok &= test_base_class(cs);
209
210    // testing copyright lines for peter
211    std::vector<int> correct(48,0);
212    correct[47]=1;
213    ok &= check(cs, correct, LineTypeParser::copyright, "copyright", "peter");
214
215    // testing code lines for jari
216    correct.resize(0);
217    correct.resize(48,0);
218    correct[15]=20;
219    correct[16]=1;
220    correct[17]=1;
221    correct[28]=8;
222    correct[30]=54;
223    ok &= check(cs, correct, LineTypeParser::code, "code", "jari");
224
225    // testing comment lines for jari
226    correct.resize(0);
227    correct.resize(48,0);
228    correct[15]=1;
229    correct[28]=13;
230    correct[30]=7;
231    ok &= check(cs, correct, LineTypeParser::comment, "comment", "jari");
232
233    // testing blank lines for jari
234    correct.resize(0);
235    correct.resize(48,0);
236    correct[15]=10;
237    correct[28]=10;
238    correct[30]=2;
239    ok &= check(cs, correct, LineTypeParser::other, "other", "jari");
240
241    // testing code all lines for total
242    correct.resize(0);
243    correct.resize(48,0);
244    correct[15]=31;
245    correct[16]=1;
246    correct[17]=1;
247    correct[28]=31;
248    correct[30]=63;
249    correct[47]=1;
250    ok &= check(cs, correct, LineTypeParser::total, "total", "all");
251
252    return ok;
253  }
254 
255  bool check(const Stats& stats, const std::vector<int>& correct,
256             int linetype, const std::string& descr, const std::string& author)
257  {
258    bool ok=true;
259    std::vector<size_t> sum(correct.size());
260    std::partial_sum(correct.begin(), correct.end(), sum.begin());
261    for (size_t rev=0; rev<sum.size(); ++rev){
262      size_t n = stats(linetype, author, rev);
263      if (n != sum[rev]){
264        std::cout << "error: " << descr << " " << author << " rev:" << rev
265                  << ": found " << n << " expected " << sum[rev] << "\n";
266        ok = false;
267      }
268    }
269    return ok;
270  }
271
272  bool test_base_class(const Stats& s)
273  {
274    if (!test_cache(s))
275      return false;
276    if (s.code()+s.comments()+s.empty()!=s.lines()){
277      std::cerr << "Code plus comments plus empty do not add up to lines\n";
278      std::cerr << "code: " << s.code() << "\n";
279      std::cerr << "comment: " << s.comments() << "\n";
280      std::cerr << "empty: " << s.empty() << "\n";
281      std::cerr << "lines: " << s.lines() << "\n";
282      return false;
283    }
284    return true;
285  }
286
287}} // end of namespace svndigest and theplu
Note: See TracBrowser for help on using the repository browser.