// -*- swift -*- // RUN: %target-run-simple-swiftgyb // REQUIRES: executable_test %{ from gyb_stdlib_support import ( TRAVERSALS, sliceTypeName, defaultIndicesForTraversal ) }% 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 ]: % Slice = sliceTypeName(traversal=Traversal, mutable=Mutable, rangeReplaceable=RangeReplaceable) % Collection = 'Minimal' + Slice.replace('Slice', 'Collection') SliceTests.test("${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, indexDistanceType: Int.self, indicesType: ${defaultIndicesForTraversal(Traversal)}.self) } func checkStaticTypealiases1(_: Base) { expectEqualType(Base.Index.self, Slice.Index.self) } func checkStaticTypealiases2< Base : MutableCollection >(_: Base) { expectEqualType(Base.Index.self, MutableSlice.Index.self) } } SliceTests.test("${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) checkCollection( slice, expected: test.expected, stackTrace: SourceLocStack().with(test.loc)) { $0.value == $1.value } } } % if RangeReplaceable == False and Mutable == False: SliceTests.test("${Slice}/baseProperty") { let referenceCollection = ReferenceCollection() let testSlice = ${Slice}(base: referenceCollection, bounds: 0..<1) expectTrue(testSlice.base === referenceCollection) } % end SliceTests.test("${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) expectEqual(bounds.lowerBound, slice.startIndex) expectEqual(bounds.upperBound, slice.endIndex) } } % end % end % end //===----------------------------------------------------------------------===// // MutableSlice //===----------------------------------------------------------------------===// /* FIXME: uncomment this test when the following bug is fixed: Recast Slice and MutableSlice in terms of Collection and MutableCollection extension MutableSlice { func _checkBaseSubSequenceElementIsElement() { Element.self, Iterator.Element.self) expectEqualType( Element.self, Iterator.Element.self, Base.Iterator.Element.self) expectEqualType( Element.self, Iterator.Element.self, Base.SubSequence.Iterator.Element.self) } } */ runAllTests()