Skip to content

Commit 4872e54

Browse files
committed
[stdlib] Adding tests for removeSubrange overloads for range types
1 parent e9fff22 commit 4872e54

File tree

4 files changed

+88
-50
lines changed

4 files changed

+88
-50
lines changed

stdlib/private/StdlibCollectionUnittest/CheckRangeReplaceableCollectionType.swift

+61-49
Original file line numberDiff line numberDiff line change
@@ -159,11 +159,11 @@ internal struct RemoveLastNTest {
159159
}
160160
}
161161

162-
internal struct RemoveSubrangeTest {
163-
let collection: [OpaqueValue<Int>]
164-
let rangeSelection: RangeSelection
165-
let expected: [Int]
166-
let loc: SourceLoc
162+
public struct RemoveSubrangeTest {
163+
public let collection: [OpaqueValue<Int>]
164+
public let rangeSelection: RangeSelection
165+
public let expected: [Int]
166+
public let loc: SourceLoc
167167

168168
internal init(
169169
collection: [Int], rangeSelection: RangeSelection, expected: [Int],
@@ -394,6 +394,48 @@ public let replaceRangeTests: [ReplaceSubrangeTest] = [
394394
closedExpected: [1010, 8080, 9090]),
395395
]
396396

397+
public let removeRangeTests: [RemoveSubrangeTest] = [
398+
RemoveSubrangeTest(
399+
collection: [],
400+
rangeSelection: .emptyRange,
401+
expected: []),
402+
403+
RemoveSubrangeTest(
404+
collection: [1010],
405+
rangeSelection: .middle,
406+
expected: []),
407+
408+
RemoveSubrangeTest(
409+
collection: [1010, 2020, 3030, 4040],
410+
rangeSelection: .leftHalf,
411+
expected: [3030, 4040]),
412+
413+
RemoveSubrangeTest(
414+
collection: [1010, 2020, 3030, 4040],
415+
rangeSelection: .rightHalf,
416+
expected: [1010, 2020]),
417+
418+
RemoveSubrangeTest(
419+
collection: [1010, 2020, 3030, 4040, 5050],
420+
rangeSelection: .middle,
421+
expected: [1010, 5050]),
422+
423+
RemoveSubrangeTest(
424+
collection: [1010, 2020, 3030, 4040, 5050, 6060],
425+
rangeSelection: .leftHalf,
426+
expected: [4040, 5050, 6060]),
427+
428+
RemoveSubrangeTest(
429+
collection: [1010, 2020, 3030, 4040, 5050, 6060],
430+
rangeSelection: .rightHalf,
431+
expected: [1010, 2020, 3030]),
432+
433+
RemoveSubrangeTest(
434+
collection: [1010, 2020, 3030, 4040, 5050, 6060],
435+
rangeSelection: .middle,
436+
expected: [1010, 6060]),
437+
]
438+
397439
extension TestSuite {
398440
/// Adds a set of tests for `RangeReplaceableCollection`.
399441
///
@@ -808,50 +850,8 @@ self.test("\(testNamePrefix).removeFirst(n: Int)/removeTooMany/semantics") {
808850
// removeSubrange()
809851
//===----------------------------------------------------------------------===//
810852

811-
self.test("\(testNamePrefix).removeSubrange()/semantics") {
812-
let tests: [RemoveSubrangeTest] = [
813-
RemoveSubrangeTest(
814-
collection: [],
815-
rangeSelection: .emptyRange,
816-
expected: []),
817-
818-
RemoveSubrangeTest(
819-
collection: [1010],
820-
rangeSelection: .middle,
821-
expected: []),
822-
823-
RemoveSubrangeTest(
824-
collection: [1010, 2020, 3030, 4040],
825-
rangeSelection: .leftHalf,
826-
expected: [3030, 4040]),
827-
828-
RemoveSubrangeTest(
829-
collection: [1010, 2020, 3030, 4040],
830-
rangeSelection: .rightHalf,
831-
expected: [1010, 2020]),
832-
833-
RemoveSubrangeTest(
834-
collection: [1010, 2020, 3030, 4040, 5050],
835-
rangeSelection: .middle,
836-
expected: [1010, 5050]),
837-
838-
RemoveSubrangeTest(
839-
collection: [1010, 2020, 3030, 4040, 5050, 6060],
840-
rangeSelection: .leftHalf,
841-
expected: [4040, 5050, 6060]),
842-
843-
RemoveSubrangeTest(
844-
collection: [1010, 2020, 3030, 4040, 5050, 6060],
845-
rangeSelection: .rightHalf,
846-
expected: [1010, 2020, 3030]),
847-
848-
RemoveSubrangeTest(
849-
collection: [1010, 2020, 3030, 4040, 5050, 6060],
850-
rangeSelection: .middle,
851-
expected: [1010, 6060]),
852-
]
853-
854-
for test in tests {
853+
self.test("\(testNamePrefix).removeSubrange()/range/semantics") {
854+
for test in removeRangeTests {
855855
var c = makeWrappedCollection(test.collection)
856856
let rangeToRemove = test.rangeSelection.range(in: c)
857857
c.removeSubrange(rangeToRemove)
@@ -862,6 +862,18 @@ self.test("\(testNamePrefix).removeSubrange()/semantics") {
862862
}
863863
}
864864

865+
self.test("\(testNamePrefix).replaceSubrange()/closedRange/semantics") {
866+
for test in removeRangeTests.filter({ !$0.rangeSelection.isEmpty }) {
867+
var c = makeWrappedCollection(test.collection)
868+
let rangeToRemove = test.rangeSelection.closedRange(in: c)
869+
c.removeSubrange(rangeToRemove)
870+
expectEqualSequence(
871+
test.expected,
872+
c.map { extractValue($0).value },
873+
stackTrace: SourceLocStack().with(test.loc))
874+
}
875+
}
876+
865877
//===----------------------------------------------------------------------===//
866878
// removeAll()
867879
//===----------------------------------------------------------------------===//

stdlib/private/StdlibCollectionUnittest/RangeSelection.swift

+7
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ public enum RangeSelection {
2121
case rightHalf
2222
case offsets(Int, Int)
2323

24+
public var isEmpty: Bool {
25+
switch self {
26+
case .emptyRange: return true
27+
default: return false
28+
}
29+
}
30+
2431
public func range<C : Collection>(in c: C) -> Range<C.Index> {
2532
switch self {
2633
case .emptyRange: return c.endIndex..<c.endIndex

stdlib/public/core/RangeReplaceableCollection.swift.gyb

-1
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,6 @@ extension RangeReplaceableCollection
925925
///
926926
/// - Complexity: O(*n*), where *n* is the length of the collection.
927927
public mutating func removeSubrange(_ bounds: ${Range}<Index>) {
928-
// FIXME: swift-3-indexing-model: tests.
929928
removeSubrange(_makeHalfOpen(bounds))
930929
}
931930
}

validation-test/stdlib/RangeReplaceable.swift.gyb

+20
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,26 @@ RangeReplaceableTestSuite.test("replaceSubrange/countableClosedRange") {
109109
}
110110
}
111111

112+
% withRangeTypes = ["countableRange", "countableClosedRange"]
113+
% for rangeType in withRangeTypes:
114+
RangeReplaceableTestSuite.test("removeSubrange/${rangeType}") {
115+
% if rangeType is "countableClosedRange":
116+
for test in removeRangeTests.filter({ !$0.rangeSelection.isEmpty }) {
117+
% else:
118+
for test in removeRangeTests {
119+
% end
120+
var c =
121+
MinimalRangeReplaceableRandomAccessCollectionWithStrideableIndex(elements: test.collection)
122+
let rangeToRemove = test.rangeSelection.${rangeType}(in: c)
123+
c.removeSubrange(rangeToRemove)
124+
expectEqualSequence(
125+
test.expected,
126+
c.map { $0.value },
127+
stackTrace: SourceLocStack().with(test.loc))
128+
}
129+
}
130+
% end
131+
112132
RangeReplaceableTestSuite.test("reserveCapacity/dispatch") {
113133
var tester = RangeReplaceableCollectionLog.dispatchTester(Array<Int>())
114134
tester.reserveCapacity(10)

0 commit comments

Comments
 (0)