source: trunk/test/stats_test.cc @ 633

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

closes #327 - added rule so 'make' is issued in 'lib/' when libsvndigest is needed - skipping similar rule for 'bin/' because cant see the use of it

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 6.8 KB
Line 
1// $Id: stats_test.cc 633 2008-05-09 00:34:22Z peter $
2
3/*
4  Copyright (C) 2008 Peter Johansson
5
6  This file is part of svndigest, http://trac.thep.lu.se/svndigest
7
8  svndigest is free software; you can redistribute it and/or modify it
9  under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12
13  svndigest is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21  02111-1307, USA.
22*/
23
24#include "Suite.h"
25
26#include "AddStats.h"
27#include "BlameStats.h"
28#include "ClassicStats.h"
29#include "Configuration.h"
30#include "Stats.h"
31#include "SVN.h"
32
33#include <algorithm>
34#include <cassert>
35#include <cstddef>
36#include <iterator>
37#include <iostream>
38#include <numeric>
39#include <sstream>
40#include <string>
41#include <vector>
42
43namespace theplu{
44namespace svndigest{
45
46  bool check(const Stats& stats, const std::vector<size_t>& correct,
47             int linetype, const std::string& descr, const std::string& author);
48  std::string path(void);
49  bool test_add(void);
50  bool test_blame(void);
51  bool test_cache(const Stats&);
52  bool test_classic(void);
53  bool test_base_class(const Stats&);
54 
55}} // end of namespace svndigest and theplu
56
57
58int main( int argc, char* argv[])
59{
60  using namespace theplu::svndigest;
61  bool verbose=false;
62  bool ok=true;
63  if (argc>1 && argv[1]==std::string("-v") )
64    verbose=true;
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  if (ok)
81    return 0;
82  return 1;
83}
84
85
86namespace theplu{
87namespace svndigest{
88
89  std::string path(void)
90  {
91    return test::filename("toy_project/bin/svnstat.cc");
92  }
93
94  bool test_add(void)
95  {
96    bool ok =true;
97    AddStats cs(path());
98    cs.parse(path());
99    ok &= test_base_class(cs);
100    return ok;
101  }
102 
103 
104  bool test_blame(void)
105  {
106    bool ok =true;
107    BlameStats cs(path());
108    cs.parse(path());
109    ok &= test_base_class(cs);
110    return ok;
111  }
112
113 
114  bool test_cache(const Stats& stats)
115  {
116    std::cerr << "test cache " << std::endl;
117    std::stringstream ss;
118    stats.print(ss);
119    ClassicStats new_stats(path());
120    if (!new_stats.load_cache(ss)) {
121      std::cerr << "Failed reloading cache" << std::endl;
122      return false;
123    }
124    std::cerr << "Hello" << std::endl;
125    ss.clear(std::ios::goodbit);
126    if (stats.authors() != new_stats.authors()) {
127      std::cerr << "Error: cache: authors not the same\n";
128      return false;
129    }
130    std::cerr << "Hello2" << std::endl;
131    if (stats.revision()!=new_stats.revision()) {
132      std::cerr << "Error: cache: revision not the same\n";
133      return false;
134    }
135    try {
136      for (int lt=0; lt<1; ++lt) {
137        for (std::set<std::string>::const_iterator a=stats.authors().begin();
138             a!=stats.authors().end(); ++a) {
139          for (svn_revnum_t rev=0; rev<=stats.revision(); ++rev) {
140            std::cerr << "lt: " << lt << std::endl;
141            std::cerr << "author: " << *a << std::endl;
142            std::cerr << "rev: " << rev << std::endl;
143            if (stats(lt, *a, rev)!=new_stats(lt, *a, rev)) {
144              std::cerr << "Error cache:\n";
145              std::cerr << "lt: " << lt << std::endl;
146              std::cerr << "author: " << *a << std::endl;
147              std::cerr << "rev: " << rev << std::endl;
148              std::cerr << stats(lt, *a, rev) << " not equal " 
149                        << new_stats(lt, *a, rev) << std::endl;
150              return false;
151            }
152          }
153        }
154      }
155    }
156    catch (std::runtime_error& e) {
157      std::cerr << "Caught an exception. what(): " << e.what() << "\n";
158      return false;
159    }
160
161    std::stringstream ss2;
162    new_stats.print(ss2);
163    if (ss.str()!=ss2.str()) {
164      std::cerr << "ERROR: reprinted cache not equal first printed cache\n";
165
166      std::string line;
167      std::string line2;
168      std::size_t line_no=1;
169      ss.seekg(0);
170      ss2.seekg(0);
171      assert(ss.good());
172      assert(ss2.good());
173      while (getline(ss, line) && getline(ss2, line2) ) {
174        if (line==line2) {
175          std::cerr << line_no << " " << line << "\n";
176        }
177        else {
178          std::cerr << line_no << "< " << line << "\n";
179          std::cerr << line_no << "> " << line2 << "\n";
180          return false;
181        }
182        ++line_no;
183      }
184      return false;
185    }
186    return true;
187  }
188
189
190  bool test_classic(void)
191  {
192    bool ok =true;
193    ClassicStats cs(path());
194    cs.parse(path());
195    //ok &= test_base_class(cs);
196   
197    // Peter, should be included in test_base_test()
198    ok &= test_cache(cs);
199
200    // testing copyright lines for peter
201    std::vector<size_t> correct(48,0);
202    correct[47]=2;
203    ok &= check(cs, correct, LineTypeParser::copyright, "copyright", "peter");
204
205    // testing code lines for jari
206    correct.resize(0);
207    correct.resize(48,0);
208    correct[15]=20;
209    correct[16]=1;
210    correct[17]=1;
211    correct[28]=8;
212    correct[30]=54;
213    ok &= check(cs, correct, LineTypeParser::code, "code", "jari");
214
215    // testing comment lines for jari
216    correct.resize(0);
217    correct.resize(48,0);
218    correct[15]=1;
219    correct[28]=13;
220    correct[30]=7;
221    ok &= check(cs, correct, LineTypeParser::comment, "comment", "jari");
222
223    // testing blank lines for jari
224    correct.resize(0);
225    correct.resize(48,0);
226    correct[15]=10;
227    correct[28]=10;
228    correct[30]=2;
229    ok &= check(cs, correct, LineTypeParser::other, "other", "jari");
230
231    // testing code all lines for total
232    correct.resize(0);
233    correct.resize(48,0);
234    correct[15]=31;
235    correct[16]=1;
236    correct[17]=1;
237    correct[28]=31;
238    correct[30]=63;
239    correct[47]=2;
240    ok &= check(cs, correct, LineTypeParser::total, "total", "all");
241
242    return ok;
243  }
244 
245  bool check(const Stats& stats, const std::vector<size_t>& correct,
246             int linetype, const std::string& descr, const std::string& author)
247  {
248    bool ok=true;
249    std::vector<size_t> sum(correct.size());
250    std::partial_sum(correct.begin(), correct.end(), sum.begin());
251    for (size_t rev=0; rev<sum.size(); ++rev){
252      size_t n = stats(linetype, author, rev);
253      if (n != sum[rev]){
254        std::cerr << "error: " << descr << " " << author << " rev:" << rev
255                  << ": found " << n << " expected " << sum[rev] << "\n";
256        ok = false;
257      }
258    }
259    return true;
260  }
261
262  bool test_base_class(const Stats& s)
263  {
264    if (s.code()+s.comments()+s.empty()!=s.lines()){
265      std::cerr << "Code plus comments plus empty do not add up to lines\n";
266      std::cerr << "code: " << s.code() << "\n";
267      std::cerr << "comment: " << s.comments() << "\n";
268      std::cerr << "empty: " << s.empty() << "\n";
269      std::cerr << "lines: " << s.lines() << "\n";
270      return false;
271    }
272    return true;
273  }
274
275}} // end of namespace svndigest and theplu
Note: See TracBrowser for help on using the repository browser.