// -*- swift -*-
// RUN: %target-run-simple-swiftgyb
// REQUIRES: executable_test

// <rdar://problem/24357067> The compiler never finishes compiling validation-test/stdlib/CollectionType.swift.gyb in -O
// REQUIRES: swift_test_mode_optimize_none

% import os.path
% import gyb
% from gyb_stdlib_support import TRAVERSALS, collectionForTraversal, sliceTypeName, defaultIndicesForTraversal

import StdlibUnittest
import StdlibCollectionUnittest


var CollectionTypeTests = TestSuite("Collection")

struct CollectionWithDefaultUnderestimatedCount : Collection {
  init(count: Int) {
    self._count = count
    self._collectionState =
      _CollectionState(newRootStateForElementCount: count)
  }

  func makeIterator() -> MinimalIterator<OpaqueValue<Int>> {
    expectUnreachable()
    return MinimalIterator([])
  }

  var startIndex: MinimalIndex {
    return MinimalIndex(
      collectionState: _collectionState,
      position: 0, startIndex: 0, endIndex: _count)
  }

  var endIndex: MinimalIndex {
    return MinimalIndex(
      collectionState: _collectionState,
      position: _count, startIndex: 0, endIndex: _count)
  }

  func index(after i: MinimalIndex) -> MinimalIndex {
    return MinimalIndex(
      collectionState: _collectionState,
      position: i.position + 1, startIndex: 0, endIndex: _count)
  }

  subscript(i: MinimalIndex) -> OpaqueValue<Int> {
    expectUnreachable()
    return OpaqueValue(0xffff)
  }

  var _count: Int
  var _collectionState: _CollectionState
}

//===----------------------------------------------------------------------===//
// filter()
//===----------------------------------------------------------------------===//

var MinimalCollectionWithCustomFilter_timesFilterWasCalled: Int = 0

% for Implementation in [ 'Default', 'Custom' ]:

struct MinimalCollectionWith${Implementation}Filter<Element>
  : Collection {

  init(_ data: [Element], underestimatedCount: UnderestimatedCountBehavior) {
    self._data = MinimalCollection(
      elements: data, underestimatedCount: underestimatedCount)
  }

  func makeIterator() -> MinimalIterator<Element> {
    return _data.makeIterator()
  }

  var startIndex: MinimalIndex {
    return _data.startIndex
  }

  var endIndex: MinimalIndex {
    return _data.endIndex
  }

  func index(after i: MinimalIndex) -> MinimalIndex {
    return _data.index(after: i)
  }

  subscript(i: MinimalIndex) -> Element {
    return _data[i]
  }

  var _data: MinimalCollection<Element>


%   if Implementation == 'Custom':

  static var timesFilterWasCalled: Int {
    get {
      return MinimalCollectionWithCustomFilter_timesFilterWasCalled
    }
    set {
      MinimalCollectionWithCustomFilter_timesFilterWasCalled = newValue
    }
  }

  func filter(
    _ isIncluded: (Element) throws -> Bool
  ) rethrows -> [Element] {
    MinimalCollectionWithCustomFilter.timesFilterWasCalled += 1
    return try _data.filter(isIncluded)
  }

%   end

}

% end

func callStaticCollectionFilter(
  _ sequence: MinimalCollectionWithDefaultFilter<OpaqueValue<Int>>,
  _ isIncluded: (OpaqueValue<Int>) -> Bool
) -> [OpaqueValue<Int>] {
  var result = sequence.filter(isIncluded)
  expectType([OpaqueValue<Int>].self, &result)
  return result
}

func callStaticCollectionFilter(
  _ sequence: MinimalCollectionWithCustomFilter<OpaqueValue<Int>>,
  _ isIncluded: (OpaqueValue<Int>) -> Bool
) -> [OpaqueValue<Int>] {
  var result = sequence.filter(isIncluded)
  expectType([OpaqueValue<Int>].self, &result)
  return result
}

