-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtestsunit.h
More file actions
134 lines (113 loc) · 2.92 KB
/
testsunit.h
File metadata and controls
134 lines (113 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
//
// testsunit.h
// xcode5sample
//
// Created by Loïc Oudot on 10/01/2014.
// Copyright (c) 2014 java4cpp. All rights reserved.
//
#ifndef xcode5sample_testsunit_h
#define xcode5sample_testsunit_h
#include <stdexcept>
#include <sstream>
#include <math.h>
template<typename T>
class Assert
{
private:
T _actual;
public:
Assert(T actual) : _actual(actual) {}
void isEqualTo(T expected) {
if (expected != _actual) {
std::ostringstream oss;
oss << std::endl << "Error: expected " << expected << ", but was " << _actual;
throw std::runtime_error(oss.str());
}
}
void isNotEqualTo(T expected) {
if (expected == _actual) {
std::ostringstream oss;
oss << std::endl << "Error: expected " << _actual << ", not to be equal to " << expected;
throw std::runtime_error(oss.str());
}
}
void isFalse() {
isEqualTo(false);
}
void isTrue() {
isEqualTo(true);
}
void isNull() {
isEqualTo(NULL);
}
void isNotNull() {
isNotEqualTo(NULL);
}
};
template<>
inline void Assert<double>::isEqualTo(double expected) {
if (fabs(expected - _actual) > 1e-5) {
std::ostringstream oss;
oss << std::endl << "Error: expected " << expected << ", but was " << _actual;
throw std::runtime_error(oss.str());
}
}
template<typename T>
std::vector<T> make_vector(int size, ...) {
std::vector<T> result;
va_list ap;
va_start(ap, size);
for(int j = 0; j < size; j++)
result.push_back(va_arg(ap, T));
va_end(ap);
return result;
}
template<typename T>
std::ostream& operator<<(std::ostream& str, std::vector<T>& vector)
{
std::string sep = "[";
for(typename std::vector<T>::const_iterator it = vector.begin(); it != vector.end(); ++it) {
str << sep << *it;
sep = ", ";
}
str << ']';
return str;
}
template<typename T>
class VectorAssert
{
private:
typedef std::vector<T> type;
type _actual;
public:
VectorAssert(std::vector<T> actual) : _actual(actual) {}
void hasSize(int size) {
if (_actual.size() != size) {
std::ostringstream oss;
oss << std::endl << "Error: expected size of " << size << ", but was " << _actual.size();
throw std::runtime_error(oss.str());
}
}
void containsExactly(int size, ...) {
va_list ap;
std::vector<T> expected;
va_start(ap, size);
for(int j = 0; j < size; j++)
expected.push_back(va_arg(ap, T));
va_end(ap);
if (_actual != expected) {
std::ostringstream oss;
oss << std::endl << "Error: expected " << expected << ", but was " << _actual;
throw std::runtime_error(oss.str());
}
}
};
template<typename T>
Assert<T> assertThat(T expected) {
return Assert<T>(expected);
}
template<typename T>
VectorAssert<T> assertThat(std::vector<T> expected) {
return VectorAssert<T>(expected);
}
#endif