mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
108 lines
3.1 KiB
Swift
108 lines
3.1 KiB
Swift
// RUN: %target-run-simple-swift
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: objc_interop
|
|
|
|
import StdlibUnittest
|
|
import Foundation
|
|
|
|
@objc protocol Horse {
|
|
init()
|
|
}
|
|
|
|
class Pony : Horse {
|
|
let x = LifetimeTracked(0)
|
|
|
|
required init() {}
|
|
}
|
|
|
|
var ObjCProtocolsTest = TestSuite("ObjCProtocols")
|
|
|
|
ObjCProtocolsTest.test("InitRequirement") {
|
|
let t: Horse.Type = Pony.self
|
|
|
|
_ = t.init()
|
|
}
|
|
|
|
@objc protocol OptionalRequirements {
|
|
@objc optional func returnNumber(n: Int) -> Int
|
|
@objc optional static func returnNumberStatic(n: Int) -> Int
|
|
|
|
@objc optional func returnSelf() -> Self
|
|
}
|
|
|
|
ObjCProtocolsTest.test("OptionalMethodReferenceTypes") {
|
|
class Base {}
|
|
class Derived: Base, OptionalRequirements {}
|
|
|
|
let exist: OptionalRequirements = Derived()
|
|
let existComposition: Base & OptionalRequirements = Derived()
|
|
let existMeta: OptionalRequirements.Type = Derived.self
|
|
|
|
expectEqual(type(of: exist.returnNumber),
|
|
((Int) -> Int)?.self)
|
|
expectEqual(type(of: existMeta.returnNumberStatic),
|
|
((Int) -> Int)?.self)
|
|
expectEqual(type(of: OptionalRequirements.returnNumber),
|
|
((OptionalRequirements) -> ((Int) -> Int)?).self)
|
|
expectEqual(type(of: (Base & OptionalRequirements).returnNumber),
|
|
((Base & OptionalRequirements) -> ((Int) -> Int)?).self)
|
|
|
|
expectEqual(type(of: exist.returnSelf),
|
|
(() -> OptionalRequirements)?.self)
|
|
expectEqual(type(of: existComposition.returnSelf),
|
|
(() -> Base & OptionalRequirements)?.self)
|
|
expectEqual(type(of: OptionalRequirements.returnSelf),
|
|
((OptionalRequirements) -> (() -> OptionalRequirements)?).self)
|
|
expectEqual(type(of: (Base & OptionalRequirements).returnSelf),
|
|
((Base & OptionalRequirements) -> (() -> Base & OptionalRequirements)?).self)
|
|
|
|
}
|
|
|
|
ObjCProtocolsTest.test("OptionalMethodReferencesNoImplementation") {
|
|
class Class: OptionalRequirements {}
|
|
|
|
let exist: OptionalRequirements = Class()
|
|
let existMeta: OptionalRequirements.Type = Class.self
|
|
|
|
expectNil(exist.returnNumber)
|
|
expectNil(existMeta.returnNumberStatic)
|
|
expectNil(OptionalRequirements.returnNumber(exist))
|
|
|
|
expectNil(exist.returnSelf)
|
|
expectNil(OptionalRequirements.returnSelf(exist))
|
|
}
|
|
|
|
ObjCProtocolsTest.test("OptionalMethodReferencesWithImplementation") {
|
|
class Class: OptionalRequirements {
|
|
func returnSelf() -> Self {
|
|
return self
|
|
}
|
|
|
|
func returnNumber(n: Int) -> Int {
|
|
return n
|
|
}
|
|
static func returnNumberStatic(n: Int) -> Int {
|
|
return n
|
|
}
|
|
}
|
|
|
|
let exist: OptionalRequirements = Class()
|
|
let existMeta: OptionalRequirements.Type = Class.self
|
|
|
|
let returnNumberRef = exist.returnNumber
|
|
let returnNumberStaticRef = existMeta.returnNumberStatic
|
|
let returnNumberUnboundRef = OptionalRequirements.returnNumber
|
|
|
|
expectEqual(returnNumberRef!(123), 123)
|
|
expectEqual(returnNumberStaticRef!(456), 456)
|
|
expectEqual(returnNumberUnboundRef(exist)!(789), 789)
|
|
|
|
let returnSelfRef = exist.returnSelf
|
|
let returnSelfUnboundRef = OptionalRequirements.returnSelf
|
|
|
|
expectEqual(returnSelfRef!().returnNumber!(n: 321), 321)
|
|
expectEqual(returnSelfUnboundRef(exist)!().returnNumber!(n: 456), 456)
|
|
}
|
|
|
|
runAllTests()
|