Skip to content

Commit b342e5f

Browse files
committed
Make tests fuzzier so they work on both Darwin and Linux ICUs.
1 parent 32cfcf1 commit b342e5f

File tree

1 file changed

+64
-32
lines changed

1 file changed

+64
-32
lines changed

TestFoundation/TestDateIntervalFormatter.swift

Lines changed: 64 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,25 @@
1515
#endif
1616
#endif
1717

18+
extension String {
19+
func containsInOrder(requiresLastToBeAtEnd: Bool = false, _ substrings: String...) -> Bool {
20+
var foundRange: Range<String.Index> = startIndex ..< startIndex
21+
for substring in substrings {
22+
if let newRange = range(of: substring, options: [], range: foundRange.upperBound..<endIndex, locale: nil) {
23+
foundRange = newRange
24+
} else {
25+
return false
26+
}
27+
}
28+
29+
if requiresLastToBeAtEnd {
30+
return foundRange.upperBound == endIndex
31+
} else {
32+
return true
33+
}
34+
}
35+
}
36+
1837
class TestDateIntervalFormatter: XCTestCase {
1938
private var formatter: DateIntervalFormatter!
2039

@@ -38,47 +57,52 @@ class TestDateIntervalFormatter: XCTestCase {
3857
let older = Date(timeIntervalSinceReferenceDate: 0)
3958
let newer = Date(timeIntervalSinceReferenceDate: 3e9)
4059

41-
XCTAssertEqual(formatter.string(from: older, to: newer),
42-
"January 1, 2001, 12:00:00 AM Greenwich Mean Time – January 25, 2096, 5:20:00 AM Greenwich Mean Time")
60+
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"))
4363
}
4464

4565
func testStringFromDateToDateAcrossThreeMillionSeconds() {
4666
let older = Date(timeIntervalSinceReferenceDate: 0)
4767
let newer = Date(timeIntervalSinceReferenceDate: 3e6)
4868

49-
XCTAssertEqual(formatter.string(from: older, to: newer),
50-
"January 1, 2001, 12:00:00 AM Greenwich Mean Time – February 4, 2001, 5:20:00 PM Greenwich Mean Time")
69+
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"))
5172
}
5273

5374
func testStringFromDateToDateAcrossThreeBillionSecondsReversed() {
5475
let older = Date(timeIntervalSinceReferenceDate: 0)
5576
let newer = Date(timeIntervalSinceReferenceDate: 3e9)
5677

57-
XCTAssertEqual(formatter.string(from: newer, to: older),
58-
"January 25, 2096, 5:20:00 AM Greenwich Mean Time – January 1, 2001, 12:00:00 AM Greenwich Mean Time")
78+
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"))
5981
}
6082

6183
func testStringFromDateToDateAcrossThreeMillionSecondsReversed() {
6284
let older = Date(timeIntervalSinceReferenceDate: 0)
6385
let newer = Date(timeIntervalSinceReferenceDate: 3e6)
6486

65-
XCTAssertEqual(formatter.string(from: newer, to: older),
66-
"February 4, 2001, 5:20:00 PM Greenwich Mean Time – January 1, 2001, 12:00:00 AM Greenwich Mean Time")
87+
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"))
6790
}
6891

6992
func testStringFromDateToSameDate() {
7093
let date = Date(timeIntervalSinceReferenceDate: 3e6)
7194

7295
// For a range from a date to itself, we represent the date only once, with no interdate separator.
73-
XCTAssertEqual(formatter.string(from: date, to: date),
74-
"February 4, 2001, 5:20:00 PM Greenwich Mean Time")
96+
let result = formatter.string(from: date, to: date)
97+
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "February 4", "2001", "5:20:00 AM", "Greenwich Mean Time"))
7598
}
7699

77-
func testStringFromDateIntervalAcrossThreeMillionSeconds() {
100+
func testStringFromDateIntervalAcrossThreeMillionSeconds() throws {
78101
let interval = DateInterval(start: Date(timeIntervalSinceReferenceDate: 0), duration: 3e6)
79102

80-
XCTAssertEqual(formatter.string(from: interval),
81-
"January 1, 2001, 12:00:00 AM Greenwich Mean Time – February 4, 2001, 5:20:00 PM Greenwich Mean Time")
103+
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"))
82106
}
83107

84108
func testStringFromDateToDateAcrossOneWeek() {
@@ -88,16 +112,16 @@ class TestDateIntervalFormatter: XCTestCase {
88112
let older = Date(timeIntervalSinceReferenceDate: 0)
89113
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 7)
90114

91-
XCTAssertEqual(formatter.string(from: older, to: newer),
92-
"Jan 1 – 8")
115+
let result = formatter.string(from: older, to: newer)
116+
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "8"))
93117
}
94118

