Skip to content

Commit 8180dd1

Browse files
authored
Convert String/Predicate/ProcessInfo/RecurrenceRule tests to swift-testing (#1357)
* Convert predicate tests * Convert ProcessInfo tests * Convert String tests * Convert RecurrenceRule tests * Fix Windows build failure * Fix build failures * Avoid relying on default timezone
1 parent 09a0524 commit 8180dd1

File tree

7 files changed

+1776
-1821
lines changed

7 files changed

+1776
-1821
lines changed

Tests/FoundationEssentialsTests/FileManager/FilePlayground.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,18 +144,18 @@ struct FilePlayground {
144144

145145
func test(captureDelegateCalls: Bool = false, sourceLocation: SourceLocation = #_sourceLocation, _ tester: sending (FileManager) throws -> Void) async throws {
146146
let capturingDelegate = CapturingFileManagerDelegate()
147-
let fileManager = FileManager()
148147
let tempDir = String.temporaryDirectoryPath
149-
try directory.build(in: tempDir, using: fileManager)
150-
if captureDelegateCalls {
151-
// Add the delegate after the call to `build` to ensure that the builder doesn't mutate the delegate
152-
fileManager.delegate = capturingDelegate
153-
}
148+
try directory.build(in: tempDir, using: FileManager.default)
154149
let createdDir = tempDir.appendingPathComponent(directory.name)
155-
try await CurrentWorkingDirectoryActor.withCurrentWorkingDirectory(createdDir, fileManager: fileManager, sourceLocation: sourceLocation) {
150+
try await CurrentWorkingDirectoryActor.withCurrentWorkingDirectory(createdDir, sourceLocation: sourceLocation) {
151+
let fileManager = FileManager()
152+
if captureDelegateCalls {
153+
// Add the delegate after the call to `build` to ensure that the builder doesn't mutate the delegate
154+
fileManager.delegate = capturingDelegate
155+
}
156156
try tester(fileManager)
157157
}
158-
try fileManager.removeItem(atPath: createdDir)
158+
try FileManager.default.removeItem(atPath: createdDir)
159159
extendLifetime(capturingDelegate) // Ensure capturingDelegate lives beyond the tester body
160160
}
161161
}

Tests/FoundationEssentialsTests/GregorianCalendarRecurrenceRuleTests.swift

Lines changed: 131 additions & 123 deletions
Large diffs are not rendered by default.

Tests/FoundationEssentialsTests/PredicateCodableTests.swift

Lines changed: 103 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
#if canImport(TestSupport)
14-
import TestSupport
15-
#endif
16-
1713
#if FOUNDATION_FRAMEWORK
1814

15+
import Testing
16+
import Foundation
17+
1918
fileprivate protocol PredicateCodingConfigurationProviding : EncodingConfigurationProviding, DecodingConfigurationProviding where EncodingConfiguration == PredicateCodableConfiguration, DecodingConfiguration == PredicateCodableConfiguration {
2019
static var config: PredicateCodableConfiguration { get }
2120
}
@@ -57,7 +56,8 @@ extension PredicateExpressions {
5756
}
5857
}
5958

60-
final class PredicateCodableTests: XCTestCase {
59+
@Suite("Predicate Codable")
60+
private struct PredicateCodableTests {
6161

6262
struct Object : Equatable, PredicateCodableKeyPathProviding {
6363
var a: Int
@@ -192,163 +192,183 @@ final class PredicateCodableTests: XCTestCase {
192192
return try decoder.decode(T.self, from: data)
193193
}
194194

195-
func testBasicEncodeDecode() throws {
195+
@Test func basicEncodeDecode() throws {
196196
let predicate = #Predicate<Object> {
197197
$0.a == 2
198198
}
199199

200200
let decoded = try _encodeDecode(predicate, for: StandardConfig.self)
201201
var object = Object.example
202-
XCTAssertEqual(try predicate.evaluate(object), try decoded.evaluate(object))
202+
#expect(try predicate.evaluate(object) == decoded.evaluate(object))
203203
object.a = 2
204-
XCTAssertEqual(try predicate.evaluate(object), try decoded.evaluate(object))
204+
#expect(try predicate.evaluate(object) == decoded.evaluate(object))
205205
object.a = 3
206-
XCTAssertEqual(try predicate.evaluate(object), try decoded.evaluate(object))
206+
#expect(try predicate.evaluate(object) == decoded.evaluate(object))
207207

208-
XCTAssertThrowsError(try _encodeDecode(predicate, for: EmptyConfig.self))
209-
XCTAssertThrowsError(try _encodeDecode(predicate))
208+
#expect(throws: (any Error).self) {
209+
try _encodeDecode(predicate, for: EmptyConfig.self)
210+
}
211+
#expect(throws: (any Error).self) {
212+
try _encodeDecode(predicate)
213+
}
210214
}
211215

212-
func testDisallowedKeyPath() throws {
216+
@Test func disallowedKeyPath() throws {
213217
var predicate = #Predicate<Object> {
214218
$0.f
215219
}
216220

217-
XCTAssertThrowsError(try _encodeDecode(predicate))
218-
XCTAssertThrowsError(try _encodeDecode(predicate, for: StandardConfig.self))
221+
#expect(throws: (any Error).self) {
222+
try _encodeDecode(predicate)
223+
}
224+
#expect(throws: (any Error).self) {
225+
try _encodeDecode(predicate, for: StandardConfig.self)
226+
}
219227

220228
predicate = #Predicate<Object> {
221229
$0.a == 1
222230
}
223-
XCTAssertThrowsError(try _encodeDecode(predicate, encoding: StandardConfig.self, decoding: MinimalConfig.self)) {
224-
guard let decodingError = $0 as? DecodingError else {
225-
XCTFail("Incorrect error thrown: \($0)")
226-
return
227-
}
228-
XCTAssertEqual(decodingError.debugDescription, "A keypath for the 'Object.a' identifier is not in the provided allowlist")
231+
#expect {
232+
try _encodeDecode(predicate, encoding: StandardConfig.self, decoding: MinimalConfig.self)
233+
} throws: {
234+
let decodingError = try #require($0 as? DecodingError)
235+
return decodingError.debugDescription == "A keypath for the 'Object.a' identifier is not in the provided allowlist"
229236
}
230237
}
231238

