// RUN: %empty-directory(%t)
// RUN: %gyb %s -o %t/ArrayTraps.swift
// RUN: %line-directive %t/ArrayTraps.swift -- %target-build-swift %t/ArrayTraps.swift -o %t/a.out_Debug -Onone
// RUN: %line-directive %t/ArrayTraps.swift -- %target-build-swift %t/ArrayTraps.swift -o %t/a.out_Release -O
//
// RUN: %line-directive %t/ArrayTraps.swift -- %target-run %t/a.out_Debug
// RUN: %line-directive %t/ArrayTraps.swift -- %target-run %t/a.out_Release
// REQUIRES: executable_test

import StdlibUnittest

let testSuiteSuffix = _isDebugAssertConfiguration() ? "_debug" : "_release"

%{
# We test for bounds-checking traps for both reading and writing
# both single elements and slices of all three different array
# types.
array_types = ('Array', 'ContiguousArray', 'ArraySlice')

def bounds_trap(index, expr_to_write):
  global io
  return 'expectCrashLater()\n' + (
    'let x = a[%s]' % index
     if io == 'read' else
    'a[%s] = %s' % (index, expr_to_write))
}%

% for ArrayTy in array_types:

var ${ArrayTy}Traps = TestSuite("${ArrayTy}Traps" + testSuiteSuffix)
var ${ArrayTy}LowerBoundOutOfRangeErrorMsg = (
% if ArrayTy in ['Array', 'ContiguousArray']:
    "Negative ${ArrayTy} index is out of range"
% else:
    "${ArrayTy} index is out of range (before startIndex)"
% end
)

var ${ArrayTy}BoundsErrorMsg = (
% if ArrayTy in ['Array', 'ContiguousArray']:
    "Index out of range"
% else:
    "Index out of bounds"
% end
)

%   for io in ['read', 'write']:

${ArrayTy}Traps.test("bounds1/${io}")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches(_isDebugAssertConfiguration() ?
    ${ArrayTy}BoundsErrorMsg : "")
  .code {
  var a: ${ArrayTy}<Int> = []
  ${bounds_trap(index='0', expr_to_write='1')}
}

${ArrayTy}Traps.test("bounds2/${io}")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches(_isDebugAssertConfiguration() ?
    ${ArrayTy}BoundsErrorMsg : "")
  .code {
  var a: ${ArrayTy}<Int> = []
  ${bounds_trap(index='100', expr_to_write='1')}
}

${ArrayTy}Traps.test("bounds3/${io}")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches(_isDebugAssertConfiguration() ?
    ${ArrayTy}BoundsErrorMsg : "")
  .code {
  var a: ${ArrayTy} = [ 10, 20, 30 ]
  ${bounds_trap(index='3', expr_to_write='1')}
}

${ArrayTy}Traps.test("sliceBounds0/${io}")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches(_isDebugAssertConfiguration() ?
    ${ArrayTy}LowerBoundOutOfRangeErrorMsg : "")
  .code {
  var a: ${ArrayTy}<Int> = []
  ${bounds_trap(index='-1..<1', expr_to_write='ArraySlice()')}
}

${ArrayTy}Traps.test("sliceBounds1/${io}")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches(_isDebugAssertConfiguration() ?
    ${ArrayTy}LowerBoundOutOfRangeErrorMsg : "")
  .code {
  var a: ${ArrayTy} = [ 1 ]
  ${bounds_trap(index='-1..<1', expr_to_write='ArraySlice()')}
}

${ArrayTy}Traps.test("sliceBounds2/${io}")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches(_isDebugAssertConfiguration() ?
    "${ArrayTy} index is out of range" : "")
  .code {
  var a: ${ArrayTy} = [ 1 ]
  ${bounds_trap(index='0..<2', expr_to_write='ArraySlice()')}
}

${ArrayTy}Traps.test("sliceBounds3/${io}")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches(_isDebugAssertConfiguration() ?
    "${ArrayTy} index is out of range" : "")
  .code {
  var a: ${ArrayTy} = [ 1 ]
  ${bounds_trap(index='1..<2', expr_to_write='ArraySlice()')}
}

%   end

${ArrayTy}Traps.test("PopFromEmpty")
  .crashOutputMatches(_isDebugAssertConfiguration() ?
    "Can't remove last element from an empty collection" : "")
  .code {
  var a: ${ArrayTy}<Int> = []
  expectCrashLater()
  a.removeLast()
}

%   for index in -1, 2:
${ArrayTy}Traps.test("${'insert(_:at:)/%s' % index}")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches(_isDebugAssertConfiguration() ?
% if index < 0:
    ${ArrayTy}LowerBoundOutOfRangeErrorMsg
% else:
    "${ArrayTy} index is out of range"
%end
    : "")
  .code {
  var a: ${ArrayTy}<Int> = [42]
  expectCrashLater()
  a.insert(3, at: ${index})
}
%   end

%   for index in -1, 1, 2:
${ArrayTy}Traps.test("${'remove(at:)/%s' % index}")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches(_isDebugAssertConfiguration() ?
    ${ArrayTy}BoundsErrorMsg : "")
  .code {
  var a: ${ArrayTy}<Int> = [42]
  expectCrashLater()
  a.remove(at: ${index})
}
%   end
% end

ArrayTraps.test("unsafeLength")
  .skip(.custom(
    { _isFastAssertConfiguration() },
    reason: "this trap is not guaranteed to happen in -Ounchecked"))
  .crashOutputMatches(_isDebugAssertConfiguration() ?
    "UnsafeBufferPointer with negative count" : "")
  .code {
  var a = [ 42, 77, 88 ]

  expectEqual(42, a.withUnsafeBufferPointer({ $0[0] }))

  expectCrashLater()

  _ = a.withUnsafeBufferPointer {
    UnsafeBufferPointer(start: $0.baseAddress, count: -1)
  }
}

runAllTests()

