|
10 | 10 | // |
11 | 11 | //===----------------------------------------------------------------------===// |
12 | 12 |
|
13 | | -import Testing |
14 | | - |
15 | | -#if canImport(FoundationEssentials) |
16 | | -import FoundationEssentials |
17 | | -#else |
18 | | -import Foundation |
| 13 | +#if canImport(TestSupport) |
| 14 | +import TestSupport |
19 | 15 | #endif |
20 | 16 |
|
21 | | -@Suite("AttributedString Index Tracking") |
22 | | -private struct AttributedStringIndexTrackingTests { |
23 | | - @Test |
24 | | - func basics() throws { |
| 17 | +final class AttributedStringIndexTrackingTests: XCTestCase { |
| 18 | + func testBasic() throws { |
25 | 19 | var text = AttributedString("ABC. Hello, world!") |
26 | 20 | let original = text |
27 | | - let helloRange = try #require(text.range(of: "Hello")) |
28 | | - let worldRange = try #require(text.range(of: "world")) |
| 21 | + let helloRange = try XCTUnwrap(text.range(of: "Hello")) |
| 22 | + let worldRange = try XCTUnwrap(text.range(of: "world")) |
29 | 23 |
|
30 | | - let updatedRanges = try #require(text.transform(updating: [helloRange, worldRange]) { |
| 24 | + let updatedRanges = try XCTUnwrap(text.transform(updating: [helloRange, worldRange]) { |
31 | 25 | $0.insert(AttributedString("Goodbye. "), at: $0.startIndex) |
32 | 26 | }) |
33 | 27 |
|
34 | | - #expect(updatedRanges.count == 2) |
35 | | - #expect(text[updatedRanges[0]] == original[helloRange]) |
36 | | - #expect(text[updatedRanges[1]] == original[worldRange]) |
| 28 | + XCTAssertEqual(updatedRanges.count, 2) |
| 29 | + XCTAssertEqual(text[updatedRanges[0]], original[helloRange]) |
| 30 | + XCTAssertEqual(text[updatedRanges[1]], original[worldRange]) |
37 | 31 | } |
38 | 32 |
|
39 | | - @Test |
40 | | - func insertionWithinRange() throws { |
| 33 | + func testInsertionWithinRange() throws { |
41 | 34 | var text = AttributedString("Hello, world") |
42 | | - var helloRange = try #require(text.range(of: "Hello")) |
| 35 | + var helloRange = try XCTUnwrap(text.range(of: "Hello")) |
43 | 36 |
|
44 | 37 | text.transform(updating: &helloRange) { |
45 | 38 | $0.insert(AttributedString("_Goodbye_"), at: $0.index($0.startIndex, offsetByCharacters: 3)) |
46 | 39 | } |
47 | 40 |
|
48 | | - #expect(String(text[helloRange].characters) == "Hel_Goodbye_lo") |
| 41 | + XCTAssertEqual(String(text[helloRange].characters), "Hel_Goodbye_lo") |
49 | 42 | } |
50 | 43 |
|
51 | | - @Test |
52 | | - func insertionAtStartOfRange() throws { |
| 44 | + func testInsertionAtStartOfRange() throws { |
53 | 45 | var text = AttributedString("Hello, world") |
54 | | - let helloRange = try #require(text.range(of: "llo")) |
| 46 | + let helloRange = try XCTUnwrap(text.range(of: "llo")) |
55 | 47 |
|
56 | | - let updatedHelloRange = try #require(text.transform(updating: helloRange) { |
| 48 | + let updatedHelloRange = try XCTUnwrap(text.transform(updating: helloRange) { |
57 | 49 | $0.insert(AttributedString("_"), at: helloRange.lowerBound) |
58 | 50 | }) |
59 | 51 |
|
60 | | - #expect(String(text[updatedHelloRange].characters) == "llo") |
| 52 | + XCTAssertEqual(String(text[updatedHelloRange].characters), "llo") |
61 | 53 | } |
62 | 54 |
|
63 | | - @Test |
64 | | - func insertionAtEndOfRange() throws { |
| 55 | + func testInsertionAtEndOfRange() throws { |
65 | 56 | var text = AttributedString("Hello, world") |
66 | | - let helloRange = try #require(text.range(of: "llo")) |
| 57 | + let helloRange = try XCTUnwrap(text.range(of: "llo")) |
67 | 58 |
|
68 | | - let updatedHelloRange = try #require(text.transform(updating: helloRange) { |
| 59 | + let updatedHelloRange = try XCTUnwrap(text.transform(updating: helloRange) { |
69 | 60 | $0.insert(AttributedString("_"), at: helloRange.upperBound) |
70 | 61 | }) |
71 | 62 |
|
72 | | - #expect(String(text[updatedHelloRange].characters) == "llo") |
| 63 | + XCTAssertEqual(String(text[updatedHelloRange].characters), "llo") |
73 | 64 | } |
74 | 65 |
|
75 | | - @Test |
76 | | - func insertionAtEmptyRange() throws { |
| 66 | + func testInsertionAtEmptyRange() throws { |
77 | 67 | var text = AttributedString("ABCDE") |
78 | 68 | let idx = text.index(text.startIndex, offsetByCharacters: 3) |
79 | 69 |
|
80 | | - let updatedRange = try #require(text.transform(updating: idx ..< idx) { |
| 70 | + let updatedRange = try XCTUnwrap(text.transform(updating: idx ..< idx) { |
81 | 71 | $0.insert(AttributedString("_"), at: idx) |
82 | 72 | }) |
83 | 73 |
|
84 | | - #expect(updatedRange.lowerBound == updatedRange.upperBound) |
85 | | - #expect(text.characters[updatedRange.lowerBound] == "D") |
| 74 | + XCTAssertEqual(updatedRange.lowerBound, updatedRange.upperBound) |
| 75 | + XCTAssertEqual(text.characters[updatedRange.lowerBound], "D") |
86 | 76 | } |
87 | 77 |
|
88 | | - @Test |
89 | | - func removalWithinRange() throws { |
| 78 | + func testRemovalWithinRange() throws { |
90 | 79 | var text = AttributedString("Hello, world") |
91 | | - var helloRange = try #require(text.range(of: "Hello")) |
| 80 | + var helloRange = try XCTUnwrap(text.range(of: "Hello")) |
92 | 81 |
|
93 | 82 | try text.transform(updating: &helloRange) { |
94 | | - $0.removeSubrange(try #require($0.range(of: "ll"))) |
| 83 | + $0.removeSubrange(try XCTUnwrap($0.range(of: "ll"))) |
95 | 84 | } |
96 | 85 |
|
97 | | - #expect(String(text[helloRange].characters) == "Heo") |
| 86 | + XCTAssertEqual(String(text[helloRange].characters), "Heo") |
98 | 87 | } |
99 | 88 |
|
100 | | - @Test |
101 | | - func fullCollapse() throws { |
| 89 | + func testFullCollapse() throws { |
102 | 90 | do { |
103 | 91 | var text = AttributedString("Hello, world") |
104 | | - var helloRange = try #require(text.range(of: "Hello")) |
| 92 | + var helloRange = try XCTUnwrap(text.range(of: "Hello")) |
105 | 93 |
|
106 | 94 | text.transform(updating: &helloRange) { |
107 | 95 | $0.removeSubrange($0.startIndex ..< $0.endIndex) |
108 | 96 | } |
109 | 97 |
|
110 | | - #expect(String(text[helloRange].characters) == "") |
| 98 | + XCTAssertEqual(String(text[helloRange].characters), "") |
111 | 99 | } |
112 | 100 |
|
113 | 101 | do { |
114 | 102 | var text = AttributedString("Hello, world") |
115 | | - let helloRange = try #require(text.range(of: "Hello")) |
| 103 | + let helloRange = try XCTUnwrap(text.range(of: "Hello")) |
116 | 104 |
|
117 | | - let updatedHelloRange = try #require(text.transform(updating: helloRange) { |
| 105 | + let updatedHelloRange = try XCTUnwrap(text.transform(updating: helloRange) { |
118 | 106 | $0.removeSubrange(helloRange) |
119 | 107 | }) |
120 | 108 |
|
121 | | - #expect(String(text[updatedHelloRange].characters) == "") |
| 109 | + XCTAssertEqual(String(text[updatedHelloRange].characters), "") |
122 | 110 | } |
123 | 111 |
|
124 | 112 | do { |
125 | 113 | var text = AttributedString("Hello, world") |
126 | | - var helloRange = try #require(text.range(of: ", ")) |
| 114 | + var helloRange = try XCTUnwrap(text.range(of: ", ")) |
127 | 115 |
|
128 | 116 | try text.transform(updating: &helloRange) { |
129 | | - $0.removeSubrange(try #require($0.range(of: "o, w"))) |
| 117 | + $0.removeSubrange(try XCTUnwrap($0.range(of: "o, w"))) |
130 | 118 | } |
131 | 119 |
|
132 | | - #expect(String(text[helloRange].characters) == "") |
| 120 | + XCTAssertEqual(String(text[helloRange].characters), "") |
133 | 121 | let collapsedIdx = text.index(text.startIndex, offsetByCharacters: 4) |
134 | | - #expect(helloRange == collapsedIdx ..< collapsedIdx) |
| 122 | + XCTAssertEqual(helloRange, collapsedIdx ..< collapsedIdx) |
135 | 123 | } |
136 | 124 | } |
137 | 125 |
|
138 | | - @Test |
139 | | - func collapseLeft() throws { |
| 126 | + func testCollapseLeft() throws { |
140 | 127 | var text = AttributedString("Hello, world") |
141 | | - var helloRange = try #require(text.range(of: "Hello")) |
| 128 | + var helloRange = try XCTUnwrap(text.range(of: "Hello")) |
142 | 129 |
|
143 | 130 | try text.transform(updating: &helloRange) { |
144 | | - $0.removeSubrange(try #require($0.range(of: "llo, wo"))) |
| 131 | + $0.removeSubrange(try XCTUnwrap($0.range(of: "llo, wo"))) |
145 | 132 | } |
146 | 133 |
|
147 | | - #expect(String(text[helloRange].characters) == "He") |
| 134 | + XCTAssertEqual(String(text[helloRange].characters), "He") |
148 | 135 | } |
149 | 136 |
|
150 | | - @Test |
151 | | - func collapseRight() throws { |
| 137 | + func testCollapseRight() throws { |
152 | 138 | var text = AttributedString("Hello, world") |
153 | | - var worldRange = try #require(text.range(of: "world")) |
| 139 | + var worldRange = try XCTUnwrap(text.range(of: "world")) |
154 | 140 |
|
155 | 141 | try text.transform(updating: &worldRange) { |
156 | | - $0.removeSubrange(try #require($0.range(of: "llo, wo"))) |
| 142 | + $0.removeSubrange(try XCTUnwrap($0.range(of: "llo, wo"))) |
157 | 143 | } |
158 | 144 |
|
159 | | - #expect(String(text[worldRange].characters) == "rld") |
| 145 | + XCTAssertEqual(String(text[worldRange].characters), "rld") |
160 | 146 | } |
161 | 147 |
|
162 | | - @Test |
163 | | - func nesting() throws { |
| 148 | + func testNesting() throws { |
164 | 149 | var text = AttributedString("Hello, world") |
165 | | - var helloRange = try #require(text.range(of: "Hello")) |
| 150 | + var helloRange = try XCTUnwrap(text.range(of: "Hello")) |
166 | 151 | try text.transform(updating: &helloRange) { |
167 | | - var worldRange = try #require($0.range(of: "world")) |
| 152 | + var worldRange = try XCTUnwrap($0.range(of: "world")) |
168 | 153 | try $0.transform(updating: &worldRange) { |
169 | | - $0.removeSubrange(try #require($0.range(of: "llo, wo"))) |
| 154 | + $0.removeSubrange(try XCTUnwrap($0.range(of: "llo, wo"))) |
170 | 155 | } |
171 | | - #expect(String($0[worldRange].characters) == "rld") |
| 156 | + XCTAssertEqual(String($0[worldRange].characters), "rld") |
172 | 157 | } |
173 | | - #expect(String(text[helloRange].characters) == "He") |
| 158 | + XCTAssertEqual(String(text[helloRange].characters), "He") |
174 | 159 | } |
175 | 160 |
|
176 | | - #if FOUNDATION_EXIT_TESTS |
177 | | - @Test |
178 | | - func trackingLostPreconditions() async { |
179 | | - await #expect(processExitsWith: .failure) { |
180 | | - var text = AttributedString("Hello, world") |
181 | | - var helloRange = try #require(text.range(of: "Hello")) |
182 | | - text.transform(updating: &helloRange) { |
183 | | - $0 = AttributedString("Foo") |
184 | | - } |
185 | | - } |
186 | | - |
187 | | - await #expect(processExitsWith: .failure) { |
188 | | - var text = AttributedString("Hello, world") |
189 | | - var helloRange = try #require(text.range(of: "Hello")) |
190 | | - text.transform(updating: &helloRange) { |
191 | | - $0 = AttributedString("Hello world") |
192 | | - } |
193 | | - } |
194 | | - |
195 | | - await #expect(processExitsWith: .failure) { |
196 | | - var text = AttributedString("Hello, world") |
197 | | - var ranges = [try #require(text.range(of: "Hello"))] |
198 | | - text.transform(updating: &ranges) { |
199 | | - $0 = AttributedString("Foo") |
200 | | - } |
201 | | - } |
202 | | - |
203 | | - await #expect(processExitsWith: .failure) { |
204 | | - var text = AttributedString("Hello, world") |
205 | | - var ranges = [try #require(text.range(of: "Hello"))] |
206 | | - text.transform(updating: &ranges) { |
207 | | - $0 = AttributedString("Hello world") |
208 | | - } |
209 | | - } |
210 | | - } |
211 | | - #endif |
212 | | - |
213 | | - @Test |
214 | | - func trackingLost() throws { |
| 161 | + func testTrackingLost() throws { |
215 | 162 | let text = AttributedString("Hello, world") |
216 | | - let helloRange = try #require(text.range(of: "Hello")) |
| 163 | + let helloRange = try XCTUnwrap(text.range(of: "Hello")) |
217 | 164 |
|
218 | 165 | do { |
219 | 166 | var copy = text |
220 | | - #expect(copy.transform(updating: helloRange) { |
| 167 | + XCTAssertNil(copy.transform(updating: helloRange) { |
221 | 168 | $0 = AttributedString("Foo") |
222 | | - } == nil) |
| 169 | + }) |
223 | 170 | } |
224 | 171 |
|
225 | 172 | do { |
226 | 173 | var copy = text |
227 | | - #expect(copy.transform(updating: helloRange) { |
| 174 | + XCTAssertNil(copy.transform(updating: helloRange) { |
228 | 175 | $0 = AttributedString("Hello world") |
229 | | - } == nil) |
| 176 | + }) |
230 | 177 | } |
231 | 178 |
|
232 | 179 | do { |
233 | 180 | var copy = text |
234 | | - #expect(copy.transform(updating: helloRange) { |
| 181 | + XCTAssertNotNil(copy.transform(updating: helloRange) { |
235 | 182 | $0 = $0 |
236 | | - } != nil) |
| 183 | + }) |
237 | 184 | } |
238 | 185 |
|
239 | 186 | do { |
240 | 187 | var copy = text |
241 | | - #expect(copy.transform(updating: helloRange) { |
| 188 | + XCTAssertNotNil(copy.transform(updating: helloRange) { |
242 | 189 | var reference = $0 |
243 | 190 | reference.testInt = 2 |
244 | 191 | $0 = $0 |
245 | | - } != nil) |
246 | | - #expect(copy.testInt == nil) |
| 192 | + }) |
| 193 | + XCTAssertNil(copy.testInt) |
247 | 194 | } |
248 | 195 | } |
249 | 196 |
|
250 | | - @Test |
251 | | - func attributeMutation() throws { |
| 197 | + func testAttributeMutation() throws { |
252 | 198 | var text = AttributedString("Hello, world!") |
253 | 199 | let original = text |
254 | | - let helloRange = try #require(text.range(of: "Hello")) |
255 | | - let worldRange = try #require(text.range(of: "world")) |
| 200 | + let helloRange = try XCTUnwrap(text.range(of: "Hello")) |
| 201 | + let worldRange = try XCTUnwrap(text.range(of: "world")) |
256 | 202 |
|
257 | | - let updatedRanges = try #require(text.transform(updating: [helloRange, worldRange]) { |
| 203 | + let updatedRanges = try XCTUnwrap(text.transform(updating: [helloRange, worldRange]) { |
258 | 204 | $0.testInt = 2 |
259 | 205 | }) |
260 | 206 |
|
261 | | - #expect(updatedRanges.count == 2) |
262 | | - #expect(AttributedString(text[updatedRanges[0]]) == original[helloRange].settingAttributes(AttributeContainer.testInt(2))) |
263 | | - #expect(AttributedString(text[updatedRanges[1]]) == original[worldRange].settingAttributes(AttributeContainer.testInt(2))) |
264 | | - } |
265 | | - |
266 | | - #if FOUNDATION_EXIT_TESTS |
267 | | - @Test |
268 | | - func invalidInputRanges() async { |
269 | | - await #expect(processExitsWith: .failure) { |
270 | | - var text = AttributedString("Hello, world") |
271 | | - let other = text + AttributedString("Extra text") |
272 | | - let range = other.startIndex ..< other.endIndex |
273 | | - _ = text.transform(updating: range) { _ in |
274 | | - |
275 | | - } |
276 | | - } |
277 | | - |
278 | | - await #expect(processExitsWith: .failure) { |
279 | | - var text = AttributedString("Hello, world") |
280 | | - let other = text + AttributedString("Extra text") |
281 | | - let range = other.endIndex ..< other.endIndex |
282 | | - _ = text.transform(updating: range) { _ in |
283 | | - |
284 | | - } |
285 | | - } |
286 | | - |
287 | | - await #expect(processExitsWith: .failure) { |
288 | | - var text = AttributedString("Hello, world") |
289 | | - _ = text.transform(updating: []) { _ in |
290 | | - |
291 | | - } |
292 | | - } |
| 207 | + XCTAssertEqual(updatedRanges.count, 2) |
| 208 | + XCTAssertEqual(AttributedString(text[updatedRanges[0]]), original[helloRange].settingAttributes(AttributeContainer.testInt(2))) |
| 209 | + XCTAssertEqual(AttributedString(text[updatedRanges[1]]), original[worldRange].settingAttributes(AttributeContainer.testInt(2))) |
293 | 210 | } |
294 | | - #endif |
295 | 211 | } |
0 commit comments