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

import StdlibUnittest
import StdlibCollectionUnittest

// Tests

func allocateForRawBuffer(count: Int) -> UnsafeMutableRawPointer {
  return UnsafeMutableRawPointer.allocate(bytes: count, alignedTo: 1)
}
func allocateForBuffer<T>(count: Int) -> UnsafeMutablePointer<T> {
  return UnsafeMutablePointer<T>.allocate(capacity: count)
}
func deallocateForRawBuffer(
  _ memory: UnsafeMutableRawPointer, count: Int
) {
  memory.deallocate(bytes: count, alignedTo: 1)
}
func deallocateForBuffer<T>(
  _ memory: UnsafeMutablePointer<T>, count: Int
) {
  memory.deallocate(capacity: count)
}

// Initialize memory with arbitrary equatable, comparable values.
func initUnsafeRawBufferPointer(_ b: UnsafeMutableRawBufferPointer) {
  _ = b.initializeMemory(as: UInt8.self, from: UInt8(0)..<numericCast(b.count))
}
func initUnsafeBufferPointer(_ b: UnsafeMutableBufferPointer<Float>) {
  _ = b.initialize(from: (0..<b.count).lazy.map {Float($0)})
}

// Test Suites

var UnsafeBufferPointerTestSuite = TestSuite("UnsafeBufferPointer")
var UnsafeMutableBufferPointerTestSuite = TestSuite("UnsafeMutableBufferPointer")
var UnsafeRawBufferPointerTestSuite = TestSuite("UnsafeRawBufferPointer")
var UnsafeMutableRawBufferPointerTestSuite = TestSuite("UnsafeMutableRawBufferPointer")

% for (SelfName, IsMutable, IsRaw, SelfType, PointerType) in [
%   ('UnsafeBufferPointer', False, False, 'UnsafeBufferPointer<Float>', 'UnsafePointer<Float>'),
%   ('UnsafeMutableBufferPointer', True, False, 'UnsafeMutableBufferPointer<Float>', 'UnsafeMutablePointer<Float>'),
%   ('UnsafeRawBufferPointer', False, True, 'UnsafeRawBufferPointer', 'UnsafeRawPointer'),
%   ('UnsafeMutableRawBufferPointer', True, True, 'UnsafeMutableRawBufferPointer', 'UnsafeMutableRawPointer')
% ]:
%   Raw = 'Raw' if IsRaw else ''
%   Element = 'UInt8' if IsRaw else 'Float'

${SelfName}TestSuite.test("AssociatedTypes") {
  expectRandomAccessCollectionAssociatedTypes(
    collectionType: ${SelfType}.self,
%   if IsRaw:
    iteratorType: ${SelfType}.Iterator.self,
%   else:
    iteratorType: IndexingIterator<${SelfType}>.self,
%   end
    subSequenceType: ${'Mutable' if IsMutable else ''}RandomAccessSlice<${SelfType}>.self,
    indexType: Int.self,
    indexDistanceType: Int.self,
    indicesType: CountableRange<Int>.self)

  expect${'Mutable' if IsMutable else ''}CollectionType(${SelfType}.self)
}

${SelfName}TestSuite.test("rebasing") {
  let rawbuffer = UnsafeMutableRawBufferPointer.allocate(count: 4 * MemoryLayout<Int>.stride)
  defer { rawbuffer.deallocate() }

  rawbuffer.copyBytes(from: [0, 1, 2, 3])

%   if IsRaw:
  let buffer = rawbuffer
%   else:
  let intPtr = rawbuffer.baseAddress!.bindMemory(to: Int.self, capacity: 4)
  let buffer = UnsafeMutableBufferPointer(start: intPtr, count: 4)
%   end

  for i in buffer.indices {
    let slice = buffer[i..<buffer.endIndex]
    let rebased = ${SelfName}(rebasing: slice)
    expectEqual(rebased.startIndex, 0)
    expectEqual(rebased.endIndex, rebased.count)
    expectEqual(rebased.endIndex, buffer.endIndex - i)
    expectEqual(rebased[0], slice[i])
    if rebased.count > 1 {
      expectEqual(rebased[1], slice[i + 1])

      // Rebase again. Tests Mutable->Immutable initializer
      // and an rvalue slice with literal indices.
      let rebased2 = ${SelfName}(rebasing: rebased[1..<2])
      expectEqual(rebased2.startIndex, 0)
      expectEqual(rebased2.endIndex, 1)
      expectEqual(rebased2[0], slice[i + 1])
    }
  }
}

