16
16
#endif
17
17
18
18
extension String {
19
- func containsInOrder( requiresLastToBeAtEnd: Bool = false , _ substrings: String ... ) -> Bool {
19
+ func containsInOrder( requiresLastToBeAtEnd: Bool = false , _ substrings: [ String ] ) -> Bool {
20
20
var foundRange : Range < String . Index > = startIndex ..< startIndex
21
21
for substring in substrings {
22
22
if let newRange = range ( of: substring, options: [ ] , range: foundRange. upperBound..< endIndex, locale: nil ) {
@@ -32,6 +32,10 @@ extension String {
32
32
return true
33
33
}
34
34
}
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
+ }
35
39
}
36
40
37
41
class TestDateIntervalFormatter : XCTestCase {
@@ -58,51 +62,51 @@ class TestDateIntervalFormatter: XCTestCase {
58
62
let newer = Date ( timeIntervalSinceReferenceDate: 3e9 )
59
63
60
64
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 " )
63
67
}
64
68
65
69
func testStringFromDateToDateAcrossThreeMillionSeconds( ) {
66
70
let older = Date ( timeIntervalSinceReferenceDate: 0 )
67
71
let newer = Date ( timeIntervalSinceReferenceDate: 3e6 )
68
72
69
73
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 " )
72
76
}
73
77
74
78
func testStringFromDateToDateAcrossThreeBillionSecondsReversed( ) {
75
79
let older = Date ( timeIntervalSinceReferenceDate: 0 )
76
80
let newer = Date ( timeIntervalSinceReferenceDate: 3e9 )
77
81
78
82
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 " )
81
85
}
82
86
83
87
func testStringFromDateToDateAcrossThreeMillionSecondsReversed( ) {
84
88
let older = Date ( timeIntervalSinceReferenceDate: 0 )
85
89
let newer = Date ( timeIntervalSinceReferenceDate: 3e6 )
86
90
87
91
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 " )
90
94
}
91
95
92
96
func testStringFromDateToSameDate( ) {
93
97
let date = Date ( timeIntervalSinceReferenceDate: 3e6 )
94
98
95
99
// For a range from a date to itself, we represent the date only once, with no interdate separator.
96
100
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 " )
98
102
}
99
103
100
104
func testStringFromDateIntervalAcrossThreeMillionSeconds( ) throws {
101
105
let interval = DateInterval ( start: Date ( timeIntervalSinceReferenceDate: 0 ) , duration: 3e6 )
102
106
103
107
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 " )
106
110
}
107
111
108
112
func testStringFromDateToDateAcrossOneWeek( ) {
@@ -113,15 +117,15 @@ class TestDateIntervalFormatter: XCTestCase {
113
117
let newer = Date ( timeIntervalSinceReferenceDate: 3600 * 24 * 7 )
114
118
115
119
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 " )
117
121
}
118
122
119
123
do {
120
124
let older = Date ( timeIntervalSinceReferenceDate: 3600 * 24 * 28 )
121
125
let newer = Date ( timeIntervalSinceReferenceDate: 3600 * 24 * 34 )
122
126
123
127
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 " )
125
129
}
126
130
}
127
131
@@ -135,15 +139,15 @@ class TestDateIntervalFormatter: XCTestCase {
135
139
let newer = Date ( timeIntervalSinceReferenceDate: 3600 * 24 * 7 )
136
140
137
141
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 " )
139
143
}
140
144
141
145
do {
142
146
let older = Date ( timeIntervalSinceReferenceDate: 3600 * 24 * 28 )
143
147
let newer = Date ( timeIntervalSinceReferenceDate: 3600 * 24 * 34 )
144
148
145
149
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 " )
147
151
XCTAssertNil ( result. range ( of: " Feb " ) )
148
152
}
149
153
}
@@ -156,7 +160,7 @@ class TestDateIntervalFormatter: XCTestCase {
156
160
let newer = Date ( timeIntervalSinceReferenceDate: 3600 * 24 * 60 )
157
161
158
162
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 " )
160
164
}
161
165
162
166
#if NS_FOUNDATION_ALLOWS_TESTABLE_IMPORT && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS))
@@ -169,7 +173,7 @@ class TestDateIntervalFormatter: XCTestCase {
169
173
170
174
// Minimization shouldn't do anything since this spans more than a month
171
175
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 " )
173
177
}
174
178
#endif
175
179
@@ -179,7 +183,7 @@ class TestDateIntervalFormatter: XCTestCase {
179
183
let newer = Date ( timeIntervalSinceReferenceDate: 3600 * 5 )
180
184
181
185
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 " )
183
187
184
188
let firstJanuary = try result. range ( of: " January " ) . unwrapped ( )
185
189
XCTAssertNil ( result [ firstJanuary. upperBound... ] . range ( of: " January " ) ) // January appears only once.
@@ -192,7 +196,7 @@ class TestDateIntervalFormatter: XCTestCase {
192
196
XCTAssertEqual ( formatter. string ( from: older, to: newer) ,
193
197
" January 1, 2001, 10:00:00 PM Greenwich Mean Time – January 2, 2001, 3:00:00 AM Greenwich Mean Time " )
194
198
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 " )
196
200
}
197
201
}
198
202
@@ -201,7 +205,7 @@ class TestDateIntervalFormatter: XCTestCase {
201
205
let newer = Date ( timeIntervalSinceReferenceDate: 3600 * 18 )
202
206
203
207
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 " )
205
209
206
210
let firstJanuary = try result. range ( of: " January " ) . unwrapped ( )
207
211
XCTAssertNil ( result [ firstJanuary. upperBound... ] . range ( of: " January " ) ) // January appears only once.
0 commit comments