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