// Allocate two buffers. Initialize one and copy it into the other. Pass those
// to the specified generic collection test function `checkBuffers`.
func checkWithExpectedBuffer(checkBuffers: (${SelfType}, ${SelfType}) -> Void) {
  // A collection just big enough to be sliced up interestingly.
  let elementCount = 4

%   if IsRaw:
  var memory: UnsafeMutableRawPointer
  var memoryCopy: UnsafeMutableRawPointer
%   else:
  var memory: UnsafeMutablePointer<Float>
  var memoryCopy: UnsafeMutablePointer<Float>
%   end

  memory = allocateFor${Raw}Buffer(count: elementCount)
  defer { deallocateFor${Raw}Buffer(
      memory, count: elementCount) }

  memoryCopy = allocateFor${Raw}Buffer(count: elementCount)
  defer { deallocateFor${Raw}Buffer(memoryCopy, count: elementCount) }

  initUnsafe${Raw}BufferPointer(
    UnsafeMutable${Raw}BufferPointer(start: memory, count: elementCount))

  let buffer = ${SelfType}(start: memory, count: elementCount)

  let expectedBuffer = UnsafeMutable${Raw}BufferPointer(start: memoryCopy,
    count: elementCount)

%   if IsRaw:
    expectedBuffer.copyBytes(from: buffer)
%   else:
    _ = expectedBuffer.initialize(from: buffer)
%   end

  let expected = ${SelfType}(
    start: expectedBuffer.baseAddress, count: expectedBuffer.count)

  checkBuffers(expected, buffer)
}

${SelfName}TestSuite.test("RandomAccessCollection") {
  checkWithExpectedBuffer { (expected: ${SelfType}, buffer: ${SelfType}) in
    checkRandomAccessCollection(expected, buffer,
      sameValue: { (a: ${Element}, b: ${Element}) in a == b })
  }
}

${SelfName}TestSuite.test("nilBaseAddress") {
  let emptyBuffer = ${SelfType}(start: nil, count: 0)
  expectNil(emptyBuffer.baseAddress)
  expectEqual(0, emptyBuffer.count)
  expectTrue(emptyBuffer.startIndex == emptyBuffer.endIndex)

  var iter = emptyBuffer.makeIterator()
  expectNil(iter.next())

  expectEqualSequence([], emptyBuffer)
}

${SelfName}TestSuite.test("nonNilButEmpty") {
  let emptyAllocated = UnsafeMutablePointer<Float>.allocate(capacity: 0)
  defer { emptyAllocated.deallocate(capacity: 0) }

  let emptyBuffer = ${SelfType}(start: ${PointerType}(emptyAllocated), count: 0)
  expectEqual(emptyAllocated, emptyBuffer.baseAddress)
  expectEqual(0, emptyBuffer.count)
  expectTrue(emptyBuffer.startIndex == emptyBuffer.endIndex)

  var iter = emptyBuffer.makeIterator()
  expectNil(iter.next())

  expectEqualSequence([], emptyBuffer)
}

