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

// Requires swift-version 4
// UNSUPPORTED: swift_test_mode_optimize_none_with_implicit_dynamic

import StdlibUnittest
import StdlibCollectionUnittest

extension Range {
  static var _isHalfOpen: Bool { return true }
}
extension ClosedRange {
  static var _isHalfOpen: Bool { return false }
}

protocol TestProtocol1 {}

struct ContainsTest {
  let lowerBound: Int
  let upperBound: Int
  let value: Int
  let loc: SourceLoc

  var containedInHalfOpen: Bool {
    return lowerBound <= value && value < upperBound
  }

  var containedInClosed: Bool {
    return lowerBound <= value && value <= upperBound
  }

  init(
    lowerBound: Int,
    upperBound: Int,
    value: Int,
    file: String = #file, line: UInt = #line
  ) {
    self.lowerBound = lowerBound
    self.upperBound = upperBound
    self.value = value
    self.loc = SourceLoc(file, line, comment: "test data")
  }
}

func generateContainsTests() -> [ContainsTest] {
  let bounds = [ Int.min, -30, -10, 0, 10, 20, Int.max ]
  var result: [ContainsTest] = []
  for lowerBound in bounds {
    for upperBound in bounds {
      if lowerBound > upperBound { continue }
      for value in bounds {
        result.append(
          ContainsTest(
             lowerBound: lowerBound, upperBound: upperBound,
            value: value))
      }
    }
  }
  return result
}

let containsTests: [ContainsTest] = generateContainsTests()

infix operator ..<* : RangeFormationPrecedence
infix operator ...* : RangeFormationPrecedence

enum VariantRange {
  case halfOpen(lowerBound: Int, upperBound: Int)
  case closed(lowerBound: Int, upperBound: Int)

  var isHalfOpen: Bool {
    switch self {
    case .halfOpen:
      return true
    case .closed:
      return false
    }
  }

  var lowerBound: Int {
    switch self {
    case .halfOpen(let result, _):
      return result
    case .closed(let result, _):
      return result
    }
  }

  var upperBound: Int {
    switch self {
    case .halfOpen(_, let result):
      return result
    case .closed(_, let result):
      return result
    }
  }
}

func ..<* (lhs: Int, rhs: Int) -> VariantRange {
  return .halfOpen(lowerBound: lhs, upperBound: rhs)
}

func ...* (lhs: Int, rhs: Int) -> VariantRange {
  return .closed(lowerBound: lhs, upperBound: rhs)
}

struct OverlapsTest {
  let expected: Bool
  let lhs: VariantRange
  let rhs: VariantRange
  let loc: SourceLoc

  init(
    expected: Bool,
    lhs: VariantRange,
    rhs: VariantRange,
    file: String = #file, line: UInt = #line
  ) {
    self.expected = expected
    self.lhs = lhs
    self.rhs = rhs
    self.loc = SourceLoc(file, line, comment: "test data")
  }
}

let overlapsTests: [OverlapsTest] = [
  // 0-4, 5-10
  OverlapsTest(expected: false, lhs: 0..<*4, rhs: 5..<*10),
  OverlapsTest(expected: false, lhs: 0..<*4, rhs: 5...*10),
  OverlapsTest(expected: false, lhs: 0...*4, rhs: 5..<*10),
  OverlapsTest(expected: false, lhs: 0...*4, rhs: 5...*10),

  // 0-5, 5-10
  OverlapsTest(expected: false, lhs: 0..<*5, rhs: 5..<*10),
  OverlapsTest(expected: false, lhs: 0..<*5, rhs: 5...*10),
  OverlapsTest(expected: true, lhs: 0...*5, rhs: 5..<*10),
  OverlapsTest(expected: true, lhs: 0...*5, rhs: 5...*10),

  // 0-6, 5-10
  OverlapsTest(expected: true, lhs: 0..<*6, rhs: 5..<*10),
  OverlapsTest(expected: true, lhs: 0..<*6, rhs: 5...*10),
  OverlapsTest(expected: true, lhs: 0...*6, rhs: 5..<*10),
  OverlapsTest(expected: true, lhs: 0...*6, rhs: 5...*10),

  // 0-20, 5-10
  OverlapsTest(expected: true, lhs: 0..<*20, rhs: 5..<*10),
  OverlapsTest(expected: true, lhs: 0..<*20, rhs: 5...*10),
  OverlapsTest(expected: true, lhs: 0...*20, rhs: 5..<*10),
  OverlapsTest(expected: true, lhs: 0...*20, rhs: 5...*10),

  // 0-0, 0-5
  OverlapsTest(expected: false, lhs: 0..<*0, rhs: 0..<*5),
  OverlapsTest(expected: false, lhs: 0..<*0, rhs: 0...*5),
]

