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+
1918fileprivate 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