mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
* Kill the slice variants from the gybbed collection test types * Handful more SDK instances * Fix SequencesCollections.swift.gyb
359 lines
9.6 KiB
Swift
359 lines
9.6 KiB
Swift
// -*- swift -*-
|
|
// RUN: %target-run-simple-swiftgyb
|
|
// REQUIRES: executable_test
|
|
|
|
%{
|
|
|
|
from gyb_stdlib_support import (
|
|
TRAVERSALS,
|
|
collectionForTraversal,
|
|
protocolsForCollectionFeatures,
|
|
collectionTypeName
|
|
)
|
|
|
|
}%
|
|
|
|
import SwiftPrivate
|
|
import StdlibUnittest
|
|
import StdlibCollectionUnittest
|
|
|
|
|
|
%for traversal in TRAVERSALS:
|
|
// This comment is a workaround for <rdar://problem/18900352> gyb miscompiles nested loops
|
|
% for mutable in [ False, True ]:
|
|
// This comment is a workaround for <rdar://problem/18900352> gyb miscompiles nested loops
|
|
% Self = 'Minimal' + collectionTypeName(traversal=traversal, mutable=mutable, rangeReplaceable=False)
|
|
|
|
var ${Self}TestSuite = TestSuite("${Self}")
|
|
|
|
${Self}TestSuite.test("startIndex/InterchangeableCollections") {
|
|
var c1 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
var c2 = c1
|
|
|
|
expectEqual(c1.startIndex, c1.startIndex)
|
|
expectEqual(c2.startIndex, c2.startIndex)
|
|
expectEqual(c1.startIndex, c2.startIndex)
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("startIndex/DifferentCollections") {
|
|
let c1 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
let c2 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
expectEqual(c1.startIndex, c1.startIndex)
|
|
expectEqual(c2.startIndex, c2.startIndex)
|
|
let i1 = c1.startIndex
|
|
let i2 = c2.startIndex
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
}
|
|
|
|
${Self}TestSuite.test("endIndex/InterchangeableCollections") {
|
|
var c1 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
let c2 = c1
|
|
expectEqual(c1.endIndex, c1.endIndex)
|
|
expectEqual(c2.endIndex, c2.endIndex)
|
|
expectEqual(c1.endIndex, c2.endIndex)
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("endIndex/DifferentCollections") {
|
|
let c1 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
let c2 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
expectEqual(c1.endIndex, c1.endIndex)
|
|
expectEqual(c2.endIndex, c2.endIndex)
|
|
let i1 = c1.endIndex
|
|
let i2 = c2.endIndex
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
}
|
|
|
|
% if mutable:
|
|
${Self}TestSuite.test("subscript(_:Index)/InterchangeableCollections") {
|
|
var c1 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
let c2 = c1
|
|
var i1 = c1.startIndex
|
|
c1[c1.startIndex] = OpaqueValue(4040)
|
|
|
|
var i2 = c1.startIndex
|
|
expectEqual(i1, i2)
|
|
expectEqual(1010, c2[i1].value)
|
|
expectEqual(4040, c1[i2].value)
|
|
|
|
i1 = c1.index(i1, offsetBy: 1)
|
|
i2 = c1.index(i2, offsetBy: 1)
|
|
expectEqual(i1, i2)
|
|
expectEqual(2020, c2[i1].value)
|
|
expectEqual(2020, c1[i2].value)
|
|
|
|
i1 = c1.index(i1, offsetBy: 1)
|
|
i2 = c1.index(i2, offsetBy: 1)
|
|
expectEqual(i1, i2)
|
|
expectEqual(3030, c2[i1].value)
|
|
expectEqual(3030, c1[i2].value)
|
|
}
|
|
|
|
${Self}TestSuite.test("subscript(_:Index)/Get/DifferentCollections") {
|
|
let c1 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
let c2 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
|
|
expectCrashLater()
|
|
c2[c1.startIndex]
|
|
}
|
|
|
|
${Self}TestSuite.test("subscript(_:Index)/Set/DifferentCollections") {
|
|
let c1 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
var c2 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
|
|
expectCrashLater()
|
|
c2[c1.startIndex] = OpaqueValue(4040)
|
|
}
|
|
% end
|
|
|
|
% end
|
|
%end
|
|
|
|
%for traversal in TRAVERSALS:
|
|
% Self = 'Minimal' + collectionTypeName(traversal=traversal, mutable=False, rangeReplaceable=True)
|
|
|
|
func getTwoInterchangeable${Self}(_ elements: [Int])
|
|
-> (${Self}<OpaqueValue<Int>>, ${Self}<OpaqueValue<Int>>) {
|
|
var c1 = ${Self}<OpaqueValue<Int>>()
|
|
c1.append(contentsOf: elements.map(OpaqueValue.init))
|
|
|
|
var c2 = ${Self}<OpaqueValue<Int>>()
|
|
c2.append(contentsOf: elements.map(OpaqueValue.init))
|
|
|
|
return (c1, c2)
|
|
}
|
|
|
|
var ${Self}TestSuite = TestSuite("${Self}")
|
|
|
|
${Self}TestSuite.test("startIndex/InterchangeableCollections") {
|
|
let (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
expectEqual(c1.startIndex, c1.startIndex)
|
|
expectEqual(c2.startIndex, c2.startIndex)
|
|
expectEqual(c1.startIndex, c2.startIndex)
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("startIndex/DifferentCollections") {
|
|
let c1 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
let c2 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
expectEqual(c1.startIndex, c1.startIndex)
|
|
expectEqual(c2.startIndex, c2.startIndex)
|
|
let i1 = c1.startIndex
|
|
let i2 = c2.startIndex
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
}
|
|
|
|
${Self}TestSuite.test("endIndex/InterchangeableCollections") {
|
|
let (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
expectEqual(c1.endIndex, c1.endIndex)
|
|
expectEqual(c2.endIndex, c2.endIndex)
|
|
expectEqual(c1.endIndex, c2.endIndex)
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("endIndex/DifferentCollections") {
|
|
let c1 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
let c2 = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
expectEqual(c1.endIndex, c1.endIndex)
|
|
expectEqual(c2.endIndex, c2.endIndex)
|
|
let i1 = c1.endIndex
|
|
let i2 = c2.endIndex
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
}
|
|
|
|
${Self}TestSuite.test("reserveCapacity()/IndexInvalidation/DifferentCollections") {
|
|
var (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
let i = c1.startIndex
|
|
c1.reserveCapacity(0)
|
|
|
|
expectCrashLater()
|
|
_ = i == c1.startIndex
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("reserveCapacity()/IndexInvalidation/DifferentMutationEpoch") {
|
|
var c = ${Self}(elements: [ 1010, 2020, 3030 ].map(OpaqueValue.init))
|
|
let i = c.startIndex
|
|
c.reserveCapacity(0)
|
|
|
|
expectCrashLater()
|
|
_ = i == c.startIndex
|
|
}
|
|
|
|
${Self}TestSuite.test("append()/IndexInvalidation") {
|
|
var (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
let i1 = c1.endIndex
|
|
c1.append(OpaqueValue(4040))
|
|
let i2 = c1.index(c1.startIndex, offsetBy: 3)
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("append(contentsOf:)/IndexInvalidation") {
|
|
var (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
let i1 = c1.endIndex
|
|
c1.append(contentsOf: [ 4040, 5050 ].map(OpaqueValue.init))
|
|
let i2 = c1.index(c1.startIndex, offsetBy: 3)
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("replaceSubrange()/IndexInvalidation") {
|
|
var (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
let i1 = c1.index(c1.startIndex, offsetBy: 1)
|
|
c1.replaceSubrange(
|
|
i1..<c1.index(i1, offsetBy: 2),
|
|
with: [ 4040, 5050 ].map(OpaqueValue.init))
|
|
let i2 = c1.index(c1.startIndex, offsetBy: 1)
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("insert()/IndexInvalidation") {
|
|
var (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
let i1 = c1.index(c1.startIndex, offsetBy: 1)
|
|
c1.insert(OpaqueValue(4040), at: i1)
|
|
let i2 = c1.index(c1.startIndex, offsetBy: 1)
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("insert(contentsOf:at:)/IndexInvalidation") {
|
|
var (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
let i1 = c1.index(c1.startIndex, offsetBy: 1)
|
|
c1.insert(contentsOf: [ 4040, 5050 ].map(OpaqueValue.init), at: i1)
|
|
let i2 = c1.index(c1.startIndex, offsetBy: 1)
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("remove(at:)/IndexInvalidation") {
|
|
var (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
let i1 = c1.index(c1.startIndex, offsetBy: 1)
|
|
c1.remove(at: c1.index(c1.startIndex, offsetBy: 1))
|
|
let i2 = c1.index(c1.startIndex, offsetBy: 1)
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("removeLast()/IndexInvalidation") {
|
|
var (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
let i2 = c2.endIndex
|
|
c1.removeLast()
|
|
let i1 = c1.endIndex
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("removeSubrange()/IndexInvalidation") {
|
|
var (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
let i1 = c1.index(c1.startIndex, offsetBy: 1)
|
|
c1.removeSubrange(i1..<c1.index(i1, offsetBy: 1))
|
|
let i2 = c1.index(c1.startIndex, offsetBy: 1)
|
|
|
|
expectCrashLater()
|
|
_ = i1 == i2
|
|
_blackHole(c2)
|
|
}
|
|
|
|
${Self}TestSuite.test("removeAll()/IndexInvalidation") {
|
|
var (c1, c2) = getTwoInterchangeable${Self}([ 1010, 2020, 3030 ])
|
|
let i = c1.startIndex
|
|
c1.removeAll(keepingCapacity: true)
|
|
|
|
expectCrashLater()
|
|
_ = i == c1.startIndex
|
|
_blackHole(c2)
|
|
}
|
|
|
|
%end
|
|
|
|
var SequenceTypeAlgorithms = TestSuite("SequenceTypeAlgorithms")
|
|
|
|
SequenceTypeAlgorithms.test("forAllPermutations") {
|
|
do {
|
|
var permutations: [[Int]] = []
|
|
forAllPermutations(0) {
|
|
permutations.append($0)
|
|
}
|
|
expectEqualSequence([[]] as [[Int]], permutations) { $0 == $1 }
|
|
}
|
|
|
|
do {
|
|
var permutations: [[Int]] = []
|
|
forAllPermutations(1) {
|
|
permutations.append($0)
|
|
}
|
|
expectEqualSequence([[ 0 ]] as [[Int]], permutations) { $0 == $1 }
|
|
}
|
|
|
|
do {
|
|
var permutations: [[Int]] = []
|
|
forAllPermutations(2) {
|
|
permutations.append($0)
|
|
}
|
|
expectEqualSequence(
|
|
[[ 0, 1 ], [ 1, 0 ]] as [[Int]], permutations) { $0 == $1 }
|
|
}
|
|
|
|
do {
|
|
var permutations: [[Int]] = []
|
|
forAllPermutations(3) {
|
|
permutations.append($0)
|
|
}
|
|
expectEqualSequence(
|
|
[
|
|
[ 0, 1, 2 ],
|
|
[ 0, 2, 1 ],
|
|
[ 1, 0, 2 ],
|
|
[ 1, 2, 0 ],
|
|
[ 2, 0, 1 ],
|
|
[ 2, 1, 0 ],
|
|
] as [[Int]],
|
|
permutations) { $0 == $1 }
|
|
}
|
|
|
|
do {
|
|
var permutations: [[Int]] = []
|
|
forAllPermutations([ 10, 20, 30 ]) {
|
|
permutations.append($0)
|
|
}
|
|
expectEqualSequence(
|
|
[
|
|
[ 10, 20, 30 ],
|
|
[ 10, 30, 20 ],
|
|
[ 20, 10, 30 ],
|
|
[ 20, 30, 10 ],
|
|
[ 30, 10, 20 ],
|
|
[ 30, 20, 10 ],
|
|
] as [[Int]],
|
|
permutations) { $0 == $1 }
|
|
}
|
|
}
|
|
|
|
runAllTests()
|
|
|