blob: b1e320b937f1f7213ed0a2bc66ad0968ceb6147f [file] [log] [blame]
// RUN: %target-run-simple-swift
// REQUIRES: executable_test
import StdlibUnittest
// Check that the generic parameter is called 'Instance'.
protocol TestProtocol1 {}
extension Unmanaged where Instance : TestProtocol1 {
var _instanceIsTestProtocol1: Bool {
fatalError("not implemented")
}
}
var UnmanagedTests = TestSuite("Unmanaged")
class FooClass {}
UnmanagedTests.test("unsafeBitCast(Unmanaged, Int)") {
let ref = FooClass()
expectNotEqual(
0,
unsafeBitCast(
Unmanaged.passUnretained(ref) as Unmanaged<AnyObject>,
to: Int.self))
_fixLifetime(ref)
}
class Foobar {
func foo() -> Int { return 1 }
}
UnmanagedTests.test("_withUnsafeGuaranteedRef") {
var ref = Foobar()
var unmanaged = Unmanaged.passUnretained(ref)
withExtendedLifetime(ref) {
unmanaged._withUnsafeGuaranteedRef {
expectTrue(ref === $0)
}
unmanaged._withUnsafeGuaranteedRef {
expectEqual(1, $0.foo())
}
}
}
UnmanagedTests.test("_withUnsafeGuaranteedRef/return") {
var ref = Foobar()
var unmanaged = Unmanaged.passUnretained(ref)
withExtendedLifetime(ref) {
expectEqual(1, unmanaged._withUnsafeGuaranteedRef {
return $0.foo()
})
}
}
UnmanagedTests.test("Opaque") {
var ref = Foobar()
let opaquePtr = Unmanaged.passUnretained(ref).toOpaque()
let unknownPtr = Int(bitPattern: opaquePtr)
let voidPtr = UnsafeRawPointer(bitPattern: unknownPtr)
expectNotNil(voidPtr, "toOpaque must not return null pointer")
let unmanaged = Unmanaged<Foobar>.fromOpaque(voidPtr!)
expectEqual(
ref === unmanaged.takeUnretainedValue(),
true,
"fromOpaque must return the same reference")
_fixLifetime(ref)
}
runAllTests()