Skip to content

Commit b8cd151

Browse files
committed
Merge pull request Quick#174 from abbeycode/closeTo-NSDate
Add beCloseTo support for NSDate
2 parents 7ff30ca + 64acc0b commit b8cd151

File tree

5 files changed

+69
-4
lines changed

5 files changed

+69
-4
lines changed

Nimble/Matchers/BeCloseTo.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import Foundation
22

33
internal let DefaultDelta = 0.0001
44

5-
internal func isCloseTo(actualValue: Double?, expectedValue: Double, delta: Double, failureMessage: FailureMessage) -> Bool {
5+
internal func isCloseTo(actualValue: NMBDoubleConvertible?, expectedValue: NMBDoubleConvertible, delta: Double, failureMessage: FailureMessage) -> Bool {
66
failureMessage.postfixMessage = "be close to <\(stringify(expectedValue))> (within \(stringify(delta)))"
77
if actualValue != nil {
88
failureMessage.actualValue = "<\(stringify(actualValue!))>"
99
} else {
1010
failureMessage.actualValue = "<nil>"
1111
}
12-
return actualValue != nil && abs(actualValue! - expectedValue) < delta
12+
return actualValue != nil && abs(actualValue!.doubleValue - expectedValue.doubleValue) < delta
1313
}
1414

1515
/// A Nimble matcher that succeeds when a value is close to another. This is used for floating
@@ -28,7 +28,7 @@ public func beCloseTo(expectedValue: Double, within delta: Double = DefaultDelta
2828
/// @see equal
2929
public func beCloseTo(expectedValue: NMBDoubleConvertible, within delta: Double = DefaultDelta) -> NonNilMatcherFunc<NMBDoubleConvertible> {
3030
return NonNilMatcherFunc { actualExpression, failureMessage in
31-
return isCloseTo(try actualExpression.evaluate()?.doubleValue, expectedValue: expectedValue.doubleValue, delta: delta, failureMessage: failureMessage)
31+
return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta, failureMessage: failureMessage)
3232
}
3333
}
3434

Nimble/Matchers/MatcherProtocols.swift

+39-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,45 @@ extension NSArray : NMBOrderedCollection {}
3939
@objc public protocol NMBDoubleConvertible {
4040
var doubleValue: CDouble { get }
4141
}
42-
extension NSNumber : NMBDoubleConvertible { }
42+
extension NSNumber : NMBDoubleConvertible {
43+
}
44+
45+
private let dateFormatter: NSDateFormatter = {
46+
let formatter = NSDateFormatter()
47+
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSSS"
48+
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
49+
50+
return formatter
51+
}()
52+
53+
extension NSDate: NMBDoubleConvertible {
54+
public var doubleValue: CDouble {
55+
get {
56+
return self.timeIntervalSinceReferenceDate
57+
}
58+
}
59+
}
60+
61+
62+
extension NMBDoubleConvertible {
63+
public var stringRepresentation: String {
64+
get {
65+
if let date = self as? NSDate {
66+
return dateFormatter.stringFromDate(date)
67+
}
68+
69+
if let debugStringConvertible = self as? CustomDebugStringConvertible {
70+
return debugStringConvertible.debugDescription
71+
}
72+
73+
if let stringConvertible = self as? CustomStringConvertible {
74+
return stringConvertible.description
75+
}
76+
77+
return ""
78+
}
79+
}
80+
}
4381

4482
/// Protocol for types to support beLessThan(), beLessThanOrEqualTo(),
4583
/// beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers.

Nimble/Utils/Stringers.swift

+7
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@ internal func stringify<T>(value: T) -> String {
4747
return String(value)
4848
}
4949

50+
internal func stringify(value: NMBDoubleConvertible) -> String {
51+
if let value = value as? Double {
52+
return NSString(format: "%.4f", (value)).description
53+
}
54+
return value.stringRepresentation
55+
}
56+
5057
internal func stringify<T>(value: T?) -> String {
5158
if let unboxed = value {
5259
return stringify(unboxed)

NimbleTests/Helpers/utils.swift

+10
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,13 @@ public class NimbleHelper : NSObject {
7575
failsWithErrorMessageForNil(message as String, file: file, line: line, preferOriginalSourceLocation: true, closure: block)
7676
}
7777
}
78+
79+
extension NSDate {
80+
convenience init(dateTimeString:String) {
81+
let dateFormatter = NSDateFormatter()
82+
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
83+
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
84+
let date = dateFormatter.dateFromString(dateTimeString)!
85+
self.init(timeInterval:0, sinceDate:date)
86+
}
87+
}

NimbleTests/Matchers/BeCloseToTest.swift

+10
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ class BeCloseToTest: XCTestCase {
3030
}
3131
}
3232

33+
func testBeCloseToWithNSDate() {
34+
expect(NSDate(dateTimeString: "2015-08-26 11:43:00")).to(beCloseTo(NSDate(dateTimeString: "2015-08-26 11:43:05"), within: 10))
35+
36+
failsWithErrorMessage("expected to not be close to <2015-08-26 11:43:00.0050> (within 0.0040), got <2015-08-26 11:43:00.0000>") {
37+
38+
let expectedDate = NSDate(dateTimeString: "2015-08-26 11:43:00").dateByAddingTimeInterval(0.005)
39+
expect(NSDate(dateTimeString: "2015-08-26 11:43:00")).toNot(beCloseTo(expectedDate, within: 0.004))
40+
}
41+
}
42+
3343
func testBeCloseToOperator() {
3444
expect(1.2) 1.2001
3545
expect(1.2 as CDouble) 1.2001

0 commit comments

Comments
 (0)