1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
// RUN: %empty-directory(%t)
// RUN: %target-clang -fobjc-arc %S/Inputs/ObjCClasses/ObjCClasses.m -c -o %t/ObjCClasses.o
// RUN: %target-build-swift-dylib(%t/%target-library-name(resilient_struct)) -enable-library-evolution %S/../Inputs/resilient_struct.swift -emit-module -emit-module-path %t/resilient_struct.swiftmodule -module-name resilient_struct
// RUN: %target-build-swift-dylib(%t/%target-library-name(resilient_objc_class)) -enable-library-evolution %S/Inputs/resilient_objc_class.swift -emit-module -emit-module-path %t/resilient_objc_class.swiftmodule -module-name resilient_objc_class -I %S/Inputs/ObjCClasses/ -L %t -Xlinker %t/ObjCClasses.o -framework Foundation
// RUN: %target-codesign %t/%target-library-name(resilient_struct) %t/%target-library-name(resilient_objc_class)
// RUN: %target-build-swift %s -L %t -I %t -lresilient_struct -lresilient_objc_class -I %S/Inputs/ObjCClasses/ -o %t/main %target-rpath(%t)
// RUN: %target-codesign %t/main
// RUN: %target-run %t/main %t/%target-library-name(resilient_struct) %t/%target-library-name(resilient_objc_class)
// REQUIRES: executable_test
// REQUIRES: objc_interop
import StdlibUnittest
import Foundation
import resilient_struct
import resilient_objc_class
import ObjCClasses
var ResilientClassTestSuite = TestSuite("ResilientClass")
class ResilientFieldWithCategory {
var value: ResilientInt?
}
@objc protocol MyProtocol {
func myMethod() -> Int
}
extension ResilientFieldWithCategory : MyProtocol {
@objc func myMethod() -> Int { return 42 }
}
func takesMyProtocol(_ p: MyProtocol) -> Int {
return p.myMethod()
}
ResilientClassTestSuite.test("Category")
.xfail(.osxMinor(10, 9, reason:
"Category attachment with ARCLite on 10.9 doesn't work currently"))
.code {
expectEqual(42, takesMyProtocol(ResilientFieldWithCategory()))
}
// rdar://problem/45569020 - Make sure we initialize the superclass first
class ResilientSuperclass {
var value: ResilientInt?
}
class ResilientSubclass : ResilientSuperclass {}
ResilientClassTestSuite.test("Superclass") {
_blackHole(ResilientSubclass())
}
// rdar://48031465 - Make sure we handle sliding empty ivars properly.
struct Empty {}
class ClassWithEmptyThenResilient : HasHiddenIvars {
let empty: Empty
let resilient: ResilientInt
init(empty: Empty, resilient: ResilientInt) {
self.empty = empty
self.resilient = resilient
}
}
ResilientClassTestSuite.test("EmptyThenResilient") {
let c = ClassWithEmptyThenResilient(empty: Empty(),
resilient: ResilientInt(i: 17))
c.x = 100
c.y = 2000
c.z = 30000
c.t = 400000
expectEqual(c.resilient.i, 17)
expectEqual(c.x, 100)
expectEqual(c.y, 2000)
expectEqual(c.z, 30000)
expectEqual(c.t, 400000)
}
class ClassWithResilientThenEmpty : HasHiddenIvars {
let resilient: ResilientInt
let empty: Empty
init(empty: Empty, resilient: ResilientInt) {
self.empty = empty
self.resilient = resilient
}
}
ResilientClassTestSuite.test("ResilientThenEmpty") {
let c = ClassWithResilientThenEmpty(empty: Empty(),
resilient: ResilientInt(i: 17))
c.x = 100
c.y = 2000
c.z = 30000
c.t = 400000
expectEqual(c.resilient.i, 17)
expectEqual(c.x, 100)
expectEqual(c.y, 2000)
expectEqual(c.z, 30000)
expectEqual(c.t, 400000)
}
// Same as the above, but the class itself has a resilient base class
class AnotherClassWithEmptyThenResilient : HasResilientObjCBaseClass {
let empty: Empty
let resilient: ResilientInt
init(empty: Empty, resilient: ResilientInt) {
self.empty = empty
self.resilient = resilient
}
}
ResilientClassTestSuite.test("AnotherEmptyThenResilient") {
let c = AnotherClassWithEmptyThenResilient(empty: Empty(),
resilient: ResilientInt(i: 17))
c.x = 100
c.y = 2000
c.z = 30000
c.t = 400000
expectEqual(c.resilient.i, 17)
expectEqual(c.x, 100)
expectEqual(c.y, 2000)
expectEqual(c.z, 30000)
expectEqual(c.t, 400000)
}
class AnotherClassWithResilientThenEmpty : HasHiddenIvars {
let resilient: ResilientInt
let empty: Empty
init(empty: Empty, resilient: ResilientInt) {
self.empty = empty
self.resilient = resilient
}
}
ResilientClassTestSuite.test("AnotherResilientThenEmpty") {
let c = AnotherClassWithResilientThenEmpty(empty: Empty(),
resilient: ResilientInt(i: 17))
c.x = 100
c.y = 2000
c.z = 30000
c.t = 400000
expectEqual(c.resilient.i, 17)
expectEqual(c.x, 100)
expectEqual(c.y, 2000)
expectEqual(c.z, 30000)
expectEqual(c.t, 400000)
}
runAllTests()
|