source: trunk/test/Suite.cc @ 1087

Last change on this file since 1087 was 1044, checked in by Peter Johansson, 11 years ago

using parallel-tests driver and making c++ tests verbose by default.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 6.9 KB
Line 
1// $Id: Suite.cc 1044 2010-03-27 20:56:29Z 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 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    : ok_(true)
45  {
46    if (need_test_repo) {
47      bool have_test_repo=false;
48      #ifdef HAVE_TEST_REPO
49      have_test_repo=true;
50      #endif
51      if (!have_test_repo) {
52        out() << "Skipping test because test repository is not available\n";
53        exit (77);
54      }
55      update_test_wc();
56    }
57
58  }
59
60
61  Suite::~Suite(void)
62  {
63  }
64
65 
66  bool Suite::add(bool b)
67  {
68    ok_ = ok_ && b;
69    return b;
70  }
71
72
73  bool Suite::ok(void) const
74  {
75    return ok_;
76  }
77
78
79  std::ostream& Suite::out(void) const
80  {
81    return std::cout;
82  }
83
84
85  bool check_all(const Stats& stats, test::Suite& suite)
86  {
87    for (int lt=0; lt<=LineTypeParser::total; ++lt) {
88      for (svn_revnum_t rev=0; rev<=stats.revision(); ++rev) {
89        size_t all = 0;
90        for (std::set<std::string>::const_iterator a=stats.authors().begin();
91             a!=stats.authors().end(); ++a) {
92          all += stats(lt, *a, rev);
93        }
94        if (all!=stats(lt, "all", rev)) {
95          suite.out() << "error: check_all\n"
96                      << " lt = " << lt << "\n"
97                      << " rev = " << rev << "\n"
98                      << " all = " << all << "\n"
99                      << " stats = " << stats(lt, "all", rev) << "\n";
100          for (std::set<std::string>::const_iterator a=stats.authors().begin();
101               a!=stats.authors().end(); ++a) {
102            suite.out() << *a << " " << stats(lt, *a, rev) << "\n";
103          }
104          return false;
105        }
106      }
107    }
108    return true;
109  }
110 
111
112  bool check_total(const Stats& stats, test::Suite& suite)
113  {
114    for (svn_revnum_t rev=0; rev<=stats.revision(); ++rev) {
115      for (std::set<std::string>::const_iterator a=stats.authors().begin();
116           a!=stats.authors().end(); ++a) {
117        unsigned int total=0;
118        for (int lt=0; lt<4; ++lt) {
119          total += stats(lt, *a, rev);
120        }
121        unsigned int total2=stats(LineTypeParser::total, *a, rev);
122       
123        if (total!=total2) {
124          suite.out() << "error: check_total\n"
125                      << " author = " << *a << "\n"
126                      << " rev = " << rev << "\n"
127                      << " sum = " << total << "\n"
128                      << " total = " << total2 << "\n";
129          return false;
130        }
131      }
132    }
133    return true;
134  }
135 
136
137  bool check_comment_or_copy(const Stats& stats, test::Suite& suite)
138  {
139    for (svn_revnum_t rev=0; rev<=stats.revision(); ++rev) {
140      for (std::set<std::string>::const_iterator a=stats.authors().begin();
141           a!=stats.authors().end(); ++a) {
142        unsigned int x=stats(LineTypeParser::comment, *a, rev);
143        x+=stats(LineTypeParser::copyright, *a, rev);
144        unsigned int y=stats(LineTypeParser::comment_or_copy, *a, rev);
145       
146        if (x!=y) {
147          suite.out() << "error: check_total\n"
148                      << " author = " << *a << "\n"
149                      << " rev = " << rev << "\n"
150                      << " comment + copyright = " << x << "\n"
151                      << " comment_or_copy = " << y << "\n";
152          return false;
153        }
154      }
155    }
156    return true;
157  }
158
159
160  bool consistent(const StatsCollection& sc, test::Suite& suite)
161  {
162    std::map<std::string, Stats*>::const_iterator iter = sc.stats().begin();
163    while (iter != sc.stats().end()) {
164      if (!consistent(*iter->second, suite)) {
165        suite.out() << "error in " << iter->first << "\n";
166        return false;
167      }
168      ++iter;
169    }
170    return true;
171  }
172
173
174  bool consistent(const Stats& stats, test::Suite& suite)
175  {
176    suite.add(check_all(stats, suite));
177    suite.add(check_total(stats, suite));
178    suite.add(check_comment_or_copy(stats, suite));
179    return true;
180  }
181
182
183  bool equal(const StatsCollection& a, const StatsCollection& b, 
184             Suite& suite)
185  {
186    if (a.stats().size() != b.stats().size()) {
187      suite.out() << "size mismatch\n";
188      return false;
189    }
190    std::map<std::string, Stats*>::const_iterator iter1 = a.stats().begin();
191    std::map<std::string, Stats*>::const_iterator iter2 = b.stats().begin();
192    while (iter1 != a.stats().end()) {
193      if (iter1->first != iter2->first) {
194        suite.out() << "key mismatch\n";
195        suite.out() << iter1->first << " vs " << iter2->first << "\n";
196        return false;
197      }
198      if (!equal(*iter1->second, *iter2->second, suite)) {
199        suite.out() << "error in " << iter1->first << "\n";
200        return false;
201      }
202      ++iter1;
203      ++iter2;
204    }
205    return true;
206  }
207 
208
209  bool equal(const Stats& a, const Stats& b, test::Suite& suite)
210  {
211    if (a.authors() != b.authors()) {
212      suite.out() << "authors are not equal\n";
213      suite.out() << "lhs:\n";
214      std::copy(a.authors().begin(), a.authors().end(), 
215                std::ostream_iterator<std::string>(suite.out(), "\n"));
216      suite.out() << "rhs:\n";
217      std::copy(b.authors().begin(), b.authors().end(), 
218                std::ostream_iterator<std::string>(suite.out(), "\n"));
219      return false;
220    }
221    if (a.revision() != b.revision()) {
222      suite.out() << "revision mismatch\n";
223      return false;
224    }
225    std::vector<std::string> authors;
226    authors.reserve(a.authors().size()+1);
227    std::copy(a.authors().begin(), a.authors().end(), 
228              std::back_inserter(authors));
229    authors.push_back("all");
230    for (int linetype=0; linetype <= LineTypeParser::total; ++linetype) {
231      for (std::vector<std::string>::const_iterator author=authors.begin(); 
232           author!=authors.end(); ++author) {
233        for (svn_revnum_t rev=0; rev<a.revision(); ++rev) {
234          size_t ax = a(linetype, *author, rev);
235          size_t bx = b(linetype, *author, rev);
236          if (ax != bx) {
237            suite.out() << "error: linetype: " << linetype
238                        << " author " << *author 
239                        << " rev " << rev << "\n"
240                        << "   a: " << ax << "\n"
241                        << "   b: " << bx << "\n";
242            return false;
243          }
244        }
245      }
246    }
247    return true;
248  }
249
250
251  void Suite::update_test_wc(void) const
252  {
253    std::string cmd = abs_builddir()+"/svn_update.sh";
254    out() << cmd << std::endl;
255    int status = system(cmd.c_str());
256    if (status) {
257      out() << "failed with status: " << status << std::endl;
258      exit (1);
259    }
260  }
261
262
263  bool Suite::verbose(void) const
264  {
265    // we are always verbose nowadays
266    return true;
267  }
268
269
270  std::string filename(const std::string& path)
271  {
272    return abs_builddir()+"/"+path;
273  }
274
275
276  std::string src_filename(const std::string& path)
277  {
278    return abs_srcdir()+"/"+path;
279  }
280
281
282}}}
Note: See TracBrowser for help on using the repository browser.