%   if IsRaw:
${SelfName}TestSuite.test("nonNilNonEmpty") {
  let count = 4
  let allocated = UnsafeMutableRawPointer.allocate(bytes: count, alignedTo: 1)
  defer { allocated.deallocate(bytes: count, alignedTo: 1) }
  let uint8Ptr = allocated.initializeMemory(as: UInt8.self, count: count, to: 1)
  uint8Ptr[count - 1] = 2

  let buffer = ${SelfType}(start: ${PointerType}(allocated), count: count - 1)
  expectEqual(allocated, buffer.baseAddress)
  expectEqual(count - 1, buffer.count)
  expectEqual(count - 1, buffer.endIndex - buffer.startIndex)

  uint8Ptr[1] = 0
  expectEqual(1, buffer[0])
  expectEqual(0, buffer[1])
  expectEqual(1, buffer[2])

  var iter = buffer.makeIterator()
  expectEqual(1, iter.next())
  expectEqual(0, iter.next())
  expectEqual(1, iter.next())
  expectNil(iter.next())

  expectEqualSequence([1, 0, 1], buffer.map { Int($0) })

  expectEqual(2, uint8Ptr[count-1])
}
%   else: # !IsRaw
${SelfName}TestSuite.test("nonNilNonEmpty") {
  let count = 4
  let allocated = UnsafeMutablePointer<Float>.allocate(capacity: count)
  defer { allocated.deallocate(capacity: count) }
  allocated.initialize(to: 1.0, count: count)
  allocated[count - 1] = 2.0

  let buffer = ${SelfType}(start: ${PointerType}(allocated), count: count - 1)
  expectEqual(allocated, buffer.baseAddress)
  expectEqual(count - 1, buffer.count)
  expectEqual(count - 1, buffer.endIndex - buffer.startIndex)

  allocated[1] = 0.0
  expectEqual(1.0, buffer[0])
  expectEqual(0.0, buffer[1])
  expectEqual(1.0, buffer[2])

  var iter = buffer.makeIterator()
  expectEqual(1.0, iter.next())
  expectEqual(0.0, iter.next())
  expectEqual(1.0, iter.next())
  expectNil(iter.next())

  expectEqualSequence([1.0, 0.0, 1.0], buffer)

  expectEqual(2.0, allocated[count-1])
}
%   end # !IsRaw

${SelfName}TestSuite.test("badCount")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .code {
  expectCrashLater()

  let emptyAllocated = UnsafeMutablePointer<Float>.allocate(capacity: 0)
  defer { emptyAllocated.deallocate(capacity: 0) }

  let buffer = ${SelfType}(start: ${PointerType}(emptyAllocated), count: -1)
  _ = buffer
}

${SelfName}TestSuite.test("badNilCount")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .code {
  expectCrashLater()

  let buffer = ${SelfType}(start: nil, count: 1)
  _ = buffer
}
% end # for SelfName, IsRaw, SelfType

UnsafeMutableRawBufferPointerTestSuite.test("changeElementViaBuffer") {
  let count = 4
  let allocated = UnsafeMutableRawPointer.allocate(bytes: count, alignedTo: 1)
  defer { allocated.deallocate(bytes: count, alignedTo: 1) }
  let uint8Ptr = allocated.initializeMemory(as: UInt8.self, count: count, to: 1)
  uint8Ptr[count-1] = UInt8.max

  var buffer = UnsafeMutableRawBufferPointer(start: allocated, count: count - 1)

  buffer[1] = 0
  expectEqual(1, buffer[0])
  expectEqual(0, buffer[1])
  expectEqual(1, buffer[2])

  expectEqual(1, uint8Ptr[0])
  expectEqual(0, uint8Ptr[1])
  expectEqual(1, uint8Ptr[2])
  expectEqual(UInt8.max, uint8Ptr[count-1])

  buffer.sort()
  expectEqual(0, buffer[0])
  expectEqual(1, buffer[1])
  expectEqual(1, buffer[2])

  expectEqual(0, uint8Ptr[0])
  expectEqual(1, uint8Ptr[1])
  expectEqual(1, uint8Ptr[2])
  expectEqual(UInt8.max, uint8Ptr[count-1])
}

UnsafeMutableBufferPointerTestSuite.test("changeElementViaBuffer") {
  let count = 4
  let allocated = UnsafeMutablePointer<Float>.allocate(capacity: count)
  defer { allocated.deallocate(capacity: count) }
  allocated.initialize(to: 1.0, count: count)
  allocated[count-1] = -1.0

  var buffer = UnsafeMutableBufferPointer(start: allocated, count: count - 1)

  buffer[1] = 0.0
  expectEqual(1.0, buffer[0])
  expectEqual(0.0, buffer[1])
  expectEqual(1.0, buffer[2])

  expectEqual(1.0, allocated[0])
  expectEqual(0.0, allocated[1])
  expectEqual(1.0, allocated[2])
  expectEqual(-1.0, allocated[count-1])

  buffer.sort()
  expectEqual(0.0, buffer[0])
  expectEqual(1.0, buffer[1])
  expectEqual(1.0, buffer[2])

  expectEqual(0.0, allocated[0])
  expectEqual(1.0, allocated[1])
  expectEqual(1.0, allocated[2])
  expectEqual(-1.0, allocated[count-1])
}

protocol SubscriptTest {
  static var start: Int { get }
  static var end: Int { get }
  static var elementCount: Int { get }
}