struct ClampedTest {
  let expected: Range<Int>
  let subject: Range<Int>
  let limits: Range<Int>
  let loc: SourceLoc

  init(
    expected: Range<Int>,
    subject: Range<Int>,
    limits: Range<Int>,
    file: String = #file, line: UInt = #line
  ) {
    self.expected = expected
    self.subject = subject
    self.limits = limits
    self.loc = SourceLoc(file, line, comment: "test data")
  }
}

let clampedTests: [ClampedTest] = [
  ClampedTest(expected: 5..<5,   subject: 0..<3,   limits: 5..<10),
  ClampedTest(expected: 5..<9,   subject: 0..<9,   limits: 5..<10),
  ClampedTest(expected: 5..<10,  subject: 0..<13,  limits: 5..<10),
  ClampedTest(expected: 7..<9,   subject: 7..<9,   limits: 5..<10),
  ClampedTest(expected: 7..<10,  subject: 7..<13,  limits: 5..<10),
  ClampedTest(expected: 10..<10, subject: 13..<15, limits: 5..<10),
]

struct OffsetByTest {
  static let start: Int = 10
  static let end: Int = 20
  let advanceBy: Int

  /// Instead of advancing from `startIndex`, advance from `endIndex`.
  let advanceFromEnd: Bool

  // `nil` if the test should fail for open ranges.
  let newOpenIndex: Int?
  // `nil` if the test should fail for closed ranges.
  let newClosedIndex: Int?

  let loc: SourceLoc

  init(
    advanceBy: Int, newOpenIndex: Int? = nil, newClosedIndex: Int? = nil,
    advanceFromEnd: Bool = false, file: String = #file, line: UInt = #line
  ) {
    self.advanceBy = advanceBy
    self.newOpenIndex = newOpenIndex
    self.newClosedIndex = newClosedIndex
    self.advanceFromEnd = advanceFromEnd
    self.loc = SourceLoc(file, line, comment: "index(_:offsetBy:) tests for countable ranges")
  }
}

let offsetByTests: [OffsetByTest] = [
  // Move forward, valid.
  OffsetByTest(advanceBy: 4, newOpenIndex: 14, newClosedIndex: 14),
  OffsetByTest(advanceBy: 0, newOpenIndex: 10, newClosedIndex: 10),
  OffsetByTest(advanceBy: 10, newOpenIndex: 20, newClosedIndex: 20),
  OffsetByTest(advanceBy: 11, newClosedIndex: 21),

  // Move forward, invalid.
  OffsetByTest(advanceBy: 12),
  OffsetByTest(advanceBy: 25600),

  // Move backward, valid.
  OffsetByTest(advanceBy: -9, newOpenIndex: 11, newClosedIndex: 12,
    advanceFromEnd: true),
  OffsetByTest(advanceBy: -10, newOpenIndex: 10, newClosedIndex: 11,
    advanceFromEnd: true),
  OffsetByTest(advanceBy: -11, newClosedIndex: 10,
    advanceFromEnd: true),
  OffsetByTest(advanceBy: 0, newOpenIndex: 20, newClosedIndex: 21,
    advanceFromEnd: true),

  // Move backward, invalid.
  OffsetByTest(advanceBy: -12, advanceFromEnd: true),
  OffsetByTest(advanceBy: -2885, advanceFromEnd: true),
]

struct IndexDistanceTest {
  static let start: Int = 10
  static let end: Int = 30

  // Leave either of these `nil` to use the 'right edge index', which differs
  // between open and closed ranges.
  let leftIndex: Int?
  let rightIndex: Int?

  let loc: SourceLoc
  let openDistance: Int
  let closedDistance: Int

