|
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