| // RUN: %target-run-simple-swift |
| // REQUIRES: executable_test |
| |
| |
| // REQUIRES: objc_interop |
| |
| import StdlibUnittest |
| import Foundation |
| |
| protocol P { } |
| protocol Q { } |
| |
| class Supermodel : NSObject { } |
| |
| class Model1 : Supermodel { |
| @objc dynamic var name = "" |
| } |
| |
| class Model2 : NSObject, Q { |
| @objc dynamic var name = "" |
| } |
| |
| |
| extension Supermodel: P { } |
| |
| var kvoContext = 0 |
| |
| class Observer: NSObject { |
| let model1 = Model1() |
| let model2 = Model2() |
| |
| override init() { |
| super.init() |
| model1.addObserver(self, forKeyPath: "name", options: [], context: &kvoContext) |
| model2.addObserver(self, forKeyPath: "name", options: [], context: &kvoContext) |
| } |
| |
| deinit { |
| model1.removeObserver(self, forKeyPath: "name") |
| model2.removeObserver(self, forKeyPath: "name") |
| } |
| } |
| |
| let allTests = TestSuite("Dynamic subclasses conformance lookups") |
| |
| allTests.test("Lookup via dynamic subclasses") { |
| let observer = Observer() |
| |
| // Check via "AnyObject" |
| let model1obj: AnyObject = observer.model1 |
| let model2obj: AnyObject = observer.model2 |
| |
| expectTrue(model1obj is P) |
| expectFalse(model1obj is Q) |
| expectFalse(model2obj is P) |
| expectTrue(model2obj is Q) |
| |
| expectNotNil(model1obj as? P) |
| expectNil(model1obj as? Q) |
| expectNil(model2obj as? P) |
| expectNotNil(model2obj as? Q) |
| |
| // Check via "Any" |
| let model1: Any = observer.model1 |
| let model2: Any = observer.model2 |
| |
| expectTrue(model1 is P) |
| expectFalse(model1 is Q) |
| expectFalse(model2 is P) |
| expectTrue(model2 is Q) |
| |
| expectNotNil(model1 as? P) |
| expectNil(model1 as? Q) |
| expectNil(model2 as? P) |
| expectNotNil(model2 as? Q) |
| |
| print(model1) |
| print(model2) |
| } |
| |
| runAllTests() |