source: trunk/test/Suite.cc @ 847

Last change on this file since 847 was 847, checked in by Peter Johansson, 12 years ago

updating copyrights

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.2 KB
Line 
1// $Id: Suite.cc 847 2009-11-17 01:38:52Z 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 the yat library, http://dev.thep.lu.se/yat
8
9  The yat library is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License as
11  published by the Free Software Foundation; either version 3 of the
12  License, or (at your option) any later version.
13
14  The yat library is distributed in the hope that it will be useful,
15  but 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 <config.h>
24
25#include "Suite.h"
26#include "environment.h"
27
28#include "Stats.h"
29#include "StatsCollection.h"
30#include "../lib/utility.h"
31
32#include <algorithm>
33#include <cassert>
34#include <fstream>
35#include <iostream>
36#include <iterator>
37#include <string>
38
39namespace theplu {
40namespace svndigest {
41namespace test {
42
43  Suite::Suite(int argc, char* argv[], bool need_test_repo)
44    : dev_null_(NULL), ok_(true), verbose_(false)
45  {
46    char* buffer=std::getenv("VERBOSE");
47    if ( (argc>1 && (argv[1]==std::string("-v") 
48                     || argv[1]==std::string("--verbose")) 
49          || (buffer && buffer == std::string("1"))) ) {
50      verbose_=true;
51    }
52    else
53      dev_null_ = new std::ofstream("/dev/null");
54
55    if (need_test_repo) {
56      bool have_test_repo=false;
57      #ifdef HAVE_TEST_REPO
58      have_test_repo=true;
59      #endif
60      if (!have_test_repo) {
61        out() << "Skipping test because test repository is not available\n";
62        exit (77);
63      }
64      update_test_wc();
65    }
66
67  }
68
69
70  Suite::~Suite(void)
71  {
72    delete dev_null_;
73  }
74
75 
76  bool Suite::add(bool b)
77  {
78    ok_ = ok_ && b;
79    return b;
80  }
81
82
83  bool Suite::ok(void) const
84  {
85    return ok_;
86  }
87
88
89  std::ostream& Suite::out(void) const
90  {
91    if (verbose())
92      return std::cout;
93    return *dev_null_;
94  }
95
96
97  bool check_all(const Stats& stats, test::Suite& suite)
98  {
99    for (int lt=0; lt<=LineTypeParser::total; ++lt) {
100      for (svn_revnum_t rev=0; rev<=stats.revision(); ++rev) {
101        size_t all = 0;
102        for (std::set<std::string>::const_iterator a=stats.authors().begin();
103             a!=stats.authors().end(); ++a) {
104          all += stats(lt, *a, rev);
105        }
106        if (all!=stats(lt, "all", rev)) {
107          suite.out() << "error: check_all\n"
108                      << " lt = " << lt << "\n"
109                      << " rev = " << rev << "\n"
110                      << " all = " << all << "\n"
111                      << " stats = " << stats(lt, "all", rev) << "\n";
112          for (std::set<std::string>::const_iterator a=stats.authors().begin();
113               a!=stats.authors().end(); ++a) {
114            suite.out() << *a << " " << stats(lt, *a, rev) << "\n";
115          }
116          return false;
117        }
118      }
119    }
120    return true;
121  }
122 
123
124  bool check_total(const Stats& stats, test::Suite& suite)
125  {
126    for (svn_revnum_t rev=0; rev<=stats.revision(); ++rev) {
127      for (std::set<std::string>::const_iterator a=stats.authors().begin();
128           a!=stats.authors().end(); ++a) {
129        unsigned int total=0;
130        for (int lt=0; lt<4; ++lt) {
131          total += stats(lt, *a, rev);
132        }
133        unsigned int total2=stats(LineTypeParser::total, *a, rev);
134       
135        if (total!=total2) {
136          suite.out() << "error: check_total\n"
137                      << " author = " << *a << "\n"
138                      << " rev = " << rev << "\n"
139                      << " sum = " << total << "\n"
140                      << " total = " << total2 << "\n";
141          return false;
142        }
143      }
144    }
145    return true;
146  }
147 
148
149  bool check_comment_or_copy(const Stats& stats, test::Suite& suite)
150  {
151    for (svn_revnum_t rev=0; rev<=stats.revision(); ++rev) {
152      for (std::set<std::string>::const_iterator a=stats.authors().begin();
153           a!=stats.authors().end(); ++a) {
154        unsigned int x=stats(LineTypeParser::comment, *a, rev);
155        x+=stats(LineTypeParser::copyright, *a, rev);
156        unsigned int y=stats(LineTypeParser::comment_or_copy, *a, rev);
157       
158        if (x!=y) {
159          suite.out() << "error: check_total\n"
160                      << " author = " << *a << "\n"
161                      << " rev = " << rev << "\n"
162                      << " comment + copyright = " << x << "\n"
163                      << " comment_or_copy = " << y << "\n";
164          return false;
165        }
166      }
167    }
168    return true;
169  }
170
171
172  bool consistent(const StatsCollection& sc, test::Suite& suite)
173  {
174    std::map<std::string, Stats*>::const_iterator iter = sc.stats().begin();
175    while (iter != sc.stats().end()) {
176      if (!consistent(*iter->second, suite)) {
177        suite.out() << "error in " << iter->first << "\n";
178        return false;
179      }
180      ++iter;
181    }
182    return true;
183  }
184
185
186  bool consistent(const Stats& stats, test::Suite& suite)
187  {
188    suite.add(check_all(stats, suite));
189    suite.add(check_total(stats, suite));
190    suite.add(check_comment_or_copy(stats, suite));
191    return true;
192  }
193
194
195  bool equal(const StatsCollection& a, const StatsCollection& b, 
196             Suite& suite)
197  {
198    if (a.stats().size() != b.stats().size()) {
199      suite.out() << "size mismatch\n";
200      return false;
201    }
202    std::map<std::string, Stats*>::const_iterator iter1 = a.stats().begin();
203    std::map<std::string, Stats*>::const_iterator iter2 = b.stats().begin();
204    while (iter1 != a.stats().end()) {
205      if (iter1->first != iter2->first) {
206        suite.out() << "key mismatch\n";
207        suite.out() << iter1->first << " vs " << iter2->first << "\n";
208        return false;
209      }
210      if (!equal(*iter1->second, *iter2->second, suite)) {
211        suite.out() << "error in " << iter1->first << "\n";
212        return false;
213      }
214      ++iter1;
215      ++iter2;
216    }
217    return true;
218  }
219 
220
221  bool equal(const Stats& a, const Stats& b, test::Suite& suite)
222  {
223    if (a.authors() != b.authors()) {
224      suite.out() << "authors are not equal\n";
225      suite.out() << "lhs:\n";
226      std::copy(a.authors().begin(), a.authors().end(), 
227                std::ostream_iterator<std::string>(suite.out(), "\n"));
228      suite.out() << "rhs:\n";
229      std::copy(b.authors().begin(), b.authors().end(), 
230                std::ostream_iterator<std::string>(suite.out(), "\n"));
231      return false;
232    }
233    if (a.revision() != b.revision()) {
234      suite.out() << "revision mismatch\n";
235      return false;
236    }
237    std::vector<std::string> authors;
238    authors.reserve(a.authors().size()+1);
239    std::copy(a.authors().begin(), a.authors().end(), 
240              std::back_inserter(authors));
241    authors.push_back("all");
242    for (int linetype=0; linetype <= LineTypeParser::total; ++linetype) {
243      for (std::vector<std::string>::const_iterator author=authors.begin(); 
244           author!=authors.end(); ++author) {
245        for (svn_revnum_t rev=0; rev<a.revision(); ++rev) {
246          size_t ax = a(linetype, *author, rev);
247          size_t bx = b(linetype, *author, rev);
248          if (ax != bx) {
249            suite.out() << "error: linetype: " << linetype
250                        << " author " << *author 
251                        << " rev " << rev << "\n"
252                        << "   a: " << ax << "\n"
253                        << "   b: " << bx << "\n";
254            return false;
255          }
256        }
257      }
258    }
259    return true;
260  }
261
262
263  void Suite::update_test_wc(void) const
264  {
265    std::string cmd = abs_builddir()+"/svn_update.sh";
266    out() << cmd << std::endl;
267    int status = system(cmd.c_str());
268    if (status) {
269      out() << "failed with status: " << status << std::endl;
270      exit (1);
271    }
272  }
273
274
275  bool Suite::verbose(void) const
276  {
277    return verbose_;
278  }
279
280
281  std::string filename(const std::string& path)
282  {
283    return abs_builddir()+"/"+path;
284  }
285
286
287  std::string src_filename(const std::string& path)
288  {
289    return abs_srcdir()+"/"+path;
290  }
291
292
293}}}
Note: See TracBrowser for help on using the repository browser.