Skip to content

Commit 0c69d1a

Browse files
committed
Better assertion failure messages in the fuzzy matching.
1 parent b342e5f commit 0c69d1a

File tree

1 file changed

+25
-21
lines changed

1 file changed

+25
-21
lines changed

TestFoundation/TestDateIntervalFormatter.swift

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#endif
1717

1818
extension String {
19-
func containsInOrder(requiresLastToBeAtEnd: Bool = false, _ substrings: String...) -> Bool {
19+
func containsInOrder(requiresLastToBeAtEnd: Bool = false, _ substrings: [String]) -> Bool {
2020
var foundRange: Range<String.Index> = startIndex ..< startIndex
2121
for substring in substrings {
2222
if let newRange = range(of: substring, options: [], range: foundRange.upperBound..<endIndex, locale: nil) {
@@ -32,6 +32,10 @@ extension String {
3232
return true
3333
}
3434
}
35+
36+
func assertContainsInOrder(requiresLastToBeAtEnd: Bool = false, _ substrings: String...) {
37+
XCTAssert(containsInOrder(requiresLastToBeAtEnd: requiresLastToBeAtEnd, substrings), "String '\(self)' (must end with: \(requiresLastToBeAtEnd)) does not contain in sequence: \(substrings)")
38+
}
3539
}
3640

3741
class TestDateIntervalFormatter: XCTestCase {
@@ -58,51 +62,51 @@ class TestDateIntervalFormatter: XCTestCase {
5862
let newer = Date(timeIntervalSinceReferenceDate: 3e9)
5963

6064
let result = formatter.string(from: older, to: newer)
61-
XCTAssert(result.containsInOrder("January 1", "2001", "12:00:00 AM", "Greenwich Mean Time",
62-
"January 25", "2096", "5:20:00 AM", "Greenwich Mean Time"))
65+
result.assertContainsInOrder("January 1", "2001", "12:00:00 AM", "Greenwich Mean Time",
66+
"January 25", "2096", "5:20:00 AM", "Greenwich Mean Time")
6367
}
6468

6569
func testStringFromDateToDateAcrossThreeMillionSeconds() {
6670
let older = Date(timeIntervalSinceReferenceDate: 0)
6771
let newer = Date(timeIntervalSinceReferenceDate: 3e6)
6872

6973
let result = formatter.string(from: older, to: newer)
70-
XCTAssert(result.containsInOrder("January 1", "2001", "12:00:00 AM", "Greenwich Mean Time",
71-
"February 4", "2001", "5:20:00 AM", "Greenwich Mean Time"))
74+
result.assertContainsInOrder("January 1", "2001", "12:00:00 AM", "Greenwich Mean Time",
75+
"February 4", "2001", "5:20:00 AM", "Greenwich Mean Time")
7276
}
7377

7478
func testStringFromDateToDateAcrossThreeBillionSecondsReversed() {
7579
let older = Date(timeIntervalSinceReferenceDate: 0)
7680
let newer = Date(timeIntervalSinceReferenceDate: 3e9)
7781

7882
let result = formatter.string(from: older, to: newer)
79-
XCTAssert(result.containsInOrder("January 25", "2096", "5:20:00 AM", "Greenwich Mean Time",
80-
"January 1", "2001", "12:00:00 AM", "Greenwich Mean Time"))
83+
result.assertContainsInOrder("January 25", "2096", "5:20:00 AM", "Greenwich Mean Time",
84+
"January 1", "2001", "12:00:00 AM", "Greenwich Mean Time")
8185
}
8286

8387
func testStringFromDateToDateAcrossThreeMillionSecondsReversed() {
8488
let older = Date(timeIntervalSinceReferenceDate: 0)
8589
let newer = Date(timeIntervalSinceReferenceDate: 3e6)
8690

8791
let result = formatter.string(from: older, to: newer)
88-
XCTAssert(result.containsInOrder("February 4", "2001", "5:20:00 AM", "Greenwich Mean Time",
89-
"January 1", "2001", "12:00:00 AM", "Greenwich Mean Time"))
92+
result.assertContainsInOrder("February 4", "2001", "5:20:00 AM", "Greenwich Mean Time",
93+
"January 1", "2001", "12:00:00 AM", "Greenwich Mean Time")
9094
}
9195

9296
func testStringFromDateToSameDate() {
9397
let date = Date(timeIntervalSinceReferenceDate: 3e6)
9498

9599
// For a range from a date to itself, we represent the date only once, with no interdate separator.
96100
let result = formatter.string(from: date, to: date)
97-
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "February 4", "2001", "5:20:00 AM", "Greenwich Mean Time"))
101+
result.assertContainsInOrder(requiresLastToBeAtEnd: true, "February 4", "2001", "5:20:00 AM", "Greenwich Mean Time")
98102
}
99103

100104
func testStringFromDateIntervalAcrossThreeMillionSeconds() throws {
101105
let interval = DateInterval(start: Date(timeIntervalSinceReferenceDate: 0), duration: 3e6)
102106

103107
let result = try formatter.string(from: interval).unwrapped()
104-
XCTAssert(result.containsInOrder("January 1", "2001", "12:00:00 AM", "Greenwich Mean Time",
105-
"February 4", "2001", "5:20:00 AM", "Greenwich Mean Time"))
108+
result.assertContainsInOrder("January 1", "2001", "12:00:00 AM", "Greenwich Mean Time",
109+
"February 4", "2001", "5:20:00 AM", "Greenwich Mean Time")
106110
}
107111

108112
func testStringFromDateToDateAcrossOneWeek() {
@@ -113,15 +117,15 @@ class TestDateIntervalFormatter: XCTestCase {
113117
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 7)
114118

115119
let result = formatter.string(from: older, to: newer)
116-
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "8"))
120+
result.assertContainsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "8")
117121
}
118122