// Initialize memory with opaque values, for use with subscript tests.
extension SubscriptTest {
  static var elementCount: Int { get { return end - start } }

% for SelfType in ['UnsafeRawBufferPointer', 'UnsafeMutableRawBufferPointer']:
  /// Create and populate an `${SelfType}` for use with unit tests.
  /// PRECONDITION: `memory` must be allocated with space for
  /// `SubscriptGetTest.elementCount` bytes.
  static func create${SelfType}(from memory: UnsafeMutableRawPointer)
    -> ${SelfType}
  {
    for i in Self.start..<Self.end {
      memory.initializeMemory(as: UInt8.self, at: i, to: numericCast(i))
    }
    return ${SelfType}(start: memory, count: Self.elementCount)
  }
% end

% for SelfType in ['UnsafeBufferPointer', 'UnsafeMutableBufferPointer']:
  /// Create and populate an `${SelfType}` for use with unit tests.
  /// PRECONDITION: `memory` must be allocated with space for
  /// `SubscriptGetTest.elementCount` elements.
  static func create${SelfType}(from memory: UnsafeMutablePointer<OpaqueValue<Int>>)
    -> ${SelfType}<OpaqueValue<Int>>
  {
    for i in Self.start..<Self.end {
      memory[i] = OpaqueValue(i)
    }
    return ${SelfType}(start: memory, count: Self.elementCount)
  }
% end
}

struct SubscriptGetTest : SubscriptTest {
  // SubscriptGetTest operates on a `(end - start)` sized buffer containing
  // monotonically increasing integers from `start` to `end - 1`.
  static var start = 0
  static var end = 20

  let rangeSelection: RangeSelection
  /// The values that should be expected by slicing the UBP, or `nil` if the
  /// test is expected to crash.
  let expectedValues: [Int]?
  /// Same as `expectedValues`, but for closed ranges. `nil` if no difference,
  /// and empty if the test is expected to crash.
  let expectedClosedValues: [Int]?

  let loc: SourceLoc

  init(
    rangeSelection: RangeSelection, expectedValues: [Int]? = nil,
    expectedClosedValues: [Int]? = nil,
    file: String = #file, line: UInt = #line
  ) {
    self.rangeSelection = rangeSelection
    self.expectedValues = expectedValues
    self.expectedClosedValues = expectedClosedValues ?? expectedValues
    self.loc = SourceLoc(file, line, comment: "test data")
  }
}

