Frobby 0.9.7
asserts.h
Go to the documentation of this file.
1/* Frobby: Software for monomial ideal computations.
2 Copyright (C) 2009 Bjarke Hammersholt Roune (www.broune.com)
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see http://www.gnu.org/licenses/.
16*/
17#ifndef ASSERTS_GUARD
18#define ASSERTS_GUARD
19
20#include <stdexcept>
21#include <sstream>
22#include <vector>
23#include <ostream>
24
25class AssertException : public logic_error {
26 public:
27 AssertException(const string& str);
29};
30
31namespace TestInternal {
32 struct StdData {
33 StdData(size_t lineParam, const char* fileParam,
34 const char* testNameParam, bool printDotParam):
35 line(lineParam), file(fileParam),
36 testName(testNameParam), printDot(printDotParam) {}
37 size_t line;
38 const char* file;
39 const char* testName;
41 };
42#define STD_DATA TestInternal::StdData(__LINE__, __FILE__, __nameOfTest, __printDots)
43#define SILENT(X) \
44 {bool ___printDots = __printDots; __printDots = false; X; __printDots = ___printDots;}
45
46 template<class T>
47 string toStr(const T& t) {stringstream out;out << t;return out.str();}
48
49 // Forward-declaration due to new behaviour in GCC 12
50 // see https://stackoverflow.com/a/77928633/5894824
51 template<class T>
52 ostream& operator<<(ostream& out, const vector<T>& v);
53
54 void assertOK(const StdData&);
55 void assertFail(const char* cond, const char* expected, const StdData&);
56 void assertFail1(const char* cond, const char* expected, const StdData&,
57 const char* exp1, string exp1Value);
58 void assertFail2(const char* cond, const char* expected, const StdData&,
59 const char* exp1, string exp1Value,
60 const char* exp2, string exp2Value);
61
62 void assertSucceeded(bool printDot);
63
64 void assertFailed(const char* errorMsg,
65 const char* testName, const char* file, size_t line);
66
67 void assertTrue(bool value, const char* condition,
68 const char* testName, const char* file, size_t line,
69 bool printDot);
70
71#define ASSERT_EXCEPTION(CODE, EXCEPTION_TYPE) \
72 {bool _frobby_sawException = false; \
73 try {CODE;} catch (EXCEPTION_TYPE) {_frobby_sawException = true;} \
74 if (_frobby_sawException)assertOK(STD_DATA); \
75 else assertFail(#CODE,"throw exception of type " #EXCEPTION_TYPE,STD_DATA);}
76
77#define ASSERT_TRUE(VALUE) \
78 {if(VALUE)assertOK(STD_DATA);else assertFail(#VALUE,"true",STD_DATA);}
79#define ASSERT_TRUE_SILENT(VALUE) SILENT(ASSERT_TRUE(VALUE))
80
81#define ASSERT_TRUE1(VALUE, X) \
82 {if(VALUE)assertOK(STD_DATA);else assertFail1(#VALUE,"true",STD_DATA,#X,TestInternal::toStr(X));}
83#define ASSERT_FALSE1(VALUE, X) \
84 {if(!VALUE)assertOK(STD_DATA);else assertFail1(#VALUE,"false",STD_DATA,#X,TestInternal::toStr(X));}
85
86#define ASSERT_TRUE2(VALUE, X, Y) \
87 {if(VALUE)assertOK(STD_DATA);else assertFail2(#VALUE,"true",STD_DATA,#X,TestInternal::toStr(X),#Y,TestInternal::toStr(Y));}
88#define ASSERT_FALSE2(VALUE, X, Y) \
89 {if(!VALUE)assertOK(STD_DATA);else assertFail2(#VALUE,"false",STD_DATA,#X,TestInternal::toStr(X),#Y,TestInternal::toStr(Y));}
90
91 void assertTrue2Failed(const char* valueString,
92 const char* testName, const char* file, size_t line,
93 const char* expression1, const char* expression1Value,
94 const char* expression2, const char* expression2Value);
95 template<class A, class B>
96 void assertTrue2(bool value, const char* valueString,
97 const char* testName, const char* file, size_t line,
98 const char* expression1, const A& a,
99 const char* expression2, const B& b,
100 bool printDot) {
101 if (value) {
102 assertSucceeded(printDot);
103 return;
104 }
105
106 stringstream aValue;
107 aValue << a;
108
109 stringstream bValue;
110 bValue << b;
111
112 assertTrue2Failed(valueString, testName, file, line,
113 expression1, aValue.str().c_str(),
114 expression2, bValue.str().c_str());
115 }
116#define ASSERT_TRUE2_SILENT(VALUE, A, B) \
117 TestInternal::assertTrue2(VALUE, #VALUE, __nameOfTest, __FILE__, __LINE__, \
118 #A,A,#B,B, false);
119
120
121 void assertFalse(bool value, const char* condition,
122 const char* testName, const char* file, size_t line,
123 bool printDot);
124#define ASSERT_FALSE(VALUE) \
125 TestInternal::assertFalse(VALUE, #VALUE, __nameOfTest, __FILE__, __LINE__, __printDots)
126#define ASSERT_FALSE_SILENT(VALUE) \
127 TestInternal::assertFalse(VALUE, #VALUE, __nameOfTest, __FILE__, __LINE__, false)
128
129 void assertEqualFailed(const char* a, const char* b,
130 const char* aString, const char* bString,
131 const char* testName, const char* file, size_t line);
132 template<class T1, class T2>
133 void assertEqual(const T1& a, const T2& b,
134 const char* aString, const char* bString,
135 const char* testName, const char* file, size_t line,
136 bool printDot) {
137 if (a == b) {
138 assertSucceeded(printDot);
139 return;
140 }
141
142 stringstream aValue;
143 aValue << a;
144
145 stringstream bValue;
146 bValue << b;
147
148 assertEqualFailed(aValue.str().c_str(), bValue.str().c_str(),
149 aString, bString,
150 testName, file, line);
151 }
152#define ASSERT_EQ(A, B) \
153 TestInternal::assertEqual(A, B, #A, #B, __nameOfTest, __FILE__, __LINE__, __printDots)
154#define ASSERT_EQ_SILENT(A, B) \
155 TestInternal::assertEqual(A, B, #A, #B, __nameOfTest, __FILE__, __LINE__, false)
156
157 void assertNotEqualFailed(const char* a, const char* b,
158 const char* aString, const char* bString,
159 const char* testName, const char* file, size_t line);
160 template<class T1, class T2>
161 void assertNotEqual(const T1& a, const T2& b,
162 const char* aString, const char* bString,
163 const char* testName, const char* file, size_t line,
164 bool printDot) {
165 if (a != b) {
166 assertSucceeded(printDot);
167 return;
168 }
169
170 stringstream aValue;
171 aValue << a;
172
173 stringstream bValue;
174 bValue << b;
175
176 assertNotEqualFailed(aValue.str().c_str(), bValue.str().c_str(),
177 aString, bString,
178 testName, file, line);
179 }
180#define ASSERT_NEQ(A, B) \
181 TestInternal::assertNotEqual(A, B, #A, #B, __nameOfTest, __FILE__, __LINE__, __printDots)
182#define ASSERT_NEQ_SILENT(A, B) \
183 TestInternal::assertNotEqual(A, B, #A, #B, __nameOfTest, __FILE__, __LINE__, false)
184
188 template<class T>
189 ostream& operator<<(ostream& out, const vector<T>& v) {
190 out << " std::vector<>: ";
191 for (typename vector<T>::const_iterator it = v.begin(); it != v.end(); ++it)
192 out << (it == v.begin() ? "" : ", ") << *it;
193 out << '\n';
194 return out;
195 }
196}
197
198#endif
AssertException(const string &str)
Definition asserts.cpp:22
void assertOK(const StdData &data)
Definition asserts.cpp:31
void assertTrue2Failed(const char *valueString, const char *testName, const char *file, size_t line, const char *expression1, const char *expression1Value, const char *expression2, const char *expression2Value)
Definition asserts.cpp:167
void assertFail1(const char *cond, const char *expected, const StdData &data, const char *exp1, string exp1Value)
Definition asserts.cpp:59
void assertTrue2(bool value, const char *valueString, const char *testName, const char *file, size_t line, const char *expression1, const A &a, const char *expression2, const B &b, bool printDot)
Definition asserts.h:96
void assertEqual(const T1 &a, const T2 &b, const char *aString, const char *bString, const char *testName, const char *file, size_t line, bool printDot)
Definition asserts.h:133
void assertTrue(bool value, const char *valueString, const char *testName, const char *file, size_t line, bool printDot)
Definition asserts.cpp:154
void assertFail(const char *cond, const char *expected, const StdData &data)
Definition asserts.cpp:38
void assertFailed(const char *errorMsg, const char *testName, const char *file, size_t line)
Definition asserts.cpp:117
void assertSucceeded(bool printDot)
Definition asserts.cpp:110
void assertFalse(bool value, const char *valueString, const char *testName, const char *file, size_t line, bool printDot)
Definition asserts.cpp:178
void assertNotEqualFailed(const char *a, const char *b, const char *aString, const char *bString, const char *testName, const char *file, size_t line)
Definition asserts.cpp:202
string toStr(const T &t)
Definition asserts.h:47
void assertEqualFailed(const char *a, const char *b, const char *aString, const char *bString, const char *testName, const char *file, size_t line)
Definition asserts.cpp:191
void assertNotEqual(const T1 &a, const T2 &b, const char *aString, const char *bString, const char *testName, const char *file, size_t line, bool printDot)
Definition asserts.h:161
ostream & operator<<(ostream &out, const vector< T > &v)
Prints out a vector.
Definition asserts.h:189
void assertFail2(const char *cond, const char *expected, const StdData &data, const char *exp1, string exp1Value, const char *exp2, string exp2Value)
Definition asserts.cpp:83
const char * file
Definition asserts.h:38
const char * testName
Definition asserts.h:39
StdData(size_t lineParam, const char *fileParam, const char *testNameParam, bool printDotParam)
Definition asserts.h:33