// -*- swift -*- // RUN: %target-run-simple-swiftgyb // REQUIRES: executable_test %{ from gyb_stdlib_support import ( TRAVERSALS, collectionTypeName ) }% import StdlibUnittest import StdlibCollectionUnittest /// Reference-type collection for testing the `base` property. class ReferenceCollection : RandomAccessCollection { typealias Index = Int var startIndex: Int { return 0 } var endIndex: Int { return 1 } subscript(index: Int) -> String { return "" } func index(after i: Int) -> Int { return 1 } func index(before i: Int) -> Int { return 0 } } var SliceTests = TestSuite("Collection") //===----------------------------------------------------------------------===// // Slice //===----------------------------------------------------------------------===// % for Traversal in TRAVERSALS: % for Mutable in [ False, True ]: % for RangeReplaceable in [ False, True ]: % Collection = 'Minimal' + collectionTypeName(traversal=Traversal, mutable=Mutable, rangeReplaceable=RangeReplaceable) SliceTests.test("${Collection}.Slice/AssociatedTypes") { do { typealias Collection = ${Collection}> typealias CollectionSlice = Slice expectSliceType(CollectionSlice.self) expectCollectionAssociatedTypes( collectionType: CollectionSlice.self, iteratorType: IndexingIterator.self, subSequenceType: CollectionSlice.self, indexType: MinimalIndex.self, indicesType: Collection.Indices.self) } func checkStaticTypealiases1(_: Base) { expectEqualType(Base.Index.self, Slice.Index.self) } func checkStaticTypealiases2< Base : MutableCollection >(_: Base) { expectEqualType(Base.Index.self, Slice.Index.self) } } SliceTests.test("${Collection}.Slice/init(base:bounds:)") { for test in subscriptRangeTests { let base = ${Collection}(elements: test.collection) var slice = Slice(base: base, bounds: test.bounds(in: base)) expectType(Slice<${Collection}>>.self, &slice) expectType(${Collection}>.SubSequence.self, &slice) checkCollection( test.expected, slice, stackTrace: SourceLocStack().with(test.loc)) { $0.value == $1.value } } } % if RangeReplaceable == False and Mutable == False: SliceTests.test("${Collection}.Slice/baseProperty") { let referenceCollection = ReferenceCollection() let testSlice = Slice(base: referenceCollection, bounds: 0..<1) expectTrue(testSlice.base === referenceCollection) } % end SliceTests.test("${Collection}.Slice.{startIndex,endIndex}") { for test in subscriptRangeTests { let c = ${Collection}(elements: test.collection) let bounds = test.bounds(in: c) var slice = Slice(base: c, bounds: bounds) expectType(Slice<${Collection}>>.self, &slice) expectType(${Collection}>.SubSequence.self, &slice) expectEqual(bounds.lowerBound, slice.startIndex) expectEqual(bounds.upperBound, slice.endIndex) } } % end % end % end SliceTests.test("${Collection}.Slice.withContiguousStorageIfAvailable") { for test in subscriptRangeTests { let c = ${Collection}(elements: test.collection) let bounds = test.bounds(in: c) var slice = Slice(base: c, bounds: bounds) let r = slice.withContiguousStorageIfAvailable { _ in } expectNil(r) // None of the minimal collection types implement this. } } //===----------------------------------------------------------------------===// // MutableSlice //===----------------------------------------------------------------------===// extension Slice { func _checkBaseSubSequenceElementIsElement() { expectEqualType( Element.self, Iterator.Element.self) expectEqualType( Element.self, Base.Iterator.Element.self) expectEqualType( Element.self, Iterator.Element.self) expectEqualType( Element.self, Base.SubSequence.Iterator.Element.self) } } runAllTests()