  /// Return the index `leftIndex` steps away from `start`, or the collection's
  /// `endIndex` if `leftIndex` is `nil`.
  func leftIndex<C: RandomAccessCollection>(of c: C) -> C.Index {
    guard let leftIndex = leftIndex else {
      return c.endIndex
    }
    let iterations = leftIndex - IndexDistanceTest.start
    var idx = c.startIndex
    for _ in 0..<iterations {
      idx = c.index(after: idx)
    }
    return idx
  }

  /// Return the index `rightIndex` steps away from `start`, or the
  /// collection's `endIndex` if `rightIndex` is `nil`.
  func rightIndex<C: RandomAccessCollection>(of c: C) -> C.Index {
    guard let rightIndex = rightIndex else {
      return c.endIndex
    }
    let iterations = rightIndex - IndexDistanceTest.start
    precondition(iterations >= 0)
    var idx = c.startIndex
    for _ in 0..<iterations {
      idx = c.index(after: idx)
    }
    return idx
  }

  init(
    leftIndex: Int? = nil, rightIndex: Int? = nil,
    distance: Int, closedDistance: Int? = nil,
    file: String = #file, line: UInt = #line
  ) {
    self.leftIndex = leftIndex
    self.rightIndex = rightIndex
    self.openDistance = distance
    // Only set closedDistance if testing against someRange.endIndex.
    if closedDistance != nil {
      precondition(leftIndex == nil || rightIndex == nil)
    }
    self.closedDistance = closedDistance ?? distance
    self.loc = SourceLoc(file, line, comment: "distance(from:to:) tests for countable ranges")
  }
}

let indexDistanceTests: [IndexDistanceTest] = [
  // Forward, inside bounds.
  IndexDistanceTest(leftIndex: 10, rightIndex: 29, distance: 19),
  IndexDistanceTest(leftIndex: 15, rightIndex: 15, distance: 0),
  IndexDistanceTest(leftIndex: 16, rightIndex: 29, distance: 13),
  // Forward, at edge.
  IndexDistanceTest(leftIndex: 10, distance: 20, closedDistance: 21),
  IndexDistanceTest(leftIndex: 21, distance: 9, closedDistance: 10),
  IndexDistanceTest(leftIndex: IndexDistanceTest.end, distance: 0, closedDistance: 1),
  // Backwards, inside bounds.
  IndexDistanceTest(leftIndex: 27, rightIndex: 16, distance: -11),
  IndexDistanceTest(leftIndex: 15, rightIndex: 14, distance: -1),
  // Backwards, at edge.
  IndexDistanceTest(rightIndex: 18, distance: -12, closedDistance: -13),
  IndexDistanceTest(rightIndex: 10, distance: -20, closedDistance: -21),
  IndexDistanceTest(rightIndex: IndexDistanceTest.end, distance: 0, closedDistance: -1),
  // Completely at edge.
  IndexDistanceTest(distance: 0),
]

%{
all_range_types = [
   ('Range',       '..<', 'MinimalComparableValue', ''),
   ('Range',       '..<', 'MinimalStrideableValue', 'Countable'),
   ('ClosedRange', '...', 'MinimalComparableValue', ''),
   ('ClosedRange', '...', 'MinimalStrideableValue', 'Countable'),
]
}%

% for (Self, op, Bound, Countable) in all_range_types:
%     TestSuite = Countable + Self + 'TestSuite'

% if Countable == '':
// Check that the generic parameter is called 'Bound'.
extension ${Self} where Bound : TestProtocol1 {
  var _elementIsTestProtocol1: Bool {
    fatalError("not implemented")
  }
}
% end

var ${TestSuite} = TestSuite("${Self}")

${TestSuite}.test("init(uncheckedBounds:)")
  .forEach(in: [(1, 2), (1, 1), (2, 1)]) {
  (lowerInt, upperInt) in

  // Check that 'init(uncheckedBounds:)' does not perform precondition checks,
  // allowing to create ranges that break invariants.
  let r = ${Self}(
    uncheckedBounds: (lower: ${Bound}(lowerInt), upper: ${Bound}(upperInt)))
  expectEqual(lowerInt, r.lowerBound.value)
  expectEqual(upperInt, r.upperBound.value)
}