func callGenericCollectionFilter<S : Collection>(
  _ sequence: S,
  _ isIncluded: (S.Iterator.Element) -> Bool
) -> [S.Iterator.Element] {
  var result = sequence.filter(isIncluded)
  expectType(Array<S.Iterator.Element>.self, &result)
  return result
}

% for Implementation in [ 'Default', 'Custom' ]:

%   for dispatch in [ 'Static', 'Generic' ]:

CollectionTypeTests.test("filter/Collection/${Implementation}Implementation/${dispatch}") {
  for test in filterTests {
    for underestimatedCountBehavior in [
      UnderestimatedCountBehavior.precise,
      UnderestimatedCountBehavior.half,
      UnderestimatedCountBehavior.value(0)
    ] {
      let s = MinimalCollectionWith${Implementation}Filter<OpaqueValue<Int>>(
        test.sequence.map(OpaqueValue.init),
        underestimatedCount: underestimatedCountBehavior)
      let closureLifetimeTracker = LifetimeTracked(0)
      expectEqual(1, LifetimeTracked.instances)
      var timesClosureWasCalled = 0
%     if Implementation == 'Custom':
      MinimalCollectionWithCustomFilter<OpaqueValue<Int>>.timesFilterWasCalled = 0
%     end
      var result = call${dispatch}CollectionFilter(s) {
        (element) in
        _blackHole(closureLifetimeTracker)
        timesClosureWasCalled += 1
        return test.includeElement(element.value)
      }
      expectType([OpaqueValue<Int>].self, &result)
      expectEqual(test.expected, result.map { $0.value })
%     if Implementation == 'Custom':
      expectEqual(1, MinimalCollectionWithCustomFilter<OpaqueValue<Int>>.timesFilterWasCalled)
%     end
      expectEqual(
        test.sequence, s.map { $0.value }, "collection should not be consumed")
      expectEqual(test.sequence.count, timesClosureWasCalled,
        "filter() should be eager and should only call its predicate once per element")
      expectGE(
        2 * result.count, result.capacity,
        "filter() should not reserve capacity"
        + "(it does not know how much the predicate will filter out)")
    }
  }
}

%   end

% end

//===----------------------------------------------------------------------===//
// map()
//===----------------------------------------------------------------------===//
var MinimalCollectionWithCustomMap_timesMapWasCalled: Int = 0

% for Implementation in [ 'Default', 'Custom' ]:

struct MinimalCollectionWith${Implementation}Map<Element>
  : Collection {

  init(_ data: [Element], underestimatedCount: UnderestimatedCountBehavior) {
    self._data = MinimalCollection(
      elements: data, underestimatedCount: underestimatedCount)
  }

  func makeIterator() -> MinimalIterator<Element> {
    return _data.makeIterator()
  }

  var startIndex: MinimalIndex {
    return _data.startIndex
  }

  var endIndex: MinimalIndex {
    return _data.endIndex
  }

  func index(after i: MinimalIndex) -> MinimalIndex {
    return _data.index(after: i)
  }

  subscript(i: MinimalIndex) -> Element {
    return _data[i]
  }

  var _data: MinimalCollection<Element>


%   if Implementation == 'Custom':

  static var timesMapWasCalled: Int {
    get {
      return MinimalCollectionWithCustomMap_timesMapWasCalled
    }
    set {
      MinimalCollectionWithCustomMap_timesMapWasCalled = newValue
    }
  }

  func map<T>(
    _ transform: (Element) throws -> T
  ) rethrows -> [T] {
    MinimalCollectionWithCustomMap.timesMapWasCalled += 1
    return try _data.map(transform)
  }

%   end

}

% end

func callStaticCollectionMap<T>(
  _ collection: MinimalCollectionWithDefaultMap<OpaqueValue<Int>>,
  transform: (OpaqueValue<Int>) -> T
) -> [T] {
  var result = collection.map(transform)
  expectType([T].self, &result)
  return result
}

