Skip to content

Commit d7471bb

Browse files
committed
Merge branch '7.x-branch'
# Conflicts: # Sources/Nimble/Matchers/BeginWith.swift # Sources/Nimble/Matchers/Contain.swift # Sources/Nimble/Matchers/EndWith.swift
2 parents 471f58e + 765ab9c commit d7471bb

28 files changed

+215
-224
lines changed

Nimble.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = "Nimble"
3-
s.version = "7.1.2"
3+
s.version = "7.1.3"
44
s.summary = "A Matcher Framework for Swift and Objective-C"
55
s.description = <<-DESC
66
Use Nimble to express the expected outcomes of Swift or Objective-C expressions. Inspired by Cedar.

Sources/Nimble/Adapters/NMBExpectation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Foundation
44

55
private func from(objcPredicate: NMBPredicate) -> Predicate<NSObject> {
66
return Predicate { actualExpression in
7-
let result = objcPredicate.satisfies(({ try! actualExpression.evaluate() }),
7+
let result = objcPredicate.satisfies(({ try actualExpression.evaluate() }),
88
location: actualExpression.location)
99
return result.toSwift()
1010
}

Sources/Nimble/Adapters/NMBObjCMatcher.swift

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import Foundation
33
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
44

55
// swiftlint:disable line_length
6-
public typealias MatcherBlock = (_ actualExpression: Expression<NSObject>, _ failureMessage: FailureMessage) -> Bool
7-
public typealias FullMatcherBlock = (_ actualExpression: Expression<NSObject>, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) -> Bool
6+
public typealias MatcherBlock = (_ actualExpression: Expression<NSObject>, _ failureMessage: FailureMessage) throws -> Bool
7+
public typealias FullMatcherBlock = (_ actualExpression: Expression<NSObject>, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) throws -> Bool
88
// swiftlint:enable line_length
99

1010
public class NMBObjCMatcher: NSObject, NMBMatcher {
@@ -26,7 +26,7 @@ public class NMBObjCMatcher: NSObject, NMBMatcher {
2626

2727
public convenience init(canMatchNil: Bool, matcher: @escaping MatcherBlock) {
2828
self.init(canMatchNil: canMatchNil, matcher: matcher, notMatcher: ({ actualExpression, failureMessage in
29-
return !matcher(actualExpression, failureMessage)
29+
return try !matcher(actualExpression, failureMessage)
3030
}))
3131
}
3232

@@ -36,9 +36,9 @@ public class NMBObjCMatcher: NSObject, NMBMatcher {
3636

3737
public convenience init(canMatchNil: Bool, matcher: @escaping FullMatcherBlock) {
3838
self.init(canMatchNil: canMatchNil, matcher: ({ actualExpression, failureMessage in
39-
return matcher(actualExpression, failureMessage, false)
39+
return try matcher(actualExpression, failureMessage, false)
4040
}), notMatcher: ({ actualExpression, failureMessage in
41-
return matcher(actualExpression, failureMessage, true)
41+
return try matcher(actualExpression, failureMessage, true)
4242
}))
4343
}
4444

@@ -59,9 +59,14 @@ public class NMBObjCMatcher: NSObject, NMBMatcher {
5959

6060
public func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool {
6161
let expr = Expression(expression: actualBlock, location: location)
62-
let result = _match(
63-
expr,
64-
failureMessage)
62+
let result: Bool
63+
do {
64+
result = try _match(expr, failureMessage)
65+
} catch let error {
66+
failureMessage.stringValue = "unexpected error thrown: <\(error)>"
67+
return false
68+
}
69+
6570
if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) {
6671
return result
6772
} else {
@@ -71,9 +76,14 @@ public class NMBObjCMatcher: NSObject, NMBMatcher {
7176

7277
public func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool {
7378
let expr = Expression(expression: actualBlock, location: location)
74-
let result = _doesNotMatch(
75-
expr,
76-
failureMessage)
79+
let result: Bool
80+
do {
81+
result = try _doesNotMatch(expr, failureMessage)
82+
} catch let error {
83+
failureMessage.stringValue = "unexpected error thrown: <\(error)>"
84+
return false
85+
}
86+
7787
if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) {
7888
return result
7989
} else {

Sources/Nimble/Matchers/AllPass.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ extension NMBObjCMatcher {
6868
@objc public class func allPassMatcher(_ matcher: NMBMatcher) -> NMBPredicate {
6969
return NMBPredicate { actualExpression in
7070
let location = actualExpression.location
71-
let actualValue = try! actualExpression.evaluate()
71+
let actualValue = try actualExpression.evaluate()
7272
var nsObjects = [NSObject]()
7373

7474
var collectionIsUsable = true
@@ -99,7 +99,7 @@ extension NMBObjCMatcher {
9999
let expr = Expression(expression: ({ nsObjects }), location: location)
100100
let pred: Predicate<[NSObject]> = createPredicate(Predicate { expr in
101101
if let predicate = matcher as? NMBPredicate {
102-
return predicate.satisfies(({ try! expr.evaluate() }), location: expr.location).toSwift()
102+
return predicate.satisfies(({ try expr.evaluate() }), location: expr.location).toSwift()
103103
} else {
104104
let failureMessage = FailureMessage()
105105
let result = matcher.matches(
@@ -114,7 +114,7 @@ extension NMBObjCMatcher {
114114
)
115115
}
116116
})
117-
return try! pred.satisfies(expr).toObjectiveC()
117+
return try pred.satisfies(expr).toObjectiveC()
118118
}
119119
}
120120
}

Sources/Nimble/Matchers/BeAKindOf.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ public func beAKindOf(_ expectedClass: AnyClass) -> Predicate<NSObject> {
5959

6060
extension NMBObjCMatcher {
6161
@objc public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBMatcher {
62-
return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in
63-
return try! beAKindOf(expected).matches(actualExpression, failureMessage: failureMessage)
62+
return NMBPredicate { actualExpression in
63+
return try beAKindOf(expected).satisfies(actualExpression).toObjectiveC()
6464
}
6565
}
6666
}

Sources/Nimble/Matchers/BeAnInstanceOf.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ public func beAnInstanceOf(_ expectedClass: AnyClass) -> Predicate<NSObject> {
4848
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
4949
extension NMBObjCMatcher {
5050
@objc public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBMatcher {
51-
return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in
52-
return try! beAnInstanceOf(expected).matches(actualExpression, failureMessage: failureMessage)
51+
return NMBPredicate { actualExpression in
52+
return try beAnInstanceOf(expected).satisfies(actualExpression).toObjectiveC()
5353
}
5454
}
5555
}

Sources/Nimble/Matchers/BeCloseTo.swift

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,13 @@ public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher {
5252
})
5353
let expr = Expression(expression: actualBlock, location: location)
5454
let matcher = beCloseTo(self._expected, within: self._delta)
55-
return try! matcher.matches(expr, failureMessage: failureMessage)
55+
56+
do {
57+
return try matcher.matches(expr, failureMessage: failureMessage)
58+
} catch let error {
59+
failureMessage.stringValue = "unexpected error thrown: <\(error)>"
60+
return false
61+
}
5662
}
5763

5864
@objc public func doesNotMatch(_ actualExpression: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool {
@@ -61,7 +67,13 @@ public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher {
6167
})
6268
let expr = Expression(expression: actualBlock, location: location)
6369
let matcher = beCloseTo(self._expected, within: self._delta)
64-
return try! matcher.doesNotMatch(expr, failureMessage: failureMessage)
70+
71+
do {
72+
return try matcher.doesNotMatch(expr, failureMessage: failureMessage)
73+
} catch let error {
74+
failureMessage.stringValue = "unexpected error thrown: <\(error)>"
75+
return false
76+
}
6577
}
6678

6779
@objc public var within: (CDouble) -> NMBObjCBeCloseToMatcher {

Sources/Nimble/Matchers/BeEmpty.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,14 @@ extension NMBObjCMatcher {
6666
@objc public class func beEmptyMatcher() -> NMBPredicate {
6767
return NMBPredicate { actualExpression in
6868
let location = actualExpression.location
69-
let actualValue = try! actualExpression.evaluate()
69+
let actualValue = try actualExpression.evaluate()
7070

7171
if let value = actualValue as? NMBCollection {
7272
let expr = Expression(expression: ({ value as NMBCollection }), location: location)
73-
return try! beEmpty().satisfies(expr).toObjectiveC()
73+
return try beEmpty().satisfies(expr).toObjectiveC()
7474
} else if let value = actualValue as? NSString {
7575
let expr = Expression(expression: ({ value as String }), location: location)
76-
return try! beEmpty().satisfies(expr).toObjectiveC()
76+
return try beEmpty().satisfies(expr).toObjectiveC()
7777
} else if let actualValue = actualValue {
7878
// swiftlint:disable:next line_length
7979
let badTypeErrorMsg = "be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings)"

Sources/Nimble/Matchers/BeGreaterThan.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ public func beGreaterThan<T: Comparable>(_ expectedValue: T?) -> Predicate<T> {
1313

1414
/// A Nimble matcher that succeeds when the actual value is greater than the expected value.
1515
public func beGreaterThan(_ expectedValue: NMBComparable?) -> Predicate<NMBComparable> {
16-
return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in
17-
failureMessage.postfixMessage = "be greater than <\(stringify(expectedValue))>"
16+
let errorMessage = "be greater than <\(stringify(expectedValue))>"
17+
return Predicate.simple(errorMessage) { actualExpression in
1818
let actualValue = try actualExpression.evaluate()
1919
let matches = actualValue != nil
2020
&& actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedDescending
21-
return matches
22-
}.requireNonNil
21+
return PredicateStatus(bool: matches)
22+
}
2323
}
2424

2525
public func ><T: Comparable>(lhs: Expectation<T>, rhs: T) {
@@ -35,7 +35,7 @@ extension NMBObjCMatcher {
3535
@objc public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher {
3636
return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in
3737
let expr = actualExpression.cast { $0 as? NMBComparable }
38-
return try! beGreaterThan(expected).matches(expr, failureMessage: failureMessage)
38+
return try beGreaterThan(expected).matches(expr, failureMessage: failureMessage)
3939
}
4040
}
4141
}

Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@ import Foundation
33
/// A Nimble matcher that succeeds when the actual value is greater than
44
/// or equal to the expected value.
55
public func beGreaterThanOrEqualTo<T: Comparable>(_ expectedValue: T?) -> Predicate<T> {
6-
return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in
7-
failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>"
6+
let message = "be greater than or equal to <\(stringify(expectedValue))>"
7+
return Predicate.simple(message) { actualExpression in
88
let actualValue = try actualExpression.evaluate()
99
if let actual = actualValue, let expected = expectedValue {
10-
return actual >= expected
10+
return PredicateStatus(bool: actual >= expected)
1111
}
12-
return false
13-
}.requireNonNil
12+
return .fail
13+
}
1414
}
1515

1616
/// A Nimble matcher that succeeds when the actual value is greater than
1717
/// or equal to the expected value.
1818
public func beGreaterThanOrEqualTo<T: NMBComparable>(_ expectedValue: T?) -> Predicate<T> {
19-
return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in
20-
failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>"
19+
let message = "be greater than or equal to <\(stringify(expectedValue))>"
20+
return Predicate.simple(message) { actualExpression in
2121
let actualValue = try actualExpression.evaluate()
2222
let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedAscending
23-
return matches
24-
}.requireNonNil
23+
return PredicateStatus(bool: matches)
24+
}
2525
}
2626

2727
public func >=<T: Comparable>(lhs: Expectation<T>, rhs: T) {
@@ -37,7 +37,7 @@ extension NMBObjCMatcher {
3737
@objc public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher {
3838
return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in
3939
let expr = actualExpression.cast { $0 as? NMBComparable }
40-
return try! beGreaterThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage)
40+
return try beGreaterThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage)
4141
}
4242
}
4343
}

0 commit comments

Comments
 (0)