232-
func testKeyPathTypeMismatch() throws {
239+
@Test func keyPathTypeMismatch() throws {
233240
let predicate = #Predicate<Object> {
234241
$0.a == 2
235242
}
236243

237244
try _encodeDecode(predicate, for: StandardConfig.self)
238-
XCTAssertThrowsError(try _encodeDecode(predicate, encoding: StandardConfig.self, decoding: MismatchedKeyPathConfig.self)) {
239-
guard let decodingError = $0 as? DecodingError else {
240-
XCTFail("Incorrect error thrown: \($0)")
241-
return
242-
}
243-
XCTAssertEqual(decodingError.debugDescription, "Key path '\\Object.b' (KeyPath<\(_typeName(Object.self)), Swift.String>) for identifier 'Object.a' did not match the expression's requirement for KeyPath<\(_typeName(Object.self)), Swift.Int>")
245+
#expect {
246+
try _encodeDecode(predicate, encoding: StandardConfig.self, decoding: MismatchedKeyPathConfig.self)
247+
} throws: {
248+
let decodingError = try #require($0 as? DecodingError)
249+
return decodingError.debugDescription == "Key path '\\Object.b' (KeyPath<\(_typeName(Object.self)), Swift.String>) for identifier 'Object.a' did not match the expression's requirement for KeyPath<\(_typeName(Object.self)), Swift.Int>"
244250
}
245251
}
246252

247-
func testDisallowedType() throws {
253+
@Test func disallowedType() throws {
248254
let uuid = UUID()
249255
let predicate = #Predicate<Object> { obj in
250256
uuid == uuid
251257
}
252258

253-
XCTAssertThrowsError(try _encodeDecode(predicate))
254-
XCTAssertThrowsError(try _encodeDecode(predicate, for: StandardConfig.self))
255-
XCTAssertThrowsError(try _encodeDecode(predicate, encoding: UUIDConfig.self, decoding: MinimalConfig.self)) {
256-
XCTAssertEqual(String(describing: $0), "The 'Foundation.UUID' identifier is not in the provided allowlist (required by /PredicateExpressions.Equal/PredicateExpressions.Value)")
259+
#expect(throws: (any Error).self) {
260+
try _encodeDecode(predicate)
261+
}
262+
#expect(throws: (any Error).self) {
263+
try _encodeDecode(predicate, for: StandardConfig.self)
264+
}
265+
#expect {
266+
try _encodeDecode(predicate, encoding: UUIDConfig.self, decoding: MinimalConfig.self)
267+
} throws: {
268+
String(describing: $0) == "The 'Foundation.UUID' identifier is not in the provided allowlist (required by /PredicateExpressions.Equal/PredicateExpressions.Value)"
257269
}
258270