func callStaticCollectionMap<T>(
  _ collection: MinimalCollectionWithCustomMap<OpaqueValue<Int>>,
  transform: (OpaqueValue<Int>) -> T
) -> [T] {
  var result = collection.map(transform)
  expectType([T].self, &result)
  return result
}

func callGenericCollectionMap<C : Collection, T>(
  _ collection: C,
  transform: (C.Iterator.Element) -> T
) -> [T] {
  var result = collection.map(transform)
  expectType([T].self, &result)
  return result
}

% for Implementation in [ 'Default', 'Custom' ]:

%   for dispatch in [ 'Static', 'Generic' ]:

CollectionTypeTests.test(
  "map/Collection/${Implementation}Implementation/${dispatch}"
) {
  for test in mapTests {
    for underestimatedCountBehavior in [
      UnderestimatedCountBehavior.precise,
      UnderestimatedCountBehavior.half,
      UnderestimatedCountBehavior.value(0)
    ] {
      let s = MinimalCollectionWith${Implementation}Map<
        OpaqueValue<Int>
      >(
        test.sequence.map(OpaqueValue.init),
        underestimatedCount: underestimatedCountBehavior)
      let closureLifetimeTracker = LifetimeTracked(0)
      expectEqual(1, LifetimeTracked.instances)
      var timesClosureWasCalled = 0
%     if Implementation == 'Custom':
      MinimalCollectionWithCustomMap<
        OpaqueValue<Int>
      >.timesMapWasCalled = 0
%     end
      var result = call${dispatch}CollectionMap(s) {
        (element: OpaqueValue<Int>) -> OpaqueValue<Int32> in
        _blackHole(closureLifetimeTracker)
        timesClosureWasCalled += 1
        return OpaqueValue(Int32(test.transform(element.value)))
      }
      expectType([OpaqueValue<Int32>].self, &result)
      expectEqual(test.expected, result.map { $0.value })
%     if Implementation == 'Custom':
      expectEqual(
        1, MinimalCollectionWithCustomMap<
          OpaqueValue<Int>
        >.timesMapWasCalled)
%     end
      expectEqual(test.sequence, s.map { $0.value },
        "collection should not be consumed")
      expectEqual(test.sequence.count, timesClosureWasCalled,
        "map() should be eager and should only call its predicate"
        + "once per element")
    }
  }
}

%   end

% end

//===----------------------------------------------------------------------===//
// flatMap()
//===----------------------------------------------------------------------===//

% TLazyFlatMapTest = gyb.parse_template(os.path.join(os.path.dirname(__file__), "Inputs/flatMap.gyb"))
% LazyFlatMapTest = gyb.execute_template(TLazyFlatMapTest, Test='CollectionTypeTests', Kinds=['Collection', 'BidirectionalCollection'])
${LazyFlatMapTest}

//===----------------------------------------------------------------------===//
// underestimatedCount
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("underestimatedCount/Collection/DefaultImplementation") {
  do {
    let s = CollectionWithDefaultUnderestimatedCount(count: 0)
    expectEqual(0, callGenericUnderestimatedCount(s))
  }
  do {
    let s = CollectionWithDefaultUnderestimatedCount(count: 5)
    expectEqual(5, callGenericUnderestimatedCount(s))
  }
}

struct CollectionWithCustomUnderestimatedCount : Collection {
  init(underestimatedCount: Int) {
    self._underestimatedCount = underestimatedCount
    self._collectionState =
      _CollectionState(newRootStateForElementCount: 0xffff)
  }

  func makeIterator() -> MinimalIterator<OpaqueValue<Int>> {
    expectUnreachable()
    return MinimalIterator([])
  }

  var startIndex: MinimalIndex {
    expectUnreachable()
    return MinimalIndex(
      collectionState: _collectionState,
      position: 0, startIndex: 0, endIndex: 0xffff)
  }

