// RUN: %empty-directory(%t) // // RUN: %target-clang -fobjc-arc %S/Inputs/ObjCClasses/ObjCClasses.m -c -o %t/ObjCClasses.o // RUN: %target-build-swift -I %S/Inputs/ObjCClasses/ %t/ObjCClasses.o %s -o %t/a.out // RUN: %target-codesign %t/a.out // RUN: %target-run %t/a.out // REQUIRES: executable_test // REQUIRES: objc_interop import Foundation import StdlibUnittest import ObjCClasses var ImportedObjCGenerics = TestSuite("ImportedObjCGenerics") ImportedObjCGenerics.test("Creation") { let cs = Container(object: "i-just-met-you") expectEqual("i-just-met-you", cs.object) expectTrue(type(of: cs) === Container.self) expectTrue(type(of: cs) === Container.self) } ImportedObjCGenerics.test("Blocks") { let cs = Container(object: "and-this-is-crazy") var fromBlock: NSString = "" cs.processObject { fromBlock = $0 } expectEqual("and-this-is-crazy", fromBlock) cs.updateObject { "but-heres-my-number" } expectEqual("but-heres-my-number", cs.object) } ImportedObjCGenerics.test("Categories") { let cs = Container(cat1: "so-call-me-maybe") expectEqual("so-call-me-maybe", cs.getCat1()) cs.setCat1("its-hard-to-look-right") expectEqual("its-hard-to-look-right", cs.cat1Property) } ImportedObjCGenerics.test("Subclasses") { let subContainer = SubContainer(object: "at-you-baby") expectEqual("at-you-baby", subContainer.object) let nestedContainer = NestedContainer(object: Container(object: "but-heres-my-number")) expectEqual("but-heres-my-number", nestedContainer.object.object) let stringContainer = StringContainer(object: "so-call-me-maybe") expectEqual("so-call-me-maybe", stringContainer.object) } ImportedObjCGenerics.test("SwiftGenerics") { func openContainer(_ x: Container) -> T { return x.object } func openStringContainer>(_ x: T) -> NSString { return x.object } func openArbitraryContainer>(_ x: T) -> S { return x.object } let scs = SubContainer(object: "before-you-came-into-my-life") expectEqual("before-you-came-into-my-life", openContainer(scs)) expectEqual("before-you-came-into-my-life", openStringContainer(scs)) expectEqual("before-you-came-into-my-life", openArbitraryContainer(scs)) let cs = Container(object: "i-missed-you-so-bad") expectEqual("i-missed-you-so-bad", openContainer(cs)) expectEqual("i-missed-you-so-bad", openStringContainer(cs)) expectEqual("i-missed-you-so-bad", openArbitraryContainer(cs)) let strContainer = SubContainer(object: "i-missed-you-so-so-bad") expectEqual("i-missed-you-so-so-bad", openContainer(strContainer)) expectEqual("i-missed-you-so-so-bad", openStringContainer(strContainer)) expectEqual("i-missed-you-so-so-bad", openArbitraryContainer(strContainer)) let numContainer = Container(object: NSNumber(value: 21)) expectEqual(NSNumber(value: 21), openContainer(numContainer)) expectEqual(NSNumber(value: 21), openArbitraryContainer(numContainer)) let subNumContainer = SubContainer(object: NSNumber(value: 22)) expectEqual(NSNumber(value: 22), openContainer(subNumContainer)) expectEqual(NSNumber(value: 22), openArbitraryContainer(subNumContainer)) } ImportedObjCGenerics.test("SwiftGenerics/Creation") { func makeContainer(_ x: T) -> Container { return Container(object: x) } let c = makeContainer(NSNumber(value: 22)) expectEqual(NSNumber(value: 22), c.object) } ImportedObjCGenerics.test("ProtocolConstraints") { func copyContainerContents(_ x: CopyingContainer) -> T { return x.object.copy(with: nil) as! T } let cs = CopyingContainer(object: "Happy 2012") expectEqual("Happy 2012", copyContainerContents(cs)) } ImportedObjCGenerics.test("ClassConstraints") { func makeContainedAnimalMakeNoise(x: AnimalContainer) -> NSString { return x.object.noise as NSString } let petCarrier = AnimalContainer(object: Dog()) expectEqual("woof", makeContainedAnimalMakeNoise(x: petCarrier)) } @objc @objcMembers class ClassWithMethodsUsingObjCGenerics: NSObject { func copyContainer(_ x: CopyingContainer) -> CopyingContainer { return x } func maybeCopyContainer(_ x: CopyingContainer) -> CopyingContainer? { return x } } ImportedObjCGenerics.test("ClassWithMethodsUsingObjCGenerics") { let x: AnyObject = ClassWithMethodsUsingObjCGenerics() let y = CopyingContainer(object: "") let z = x.copyContainer(y) expectTrue(y === z) let w = x.perform(#selector(ClassWithMethodsUsingObjCGenerics.copyContainer), with: y).takeUnretainedValue() expectTrue(y === w) let zq = x.maybeCopyContainer(y) expectTrue(y === zq!) let wq = x.perform(#selector(ClassWithMethodsUsingObjCGenerics.maybeCopyContainer), with: y).takeUnretainedValue() expectTrue(y === wq) } ImportedObjCGenerics.test("InheritanceFromNongeneric") { // Test NSObject methods inherited into Container<> let gc = Container(object: "") expectTrue(gc.description.range(of: "Container") != nil) expectTrue(type(of: gc).superclass() == NSObject.self) expectTrue(Container.superclass() == NSObject.self) expectTrue(Container.superclass() == NSObject.self) expectTrue(Container.self == Container.self) expectTrue((Container, Int).self == (Container, Int).self) } public class InheritInSwift: Container { public override init(object: NSString) { super.init(object: object.lowercased as NSString) } public override var object: NSString { get { return super.object.uppercased as NSString } set { super.object = newValue.lowercased as NSString } } public var superObject: NSString { get { return super.object as NSString } } } ImportedObjCGenerics.test("InheritInSwift") { let s = InheritInSwift(object: "HEllo") let sup: Container = s expectEqual(s.superObject, "hello") expectEqual(s.object, "HELLO") expectEqual(sup.object, "HELLO") s.object = "GOodbye" expectEqual(s.superObject, "goodbye") expectEqual(s.object, "GOODBYE") expectEqual(sup.object, "GOODBYE") s.processObject { o in expectEqual(o, "GOODBYE") } s.updateObject { "Aloha" } expectEqual(s.superObject, "aloha") expectEqual(s.object, "ALOHA") expectEqual(sup.object, "ALOHA") } ImportedObjCGenerics.test("BridgedInitializer") { let strings: [NSString] = ["hello", "world"] let s = BridgedInitializer(array: strings) expectEqual(s.count, 2) } runAllTests()