259271
let decoded = try _encodeDecode(predicate, for: UUIDConfig.self)
260-
XCTAssertEqual(try decoded.evaluate(.example), try predicate.evaluate(.example))
272+
#expect(try decoded.evaluate(.example) == predicate.evaluate(.example))
261273
}
262274

263-
func testProvidedProperties() throws {
275+
@Test func providedProperties() throws {
264276
var predicate = #Predicate<Object> {
265277
$0.a == 2
266278
}
267279

268-
XCTAssertThrowsError(try _encodeDecode(predicate, for: ProvidedKeyPathConfig.self))
269-
XCTAssertThrowsError(try _encodeDecode(predicate, for: RecursiveProvidedKeyPathConfig.self))
280+
#expect(throws: (any Error).self) {
281+
try _encodeDecode(predicate, for: ProvidedKeyPathConfig.self)
282+
}
283+
#expect(throws: (any Error).self) {
284+
try _encodeDecode(predicate, for: RecursiveProvidedKeyPathConfig.self)
285+
}
270286

271287
predicate = #Predicate<Object> {
272288
$0.f == false
273289
}
274290

275291
var decoded = try _encodeDecode(predicate, for: ProvidedKeyPathConfig.self)
276-
XCTAssertEqual(try decoded.evaluate(.example), try predicate.evaluate(.example))
292+
#expect(try decoded.evaluate(.example) == predicate.evaluate(.example))
277293
decoded = try _encodeDecode(predicate, for: RecursiveProvidedKeyPathConfig.self)
278-
XCTAssertEqual(try decoded.evaluate(.example), try predicate.evaluate(.example))
294+
#expect(try decoded.evaluate(.example) == predicate.evaluate(.example))
279295

280296
predicate = #Predicate<Object> {
281297
$0.h.a == 1
282298
}
283299

284-
XCTAssertThrowsError(try _encodeDecode(predicate, for: ProvidedKeyPathConfig.self))
300+
#expect(throws: (any Error).self) {
301+
try _encodeDecode(predicate, for: ProvidedKeyPathConfig.self)
302+
}
285303
decoded = try _encodeDecode(predicate, for: RecursiveProvidedKeyPathConfig.self)
286-
XCTAssertEqual(try decoded.evaluate(.example), try predicate.evaluate(.example))
304+
#expect(try decoded.evaluate(.example) == predicate.evaluate(.example))
287305
}
288306

289-
func testDefaultAllowlist() throws {
307+
@Test func defaultAllowlist() throws {
290308
var predicate = #Predicate<String> {
291309
$0.isEmpty
292310
}
293311
var decoded = try _encodeDecode(predicate)
294-
XCTAssertEqual(try decoded.evaluate("Hello world"), try predicate.evaluate("Hello world"))
312+
#expect(try decoded.evaluate("Hello world") == predicate.evaluate("Hello world"))
295313

296314
predicate = #Predicate<String> {
297315
$0.count > 2
298316
}
299317
decoded = try _encodeDecode(predicate)
300-
XCTAssertEqual(try decoded.evaluate("Hello world"), try predicate.evaluate("Hello world"))
318+
#expect(try decoded.evaluate("Hello world") == predicate.evaluate("Hello world"))
301319

302320
predicate = #Predicate<String> {
303321
$0.contains(/[a-z]/)
304322
}
305323
decoded = try _encodeDecode(predicate)
306-
XCTAssertEqual(try decoded.evaluate("Hello world"), try predicate.evaluate("Hello world"))
324+
#expect(try decoded.evaluate("Hello world") == predicate.evaluate("Hello world"))
307325

308326
let predicate2 = #Predicate<Object> {
309327
$0 == $0
310328
}
311329
let decoded2 = try _encodeDecode(predicate2)
312-
XCTAssertEqual(try decoded2.evaluate(.example), try predicate2.evaluate(.example))
330+
#expect(try decoded2.evaluate(.example) == predicate2.evaluate(.example))
313331