119123
do {
120124
let older = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 28)
121125
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 34)
122126

123127
let result = formatter.string(from: older, to: newer)
124-
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "29", "Feb", "4"))
128+
result.assertContainsInOrder(requiresLastToBeAtEnd: true, "Jan", "29", "Feb", "4")
125129
}
126130
}
127131

@@ -135,15 +139,15 @@ class TestDateIntervalFormatter: XCTestCase {
135139
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 7)
136140

137141
let result = formatter.string(from: older, to: newer)
138-
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "8"))
142+
result.assertContainsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "8")
139143
}
140144

141145
do {
142146
let older = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 28)
143147
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 34)
144148

145149
let result = formatter.string(from: older, to: newer)
146-
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "29", "4"))
150+
result.assertContainsInOrder(requiresLastToBeAtEnd: true, "Jan", "29", "4")
147151
XCTAssertNil(result.range(of: "Feb"))
148152
}
149153
}
@@ -156,7 +160,7 @@ class TestDateIntervalFormatter: XCTestCase {
156160
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 60)
157161

158162
let result = formatter.string(from: older, to: newer)
159-
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "Mar", "2"))
163+
result.assertContainsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "Mar", "2")
160164
}
161165

162166
#if NS_FOUNDATION_ALLOWS_TESTABLE_IMPORT && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS))
@@ -169,7 +173,7 @@ class TestDateIntervalFormatter: XCTestCase {
169173

170174
// Minimization shouldn't do anything since this spans more than a month
171175
let result = formatter.string(from: older, to: newer)
172-
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "Mar", "2"))
176+
result.assertContainsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "Mar", "2")
173177
}
174178
#endif
175179

@@ -179,7 +183,7 @@ class TestDateIntervalFormatter: XCTestCase {
179183
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 5)
180184

181185
let result = formatter.string(from: older, to: newer)
182-
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "January", "1", "2001", "12:00:00 AM", "5:00:00 AM"))
186+
result.assertContainsInOrder(requiresLastToBeAtEnd: true, "January", "1", "2001", "12:00:00 AM", "5:00:00 AM")
183187

184188
let firstJanuary = try result.range(of: "January").unwrapped()
185189
XCTAssertNil(result[firstJanuary.upperBound...].range(of: "January")) // January appears only once.
@@ -192,7 +196,7 @@ class TestDateIntervalFormatter: XCTestCase {
192196
XCTAssertEqual(formatter.string(from: older, to: newer),
193197
"January 1, 2001, 10:00:00 PM Greenwich Mean Time – January 2, 2001, 3:00:00 AM Greenwich Mean Time")
194198
let result = formatter.string(from: older, to: newer)
195-
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "January", "1", "2001", "10:00:00 AM", "5:00:00 AM"))
199+
result.assertContainsInOrder(requiresLastToBeAtEnd: true, "January", "1", "2001", "10:00:00 AM", "5:00:00 AM")
196200
}
197201
}
198202

@@ -201,7 +205,7 @@ class TestDateIntervalFormatter: XCTestCase {
201205
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 18)
202206

203207
let result = formatter.string(from: older, to: newer)
204-
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "January", "1", "2001", "12:00:00 AM", "6:00:00 PM"))
208+
result.assertContainsInOrder(requiresLastToBeAtEnd: true, "January", "1", "2001", "12:00:00 AM", "6:00:00 PM")
205209

206210
let firstJanuary = try result.range(of: "January").unwrapped()
207211
XCTAssertNil(result[firstJanuary.upperBound...].range(of: "January")) // January appears only once.

0 commit comments

Comments
 (0)