Skip to content

Commit 5f4d59b

Browse files
committed
Refactor Result and more specs
1 parent 897bcab commit 5f4d59b

File tree

11 files changed

+85
-53
lines changed

11 files changed

+85
-53
lines changed

include/class_description.hpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ template <class T>
7575
using ClassContext = ClassDescription<T>;
7676

7777
template <class T>
78-
Result ClassDescription<T>::context(T subject,
79-
std::function<void(ClassDescription&)> body) {
78+
Result ClassDescription<T>::context(
79+
T subject, std::function<void(ClassDescription&)> body) {
8080
ClassContext<T> context(subject, body);
8181
context.set_parent(this);
8282
context.before_eaches = this->before_eaches;
@@ -85,13 +85,14 @@ Result ClassDescription<T>::context(T subject,
8585
}
8686

8787
template <class T>
88-
Result ClassDescription<T>::context(T& subject,
89-
std::function<void(ClassDescription&)> body) {
88+
Result ClassDescription<T>::context(
89+
T& subject, std::function<void(ClassDescription&)> body) {
9090
return context(subject, body);
9191
}
9292

9393
template <class T>
94-
Result ClassDescription<T>::context(std::function<void(ClassDescription&)> body) {
94+
Result ClassDescription<T>::context(
95+
std::function<void(ClassDescription&)> body) {
9596
ClassContext<T> context(body);
9697
context.set_parent(this);
9798
context.before_eaches = this->before_eaches;
@@ -118,7 +119,7 @@ Result Description::context(T subject,
118119

119120
template <class T, typename U>
120121
Result Description::context(std::initializer_list<U> init_list,
121-
std::function<void(ClassDescription<T>&)> body) {
122+
std::function<void(ClassDescription<T>&)> body) {
122123
ClassContext<T> context(T(init_list), body);
123124
context.set_parent(this);
124125
context.before_eaches = this->before_eaches;
@@ -149,7 +150,7 @@ Result Description::context(std::initializer_list<U> init_list,
149150
*/
150151
template <class T>
151152
Result ClassDescription<T>::it(std::string name,
152-
std::function<void(ItCd<T>&)> body) {
153+
std::function<void(ItCd<T>&)> body) {
153154
ItCd<T> it(*this, this->subject, name, body);
154155
Result result = it.run();
155156
exec_after_eaches();
@@ -192,7 +193,7 @@ Result ClassDescription<T>::run() {
192193
std::cout << padding() << descr << std::endl;
193194
body(*this);
194195
std::cout << std::endl;
195-
return Result(this->get_status());
196+
return this->get_status() ? Result::success : Result::failure;
196197
}
197198

198199
template <class T>
@@ -210,7 +211,7 @@ Result ItCd<T>::run() {
210211
body(*this);
211212
auto cd = static_cast<ClassDescription<T>*>(this->get_parent());
212213
cd->reset_lets();
213-
return Result(this->get_status());
214+
return this->get_status() ? Result::success : Result::failure;
214215
}
215216

216217
#endif /* CLASS_DESCRIPTION_H */

include/cppspec.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55
#include "class_description.hpp"
66

7-
#define _ [=](auto &self)
7+
#define _ [=](auto &self) mutable
88
#define $ [](auto &self)
99
#define it self.it
1010
#define context self.template context

include/description.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class Description : public Runnable {
7575
typedef Description Context;
7676

7777
Result Description::context(std::string name,
78-
std::function<void(Description &)> body) {
78+
std::function<void(Description &)> body) {
7979
Context context(*this, name, body);
8080
context.before_eaches = this->before_eaches;
8181
context.after_eaches = this->after_eaches;
@@ -149,7 +149,7 @@ Result Description::run() {
149149
body(*this);
150150
for (auto a : after_alls) a();
151151
std::cout << std::endl;
152-
return Result(this->get_status());
152+
return this->get_status() ? Result::success : Result::failure;
153153
}
154154

155155
void Description::reset_lets() {
@@ -197,7 +197,7 @@ Result ItD::run() {
197197
auto parent = static_cast<Description *>(this->get_parent());
198198
parent->reset_lets();
199199

200-
return Result(this->get_status());
200+
return this->get_status() ? Result::success : Result::failure;
201201
}
202202

203203
#endif /* DESCRIPTION_H */

include/expectations/expectation.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ Expectation<A> &Expectation<A>::not_() {
135135
*/
136136
template <typename A>
137137
Expectation<A> &Expectation<A>::ignore() {
138+
std::cout << "IGNORE: ";
138139
this->ignore_failure = true;
139140
return *this;
140141
}
@@ -174,7 +175,7 @@ Result Expectation<A>::to_be_null(std::string msg) {
174175
*/
175176
template <typename A>
176177
Result Expectation<A>::to_be_true(std::string msg) {
177-
return to_be([](A t) -> bool { return true; }, msg);
178+
return to_be([](A t) { return static_cast<bool>(t); }, msg);
178179
}
179180

180181
/**
@@ -186,7 +187,7 @@ Result Expectation<A>::to_be_true(std::string msg) {
186187
*/
187188
template <typename A>
188189
Result Expectation<A>::to_be_false(std::string msg) {
189-
return to_be([](A t) -> bool { return true; }, msg);
190+
return not_().to_be_true(msg);
190191
}
191192

192193
/**

include/expectations/handler.hpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Result handle_failure(Matcher &matcher, std::string message) {
2222
message = matcher.failure_message();
2323
}
2424
handle_failure_common(matcher, message);
25-
return Result::failure(message);
25+
return Result::failure_with(message);
2626
}
2727

2828
template <typename Matcher>
@@ -31,7 +31,7 @@ Result handle_negated_failure(Matcher &matcher, std::string message) {
3131
message = matcher.failure_message_when_negated();
3232
}
3333
handle_failure_common(matcher, message);
34-
return Result::failure(message);
34+
return Result::failure_with(message);
3535
}
3636
}
3737

@@ -52,21 +52,18 @@ Result PositiveExpectationHandler::handle_matcher(Matcher &matcher,
5252
std::string message) {
5353
// TODO: handle expectation failure here
5454
bool matched = matcher.match();
55-
if (!matched) {
56-
return ExpectationHelper::handle_failure(matcher, message);
57-
}
58-
return Result::success();
55+
56+
return !matched ? ExpectationHelper::handle_failure(matcher, message)
57+
: Result::success;
5958
}
6059

6160
template <typename A, class Matcher>
6261
Result NegativeExpectationHandler::handle_matcher(Matcher &matcher,
6362
std::string message) {
6463
// TODO: handle expectation failure here
6564
bool matched = matcher.negated_match();
66-
if (!matched) {
67-
return ExpectationHelper::handle_negated_failure(matcher, message);
68-
}
69-
return Result::success();
65+
return !matched ? ExpectationHelper::handle_negated_failure(matcher, message)
66+
: Result::success;
7067
}
7168
} // Expectations
7269

include/it.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
class ItExpBase : public ItBase {
66
public:
7+
ItExpBase(ItExpBase const &copy) : ItBase(copy){};
78
ItExpBase(Child &parent) : ItBase(parent){};
89
ItExpBase(Child &parent, std::string descr) : ItBase(parent, descr){};
910
template <class U>

include/it_base.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class ItBase : public Runnable {
1717

1818
public:
1919
ItBase() = delete;
20+
ItBase(ItBase const &copy) : Runnable(copy.get_parent()), descr(copy.descr){};
2021

2122
/**
2223
* @brief Create an ItBase without an explicit description

include/let.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ class LetBase : public Runnable {
1212
LetBase(const LetBase& copy) : Runnable(), delivered(copy.delivered){};
1313
void reset() { delivered = false; }
1414
bool has_result() { return delivered; }
15-
Result run() { return false; }
1615
};
1716

1817
template <typename T>
@@ -48,7 +47,7 @@ Result Let<T>::run() {
4847
result = body();
4948
delivered = true;
5049
}
51-
return Result::success();
50+
return Result::success;
5251
}
5352

5453
/**

include/matchers/basematcher.hpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ std::string BaseMatcher<A, E>::description() {
8282

8383
template <typename A, typename E>
8484
Result BaseMatcher<A, E>::run() {
85-
Result matched;
8685
ItBase *par = static_cast<ItBase *>(this->get_parent());
8786

8887
// If we need a description for our test, generate it
@@ -93,13 +92,10 @@ Result BaseMatcher<A, E>::run() {
9392
<< std::endl;
9493
}
9594

96-
if (expectation.get_sign()) {
97-
matched =
98-
PositiveExpectationHandler::handle_matcher<A>(*this, this->message);
99-
} else {
100-
matched =
101-
NegativeExpectationHandler::handle_matcher<A>(*this, this->message);
102-
}
95+
Result matched =
96+
expectation.get_sign()
97+
? PositiveExpectationHandler::handle_matcher<A>(*this, this->message)
98+
: NegativeExpectationHandler::handle_matcher<A>(*this, this->message);
10399

104100
// If our items didn't match, we obviously failed.
105101
// Only report the failure if we aren't actively ignoring it.

include/runnable.hpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,21 +74,30 @@ class Child {
7474
}
7575
};
7676

77-
struct Result {
78-
bool value = false;
77+
class Result {
78+
bool value;
7979
std::string failure_message = "";
8080
Result(){};
8181
Result(bool value, std::string failure_message = "")
8282
: value(value), failure_message(failure_message){};
8383

84+
public:
85+
Result(Result const& copy)
86+
: value(copy.value), failure_message(copy.failure_message) {}
8487
operator bool() const { return value; }
85-
86-
static Result success() { return Result(true); }
87-
static Result failure(std::string failure_message = "") {
88+
static Result success;
89+
static Result failure;
90+
static Result failure_with(std::string failure_message) {
8891
return Result(false, failure_message);
8992
}
93+
94+
std::string get_message() { return failure_message; }
95+
bool get_status() { return value; }
9096
};
9197

98+
Result Result::success = Result(true);
99+
Result Result::failure = Result(false);
100+
92101
/**
93102
* @brief Abstract base class for executable objects
94103
*/

0 commit comments

Comments
 (0)