|
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