95119
do {
96120
let older = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 28)
97121
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 34)
98122

99-
XCTAssertEqual(formatter.string(from: older, to: newer),
100-
"Jan 29 – Feb 4")
123+
let result = formatter.string(from: older, to: newer)
124+
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "29", "Feb", "4"))
101125
}
102126
}
103127

@@ -110,16 +134,17 @@ class TestDateIntervalFormatter: XCTestCase {
110134
let older = Date(timeIntervalSinceReferenceDate: 0)
111135
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 7)
112136

113-
XCTAssertEqual(formatter.string(from: older, to: newer),
114-
"Jan 1 – 8")
137+
let result = formatter.string(from: older, to: newer)
138+
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "8"))
115139
}
116140

117141
do {
118142
let older = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 28)
119143
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 34)
120144

121-
XCTAssertEqual(formatter.string(from: older, to: newer),
122-
"Jan 29 – 4")
145+
let result = formatter.string(from: older, to: newer)
146+
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "29", "4"))
147+
XCTAssertNil(result.range(of: "Feb"))
123148
}
124149
}
125150
#endif
@@ -130,8 +155,8 @@ class TestDateIntervalFormatter: XCTestCase {
130155
let older = Date(timeIntervalSinceReferenceDate: 0)
131156
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 60)
132157

133-
XCTAssertEqual(formatter.string(from: older, to: newer),
134-
"Jan 1 – Mar 2")
158+
let result = formatter.string(from: older, to: newer)
159+
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "Mar", "2"))
135160
}
136161

137162
#if NS_FOUNDATION_ALLOWS_TESTABLE_IMPORT && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS))
@@ -143,18 +168,21 @@ class TestDateIntervalFormatter: XCTestCase {
143168
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 24 * 60)
144169

145170
// Minimization shouldn't do anything since this spans more than a month
146-
XCTAssertEqual(formatter.string(from: older, to: newer),
147-
"Jan 1 – Mar 2")
171+
let result = formatter.string(from: older, to: newer)
172+
XCTAssert(result.containsInOrder(requiresLastToBeAtEnd: true, "Jan", "1", "Mar", "2"))
148173
}
149174
#endif
150175

151-
func testStringFromDateToDateAcrossFiveHours() {
176+
func testStringFromDateToDateAcrossFiveHours() throws {
152177
do {
153178
let older = Date(timeIntervalSinceReferenceDate: 0)
154179
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 5)
155180

156-
XCTAssertEqual(formatter.string(from: older, to: newer),
157-
"January 1, 2001, 12:00:00 AM GMT – 5:00:00 AM GMT")
181+
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"))
183+
184+
let firstJanuary = try result.range(of: "January").unwrapped()
185+
XCTAssertNil(result[firstJanuary.upperBound...].range(of: "January")) // January appears only once.
158186
}
159187

160188
do {
@@ -163,16 +191,20 @@ class TestDateIntervalFormatter: XCTestCase {
163191

164192
XCTAssertEqual(formatter.string(from: older, to: newer),
165193
"January 1, 2001, 10:00:00 PM Greenwich Mean Time – January 2, 2001, 3:00:00 AM Greenwich Mean Time")
194+
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"))
166196
}
167197
}
168198

169-
func testStringFromDateToDateAcrossEighteenHours() {
199+
func testStringFromDateToDateAcrossEighteenHours() throws {
170200
let older = Date(timeIntervalSinceReferenceDate: 0)
171201
let newer = Date(timeIntervalSinceReferenceDate: 3600 * 18)
172202

173-
// Minimization shouldn't do anything since this spans more than a month
174-
XCTAssertEqual(formatter.string(from: older, to: newer),
175-
"January 1, 2001, 12:00:00 AM GMT – 6:00:00 PM GMT")
203+
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"))
205+
206+
let firstJanuary = try result.range(of: "January").unwrapped()
207+
XCTAssertNil(result[firstJanuary.upperBound...].range(of: "January")) // January appears only once.
176208
}
177209

178210
static var allTests: [(String, (TestDateIntervalFormatter) -> () throws -> Void)] {

0 commit comments

Comments
 (0)