%   for (DestinationSelf, _, _, _) in all_range_types:
${TestSuite}.test("init(${DestinationSelf})/whereBoundIsStrideable")
  .forEach(in: [(0, 0), (1, 2), (10, 20), (Int.min, Int.max)]) {
  (lowerInt, upperInt) in

  let lower = MinimalStrideableValue(lowerInt)
  let upper = MinimalStrideableValue(upperInt)
  let source: ${Self}<MinimalStrideableValue> = lower${op}upper

  let isSourceHalfOpen = ${Self}<MinimalStrideableValue>._isHalfOpen
  let isDestinationHalfOpen =
    ${DestinationSelf}<MinimalStrideableValue>._isHalfOpen

  let shouldTrap =
    (source.isEmpty && !isDestinationHalfOpen) ||
    (upperInt == Int.max && !isSourceHalfOpen && isDestinationHalfOpen)
  if shouldTrap {
    expectCrashLater()
  }

  let converted = ${DestinationSelf}(source)

  if !shouldTrap {
    expectEqual(lower.value, converted.lowerBound.value)
    expectEqual(
      upper.value + ((isSourceHalfOpen ? 0 : 1) - (isDestinationHalfOpen ? 0 : 1)),
      converted.upperBound.value)
  }
}
%   end

${TestSuite}.test("lowerBound, upperBound") {
  let _1 = ${Bound}(1, identity: 1010)
  let _2 = ${Bound}(2, identity: 2020)
  let range: ${Self}<${Bound}> = _1${op}_2
  expectEqual(1,    range.lowerBound.value)
  expectEqual(1010, range.lowerBound.identity)
  expectEqual(2,    range.upperBound.value)
  expectEqual(2020, range.upperBound.identity)
}

${TestSuite}.test("Equatable") {
  let _1 = ${Bound}(1)
  let _2 = ${Bound}(2)

  let instances: [${Self}<${Bound}>] = [
    _1${op}_1,
    _1${op}_2,
    _2${op}_2,
  ]
  checkEquatable(instances, oracle: { $0 == $1 })
}

${TestSuite}.test("'${op}' traps when upperBound < lowerBound")
  .crashOutputMatches(_isDebugAssertConfiguration() ?
    "Can't form Range with upperBound < lowerBound" : "")
  .code {
  let _1 = ${Bound}(1)
  let _2 = ${Bound}(2)
  expectCrashLater()
  let range: ${Self}<${Bound}> = _2${op}_1
  _blackHole(range)
}

${TestSuite}.test("contains(_:)/staticDispatch") {
  let start = ${Bound}(10)
  let end = ${Bound}(20)
  let range: ${Self}<${Bound}> = start${op}end
  expectEqual(1, ${Bound}.timesLessWasCalled.value)
  for test in 0..<30 {
%   if 'Closed' in Self:
    let expected = test >= start.value && test <= end.value
%   else:
    let expected = test >= start.value && test < end.value
%   end
    expectEqual(
      expected, range.contains(${Bound}(test)),
      "test=\(test)")
  }
  expectEqual(51, ${Bound}.timesLessWasCalled.value)
}

${TestSuite}.test("~=/staticDispatch") {
  let start = ${Bound}(10)
  let end = ${Bound}(20)
  let range: ${Self}<${Bound}> = start${op}end
  expectEqual(1, ${Bound}.timesLessWasCalled.value)
  for test in 0..<30 {
%   if 'Closed' in Self:
    let expected = test >= start.value && test <= end.value
%   else:
    let expected = test >= start.value && test < end.value
%   end
    expectEqual(
      expected, range ~= ${Bound}(test),
      "test=\(test)")
  }
  expectEqual(51, ${Bound}.timesLessWasCalled.value)
}

%   if 'Strideable' in Bound:
${TestSuite}.test("contains(_:)/dynamicDispatch") {
  let start = ${Bound}(10)
  let end = ${Bound}(20)
  let range: ${Self}<${Bound}> = start${op}end
  let loggingRange = LoggingCollection(wrapping: range)
  expectEqual(1, ${Bound}.timesLessWasCalled.value)
  for test in 0..<30 {
%     if 'Closed' in Self:
    let expected = test >= start.value && test <= end.value
%     else:
    let expected = test >= start.value && test < end.value
%     end
    expectEqual(
      expected, loggingRange.contains(${Bound}(test)),
      "test=\(test)")
  }
  expectEqual(51, MinimalStrideableValue.timesLessWasCalled.value)
}
%   end