314332

315333
var predicate3 = #Predicate<Array<String>> {
316334
$0.isEmpty
317335
}
318336
var decoded3 = try _encodeDecode(predicate3)
319-
XCTAssertEqual(try decoded3.evaluate(["A", "B", "C"]), try predicate3.evaluate(["A", "B", "C"]))
337+
#expect(try decoded3.evaluate(["A", "B", "C"]) == predicate3.evaluate(["A", "B", "C"]))
320338

321339
predicate3 = #Predicate<Array<String>> {
322340
$0.count == 2
323341
}
324342
decoded3 = try _encodeDecode(predicate3)
325-
XCTAssertEqual(try decoded3.evaluate(["A", "B", "C"]), try predicate3.evaluate(["A", "B", "C"]))
343+
#expect(try decoded3.evaluate(["A", "B", "C"]) == predicate3.evaluate(["A", "B", "C"]))
326344

327345
var predicate4 = #Predicate<Dictionary<String, Int>> {
328346
$0.isEmpty
329347
}
330348
var decoded4 = try _encodeDecode(predicate4)
331-
XCTAssertEqual(try decoded4.evaluate(["A": 1, "B": 2, "C": 3]), try predicate4.evaluate(["A": 1, "B": 2, "C": 3]))
349+
#expect(try decoded4.evaluate(["A": 1, "B": 2, "C": 3]) == predicate4.evaluate(["A": 1, "B": 2, "C": 3]))
332350

333351
predicate4 = #Predicate<Dictionary<String, Int>> {
334352
$0.count == 2
335353
}
336354
decoded4 = try _encodeDecode(predicate4)
337-
XCTAssertEqual(try decoded4.evaluate(["A": 1, "B": 2, "C": 3]), try predicate4.evaluate(["A": 1, "B": 2, "C": 3]))
355+
#expect(try decoded4.evaluate(["A": 1, "B": 2, "C": 3]) == predicate4.evaluate(["A": 1, "B": 2, "C": 3]))
338356

339357
let predicate5 = #Predicate<Int> {
340358
(0 ..< 4).contains($0)
341359
}
342360
let decoded5 = try _encodeDecode(predicate5)
343-
XCTAssertEqual(try decoded5.evaluate(2), try predicate5.evaluate(2))
361+
#expect(try decoded5.evaluate(2) == predicate5.evaluate(2))
344362
}
345363

346-
func testMalformedData() {
347-
func _malformedDecode<T: PredicateCodingConfigurationProviding>(_ json: String, config: T.Type = StandardConfig.self, reason: String, file: StaticString = #filePath, line: UInt = #line) {
364+
@Test func malformedData() {
365+
func _malformedDecode<T: PredicateCodingConfigurationProviding>(_ json: String, config: T.Type = StandardConfig.self, reason: String, sourceLocation: SourceLocation = #_sourceLocation) {
348366
let data = Data(json.utf8)
349367
let decoder = JSONDecoder()
350-
XCTAssertThrowsError(try decoder.decode(CodableConfiguration<Predicate<Object>, T>.self, from: data), file: file, line: line) {
351-
XCTAssertTrue(String(describing: $0).contains(reason), "Error '\($0)' did not contain reason '\(reason)'", file: file, line: line)
368+
#expect(sourceLocation: sourceLocation) {
369+
try decoder.decode(CodableConfiguration<Predicate<Object>, T>.self, from: data)
370+
} throws: {
371+
String(describing: $0).contains(reason)
352372
}
353373
}
354374

@@ -424,25 +444,29 @@ final class PredicateCodableTests: XCTestCase {
424444
)
425445
}
426446

427-
func testBasicVariadic() throws {
447+
@Test func basicVariadic() throws {
428448
let predicate = #Predicate<Object, Object> {
429449
$0.a == 2 && $1.a == 3
430450
}
431451

432452
let decoded = try _encodeDecode(predicate, for: StandardConfig.self)
433453
var object = Object.example
434454
let object2 = Object.example
435-
XCTAssertEqual(try predicate.evaluate(object, object2), try decoded.evaluate(object, object2))
455+
#expect(try predicate.evaluate(object, object2) == decoded.evaluate(object, object2))
436456
object.a = 2
437-
XCTAssertEqual(try predicate.evaluate(object, object2), try decoded.evaluate(object, object2))
457+
#expect(try predicate.evaluate(object, object2) == decoded.evaluate(object, object2))
438458
object.a = 3
439-
XCTAssertEqual(try predicate.evaluate(object, object2), try decoded.evaluate(object, object2))
459+
#expect(try predicate.evaluate(object, object2) == decoded.evaluate(object, object2))
440460

441-
XCTAssertThrowsError(try _encodeDecode(predicate, for: EmptyConfig.self))
442-
XCTAssertThrowsError(try _encodeDecode(predicate))
461+
#expect(throws: (any Error).self) {
462+
try _encodeDecode(predicate, for: EmptyConfig.self)
463+
}
464+
#expect(throws: (any Error).self) {
465+
try _encodeDecode(predicate)
466+
}
443467
}
444468