  var endIndex: MinimalIndex {
    expectUnreachable()
    return MinimalIndex(
      collectionState: _collectionState,
      position: 0xffff, startIndex: 0, endIndex: 0xffff)
  }

  func index(after i: MinimalIndex) -> MinimalIndex {
    return MinimalIndex(
      collectionState: _collectionState,
      position: i.position + 1, startIndex: 0, endIndex: 0xffff)
  }

  subscript(i: MinimalIndex) -> OpaqueValue<Int> {
    expectUnreachable()
    return OpaqueValue(0xffff)
  }

  var underestimatedCount: Int {
    return _underestimatedCount
  }

  let _underestimatedCount: Int
  var _collectionState: _CollectionState
}

CollectionTypeTests.test("underestimatedCount/Collection/CustomImplementation") {
  do {
    let s = CollectionWithCustomUnderestimatedCount(underestimatedCount: 0)
    expectEqual(0, callGenericUnderestimatedCount(s))
  }
  do {
    let s = CollectionWithCustomUnderestimatedCount(underestimatedCount: 5)
    expectEqual(5, callGenericUnderestimatedCount(s))
  }
}

//===----------------------------------------------------------------------===//
// Collection.makeIterator(), Collection.Iterator
//===----------------------------------------------------------------------===//

struct MinimalCollectionWithDefaultIterator : Collection {
  init(count: Int) {
    self._count = count
    self._collectionState =
      _CollectionState(newRootStateForElementCount: count)
  }

  var startIndex: MinimalIndex {
    return MinimalIndex(
      collectionState: _collectionState,
      position: 0, startIndex: 0, endIndex: _count)
  }

  var endIndex: MinimalIndex {
    return MinimalIndex(
      collectionState: _collectionState,
      position: _count, startIndex: 0, endIndex: _count)
  }

  func index(after i: MinimalIndex) -> MinimalIndex {
    return MinimalIndex(
      collectionState: _collectionState,
      position: i.position + 1, startIndex: 0, endIndex: _count)
  }

  subscript(i: MinimalIndex) -> OpaqueValue<Int> {
    return OpaqueValue(i.position + 1)
  }

  var _count: Int
  var _collectionState: _CollectionState
}

func callGenericIterator<S : Sequence>(_ sequence: S) -> S.Iterator {
  return sequence.makeIterator()
}

CollectionTypeTests.test("Collection.makeIterator()/DefaultImplementation") {
  for count in [ 0, 5 ] {
    let collection = MinimalCollectionWithDefaultIterator(count: count)

    do {
      // Check the return type of the function when called statically.
      var iter = collection.makeIterator()
      expectType(
        IndexingIterator<MinimalCollectionWithDefaultIterator>.self,
        &iter)
    }

    do {
      // Check the return type of the function when called generically.
      var iter = callGenericIterator(collection)
      expectType(
        IndexingIterator<MinimalCollectionWithDefaultIterator>.self,
        &iter)
    }

    checkCollection(
      collection,
      expected: Array(1..<count+1).map(OpaqueValue.init) as [OpaqueValue<Int>]
    ) { $0.value == $1.value }
  }
}

struct MinimalCollectionWithCustomIterator : Collection {
  init(count: Int) {
    self._count = count
    self._collectionState =
      _CollectionState(newRootStateForElementCount: count)
  }

  static var timesIteratorWasCalled: Int = 0

  func makeIterator() -> MinimalIterator<OpaqueValue<Int>> {
    MinimalCollectionWithCustomIterator.timesIteratorWasCalled += 1
    return MinimalIterator<OpaqueValue<Int>>(
      Array(1..<_count+1).map(OpaqueValue.init) as [OpaqueValue<Int>]
    )
  }

  var startIndex: MinimalIndex {
    return MinimalIndex(
      collectionState: _collectionState,
      position: 0, startIndex: 0, endIndex: _count)
  }

  var endIndex: MinimalIndex {
    return MinimalIndex(
      collectionState: _collectionState,
      position: _count, startIndex: 0, endIndex: _count)
  }