${TestSuite}.test("contains(_:)/semantics, ~=/semantics")
  .forEach(in: containsTests) {
  (test) in

  // Check both static and dynamic dispatch.
  let range: ${Self}<${Bound}> = ${Bound}(test.lowerBound)${op}${Bound}(test.upperBound)
%   if 'Strideable' in Bound:
  let loggingRange = LoggingCollection(wrapping: range)
%   else:
  let loggingRange = range
%   end

  let value = ${Bound}(test.value)
  let expected =
    ${Self}<${Bound}>._isHalfOpen
    ? test.containedInHalfOpen
    : test.containedInClosed
  expectEqual(expected, range.contains(value))
  expectEqual(expected, loggingRange.contains(value))
  expectEqual(expected, range ~= value)
}

%   for (OtherSelf, other_op, OtherBound, __elementIsTestProtocol1) in all_range_types:
${TestSuite}.test("overlaps(${OtherSelf})/semantics")
  .forEach(in: overlapsTests) {
  (test) in

  if test.lhs.isHalfOpen != ${Self}<${Bound}>._isHalfOpen ||
     test.rhs.isHalfOpen != ${OtherSelf}<${OtherBound}>._isHalfOpen {
    return
  }

  let lhs: ${Self}<${Bound}>
    = ${Bound}(test.lhs.lowerBound)${op}${Bound}(test.lhs.upperBound)
  let rhs: ${Self}<${Bound}>
    = ${Bound}(test.rhs.lowerBound)${op}${Bound}(test.rhs.upperBound)

  expectEqual(test.expected, lhs.overlaps(rhs))
  expectEqual(test.expected, rhs.overlaps(lhs))

  expectEqual(!lhs.isEmpty, lhs.overlaps(lhs))
  expectEqual(!rhs.isEmpty, rhs.overlaps(rhs))
}
%   end

${TestSuite}.test("clamped(to:)/semantics")
  .forEach(in: clampedTests) {
  (test) in

  let subject: ${Self}<${Bound}>
    = ${Bound}(test.subject.lowerBound)${op}${Bound}(test.subject.upperBound)
  let limits: ${Self}<${Bound}>
    = ${Bound}(test.limits.lowerBound)${op}${Bound}(test.limits.upperBound)

  expectEqual(
    ${Bound}(test.expected.lowerBound)${op}${Bound}(test.expected.upperBound),
    subject.clamped(to: limits))
}

${TestSuite}.test("count/whereBoundIsStrideable") {
  typealias Bound = MinimalStrideableValue
  let start = Bound(10)
  let end = Bound(20)
  let range1: ${Self}<Bound> = start${op}start
  let range2: ${Self}<Bound> = start${op}end
  expectEqual(0, Bound.timesEqualEqualWasCalled.value)
  expectEqual(2, Bound.timesLessWasCalled.value)
  expectEqual(0, Bound.timesDistanceWasCalled.value)
  expectEqual(0, Bound.timesAdvancedWasCalled.value)
  expectEqual( 0 + (${Self}<Bound>._isHalfOpen ? 0 : 1), range1.count)
  expectEqual(10 + (${Self}<Bound>._isHalfOpen ? 0 : 1), range2.count)
  expectEqual(0, Bound.timesEqualEqualWasCalled.value)
  expectEqual(2, Bound.timesLessWasCalled.value)
  expectEqual(2, Bound.timesDistanceWasCalled.value)
  expectEqual(0, Bound.timesAdvancedWasCalled.value)
}

%   if 'Strideable' in Bound:
${TestSuite}.test("index(after:)/semantics").forEach(in: [3, 5, 10, 12, 86]) {
  (endValue) in
  let start = ${Bound}(0)
  let end = ${Bound}(endValue)
  let range: ${Self}<${Bound}> = start${op}end
  var idx = range.startIndex
  var previousValue: Int?

  for _ in 0${op}(endValue - 1) {
    // Advance the index to the last in-range position.
    idx = range.index(after: idx)
    if let previousValue = previousValue {
      expectEqual(range[idx].value, previousValue + 1)
    }
    previousValue = range[idx].value
  }
  // Iterate once more to get to the 'after end' position.
  idx = range.index(after: idx)
  expectEqual(idx, range.endIndex)
  // Now, iterate once more and expect a crash.
  expectCrashLater()
  _ = range.index(after: idx)
}