let subscriptGetTests : [SubscriptGetTest] = [
  // Valid, empty.
  SubscriptGetTest(rangeSelection: .emptyRange, expectedValues: []),

  // Valid, edges.
  SubscriptGetTest(rangeSelection: .leftEdge,
    expectedValues: [],
    expectedClosedValues: [0]),
  SubscriptGetTest(rangeSelection: .rightEdge,
    expectedValues: [],
    expectedClosedValues: [19]),

  // Valid, internal.
  SubscriptGetTest(rangeSelection: .leftHalf,
    expectedValues: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
  SubscriptGetTest(rangeSelection: .rightHalf,
    expectedValues: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),
  SubscriptGetTest(rangeSelection: .middle,
    expectedValues: [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
  SubscriptGetTest(rangeSelection: .full,
    expectedValues: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),
  SubscriptGetTest(rangeSelection: .offsets(2, 4),
    expectedValues: [2, 3],
    expectedClosedValues: [2, 3, 4]),
  SubscriptGetTest(rangeSelection: .offsets(16, 19),
    expectedValues: [16, 17, 18],
    expectedClosedValues: [16, 17, 18, 19]),

  // Invalid, bottom out of bounds.
  SubscriptGetTest(rangeSelection: .offsets(-1, -1)),
  SubscriptGetTest(rangeSelection: .offsets(-1, 0)),
  SubscriptGetTest(rangeSelection: .offsets(-100, 5)),

  // Invalid, top out of bounds.
  SubscriptGetTest(rangeSelection: .offsets(20, 20),
    expectedValues: []), // Only crash on a closed range.
  SubscriptGetTest(rangeSelection: .offsets(19, 20),
    expectedValues: [19],
    expectedClosedValues: []), // Only crash on a closed range
  SubscriptGetTest(rangeSelection: .offsets(21, 21)),
  SubscriptGetTest(rangeSelection: .offsets(5, 100)),

  // Invalid, both out of bounds.
  SubscriptGetTest(rangeSelection: .offsets(-1, 20)),
  SubscriptGetTest(rangeSelection: .offsets(-100, 100)),
]

struct SubscriptSetTest : SubscriptTest {
  // SubscriptSetTest operates on a `(end - start)` sized buffer containing
  // monotonically increasing integers from `start` to `end - 1`.
  static var start = 0
  static var end = 10

  let rangeSelection: RangeSelection

  let replacementValues: [OpaqueValue<Int>]
  let replacementClosedValues: [OpaqueValue<Int>]

  /// The values that should be expected by slicing the UBP, or `nil` if the
  /// test is expected to crash.
  let expectedValues: [Int]?
  /// Same as `expectedValues`, but for closed ranges. `nil` if no difference.
  let expectedClosedValues: [Int]?

  let loc: SourceLoc

  init(
    rangeSelection: RangeSelection,
    replacementValues: [Int],
    replacementClosedValues: [Int]? = nil,
    expectedValues: [Int]? = nil,
    expectedClosedValues: [Int]? = nil,
    file: String = #file, line: UInt = #line
  ) {
    self.rangeSelection = rangeSelection
    self.expectedValues = expectedValues
    self.expectedClosedValues = expectedClosedValues ?? expectedValues

    self.replacementValues = replacementValues.map { OpaqueValue($0) }
    if let replacements = replacementClosedValues {
      self.replacementClosedValues = replacements.map { OpaqueValue($0) }
    } else {
      self.replacementClosedValues = self.replacementValues
    }
    self.loc = SourceLoc(file, line, comment: "test data")
  }

  /// Create and populate an UnsafeMutableRawBufferPointer slice for use with
  /// unit tests.
  /// PRECONDITION: `memory` must be allocated with space for
  /// `replacementValues.count` bytes.
  func replacementValuesSlice(
    from memory: UnsafeMutableRawPointer,
    replacementValues: [OpaqueValue<Int>]
  ) -> UnsafeMutableRawBufferPointer.SubSequence
  {
    for (i, value) in replacementValues.enumerated() {
      memory.initializeMemory(
        as: UInt8.self, at: i, to: numericCast(value.value))
    }
    let buffer = UnsafeMutableRawBufferPointer(
      start: memory, count: replacementValues.count)
    let fullRange = RangeSelection.full.range(in: buffer)
    return buffer[fullRange]
  }

  /// Create and populate an UnsafeMutableBufferPointer slice for use with unit
  /// tests.
  /// PRECONDITION: `memory` must be allocated with space for
  /// `replacementValues.count` elements.
  func replacementValuesSlice(
    from memory: UnsafeMutablePointer<OpaqueValue<Int>>,
    replacementValues: [OpaqueValue<Int>]
  ) -> MutableRandomAccessSlice<UnsafeMutableBufferPointer<OpaqueValue<Int>>>
  {
    for (i, value) in replacementValues.enumerated() {
      memory[i] = value
    }
    let buffer = UnsafeMutableBufferPointer(
      start: memory, count: replacementValues.count)
    let fullRange = RangeSelection.full.range(in: buffer)
    return buffer[fullRange]
  }
}

let subscriptSetTests : [SubscriptSetTest] = [
  // Valid, empty.
  SubscriptSetTest(
    rangeSelection: .emptyRange,
    replacementValues: [],
    expectedValues: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),

  // Valid, edges.
  SubscriptSetTest(
    rangeSelection: .leftEdge,
    replacementValues: [],
    replacementClosedValues: [91],
    expectedValues: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    expectedClosedValues: [91, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
  SubscriptSetTest(
    rangeSelection: .rightEdge,
    replacementValues: [],
    replacementClosedValues: [91],
    expectedValues: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    expectedClosedValues: [0, 1, 2, 3, 4, 5, 6, 7, 8, 91]),

  // Valid, internal.
  SubscriptSetTest(
    rangeSelection: .leftHalf,
    replacementValues: [10, 11, 12, 13, 14],
    expectedValues: [10, 11, 12, 13, 14, 5, 6, 7, 8, 9]),
  SubscriptSetTest(
    rangeSelection: .rightHalf,
    replacementValues: [10, 11, 12, 13, 14],
    expectedValues: [0, 1, 2, 3, 4, 10, 11, 12, 13, 14]),
  SubscriptSetTest(
    rangeSelection: .middle,
    replacementValues: [10, 11, 12, 13, 14, 15],
    expectedValues: [0, 1, 10, 11, 12, 13, 14, 15, 8, 9]),
  SubscriptSetTest(
    rangeSelection: .full,
    replacementValues: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
    expectedValues: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),

  // Invalid, range and replacement count mismatch.
  SubscriptSetTest(
    rangeSelection: .leftEdge,
    replacementValues: [9, 9],
    replacementClosedValues: [9, 9, 9]),
  SubscriptSetTest(
    rangeSelection: .offsets(1, 2),
    replacementValues: [],
    replacementClosedValues: [9]),
  SubscriptSetTest(
    rangeSelection: .offsets(1, 2),
    replacementValues: [9, 9],
    replacementClosedValues: [9, 9, 9]),
  SubscriptSetTest(
    rangeSelection: .offsets(2, 5),
    replacementValues: [9, 9],
    replacementClosedValues: [9, 9, 9]),
  SubscriptSetTest(
    rangeSelection: .offsets(2, 5),
    replacementValues: [9, 9, 9, 9],
    replacementClosedValues: [9, 9, 9, 9, 9]),

  // Invalid, bottom out of bounds.
  SubscriptSetTest(
    rangeSelection: .offsets(-1, -1),
    replacementValues: []),
  SubscriptSetTest(
    rangeSelection: .offsets(-1, 0),
    replacementValues: [9]),
  SubscriptSetTest(
    rangeSelection: .offsets(-3, 5),
    replacementValues: [9, 9, 9, 9, 9, 9, 9, 9]),

  // Invalid, top out of bounds.
  SubscriptSetTest(
    rangeSelection: .offsets(10, 10),
    replacementValues: [],
    expectedValues: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    expectedClosedValues: []), // Only crash on a closed range.
  SubscriptSetTest(
    rangeSelection: .offsets(9, 10),
    replacementValues: [91],
    expectedValues: [0, 1, 2, 3, 4, 5, 6, 7, 8, 91],
    expectedClosedValues: []), // Only crash on a closed range.
  SubscriptSetTest(
    rangeSelection: .offsets(11, 11),
    replacementValues: []),
  SubscriptSetTest(
    rangeSelection: .offsets(8, 15),
    replacementValues: [9, 9, 9, 9, 9, 9, 9]),

  // Invalid, both out of bounds.
  SubscriptSetTest(
    rangeSelection: .offsets(-1, 10),
    replacementValues: [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]),
  SubscriptSetTest(
    rangeSelection: .offsets(-2, 11),
    replacementValues: [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]),
]

% for (SelfName, IsRaw) in [
%   ('UnsafeBufferPointer', False),
%   ('UnsafeRawBufferPointer', True),
%   ('UnsafeMutableBufferPointer', False),
%   ('UnsafeMutableRawBufferPointer', True)
% ]:

%   Raw = 'Raw' if IsRaw else ''

%   for RangeName in ['range', 'countableRange', 'closedRange', 'countableClosedRange']:
${SelfName}TestSuite.test("subscript/${RangeName}/get").forEach(in: subscriptGetTests) {
  (test) in

  let expectedValues: [Int]?
%     if 'closed' in RangeName.lower():
  if test.rangeSelection.isEmpty {
    return
  }
  // Treat an empty set as nil for closed ranges.
  if test.expectedClosedValues?.isEmpty ?? true {
    expectedValues = nil
  }
  else {
    expectedValues = test.expectedClosedValues
  }
%     else:
  expectedValues = test.expectedValues
%     end

  let elementCount = SubscriptGetTest.elementCount

%     if IsRaw:
  var memory: UnsafeMutableRawPointer
%     else:
  var memory: UnsafeMutablePointer<OpaqueValue<Int>>
%     end

  memory = allocateFor${Raw}Buffer(count: elementCount)
  defer { deallocateFor${Raw}Buffer(memory, count: elementCount) }

  let buffer = SubscriptGetTest.create${SelfName}(from: memory)

%     if IsRaw:
  // A raw buffer pointer has debug bounds checks on indices, and
  // (currently) invokes Collection._failEarlyRangeCheck in nondebug mode.
  if expectedValues == nil { expectCrashLater() }
%     end
  let range = test.rangeSelection.${RangeName}(in: buffer)

  if _isDebugAssertConfiguration() {
    if expectedValues == nil { expectCrashLater() }
  }
  let slice = buffer[range]
  // If expectedValues is nil, we should have crashed above. Allowing the
  // following code to crash leads to false positives.
  if let expectedValues = expectedValues {
    expectEqual(
      expectedValues,
%     if IsRaw:
      slice.map { Int($0) },
% else:
      slice.map { $0.value },
%     end
      stackTrace: SourceLocStack().with(test.loc)
    )
  }
}

%   end # RangeName
% end # SelfName, IsMutable, IsRaw, SelfType, PointerType

% for (SelfName, IsRaw) in [
%   ('UnsafeMutableBufferPointer', False),
%   ('UnsafeMutableRawBufferPointer', True)
% ]:
%   Raw = 'Raw' if IsRaw else ''
%   for RangeName in ['range', 'countableRange', 'closedRange', 'countableClosedRange']:

UnsafeMutable${'Raw' if IsRaw else ''}BufferPointerTestSuite.test("subscript/${RangeName}/set")
%     if not IsRaw:
  // UnsafeRawBuffer (currently) invokes Collection._failEarlyRangeCheck
  // in nondebug mode.
  .skip(.custom(
    { !_isDebugAssertConfiguration() },
    reason: "This tests a debug precondition."))
%     end
.forEach(in: subscriptSetTests) { (test) in

  let expectedValues: [Int]?
  let replacementValues: [OpaqueValue<Int>]
  let elementCount = SubscriptSetTest.elementCount

%      if 'closed' in RangeName.lower():
  if test.rangeSelection.isEmpty {
    return
  }
  // Treat an empty set as nil for closed ranges.
  if test.expectedClosedValues?.isEmpty ?? true {
    expectedValues = nil
  }
  else {
    expectedValues = test.expectedClosedValues
  }
  replacementValues = test.replacementClosedValues
  let isOutOfBounds: () -> Bool = {
    switch test.rangeSelection {
    case let .offsets(lowerBound, upperBound):
      return lowerBound < 0 || upperBound >= elementCount
    default:
      return false
    }
  }
%      else: # !closed
  expectedValues = test.expectedValues
  replacementValues = test.replacementValues
  let isOutOfBounds: () -> Bool = {
    switch test.rangeSelection {
    case let .offsets(lowerBound, upperBound):
      return lowerBound < 0 || upperBound > elementCount
    default:
      return false
    }
  }
%      end # !closed

%     if IsRaw:
  var memory: UnsafeMutableRawPointer
  var sliceMemory: UnsafeMutableRawPointer
%     else:
  var memory: UnsafeMutablePointer<OpaqueValue<Int>>
  var sliceMemory: UnsafeMutablePointer<OpaqueValue<Int>>
%     end

  memory = allocateFor${Raw}Buffer(count: elementCount)
  defer { deallocateFor${Raw}Buffer(memory, count: elementCount) }

  sliceMemory = allocateFor${Raw}Buffer(count: replacementValues.count)
  defer { deallocateFor${Raw}Buffer(
      sliceMemory, count: replacementValues.count) }

  var buffer = SubscriptSetTest.create${SelfName}(from: memory)

%     if IsRaw:
  // A raw buffer pointer has debug bounds checks on indices, and
  // (currently) invokes Collection._failEarlyRangeCheck in nondebug mode.
  if _isDebugAssertConfiguration() || isOutOfBounds() {
    if expectedValues == nil { expectCrashLater() }
  }
%     end
  let range = test.rangeSelection.${RangeName}(in: buffer)

  let replacementSlice = test.replacementValuesSlice(
    from: sliceMemory,
    replacementValues: replacementValues)

  if _isDebugAssertConfiguration() {
    if expectedValues == nil { expectCrashLater() }
  }
  buffer[range] = replacementSlice
  // If expectedValues is nil, we should have crashed above. Allowing the
  // following code to crash leads to false positives.
  if let expectedValues = expectedValues {
    expectEqual(
      expectedValues,
%     if IsRaw:
      buffer.map { Int($0) },
% else:
      buffer.map { $0.value },
%     end
      stackTrace: SourceLocStack().with(test.loc)
    )
  }
}

%   end # RangeName

% end # SelfName

runAllTests()