  func index(after i: MinimalIndex) -> MinimalIndex {
    return MinimalIndex(
      collectionState: _collectionState,
      position: i.position + 1, startIndex: 0, endIndex: _count)
  }

  subscript(i: MinimalIndex) -> OpaqueValue<Int> {
    return OpaqueValue(i.position + 1)
  }

  var _count: Int
  var _collectionState: _CollectionState
}

CollectionTypeTests.test("Collection.makeIterator()/CustomImplementation") {
  for count in [ 0, 5 ] {
    let collection = MinimalCollectionWithCustomIterator(count: count)

    do {
      // Check the return type of the function when called statically.
      MinimalCollectionWithCustomIterator.timesIteratorWasCalled = 0
      var iter = collection.makeIterator()
      expectType(
        MinimalIterator<OpaqueValue<Int>>.self,
        &iter)
      expectEqual(1, MinimalCollectionWithCustomIterator.timesIteratorWasCalled)
    }

    do {
      MinimalCollectionWithCustomIterator.timesIteratorWasCalled = 0
      // Check the return type of the function when called generically.
      var iter = callGenericIterator(collection)
      expectType(
        MinimalIterator<OpaqueValue<Int>>.self,
        &iter)
      expectEqual(1, MinimalCollectionWithCustomIterator.timesIteratorWasCalled)
    }

    checkCollection(
      collection,
      expected: Array(1..<count+1).map(OpaqueValue.init) as [OpaqueValue<Int>],
      resiliencyChecks: .none) { $0.value == $1.value }
  }
}

//===----------------------------------------------------------------------===//
// subscript(_: Range<Index>), Collection.SubSequence
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("subscript(_: Range<Index>)/Dispatch") {
  let tester = CollectionLog.dispatchTester([OpaqueValue(1)])
  _ = tester[tester.startIndex..<tester.endIndex]
  let log = tester.log
  let log2 = tester.log.subscriptRange
  expectCustomizable(tester, tester.log.subscriptRange)
}

CollectionTypeTests.test("subscript(_: Range<Index>)/writeback") {
  // This code used to crash in materializeForSet.  The issue only reproduced
  // in non-generic code.  rdar://22109071
  var collection = MinimalMutableRandomAccessCollection(
    elements: [ 5, 4, 3, 2, 1, 0, -1, -2, -3, -4 ])
  var i = collection.startIndex
  var j = collection.index(i, offsetBy: 5)
  collection[i..<j].sort()
  expectEqualSequence(
    [ 1, 2, 3, 4, 5, 0, -1, -2, -3, -4 ], collection)
}

CollectionTypeTests.test("subscript(_: Range<Index>)/defaultImplementation/sliceTooLarge")
  .crashOutputMatches("Cannot replace a slice of a MutableCollection with a slice of a larger size")
  .code {
  var x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  expectCrashLater()
  x.withUnsafeMutableBufferPointer { buffer in
    buffer[2..<4] = buffer[4..<8]
  }
}

CollectionTypeTests.test("subscript(_: Range<Index>)/defaultImplementation/sliceTooSmall")
  .crashOutputMatches("Cannot replace a slice of a MutableCollection with a slice of a smaller size")
  .code {
  var x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  expectCrashLater()
  x.withUnsafeMutableBufferPointer { buffer in
    buffer[2..<6] = buffer[6..<8]
  }
}

//===----------------------------------------------------------------------===//
// isEmpty
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("isEmpty/dispatch") {
  let tester = CollectionLog.dispatchTester([OpaqueValue(1)])
  _ = tester.isEmpty
  expectCustomizable(tester, tester.log.isEmpty)
}

//===----------------------------------------------------------------------===//
// first
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("first/dispatch") {
  let tester = CollectionLog.dispatchTester([OpaqueValue(1)])
  _ = tester.first
  expectCustomizable(tester, tester.log.first)
}

