12
12
13
13
import StdlibUnittest
14
14
15
- internal enum RangeSelection {
16
- case emptyRange
17
- case leftEdge
18
- case rightEdge
19
- case middle
20
- case leftHalf
21
- case rightHalf
22
- case offsets( Range < Int > )
23
-
24
- internal func range< C : Collection > ( in c: C ) -> Range < C . Index > {
25
- switch self {
26
- case . emptyRange: return c. endIndex..< c. endIndex
27
- case . leftEdge: return c. startIndex..< c. startIndex
28
- case . rightEdge: return c. endIndex..< c. endIndex
29
- case . middle:
30
- let start = c. index ( c. startIndex, offsetBy: c. count / 4 )
31
- let end = c. index ( c. startIndex, offsetBy: 3 * c. count / 4 + 1 )
32
- return start..< end
33
- case . leftHalf:
34
- let start = c. startIndex
35
- let end = c. index ( start, offsetBy: c. count / 2 )
36
- return start..< end
37
- case . rightHalf:
38
- let start = c. index ( c. startIndex, offsetBy: c. count / 2 )
39
- let end = c. endIndex
40
- return start..< end
41
- case . offsets( let offsets) :
42
- let start = c. index ( c. startIndex, offsetBy: numericCast ( offsets. lowerBound) )
43
- let end = c. index ( c. startIndex, offsetBy: numericCast ( offsets. upperBound) )
44
- return start..< end
45
- }
46
- }
47
- }
48
-
49
15
internal enum IndexSelection {
50
16
case start
51
17
case middle
@@ -62,22 +28,24 @@ internal enum IndexSelection {
62
28
}
63
29
}
64
30
65
- internal struct ReplaceSubrangeTest {
66
- let collection : [ OpaqueValue < Int > ]
67
- let newElements : [ OpaqueValue < Int > ]
68
- let rangeSelection : RangeSelection
69
- let expected : [ Int ]
70
- let loc : SourceLoc
31
+ public struct ReplaceSubrangeTest {
32
+ public let collection : [ OpaqueValue < Int > ]
33
+ public let newElements : [ OpaqueValue < Int > ]
34
+ public let rangeSelection : RangeSelection
35
+ public let expected : [ Int ]
36
+ public let closedExpected : [ Int ] ? // Expected array for closed ranges
37
+ public let loc : SourceLoc
71
38
72
39
internal init (
73
40
collection: [ Int ] , newElements: [ Int ] ,
74
- rangeSelection: RangeSelection , expected: [ Int ] ,
41
+ rangeSelection: RangeSelection , expected: [ Int ] , closedExpected : [ Int ] ? = nil ,
75
42
file: String = #file, line: UInt = #line
76
43
) {
77
44
self . collection = collection. map ( OpaqueValue . init)
78
45
self . newElements = newElements. map ( OpaqueValue . init)
79
46
self . rangeSelection = rangeSelection
80
47
self . expected = expected
48
+ self . closedExpected = closedExpected
81
49
self . loc = SourceLoc ( file, line, comment: " replaceSubrange() test data " )
82
50
}
83
51
}
@@ -335,7 +303,9 @@ let appendContentsOfTests: [AppendContentsOfTest] = [
335
303
expected: [ 1010 , 2020 , 3030 , 4040 , 5050 , 6060 , 7070 , 8080 ] ) ,
336
304
]
337
305
338
- let replaceRangeTests : [ ReplaceSubrangeTest ] = [
306
+ // Also used in RangeReplaceable.swift.gyb to test `replaceSubrange()`
307
+ // overloads with the countable range types.
308
+ public let replaceRangeTests : [ ReplaceSubrangeTest ] = [
339
309
ReplaceSubrangeTest (
340
310
collection: [ ] ,
341
311
newElements: [ ] ,
@@ -358,55 +328,70 @@ let replaceRangeTests: [ReplaceSubrangeTest] = [
358
328
collection: [ 4040 ] ,
359
329
newElements: [ 1010 , 2020 , 3030 ] ,
360
330
rangeSelection: . leftEdge,
361
- expected: [ 1010 , 2020 , 3030 , 4040 ] ) ,
331
+ expected: [ 1010 , 2020 , 3030 , 4040 ] ,
332
+ closedExpected: [ 1010 , 2020 , 3030 ] ) ,
333
+
334
+ ReplaceSubrangeTest (
335
+ collection: [ 1010 , 2020 , 3030 ] ,
336
+ newElements: [ 4040 ] ,
337
+ rangeSelection: . leftEdge,
338
+ expected: [ 4040 , 1010 , 2020 , 3030 ] ,
339
+ closedExpected: [ 4040 , 2020 , 3030 ] ) ,
362
340
363
341
ReplaceSubrangeTest (
364
342
collection: [ 1010 ] ,
365
343
newElements: [ 2020 , 3030 , 4040 ] ,
366
344
rangeSelection: . rightEdge,
367
- expected: [ 1010 , 2020 , 3030 , 4040 ] ) ,
345
+ expected: [ 1010 , 2020 , 3030 , 4040 ] ,
346
+ closedExpected: [ 2020 , 3030 , 4040 ] ) ,
368
347
369
348
ReplaceSubrangeTest (
370
349
collection: [ 1010 , 2020 , 3030 ] ,
371
350
newElements: [ 4040 ] ,
372
351
rangeSelection: . rightEdge,
373
- expected: [ 1010 , 2020 , 3030 , 4040 ] ) ,
352
+ expected: [ 1010 , 2020 , 3030 , 4040 ] ,
353
+ closedExpected: [ 1010 , 2020 , 4040 ] ) ,
374
354
375
355
ReplaceSubrangeTest (
376
356
collection: [ 1010 , 2020 , 3030 , 4040 , 5050 ] ,
377
357
newElements: [ 9090 ] ,
378
- rangeSelection: . offsets( 1 ..< 1 ) ,
379
- expected: [ 1010 , 9090 , 2020 , 3030 , 4040 , 5050 ] ) ,
358
+ rangeSelection: . offsets( 1 , 1 ) ,
359
+ expected: [ 1010 , 9090 , 2020 , 3030 , 4040 , 5050 ] ,
360
+ closedExpected: [ 1010 , 9090 , 3030 , 4040 , 5050 ] ) ,
380
361
381
362
ReplaceSubrangeTest (
382
363
collection: [ 1010 , 2020 , 3030 , 4040 , 5050 ] ,
383
364
newElements: [ 9090 ] ,
384
- rangeSelection: . offsets( 1 ..< 2 ) ,
385
- expected: [ 1010 , 9090 , 3030 , 4040 , 5050 ] ) ,
365
+ rangeSelection: . offsets( 1 , 2 ) ,
366
+ expected: [ 1010 , 9090 , 3030 , 4040 , 5050 ] ,
367
+ closedExpected: [ 1010 , 9090 , 4040 , 5050 ] ) ,
386
368
387
369
ReplaceSubrangeTest (
388
370
collection: [ 1010 , 2020 , 3030 , 4040 , 5050 ] ,
389
371
newElements: [ 9090 ] ,
390
- rangeSelection: . offsets( 1 ..< 3 ) ,
391
- expected: [ 1010 , 9090 , 4040 , 5050 ] ) ,
372
+ rangeSelection: . offsets( 1 , 3 ) ,
373
+ expected: [ 1010 , 9090 , 4040 , 5050 ] ,
374
+ closedExpected: [ 1010 , 9090 , 5050 ] ) ,
392
375
393
376
ReplaceSubrangeTest (
394
377
collection: [ 1010 , 2020 , 3030 , 4040 , 5050 ] ,
395
378
newElements: [ 9090 ] ,
396
- rangeSelection: . offsets( 1 ..< 4 ) ,
397
- expected: [ 1010 , 9090 , 5050 ] ) ,
379
+ rangeSelection: . offsets( 1 , 4 ) ,
380
+ expected: [ 1010 , 9090 , 5050 ] ,
381
+ closedExpected: [ 1010 , 9090 ] ) ,
398
382
399
383
ReplaceSubrangeTest (
400
384
collection: [ 1010 , 2020 , 3030 , 4040 , 5050 ] ,
401
385
newElements: [ 9090 ] ,
402
- rangeSelection: . offsets( 1 ..< 5 ) ,
386
+ rangeSelection: . offsets( 1 , 5 ) ,
403
387
expected: [ 1010 , 9090 ] ) ,
404
388
405
389
ReplaceSubrangeTest (
406
390
collection: [ 1010 , 2020 , 3030 ] ,
407
391
newElements: [ 8080 , 9090 ] ,
408
- rangeSelection: . offsets( 1 ..< 2 ) ,
409
- expected: [ 1010 , 8080 , 9090 , 3030 ] ) ,
392
+ rangeSelection: . offsets( 1 , 2 ) ,
393
+ expected: [ 1010 , 8080 , 9090 , 3030 ] ,
394
+ closedExpected: [ 1010 , 8080 , 9090 ] ) ,
410
395
]
411
396
412
397
extension TestSuite {
@@ -499,7 +484,7 @@ self.test("\(testNamePrefix).init(Sequence)/semantics") {
499
484
// replaceSubrange()
500
485
//===----------------------------------------------------------------------===//
501
486
502
- self . test ( " \( testNamePrefix) .replaceSubrange()/semantics " ) {
487
+ self . test ( " \( testNamePrefix) .replaceSubrange()/range/ semantics " ) {
503
488
for test in replaceRangeTests {
504
489
var c = makeWrappedCollection ( test. collection)
505
490
let rangeToReplace = test. rangeSelection. range ( in: c)
@@ -513,6 +498,20 @@ self.test("\(testNamePrefix).replaceSubrange()/semantics") {
513
498
}
514
499
}
515
500
501
+ self . test ( " \( testNamePrefix) .replaceSubrange()/closedRange/semantics " ) {
502
+ for test in replaceRangeTests {
503
+ guard let closedExpected = test. closedExpected else { continue }
504
+ var c = makeWrappedCollection ( test. collection)
505
+ let rangeToReplace = test. rangeSelection. closedRange ( in: c)
506
+ let newElements = makeWrappedCollection ( test. newElements)
507
+ c. replaceSubrange ( rangeToReplace, with: newElements)
508
+ expectEqualSequence (
509
+ closedExpected,
510
+ c. map { extractValue ( $0) . value } ,
511
+ stackTrace: SourceLocStack ( ) . with ( test. loc) )
512
+ }
513
+ }
514
+
516
515
//===----------------------------------------------------------------------===//
517
516
// append()
518
517
//===----------------------------------------------------------------------===//
0 commit comments