blob: 5df91a9eeee1b98b9bc9b45f07ffe1cd9f14d3ab [file] [log] [blame]
// RUN: %target-run-simple-swiftgyb
// REQUIRES: executable_test
import StdlibUnittest
protocol TestProtocol1 {}
// Check that the generic parameter is called 'Pointee'.
#if _runtime(_ObjC)
extension AutoreleasingUnsafeMutablePointer where Pointee : TestProtocol1 {
var _memoryIsTestProtocol1: Bool {
fatalError("not implemented")
}
}
#endif
extension UnsafePointer where Pointee : TestProtocol1 {
var _memoryIsTestProtocol1: Bool {
fatalError("not implemented")
}
}
extension UnsafeMutablePointer where Pointee : TestProtocol1 {
var _memoryIsTestProtocol1: Bool {
fatalError("not implemented")
}
}
// Check that the generic parameter is called 'Element'.
extension UnsafeBufferPointerIterator where Element : TestProtocol1 {
var _elementIsTestProtocol1: Bool {
fatalError("not implemented")
}
}
extension UnsafeBufferPointer where Element : TestProtocol1 {
var _elementIsTestProtocol1: Bool {
fatalError("not implemented")
}
}
extension UnsafeMutableBufferPointer where Element : TestProtocol1 {
var _elementIsTestProtocol1: Bool {
fatalError("not implemented")
}
}
var UnsafePointerTestSuite = TestSuite("UnsafePointer")
var UnsafeMutablePointerTestSuite = TestSuite("UnsafeMutablePointer")
var UnsafeRawPointerTestSuite = TestSuite("UnsafeRawPointer")
var UnsafeMutableRawPointerTestSuite = TestSuite("UnsafeMutableRawPointer")
var OpaquePointerTestSuite = TestSuite("OpaquePointer")
% for (SelfName, SelfType) in [
% ('UnsafePointer', 'UnsafePointer<Float>'),
% ('UnsafeMutablePointer', 'UnsafeMutablePointer<Float>'),
% ('UnsafeRawPointer', 'UnsafeRawPointer'),
% ('UnsafeMutableRawPointer', 'UnsafeMutableRawPointer')]:
${SelfName}TestSuite.test("initFromOpaquePointer") {
let other = OpaquePointer(bitPattern: 0x12345678)!
let ptr = ${SelfType}(other)
expectEqual(0x12345678, unsafeBitCast(ptr, to: Int.self))
let optionalOther: Optional = other
let optionalPointer = ${SelfType}(optionalOther)
expectNotEmpty(optionalPointer)
expectEqual(0x12345678, unsafeBitCast(optionalPointer, to: Int.self))
let nilOther: Optional<OpaquePointer> = nil
let nilPointer = ${SelfType}(nilOther)
expectEmpty(nilPointer)
}
% end
% for (SelfName, SelfType) in [
% ('UnsafeRawPointer', 'UnsafeRawPointer'),
% ('UnsafeMutableRawPointer', 'UnsafeMutableRawPointer')]:
UnsafeMutableRawPointerTestSuite.test("initFromMutating") {
let other = UnsafeRawPointer(bitPattern: 0x12345678)!
let ptr = UnsafeMutableRawPointer(mutating: other)
expectEqual(0x12345678, unsafeBitCast(ptr, to: Int.self))
let optionalOther: Optional = other
let optionalPointer = UnsafeMutableRawPointer(mutating: optionalOther)
expectNotEmpty(optionalPointer)
expectEqual(0x12345678, unsafeBitCast(optionalPointer, to: Int.self))
let nilOther: Optional<UnsafeRawPointer> = nil
let nilPointer = UnsafeMutableRawPointer(mutating: nilOther)
expectEmpty(nilPointer)
}
% end
% for (SelfName, SelfType) in [
% ('UnsafePointer', 'UnsafePointer<Float>'),
% ('UnsafeMutablePointer', 'UnsafeMutablePointer<Float>'),
% ('UnsafeRawPointer', 'UnsafeRawPointer'),
% ('UnsafeMutableRawPointer', 'UnsafeMutableRawPointer'),
% ('OpaquePointer', 'OpaquePointer')]:
${SelfName}TestSuite.test("convertFromNil") {
let ptr: ${SelfType}? = nil
expectEqual(0, unsafeBitCast(ptr, to: Int.self))
}
${SelfName}TestSuite.test("initFromInteger") {
do {
let word: Int = 0x12345678
let ptr = ${SelfType}(bitPattern: word)
expectNotEmpty(ptr)
expectEqual(word, unsafeBitCast(ptr, to: Int.self))
}
do {
let uword: UInt = 0x12345678
let ptr = ${SelfType}(bitPattern: uword)
expectNotEmpty(ptr)
expectEqual(uword, unsafeBitCast(ptr, to: UInt.self))
}
}
${SelfName}TestSuite.test("initFromNilBitPattern") {
do {
let word = unsafeBitCast(nil as ${SelfType}?, to: Int.self)
let ptr = ${SelfType}(bitPattern: word)
expectEmpty(ptr)
expectEqual(word, unsafeBitCast(ptr, to: Int.self))
}
do {
let uword = unsafeBitCast(nil as ${SelfType}?, to: UInt.self)
let ptr = ${SelfType}(bitPattern: uword)
expectEmpty(ptr)
expectEqual(uword, unsafeBitCast(ptr, to: UInt.self))
}
}
${SelfName}TestSuite.test("Hashable") {
let ptrs = [
${SelfType}(bitPattern: 0x12345678)!,
${SelfType}(bitPattern: 0x87654321 as UInt)!,
]
for i in ptrs.indices {
for j in ptrs.indices {
var pi = ptrs[i]
var pj = ptrs[j]
checkHashable(i == j, pi, pj, "i=\(i), j=\(j)")
}
}
}
${SelfName}TestSuite.test("toInteger") {
do {
let word: Int = 0x12345678
let ptr = ${SelfType}(bitPattern: word)
expectEqual(word, Int(bitPattern: ptr))
}
do {
let ptr: ${SelfType}? = nil
expectEqual(Int(0), Int(bitPattern: ptr))
}
do {
let uword: UInt = 0x12345678
let ptr = ${SelfType}(bitPattern: uword)
expectEqual(uword, UInt(bitPattern: ptr))
}
do {
let ptr: ${SelfType}? = nil
expectEqual(UInt(0), UInt(bitPattern: ptr))
}
}
% end
% for (SelfName, SelfType) in [
% ('UnsafePointer', 'UnsafePointer<Float>'),
% ('UnsafeRawPointer', 'UnsafeRawPointer'),
% ('UnsafeMutableRawPointer', 'UnsafeMutableRawPointer')]:
${SelfName}TestSuite.test("initFromUnsafeMutablePointer") {
let other = UnsafeMutablePointer<Float>(bitPattern: 0x12345678)!
let ptr = ${SelfType}(other)
expectEqual(0x12345678, unsafeBitCast(ptr, to: Int.self))
let optionalOther: Optional = other
let optionalPointer = ${SelfType}(optionalOther)
expectNotEmpty(optionalPointer)
expectEqual(0x12345678, unsafeBitCast(optionalPointer, to: Int.self))
let nilOther: Optional<UnsafeMutablePointer<Float>> = nil
let nilPointer = ${SelfType}(nilOther)
expectEmpty(nilPointer)
}
% end
% for (SelfName, SelfType) in [
% ('UnsafePointer', 'UnsafePointer<Float>'),
% ('UnsafeRawPointer', 'UnsafeRawPointer')]:
${SelfName}TestSuite.test("initFromUnsafePointer") {
let other = UnsafePointer<Float>(bitPattern: 0x12345678)!
let ptr = ${SelfType}(other)
expectEqual(0x12345678, unsafeBitCast(ptr, to: Int.self))
let optionalOther: Optional = other
let optionalPointer = ${SelfType}(optionalOther)
expectNotEmpty(optionalPointer)
expectEqual(0x12345678, unsafeBitCast(optionalPointer, to: Int.self))
let nilOther: Optional<UnsafePointer<Float>> = nil
let nilPointer = ${SelfType}(nilOther)
expectEmpty(nilPointer)
}
% end
UnsafeRawPointerTestSuite.test("initFromUnsafeMutableRawPointer") {
let other = UnsafeMutableRawPointer(bitPattern: 0x12345678)!
let ptr = UnsafeRawPointer(other)
expectEqual(0x12345678, unsafeBitCast(ptr, to: Int.self))
let optionalOther: Optional = other
let optionalPointer = UnsafeRawPointer(optionalOther)
expectNotEmpty(optionalPointer)
expectEqual(0x12345678, unsafeBitCast(optionalPointer, to: Int.self))
let nilOther: Optional<UnsafeMutableRawPointer> = nil
let nilPointer = UnsafeRawPointer(nilOther)
expectEmpty(nilPointer)
}
enum Check {
case LeftOverlap
case RightOverlap
case Disjoint
}
class Missile {
static var missilesLaunched = 0
let number: Int
init(_ number: Int) { self.number = number }
deinit { Missile.missilesLaunched += 1 }
}
func checkPointerCorrectness(_ check: Check,
_ withMissiles: Bool = false,
_ f: (UnsafeMutablePointer<Missile>) ->
(UnsafeMutablePointer<Missile>, _ count: Int) -> Void) {
let ptr = UnsafeMutablePointer<Missile>.allocate(capacity: 4)
switch check {
case .RightOverlap:
ptr.initialize(to: Missile(1))
(ptr + 1).initialize(to: Missile(2))
if withMissiles {
(ptr + 2).initialize(to: Missile(3))
}
f(ptr + 1)(ptr, 2)
expectEqual(1, ptr[1].number)
expectEqual(2, ptr[2].number)
case .LeftOverlap:
if withMissiles {
ptr.initialize(to: Missile(1))
}
(ptr + 1).initialize(to: Missile(2))
(ptr + 2).initialize(to: Missile(3))
f(ptr)(ptr + 1, 2)
expectEqual(2, ptr[0].number)
expectEqual(3, ptr[1].number)
case .Disjoint:
if withMissiles {
ptr.initialize(to: Missile(0))
(ptr + 1).initialize(to: Missile(1))
}
(ptr + 2).initialize(to: Missile(2))
(ptr + 3).initialize(to: Missile(3))
f(ptr)(ptr + 2, 2)
expectEqual(2, ptr[0].number)
expectEqual(3, ptr[1].number)
// backwards
let ptr2 = UnsafeMutablePointer<Missile>.allocate(capacity: 4)
ptr2.initialize(to: Missile(0))
(ptr2 + 1).initialize(to: Missile(1))
if withMissiles {
(ptr2 + 2).initialize(to: Missile(2))
(ptr2 + 3).initialize(to: Missile(3))
}
f(ptr2 + 2)(ptr2, 2)
expectEqual(0, ptr2[2].number)
expectEqual(1, ptr2[3].number)
}
}
func checkPtr(
_ f: ((UnsafeMutablePointer<Missile>) -> (UnsafeMutablePointer<Missile>, _ count: Int) -> Void),
_ m: Bool
) -> (Check) -> Void {
return { checkPointerCorrectness($0, m, f) }
}
func checkPtr(
_ f: ((UnsafeMutablePointer<Missile>) -> (UnsafePointer<Missile>, _ count: Int) -> Void),
_ m: Bool
) -> (Check) -> Void {
return {
checkPointerCorrectness($0, m) { destPtr in
return { f(destPtr)(UnsafeMutablePointer($0), $1) }
}
}
}
UnsafeMutablePointerTestSuite.test("moveAssign:from:") {
let check = checkPtr(UnsafeMutablePointer.moveAssign, true)
check(Check.Disjoint)
// This check relies on _debugPrecondition() so will only trigger in -Onone mode.
if _isDebugAssertConfiguration() {
expectCrashLater()
check(Check.LeftOverlap)
}
}
UnsafeMutablePointerTestSuite.test("moveAssign:from:.Right") {
let check = checkPtr(UnsafeMutablePointer.moveAssign, true)
// This check relies on _debugPrecondition() so will only trigger in -Onone mode.
if _isDebugAssertConfiguration() {
expectCrashLater()
check(Check.RightOverlap)
}
}
UnsafeMutablePointerTestSuite.test("assign:from:") {
let check = checkPtr(UnsafeMutablePointer.assign, true)
check(Check.LeftOverlap)
check(Check.Disjoint)
check(Check.RightOverlap)
}
UnsafeMutablePointerTestSuite.test("moveInitialize:from:") {
let check = checkPtr(UnsafeMutablePointer.moveInitialize, false)
check(Check.LeftOverlap)
check(Check.Disjoint)
check(Check.RightOverlap)
}
UnsafeMutablePointerTestSuite.test("initialize:from:") {
let check = checkPtr(UnsafeMutablePointer.initialize(from:count:), false)
check(Check.Disjoint)
// This check relies on _debugPrecondition() so will only trigger in -Onone mode.
if _isDebugAssertConfiguration() {
expectCrashLater()
check(Check.LeftOverlap)
}
}
UnsafeMutablePointerTestSuite.test("initialize:from:.Right") {
let check = checkPtr(UnsafeMutablePointer.initialize(from:count:), false)
// This check relies on _debugPrecondition() so will only trigger in -Onone mode.
if _isDebugAssertConfiguration() {
expectCrashLater()
check(Check.RightOverlap)
}
}
UnsafeMutablePointerTestSuite.test("initialize:from:/immutable") {
var ptr = UnsafeMutablePointer<Missile>.allocate(capacity: 3)
defer {
ptr.deinitialize(count: 3)
ptr.deallocate(capacity: 3)
}
let source = (0..<3).map(Missile.init)
source.withUnsafeBufferPointer { bufferPtr in
ptr.initialize(from: bufferPtr.baseAddress!, count: 3)
expectEqual(0, ptr[0].number)
expectEqual(1, ptr[1].number)
expectEqual(2, ptr[2].number)
}
}
UnsafeMutablePointerTestSuite.test("assign/immutable") {
var ptr = UnsafeMutablePointer<Missile>.allocate(capacity: 2)
defer {
ptr.deinitialize(count: 2)
ptr.deallocate(capacity: 2)
}
ptr.initialize(to: Missile(1))
(ptr + 1).initialize(to: Missile(2))
let source = (3..<5).map(Missile.init)
source.withUnsafeBufferPointer { bufferPtr in
ptr.assign(from: bufferPtr.baseAddress!, count: 2)
expectEqual(3, ptr[0].number)
expectEqual(4, ptr[1].number)
}
}
% for (SelfName, SelfType) in [
% ('UnsafePointer', 'UnsafePointer<Float>'),
% ('UnsafeMutablePointer', 'UnsafeMutablePointer<Float>'),
% ('UnsafeRawPointer', 'UnsafeRawPointer'),
% ('UnsafeMutableRawPointer', 'UnsafeMutableRawPointer')]:
${SelfName}TestSuite.test("customMirror") {
// Ensure that the custom mirror works properly, including when the raw value
// is greater than Int.max
let reallyBigInt: UInt = UInt(Int.max) + 1
let ptr = ${SelfType}(bitPattern: reallyBigInt)!
let mirror = ptr.customMirror
expectEqual(1, mirror.children.count)
#if arch(i386) || arch(arm)
expectEqual("18446744071562067968", String(describing: mirror.children.first!.1))
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
expectEqual("9223372036854775808", String(describing: mirror.children.first!.1))
#else
fatalError("Unimplemented")
#endif
}
${SelfName}TestSuite.test("customPlaygroundQuickLook") {
// Ensure that the custom playground quicklook works properly, including when
// the raw value is greater than Int.max
let reallyBigInt: UInt = UInt(Int.max) + 1
let ptr = ${SelfType}(bitPattern: reallyBigInt)!
if case let .text(desc) = ptr.customPlaygroundQuickLook {
#if arch(i386) || arch(arm)
expectEqual("${SelfName}(0xFFFFFFFF80000000)", desc)
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
expectEqual("${SelfName}(0x8000000000000000)", desc)
#else
fatalError("Unimplemented")
#endif
} else {
expectTrue(false)
}
}
${SelfName}TestSuite.test("Comparable") {
var addresses: [UInt] = [
0x00000001,
0xFF00FF00,
0x00001111,
0x00000002,
0xFFFFFFFF,
0x00001111
]
#if arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le)
addresses += [
0xFFFFFFFF80000000,
0x8000000000000000
]
#endif
let instances = addresses.map { ($0, ${SelfType}(bitPattern: $0)!) }
func comparisonOracle(i: Int, j: Int) -> ExpectedComparisonResult {
return instances[i].0 <=> instances[j].0
}
checkComparable(instances.map { $0.1 }, oracle: comparisonOracle)
}
% end
% for SelfName in ['UnsafePointer', 'UnsafeMutablePointer']:
${SelfName}TestSuite.test("withMemoryRebound") {
let mutablePtr = UnsafeMutablePointer<Int>.allocate(capacity: 4)
let ptrI = ${SelfName}<Int>(mutablePtr)
ptrI.withMemoryRebound(to: UInt.self, capacity: 4) {
expectType(UInt.self, &$0.pointee)
}
mutablePtr.deallocate(capacity: 4)
}
% end
runAllTests()