| // RUN: %empty-directory(%t) |
| |
| // RUN: %target-build-swift-dylib(%t/libresilient_protocol.%target-dylib-extension) -Xfrontend -enable-resilience %S/../Inputs/resilient_protocol.swift -emit-module -emit-module-path %t/resilient_protocol.swiftmodule -module-name resilient_protocol |
| // RUN: %target-codesign %t/libresilient_protocol.%target-dylib-extension |
| |
| // RUN: %target-build-swift %s -lresilient_protocol -I %t -L %t -o %t/main -Xlinker -rpath -Xlinker %t |
| |
| // RUN: %target-run %t/main %t/libresilient_protocol.%target-dylib-extension |
| |
| // RUN: %target-build-swift-dylib(%t/libresilient_protocol_wmo.%target-dylib-extension) -Xfrontend -enable-resilience %S/../Inputs/resilient_protocol.swift -emit-module -emit-module-path %t/resilient_protocol.swiftmodule -module-name resilient_protocol -whole-module-optimization |
| // RUN: %target-codesign %t/libresilient_protocol_wmo.%target-dylib-extension |
| |
| // RUN: %target-build-swift %s -lresilient_protocol_wmo -I %t -L %t -o %t/main -Xlinker -rpath -Xlinker %t |
| |
| // RUN: %target-run %t/main %t/libresilient_protocol_wmo.%target-dylib-extension |
| |
| // REQUIRES: executable_test |
| |
| // |
| // Note: protocol resilience in the sense of resiliently adding new |
| // requirements with default implementations is actually tested in |
| // validation-test/Evolution/test_protocol_*. |
| // |
| |
| import StdlibUnittest |
| |
| |
| import resilient_protocol |
| |
| var ResilientProtocolTestSuite = TestSuite("ResilientProtocol") |
| |
| func increment(_ x: inout Int, by: Int) { |
| x += by |
| } |
| |
| struct OtherConformingType : OtherResilientProtocol { } |
| |
| // Ensure we can call materializeForSet defined in a protocol extension |
| // from a different resilience domain. |
| ResilientProtocolTestSuite.test("PropertyInProtocolExtension") { |
| var o = OtherConformingType() |
| |
| increment(&o.propertyInExtension, by: 5) |
| increment(&OtherConformingType.staticPropertyInExtension, by: 7) |
| |
| expectEqual(OtherConformingType.staticPropertyInExtension, 12) |
| } |
| |
| struct DerivedConformingType : ResilientDerivedProtocol { |
| func requirement() -> Int { return 42 } |
| } |
| |
| // Ensure dynamic casts to resilient types work. |
| func callBaseRequirement(t: ResilientBaseProtocol) -> Int { |
| return t.requirement() |
| } |
| |
| @_optimize(none) |
| func castToDerivedProtocol<T>(t: T) -> Int { |
| return callBaseRequirement(t: t as! ResilientDerivedProtocol) |
| } |
| |
| ResilientProtocolTestSuite.test("DynamicCastToResilientProtocol") { |
| expectEqual(castToDerivedProtocol(t: DerivedConformingType()), 42) |
| } |
| |
| runAllTests() |