source: trunk/test/Suite.cc @ 1658

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

Adding functions to use for fix precision comparisons (refs #470)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.5 KB
Line 
1// $Id: Suite.cc 1658 2008-12-17 15:02:00Z peter $
2
3/*
4  Copyright (C) 2008 Jari Häkkinen, Peter Johansson
5
6  This file is part of the yat library, http://dev.thep.lu.se/yat
7
8  The yat library is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 3 of the
11  License, or (at your option) any later version.
12
13  The yat library is distributed in the hope that it will be useful,
14  but 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 yat. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "Suite.h"
23#include "environment.h"
24
25#include <algorithm>
26#include <cmath>
27#include <fstream>
28#include <iostream>
29#include <sstream>
30#include <string>
31
32namespace theplu {
33namespace yat {
34namespace test {
35
36  Suite::Suite(int argc, char* argv[])
37    : dev_null_(NULL), known_issues_(0), ok_(true)
38  {
39    char* buffer=std::getenv("YAT_TEST_VERBOSE");
40
41    if ( (argc>1 && argv[1]==std::string("-v")) || 
42         (buffer && buffer == std::string("1")) )
43      verbose_ = true;
44    else {
45      verbose_ = false;
46      dev_null_ = new std::ofstream("/dev/null");
47      if (argc>1){
48        std::stringstream ss(argv[0]);
49        std::string prog;
50        while(getline(ss, prog, '/'));
51        if (prog.substr(0,3)=="lt-")
52          prog = prog.substr(3);
53        std::cout << prog << " -v : for printing extra information\n";
54      }
55    }
56  }
57
58
59  Suite::~Suite(void)
60  {
61    if (dev_null_)
62      delete dev_null_;
63  }
64
65
66  bool Suite::add(bool ok)
67  {
68    ok_ = ok_ && ok;
69    return ok;
70  }
71
72
73  std::string filename(const std::string& path)
74  {
75    return abs_srcdir()+"/"+path;
76  }
77
78
79  std::ostream& Suite::err(void) const
80  {
81    if (verbose_)
82      return std::cerr;
83    return *dev_null_;
84  }
85
86
87  bool Suite::equal(double a, double b, unsigned long int n)
88  {
89    double last_error_bound = n*std::numeric_limits<double>().epsilon()*
90      std::min(std::abs(a), std::abs(b));
91    return equal_fix(a, b, last_error_bound);
92  }
93
94
95  bool Suite::equal_fix(double a, double b, double margin)
96  {
97    // using the negated comparison to catch NaN problems
98    if (!(std::abs(a-b) <= last_error_bound)){
99      err() << "Error: Comparing " << a << " and " << b
100            << "\n  Difference: " << a - b
101            << "\n  expected difference to be at most " << margin
102            << std::endl;
103      return false;
104    }
105    return true;
106  }
107
108
109  bool Suite::equal_sqrt(double a, double b, unsigned long int n)
110  {
111    double last_error_bound = n*
112      std::sqrt(std::numeric_limits<double>().epsilon())*
113      std::min(std::abs(a), std::abs(b));
114    if (!(std::abs(a-b) <= last_error_bound)){
115      err() << "Error: Comparing " << a << " and " << b
116            << "\n  Difference: " << a - b
117            << "\n  expected difference to be at most " << last_error_bound
118            << std::endl;
119      return false;
120    }
121    return true;
122  }
123
124
125  bool Suite::ok(void) const
126  {
127    return ok_;
128  }
129
130
131  std::ostream& Suite::out(void) const
132  {
133    if (verbose_)
134      return std::cout;
135    return *dev_null_;
136  }
137
138
139  int Suite::return_value(void) const
140  {
141    if (known_issues_>1)
142      out() << known_issues_ << " known issues were detected.\n";
143    else if (known_issues_==1)
144      out() << known_issues_ << " known issue was detected.\n";
145    if (ok()){
146      out() << "Test is ok.\n";
147      return 0;
148    }
149    out() << "Test failed.\n";
150    return -1;
151  }
152
153
154  bool Suite::xadd(bool ok)
155  {
156    if (!ok)
157      ++known_issues_;
158    else {
159      err() << " test for a known issue returned true\n";
160      add(false);
161    }
162    return ok;
163  }
164
165
166}}}
Note: See TracBrowser for help on using the repository browser.