Skip to content

Commit beff303

Browse files
committed
Refactor beSuccess/beFailure matchers
1 parent 494cf56 commit beff303

File tree

2 files changed

+61
-39
lines changed

2 files changed

+61
-39
lines changed
Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,55 @@
11
import Foundation
22

3+
/// A Nimble matcher for Result that succeeds when the actual value is success.
34
///
4-
/// A Nimble matcher for Result that succeeds when the actual value is success
5-
///
6-
/// You can pass a closure to do any arbitrary custom matching
7-
/// to the value inside result. The closure only gets called when result is success.
8-
public func beSuccess<T>(test: ((T) -> Void)? = nil) -> Predicate<Result<T, Error>> {
9-
return Predicate.define("be <success>") { expression, message in
10-
guard case let .success(value)? = try expression.evaluate()
11-
else {
5+
/// You can pass a closure to do any arbitrary custom matching to the value inside result.
6+
/// The closure only gets called when the result is success.
7+
public func beSuccess<Success, Failure>(
8+
test: ((Success) -> Void)? = nil
9+
) -> Predicate<Result<Success, Failure>> {
10+
return Predicate.define("be <success(\(Success.self))>") { expression, message in
11+
guard case let .success(value)? = try expression.evaluate() else {
1212
return PredicateResult(status: .doesNotMatch, message: message)
1313
}
14-
test?(value)
15-
return PredicateResult(status: .matches, message: message)
14+
15+
var matches = true
16+
if let test = test {
17+
let assertions = gatherFailingExpectations {
18+
test(value)
19+
}
20+
let messages = assertions.map { $0.message }
21+
if !messages.isEmpty {
22+
matches = false
23+
}
24+
}
25+
26+
return PredicateResult(bool: matches, message: message)
1627
}
1728
}
1829

30+
/// A Nimble matcher for Result that succeeds when the actual value is failure.
1931
///
20-
/// A Nimble matcher for Result that succeeds when the actual value is failure
21-
///
22-
/// You can pass a closure to do custom matching for the error inside result.
23-
/// The closure only gets called when result is failure.
24-
public func beFailure<T>(test: ((Error) -> Void)? = nil) -> Predicate<Result<T, Error>> {
25-
return Predicate.define("be <failure>") { expression, message in
26-
guard case let .failure(error)? = try expression.evaluate()
27-
else {
32+
/// You can pass a closure to do any arbitrary custom matching to the error inside result.
33+
/// The closure only gets called when the result is failure.
34+
public func beFailure<Success, Failure>(
35+
test: ((Failure) -> Void)? = nil
36+
) -> Predicate<Result<Success, Failure>> {
37+
return Predicate.define("be <failure(\(Failure.self))>") { expression, message in
38+
guard case let .failure(error)? = try expression.evaluate() else {
2839
return PredicateResult(status: .doesNotMatch, message: message)
2940
}
30-
test?(error)
31-
return PredicateResult(status: .matches, message: message)
41+
42+
var matches = true
43+
if let test = test {
44+
let assertions = gatherFailingExpectations {
45+
test(error)
46+
}
47+
let messages = assertions.map { $0.message }
48+
if !messages.isEmpty {
49+
matches = false
50+
}
51+
}
52+
53+
return PredicateResult(bool: matches, message: message)
3254
}
3355
}

Tests/NimbleTests/Matchers/BeResultTest.swift

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,53 +7,53 @@ private struct StubError: Error, CustomDebugStringConvertible {
77

88
final class BeSuccessTest: XCTestCase {
99
func testPositiveMatch() {
10-
let successfulResult: Result<Int, Error> = .success(1)
11-
expect(successfulResult).to(beSuccess())
10+
let result: Result<Int, Error> = .success(1)
11+
expect(result).to(beSuccess())
1212
}
1313

1414
func testPositiveMatchWithValueTesting() {
1515
let stubValue = 1
16-
let successfulResult: Result<Int, Error> = .success(stubValue)
17-
expect(successfulResult).to(beSuccess { value in
16+
let result: Result<Int, Error> = .success(stubValue)
17+
expect(result).to(beSuccess { value in
1818
expect(value).to(equal(stubValue))
1919
})
2020
}
2121

2222
func testNegativeMatch() {
23-
let failureResult: Result<Int, Error> = .failure(StubError())
24-
expect(failureResult).toNot(beSuccess())
23+
let result: Result<Int, Error> = .failure(StubError())
24+
expect(result).toNot(beSuccess())
2525
}
2626

2727
func testExpectationFailureMessage() {
28-
let failureResult: Result<Int, Error> = .failure(StubError())
29-
failsWithErrorMessage("expected to be <success>, got <failure(StubError)>") {
30-
expect(failureResult).to(beSuccess())
28+
failsWithErrorMessage("expected to be <success(Int)>, got <failure(StubError)>") {
29+
let result: Result<Int, Error> = .failure(StubError())
30+
expect(result).to(beSuccess())
3131
}
3232
}
3333
}
3434

3535
final class BeFailureTest: XCTestCase {
3636
func testPositiveMatch() {
37-
let failureResult: Result<Int, Error> = .failure(StubError())
38-
expect(failureResult).to(beFailure())
37+
let result: Result<Int, Error> = .failure(StubError())
38+
expect(result).to(beFailure())
3939
}
4040

4141
func testPositiveMatchWithValueTesting() {
42-
let failureResult: Result<Int, Error> = .failure(StubError())
43-
expect(failureResult).to(beFailure { value in
44-
expect(value).to(matchError(StubError.self))
42+
let result: Result<Int, Error> = .failure(StubError())
43+
expect(result).to(beFailure { error in
44+
expect(error).to(matchError(StubError.self))
4545
})
4646
}
4747

4848
func testNegativeMatch() {
49-
let successfulResult: Result<Int, Error> = .success(1)
50-
expect(successfulResult).toNot(beFailure())
49+
let result: Result<Int, Error> = .success(1)
50+
expect(result).toNot(beFailure())
5151
}
5252

5353
func testExpectationFailureMessage() {
54-
let successfulResult: Result<Int, Error> = .success(1)
55-
failsWithErrorMessage("expected to be <failure>, got <success(1)>") {
56-
expect(successfulResult).to(beFailure())
54+
failsWithErrorMessage("expected to be <failure(Error)>, got <success(1)>") {
55+
let result: Result<Int, Error> = .success(1)
56+
expect(result).to(beFailure())
5757
}
5858
}
5959
}

0 commit comments

Comments
 (0)