${TestSuite}.test("index(after:)/semantics/smallestRange") {
  let range: ${Self}<${Bound}> = ${Bound}(0)${op}${Bound}(0)
  var idx = range.startIndex

%     if 'Closed' in Self:
  // Should be able to advance the index once.
  idx = range.index(after: idx)
%     end

  expectCrashLater()
  _ = range.index(after: idx)
}

${TestSuite}.test("index(before:)/semantics").forEach(in: [3, 5, 10, 12, 86]) {
  (endValue) in
  let start = ${Bound}(0)
  let end = ${Bound}(endValue)
  let range: ${Self}<${Bound}> = start${op}end
  var idx = range.endIndex
  var previousValue: Int?

  for _ in 0${op}(endValue) {
    // Advance the index backwards until we reach `startIndex`.
    // Precondition: for a..<b, advance endIndex (b - a) times to reach startIndex.
    // Precondition: for a...b, advance endIndex (b - a) + 1 times to reach startIndex.
    idx = range.index(before: idx)
    if let previousValue = previousValue {
      expectEqual(range[idx].value, previousValue - 1)
    }
    previousValue = range[idx].value
  }
  // At this point, we should be at `startIndex`.
  expectEqual(idx, range.startIndex)
  // Now, iterate once more and expect a crash.
  expectCrashLater()
  _ = range.index(before: idx)
}

${TestSuite}.test("index(before:)/semantics/smallestRange") {
  let range: ${Self}<${Bound}> = ${Bound}(0)${op}${Bound}(0)
  var idx = range.endIndex

%     if 'Closed' in Self:
  // Should be able to advance the index once.
  idx = range.index(before: idx)
%     end

  expectCrashLater()
  _ = range.index(before: idx)
}