//===----------------------------------------------------------------------===//
// count
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("count/dispatch") {
  let tester = CollectionLog.dispatchTester([OpaqueValue(1)])
  _ = tester.count
  expectCustomizable(tester, tester.log.count)
}

//===----------------------------------------------------------------------===//
// index(of:)
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("index(of:)/WhereElementIsEquatable/dispatch") {
  let tester = CollectionLog.dispatchTester([MinimalEquatableValue(1)])
  _ = tester.index(of: MinimalEquatableValue(1))
  expectCustomizable(tester, tester.log._customIndexOfEquatableElement)
}

// FIXME: underscores are a workaround for:
// <rdar://problem/20582358> Commenting out one line determines whether a
// completely different line type-checks
func callGenericFind_<
  C : Collection where C.Iterator.Element : Equatable
>(_ collection: C, _ element: C.Iterator.Element) -> C.Index? {
  return collection.index(of: element)
}

func callStaticFind_(
  _ set: Set<MinimalHashableValue>,
  _ element: MinimalHashableValue
) -> Set<MinimalHashableValue>.Index? {
  return set.index(of: element)
}

% for dispatch in [ 'Static', 'Generic' ]:

// FIXME: implement the same optimization for Dictionary.
// FIXME: move to the file where other Set tests live.
CollectionTypeTests.test("Set<T>.find/CustomImplementation/${dispatch}") {
  for test in findTests {
    let s = Set<MinimalHashableValue>(
      test.sequence.map { MinimalHashableValue($0.value) })
    MinimalHashableValue.timesEqualEqualWasCalled = 0
    MinimalHashableValue.timesHashValueWasCalled = 0
    expectEqual(
      test.expected
        .map { _ in MinimalHashableValue(test.element.value) },
      call${dispatch}Find_(s, MinimalHashableValue(test.element.value))
        .map { s[$0] },
      stackTrace: SourceLocStack().with(test.loc))
    if test.sequence.isEmpty {
      expectEqual(
        0, MinimalHashableValue.timesEqualEqualWasCalled,
        stackTrace: SourceLocStack().with(test.loc))
      expectEqual(
        0, MinimalHashableValue.timesHashValueWasCalled,
        stackTrace: SourceLocStack().with(test.loc))
    } else {
      expectNotEqual(
        0, MinimalHashableValue.timesHashValueWasCalled,
        stackTrace: SourceLocStack().with(test.loc))
    }
    if test.expected != nil {
      expectNotEqual(
        0, MinimalHashableValue.timesEqualEqualWasCalled,
        stackTrace: SourceLocStack().with(test.loc))
    }
  }
}

% end

extension Collection where
  Iterator.Element : Equatable,

  // FIXME: the following constraints should go away after
  // <rdar://problem/20715697> Collection.SubSlice should constrain its
  // Element type
  SubSequence : Collection,
  SubSequence.SubSequence == SubSequence,
  SubSequence.Iterator.Element == Iterator.Element,
  SubSequence.Index == Index {

  func _test_indicesOf(_ element: Iterator.Element) -> [Index] {
    var result: [Index] = []
    var tail = self[startIndex..<endIndex]
    while let foundIndex = tail.index(of: element) {
      result.append(foundIndex)
      tail = tail[index(after: foundIndex)..<endIndex]
    }
    return result
  }
}

CollectionTypeTests.test("index(of:)/ContinueSearch") {
  do {
    let c = MinimalCollection(elements: [] as [MinimalEquatableValue])
    expectEqualSequence(
      [],
      c._test_indicesOf(MinimalEquatableValue(1)))
  }

  do {
    let c = MinimalCollection(
      elements: [1, 2, 1, 3, 1].map(MinimalEquatableValue.init))
    let foundIndices = c._test_indicesOf(MinimalEquatableValue(1))
    let actual = foundIndices.map { c.distance(from: c.startIndex, to: $0) }
    expectEqualSequence(
      [ 0, 2, 4 ],
      actual
      )
  }
}