445-
func testCapturedVariadicTypes() throws {
469+
@Test func capturedVariadicTypes() throws {
446470
struct A<each T> : Equatable, Codable {
447471
init(_: repeat (each T).Type) {}
448472

@@ -475,10 +499,10 @@ final class PredicateCodableTests: XCTestCase {
475499
}
476500

477501
let decoded = try _encodeDecode(predicate, for: CustomConfig.self)
478-
XCTAssertEqual(try decoded.evaluate(2), try predicate.evaluate(2))
502+
#expect(try decoded.evaluate(2) == predicate.evaluate(2))
479503
}
480504

481-
func testNestedPredicates() throws {
505+
@Test func nestedPredicates() throws {
482506
let predicateA = #Predicate<Object> {
483507
$0.a == 3
484508
}
@@ -498,11 +522,11 @@ final class PredicateCodableTests: XCTestCase {
498522
]
499523

500524
for object in objects {
501-
XCTAssertEqual(try decoded.evaluate(object), try predicateB.evaluate(object), "Evaluation failed to produce equal results for \(object)")
525+
#expect(try decoded.evaluate(object) == predicateB.evaluate(object), "Evaluation failed to produce equal results for \(object)")
502526
}
503527
}
504528

505-
func testNestedPredicateRestrictedConfiguration() throws {
529+
@Test func nestedPredicateRestrictedConfiguration() throws {
506530
struct RestrictedBox<each T> : Codable {
507531
let predicate: Predicate<repeat each T>
508532

@@ -541,24 +565,30 @@ final class PredicateCodableTests: XCTestCase {
541565
}
542566

543567
// Throws an error because the sub-predicate's configuration won't contain anything in the allowlist
544-
XCTAssertThrowsError(try _encodeDecode(predicateB, for: CustomConfig.self))
568+
#expect(throws: (any Error).self) {
569+
try _encodeDecode(predicateB, for: CustomConfig.self)
570+
}
545571
}
546572

547-
func testExpression() throws {
573+
@Test func expression() throws {
548574
let expression = #Expression<Object, Int> {
549575
$0.a
550576
}
551577
let decoded = try _encodeDecode(expression, for: StandardConfig.self)
552578
var object = Object.example
553-
XCTAssertEqual(try expression.evaluate(object), try decoded.evaluate(object))
579+
#expect(try expression.evaluate(object) == decoded.evaluate(object))
554580
object.a = 2
555-
XCTAssertEqual(try expression.evaluate(object), try decoded.evaluate(object))
581+
#expect(try expression.evaluate(object) == decoded.evaluate(object))
556582
object.a = 3
557-
XCTAssertEqual(try expression.evaluate(object), try decoded.evaluate(object))
583+
#expect(try expression.evaluate(object) == decoded.evaluate(object))
558584

559-
XCTAssertThrowsError(try _encodeDecode(expression, for: EmptyConfig.self))
560-
XCTAssertThrowsError(try _encodeDecode(expression))
585+
#expect(throws: (any Error).self) {
586+
try _encodeDecode(expression, for: EmptyConfig.self)
587+
}
588+
#expect(throws: (any Error).self) {
589+
try _encodeDecode(expression)
590+
}
561591
}
562592
}
563593

564-
#endif // FOUNDATION_FRAMEWORK
594+
#endif

0 commit comments

Comments
 (0)