@@ -31,6 +31,41 @@ func checkHasContiguousStorageSubstring(_ x: Substring.UTF8View) {
31
31
expectTrue ( hasStorage)
32
32
}
33
33
34
+ fileprivate func slices(
35
+ _ s: String ,
36
+ from: Int ,
37
+ to: Int
38
+ ) -> (
39
+ Substring ,
40
+ Substring ,
41
+ Substring
42
+ ) {
43
+ let s1 = s [ s. index ( s. startIndex, offsetBy: from) ..<
44
+ s. index ( s. startIndex, offsetBy: to) ]
45
+ let s2 = s1 [ s1. startIndex..< s1. endIndex]
46
+ let s3 = s2 [ s1. startIndex..< s1. endIndex]
47
+ return ( s1, s2, s3)
48
+ }
49
+
50
+ fileprivate func allNotEmpty(
51
+ _ s: Substring ...
52
+ ) -> Bool {
53
+ s. allSatisfy { $0. isEmpty == false }
54
+ }
55
+
56
+ fileprivate func allEqual(
57
+ _ s: Substring ...
58
+ ) -> Bool {
59
+ for i in 0 ..< s. count {
60
+ for j in ( i + 1 ) ..< s. count {
61
+ if s [ i] != s [ j] {
62
+ return false
63
+ }
64
+ }
65
+ }
66
+ return true
67
+ }
68
+
34
69
SubstringTests . test ( " Equality " ) {
35
70
let s = " abcdefg "
36
71
let s1 = s [ s. index ( s. startIndex, offsetBy: 2 ) ..<
@@ -282,4 +317,219 @@ SubstringTests.test("Substring.base") {
282
317
}
283
318
}
284
319
320
+ SubstringTests . test ( " _isIdentical(to:) small ascii " ) {
321
+ let ( a1, a2, a3) = slices ( " Hello " , from: 2 , to: 4 )
322
+ let ( b1, b2, b3) = slices ( " Hello " , from: 2 , to: 4 )
323
+
324
+ precondition ( allNotEmpty ( a1, a2, a3, b1, b2, b3) )
325
+ precondition ( allEqual ( a1, a2, a3, b1, b2, b3) )
326
+
327
+ expectTrue ( a1. _isIdentical ( to: a1) )
328
+ expectTrue ( a1. _isIdentical ( to: a2) )
329
+ expectTrue ( a1. _isIdentical ( to: a3) )
330
+ expectTrue ( a1. _isIdentical ( to: b1) )
331
+ expectTrue ( a1. _isIdentical ( to: b2) )
332
+ expectTrue ( a1. _isIdentical ( to: b3) )
333
+
334
+ expectTrue ( a2. _isIdentical ( to: a1) )
335
+ expectTrue ( a2. _isIdentical ( to: a2) )
336
+ expectTrue ( a2. _isIdentical ( to: a3) )
337
+ expectTrue ( a2. _isIdentical ( to: b1) )
338
+ expectTrue ( a2. _isIdentical ( to: b2) )
339
+ expectTrue ( a2. _isIdentical ( to: b3) )
340
+
341
+ expectTrue ( a3. _isIdentical ( to: a1) )
342
+ expectTrue ( a3. _isIdentical ( to: a2) )
343
+ expectTrue ( a3. _isIdentical ( to: a3) )
344
+ expectTrue ( a3. _isIdentical ( to: b1) )
345
+ expectTrue ( a3. _isIdentical ( to: b2) )
346
+ expectTrue ( a3. _isIdentical ( to: b3) )
347
+ }
348
+
349
+ SubstringTests . test ( " _isIdentical(to:) small unicode " ) {
350
+ let ( a1, a2, a3) = slices ( " Hello Cafe \u{301} " , from: 2 , to: 4 )
351
+ let ( b1, b2, b3) = slices ( " Hello Cafe \u{301} " , from: 2 , to: 4 )
352
+ let ( c1, c2, c3) = slices ( " Hello Café " , from: 2 , to: 4 )
353
+
354
+ precondition ( allNotEmpty ( a1, a2, a3, b1, b2, b3, c1, c2, c3) )
355
+ precondition ( allEqual ( a1, a2, a3, b1, b2, b3, c1, c2, c3) )
356
+
357
+ expectTrue ( a1. _isIdentical ( to: a1) )
358
+ expectTrue ( a1. _isIdentical ( to: a2) )
359
+ expectTrue ( a1. _isIdentical ( to: a3) )
360
+ expectTrue ( a1. _isIdentical ( to: b1) )
361
+ expectTrue ( a1. _isIdentical ( to: b2) )
362
+ expectTrue ( a1. _isIdentical ( to: b3) )
363
+ expectFalse ( a1. _isIdentical ( to: c1) )
364
+ expectFalse ( a1. _isIdentical ( to: c2) )
365
+ expectFalse ( a1. _isIdentical ( to: c3) )
366
+
367
+ expectTrue ( a2. _isIdentical ( to: a1) )
368
+ expectTrue ( a2. _isIdentical ( to: a2) )
369
+ expectTrue ( a2. _isIdentical ( to: a3) )
370
+ expectTrue ( a2. _isIdentical ( to: b1) )
371
+ expectTrue ( a2. _isIdentical ( to: b2) )
372
+ expectTrue ( a2. _isIdentical ( to: b3) )
373
+ expectFalse ( a2. _isIdentical ( to: c1) )
374
+ expectFalse ( a2. _isIdentical ( to: c2) )
375
+ expectFalse ( a2. _isIdentical ( to: c3) )
376
+
377
+ expectTrue ( a3. _isIdentical ( to: a1) )
378
+ expectTrue ( a3. _isIdentical ( to: a2) )
379
+ expectTrue ( a3. _isIdentical ( to: a3) )
380
+ expectTrue ( a3. _isIdentical ( to: b1) )
381
+ expectTrue ( a3. _isIdentical ( to: b2) )
382
+ expectTrue ( a3. _isIdentical ( to: b3) )
383
+ expectFalse ( a3. _isIdentical ( to: c1) )
384
+ expectFalse ( a3. _isIdentical ( to: c2) )
385
+ expectFalse ( a3. _isIdentical ( to: c3) )
386
+ }
387
+
388
+ SubstringTests . test ( " _isIdentical(to:) large ascii " ) {
389
+ let ( a1, a2, a3) = slices ( String ( repeating: " Hello " , count: 1000 ) , from: 2 , to: 4 )
390
+ let ( b1, b2, b3) = slices ( String ( repeating: " Hello " , count: 1000 ) , from: 2 , to: 4 )
391
+
392
+ precondition ( allNotEmpty ( a1, a2, a3, b1, b2, b3) )
393
+ precondition ( allEqual ( a1, a2, a3, b1, b2, b3) )
394
+
395
+ expectTrue ( a1. _isIdentical ( to: a1) )
396
+ expectTrue ( a1. _isIdentical ( to: a2) )
397
+ expectTrue ( a1. _isIdentical ( to: a3) )
398
+ expectFalse ( a1. _isIdentical ( to: b1) )
399
+ expectFalse ( a1. _isIdentical ( to: b2) )
400
+ expectFalse ( a1. _isIdentical ( to: b3) )
401
+
402
+ expectTrue ( a2. _isIdentical ( to: a1) )
403
+ expectTrue ( a2. _isIdentical ( to: a2) )
404
+ expectTrue ( a2. _isIdentical ( to: a3) )
405
+ expectFalse ( a2. _isIdentical ( to: b1) )
406
+ expectFalse ( a2. _isIdentical ( to: b2) )
407
+ expectFalse ( a2. _isIdentical ( to: b3) )
408
+
409
+ expectTrue ( a3. _isIdentical ( to: a1) )
410
+ expectTrue ( a3. _isIdentical ( to: a2) )
411
+ expectTrue ( a3. _isIdentical ( to: a3) )
412
+ expectFalse ( a3. _isIdentical ( to: b1) )
413
+ expectFalse ( a3. _isIdentical ( to: b2) )
414
+ expectFalse ( a3. _isIdentical ( to: b3) )
415
+ }
416
+
417
+ SubstringTests . test ( " isIdentical(to:) small ascii " )
418
+ . skip ( . custom(
419
+ { if #available( SwiftStdlib 6 . 3 , * ) { false } else { true } } ,
420
+ reason: " Requires Swift 6.3's standard library "
421
+ ) )
422
+ . code {
423
+ guard #available( SwiftStdlib 6 . 3 , * ) else { return }
424
+
425
+ let ( a1, a2, a3) = slices ( " Hello " , from: 2 , to: 4 )
426
+ let ( b1, b2, b3) = slices ( " Hello " , from: 2 , to: 4 )
427
+
428
+ precondition ( allNotEmpty ( a1, a2, a3, b1, b2, b3) )
429
+ precondition ( allEqual ( a1, a2, a3, b1, b2, b3) )
430
+
431
+ expectTrue ( a1. isIdentical ( to: a1) )
432
+ expectTrue ( a1. isIdentical ( to: a2) )
433
+ expectTrue ( a1. isIdentical ( to: a3) )
434
+ expectTrue ( a1. isIdentical ( to: b1) )
435
+ expectTrue ( a1. isIdentical ( to: b2) )
436
+ expectTrue ( a1. isIdentical ( to: b3) )
437
+
438
+ expectTrue ( a2. isIdentical ( to: a1) )
439
+ expectTrue ( a2. isIdentical ( to: a2) )
440
+ expectTrue ( a2. isIdentical ( to: a3) )
441
+ expectTrue ( a2. isIdentical ( to: b1) )
442
+ expectTrue ( a2. isIdentical ( to: b2) )
443
+ expectTrue ( a2. isIdentical ( to: b3) )
444
+
445
+ expectTrue ( a3. isIdentical ( to: a1) )
446
+ expectTrue ( a3. isIdentical ( to: a2) )
447
+ expectTrue ( a3. isIdentical ( to: a3) )
448
+ expectTrue ( a3. isIdentical ( to: b1) )
449
+ expectTrue ( a3. isIdentical ( to: b2) )
450
+ expectTrue ( a3. isIdentical ( to: b3) )
451
+ }
452
+
453
+ SubstringTests . test ( " isIdentical(to:) small unicode " )
454
+ . skip ( . custom(
455
+ { if #available( SwiftStdlib 6 . 3 , * ) { false } else { true } } ,
456
+ reason: " Requires Swift 6.3's standard library "
457
+ ) )
458
+ . code {
459
+ guard #available( SwiftStdlib 6 . 3 , * ) else { return }
460
+
461
+ let ( a1, a2, a3) = slices ( " Hello Cafe \u{301} " , from: 2 , to: 4 )
462
+ let ( b1, b2, b3) = slices ( " Hello Cafe \u{301} " , from: 2 , to: 4 )
463
+ let ( c1, c2, c3) = slices ( " Hello Café " , from: 2 , to: 4 )
464
+
465
+ precondition ( allNotEmpty ( a1, a2, a3, b1, b2, b3, c1, c2, c3) )
466
+ precondition ( allEqual ( a1, a2, a3, b1, b2, b3, c1, c2, c3) )
467
+
468
+ expectTrue ( a1. isIdentical ( to: a1) )
469
+ expectTrue ( a1. isIdentical ( to: a2) )
470
+ expectTrue ( a1. isIdentical ( to: a3) )
471
+ expectTrue ( a1. isIdentical ( to: b1) )
472
+ expectTrue ( a1. isIdentical ( to: b2) )
473
+ expectTrue ( a1. isIdentical ( to: b3) )
474
+ expectFalse ( a1. isIdentical ( to: c1) )
475
+ expectFalse ( a1. isIdentical ( to: c2) )
476
+ expectFalse ( a1. isIdentical ( to: c3) )
477
+
478
+ expectTrue ( a2. isIdentical ( to: a1) )
479
+ expectTrue ( a2. isIdentical ( to: a2) )
480
+ expectTrue ( a2. isIdentical ( to: a3) )
481
+ expectTrue ( a2. isIdentical ( to: b1) )
482
+ expectTrue ( a2. isIdentical ( to: b2) )
483
+ expectTrue ( a2. isIdentical ( to: b3) )
484
+ expectFalse ( a2. isIdentical ( to: c1) )
485
+ expectFalse ( a2. isIdentical ( to: c2) )
486
+ expectFalse ( a2. isIdentical ( to: c3) )
487
+
488
+ expectTrue ( a3. isIdentical ( to: a1) )
489
+ expectTrue ( a3. isIdentical ( to: a2) )
490
+ expectTrue ( a3. isIdentical ( to: a3) )
491
+ expectTrue ( a3. isIdentical ( to: b1) )
492
+ expectTrue ( a3. isIdentical ( to: b2) )
493
+ expectTrue ( a3. isIdentical ( to: b3) )
494
+ expectFalse ( a3. isIdentical ( to: c1) )
495
+ expectFalse ( a3. isIdentical ( to: c2) )
496
+ expectFalse ( a3. isIdentical ( to: c3) )
497
+ }
498
+
499
+ SubstringTests . test ( " isIdentical(to:) large ascii " )
500
+ . skip ( . custom(
501
+ { if #available( SwiftStdlib 6 . 3 , * ) { false } else { true } } ,
502
+ reason: " Requires Swift 6.3's standard library "
503
+ ) )
504
+ . code {
505
+ guard #available( SwiftStdlib 6 . 3 , * ) else { return }
506
+
507
+ let ( a1, a2, a3) = slices ( String ( repeating: " Hello " , count: 1000 ) , from: 2 , to: 4 )
508
+ let ( b1, b2, b3) = slices ( String ( repeating: " Hello " , count: 1000 ) , from: 2 , to: 4 )
509
+
510
+ precondition ( allNotEmpty ( a1, a2, a3, b1, b2, b3) )
511
+ precondition ( allEqual ( a1, a2, a3, b1, b2, b3) )
512
+
513
+ expectTrue ( a1. isIdentical ( to: a1) )
514
+ expectTrue ( a1. isIdentical ( to: a2) )
515
+ expectTrue ( a1. isIdentical ( to: a3) )
516
+ expectFalse ( a1. isIdentical ( to: b1) )
517
+ expectFalse ( a1. isIdentical ( to: b2) )
518
+ expectFalse ( a1. isIdentical ( to: b3) )
519
+
520
+ expectTrue ( a2. isIdentical ( to: a1) )
521
+ expectTrue ( a2. isIdentical ( to: a2) )
522
+ expectTrue ( a2. isIdentical ( to: a3) )
523
+ expectFalse ( a2. isIdentical ( to: b1) )
524
+ expectFalse ( a2. isIdentical ( to: b2) )
525
+ expectFalse ( a2. isIdentical ( to: b3) )
526
+
527
+ expectTrue ( a3. isIdentical ( to: a1) )
528
+ expectTrue ( a3. isIdentical ( to: a2) )
529
+ expectTrue ( a3. isIdentical ( to: a3) )
530
+ expectFalse ( a3. isIdentical ( to: b1) )
531
+ expectFalse ( a3. isIdentical ( to: b2) )
532
+ expectFalse ( a3. isIdentical ( to: b3) )
533
+ }
534
+
285
535
runAllTests ( )
0 commit comments