//===----------------------------------------------------------------------===//
// Collection.split()
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("Collection/split/dispatch") {
  var tester = CollectionLog.dispatchTester([OpaqueValue(1)])
  _ = tester.split { $0.value == 1 }
  expectCustomizable(tester, tester.log.split)
}

//===----------------------------------------------------------------------===//
// prefix(through:)
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("Collection/prefix(through:)/dispatch") {
  var tester = CollectionLog.dispatchTester([1, 2, 3].map(OpaqueValue.init))
  _ = tester.prefix(through: 1)
  expectCustomizable(tester, tester.log.prefixThrough)
}

//===----------------------------------------------------------------------===//
// prefix(upTo:)
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("Collection/prefix(upTo:)/dispatch") {
  var tester = CollectionLog.dispatchTester([OpaqueValue(1)])
  _ = tester.prefix(upTo: 1)
  expectCustomizable(tester, tester.log.prefixUpTo)
}

//===----------------------------------------------------------------------===//
// suffix(from:)
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("Collection/suffix(from:)/dispatch") {
  var tester = CollectionLog.dispatchTester([1, 2, 3].map(OpaqueValue.init))
  _ = tester.suffix(from: 1)
  expectCustomizable(tester, tester.log.suffixFrom)
}


//===----------------------------------------------------------------------===//
// MutableCollection
//===----------------------------------------------------------------------===//

//===----------------------------------------------------------------------===//
// partition(by:)
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("partition(by:)/dispatch") {
  var tester = MutableCollectionLog.dispatchTester([OpaqueValue(1)])
  _ = tester.partition(by: { _ in true })
  expectCustomizable(tester, tester.log.partitionBy)
}

//===----------------------------------------------------------------------===//
// _withUnsafeMutableBufferPointerIfSupported()
//===----------------------------------------------------------------------===//

CollectionTypeTests.test("_withUnsafeMutableBufferPointerIfSupported/dispatch") {
  var tester = MutableCollectionLog.dispatchTester([OpaqueValue(1)])
  _ = tester._withUnsafeMutableBufferPointerIfSupported { _ in () }
  expectCustomizable(tester, tester.log._withUnsafeMutableBufferPointerIfSupported)
}


//===----------------------------------------------------------------------===//
// Associated Type Inference
//===----------------------------------------------------------------------===//

// This section verifies that only the absolutely minimal protocol requirements
// are required to declare each kind of collection. All remaining requirements
// and associated types should be either inferred from the declared properties
// and methods or inherited as defaults via protocol extension.

struct FatalIndex : Comparable { }
func <(lhs: FatalIndex, rhs: FatalIndex) -> Bool { fatalError() }
func ==(lhs: FatalIndex, rhs: FatalIndex) -> Bool { fatalError() }

% for Traversal in TRAVERSALS:
%   Collection = collectionForTraversal(Traversal)
%   Self = 'Fatal' + Collection
%   Slice = sliceTypeName(Traversal, False, False)
%   Indices = defaultIndicesForTraversal(Traversal)

struct ${Self}<T> : ${Collection} {
  var startIndex: FatalIndex { fatalError() }
  var endIndex: FatalIndex { fatalError() }
  subscript(i: FatalIndex) -> T { fatalError() }
  func index(after i: FatalIndex) -> FatalIndex { fatalError() }
%   if Traversal in ['Bidirectional', 'RandomAccess']:
  func index(before i: FatalIndex) -> FatalIndex { fatalError() }
%   end
}

CollectionTypeTests.test("AssociatedTypes/${Collection}") {
  typealias C = ${Self}<Void>
  expectCollectionAssociatedTypes(
    collectionType: C.self,
    iteratorType: IndexingIterator<C>.self,
    subSequenceType: ${Slice}<C>.self,
    indexType: FatalIndex.self,
    indexDistanceType: Int.self,
    indicesType: ${Indices}<C>.self)
}
% end


runAllTests()