${TestSuite}.test("index(offsetBy:)/semantics").forEach(in: offsetByTests) {
  (test) in
  let start = ${Bound}(OffsetByTest.start)
  let end = ${Bound}(OffsetByTest.end)
  let range: ${Self}<${Bound}> = start${op}end
  let initialIdx = test.advanceFromEnd ? range.endIndex : range.startIndex

%     if 'Closed' in Self:
  if let newIndex = test.newClosedIndex {
%     else:
  if let newIndex = test.newOpenIndex {
%     end
    let idx = range.index(initialIdx, offsetBy: test.advanceBy)
    if idx != range.endIndex {
      expectEqual(newIndex, range[idx].value, stackTrace: SourceLocStack().with(test.loc))
    }
  } else {
    expectCrashLater()
    _ = range.index(initialIdx, offsetBy: test.advanceBy)
  }
}

${TestSuite}.test("index(offsetBy:)/semantics/smallestRange/forward") {
  let range: ${Self}<${Bound}> = ${Bound}(0)${op}${Bound}(0)
  var idx = range.startIndex

  // This should work.
  _ = range.index(idx, offsetBy: 0)

%     if 'Closed' in Self:
  // Can advance once more.
  _ = range.index(idx, offsetBy: 1)
  expectCrashLater()
  _ = range.index(idx, offsetBy: 2)
%     else:
  expectCrashLater()
  _ = range.index(idx, offsetBy: 1)
%     end
}

${TestSuite}.test("index(offsetBy:)/semantics/smallestRange/backward") {
  let range: ${Self}<${Bound}> = ${Bound}(0)${op}${Bound}(0)
  var idx = range.endIndex

  // This should work.
  _ = range.index(idx, offsetBy: 0)

%     if 'Closed' in Self:
  // Can advance once more.
  _ = range.index(idx, offsetBy: -1)
  expectCrashLater()
  _ = range.index(idx, offsetBy: -2)
%     else:
  expectCrashLater()
  _ = range.index(idx, offsetBy: -1)
%     end
}

${TestSuite}.test("distance(from:to:)/semantics") {
  for test in indexDistanceTests {
    let start = ${Bound}(IndexDistanceTest.start)
    let end = ${Bound}(IndexDistanceTest.end)
    let range: ${Self}<${Bound}> = start${op}end
    let leftIdx = test.leftIndex(of: range)
    let rightIdx = test.rightIndex(of: range)

    let distance = range.distance(from: leftIdx, to: rightIdx)
%     if 'Closed' in Self:
    expectEqual(test.closedDistance, distance, stackTrace: SourceLocStack().with(test.loc))
%     else:
    expectEqual(test.openDistance, distance, stackTrace: SourceLocStack().with(test.loc))
%     end
  }
}

${TestSuite}.test("distance(from:to:)/semantics/smallestRange") {
  let range: ${Self}<${Bound}> = ${Bound}(0)${op}${Bound}(0)
  var idx = range.endIndex

%     if 'Closed' in Self:
  expectEqual(1, range.distance(from: range.startIndex, to: range.endIndex))
%     else:
  expectEqual(0, range.distance(from: range.startIndex, to: range.endIndex))
%     end
}

%   end

${TestSuite}.test("isEmpty") {
  let start = ${Bound}(10)
  let end = ${Bound}(20)
  let range1: ${Self}<${Bound}> = start${op}start
  let range2: ${Self}<${Bound}> = start${op}end
  expectEqual(0, ${Bound}.timesEqualEqualWasCalled.value)
  expectEqual(2, ${Bound}.timesLessWasCalled.value)
  expectEqual(${Self}<${Bound}>._isHalfOpen, range1.isEmpty)
  expectFalse(range2.isEmpty)
  expectEqual(
    ${Self}<${Bound}>._isHalfOpen ? 2 : 0,
    ${Bound}.timesEqualEqualWasCalled.value)
  expectEqual(2, ${Bound}.timesLessWasCalled.value)
%   if Bound == 'MinimalStrideableValue':
  expectEqual(0, ${Bound}.timesDistanceWasCalled.value)
  expectEqual(0, ${Bound}.timesAdvancedWasCalled.value)
%   end
}

${TestSuite}.test("CustomStringConvertible, CustomDebugStringConvertible, CustomReflectable") {
  var r: ${Self}<CustomPrintableValue> =
    CustomPrintableValue(1)${op}CustomPrintableValue(2)
  expectPrinted("(value: 1).description${op}(value: 2).description", r)
  expectDebugPrinted(
    "${Self}(" +
      "(value: 1).debugDescription${op}(value: 2).debugDescription" +
    ")",
    r)
  expectDumped(
    "▿ ${Self}((value: 1).debugDescription${op}(value: 2).debugDescription)\n" +
    "  ▿ lowerBound: (value: 1).debugDescription\n" +
    "    - value: 1\n" +
    "    - identity: 0\n" +
    "  ▿ upperBound: (value: 2).debugDescription\n" +
    "    - value: 2\n" +
    "    - identity: 0\n",
    r)
}

% end

CountableRangeTestSuite.test("AssociatedTypes") {
  typealias Collection = Range<MinimalStrideableValue>
  expectCollectionAssociatedTypes(
    collectionType: Collection.self,
    iteratorType: Collection.Iterator.self,
    subSequenceType: Collection.self,
    indexType: MinimalStrideableValue.self,
    indicesType: Collection.self)
}

CountableClosedRangeTestSuite.test("AssociatedTypes") {
  typealias Collection = ClosedRange<MinimalStrideableValue>
  expectCollectionAssociatedTypes(
    collectionType: Collection.self,
    iteratorType: Collection.Iterator.self,
    subSequenceType: Slice<Collection>.self,
    indexType: Collection.Index.self,
    indicesType: DefaultIndices<Collection>.self)
}

var MiscTestSuite = TestSuite("Misc")

MiscTestSuite.test("map()") {
  // <rdar://problem/17054014> map method should exist on ranges
  var result = (1..<4).map { $0*2 }
  expectType(Array<Int>.self, &result)
  expectEqualSequence([ 2, 4, 6 ], result)
}

MiscTestSuite.test("reversed()") {
  var result = (0..<10).lazy.reversed()
  typealias Expected = ReversedCollection<
    LazyCollection<Range<Int>>>
    expectType(Expected.self, &result)
  expectEqualSequence(
    [ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ],
    result)
}

MiscTestSuite.test("Compatibility typealiases") {
  let _: CountablePartialRangeFrom = 1...
  let _: CountableRange = MinimalStrideableValue(3)..<MinimalStrideableValue(3)
  let _: CountableClosedRange = MinimalStrideableValue(3)...MinimalStrideableValue(3)
}

runAllTests()

