Skip to content

Commit 4791fde

Browse files
committed
Migrated more object hook tests
1 parent 9917468 commit 4791fde

4 files changed

Lines changed: 95 additions & 117 deletions

File tree

Tests/InterposeKitTests/ClassHookTests.swift

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ fileprivate class ExampleClass: NSObject {
55
@objc static dynamic func doSomethingStatic() {}
66
@objc dynamic func doSomething() {}
77
@objc dynamic var intValue: Int { 1 }
8-
@objc dynamic var arrayValue: [String] { ["superclass"] }
8+
@objc dynamic var arrayValue: [String] { ["base"] }
99
}
1010

1111
fileprivate class ExampleSubclass: ExampleClass {
@@ -129,7 +129,7 @@ final class ClassHookTests: XCTestCase {
129129

130130
func testSubclassOverride() throws {
131131
let object = ExampleSubclass()
132-
XCTAssertEqual(object.arrayValue, ["superclass", "subclass"])
132+
XCTAssertEqual(object.arrayValue, ["base", "subclass"])
133133

134134
let superclassHook = try Interpose.applyHook(
135135
on: ExampleClass.self,
@@ -141,7 +141,7 @@ final class ClassHookTests: XCTestCase {
141141
return hook.original(self, hook.selector) + ["superclass.hook"]
142142
}
143143
}
144-
XCTAssertEqual(object.arrayValue, ["superclass", "superclass.hook", "subclass"])
144+
XCTAssertEqual(object.arrayValue, ["base", "superclass.hook", "subclass"])
145145

146146
let subclassHook = try Interpose.applyHook(
147147
on: ExampleSubclass.self,
@@ -154,18 +154,18 @@ final class ClassHookTests: XCTestCase {
154154
}
155155
}
156156

157-
XCTAssertEqual(object.arrayValue, ["superclass", "superclass.hook", "subclass", "subclass.hook"])
157+
XCTAssertEqual(object.arrayValue, ["base", "superclass.hook", "subclass", "subclass.hook"])
158158

159159
try superclassHook.revert()
160-
XCTAssertEqual(object.arrayValue, ["superclass", "subclass", "subclass.hook"])
160+
XCTAssertEqual(object.arrayValue, ["base", "subclass", "subclass.hook"])
161161

162162
try subclassHook.revert()
163-
XCTAssertEqual(object.arrayValue, ["superclass", "subclass"])
163+
XCTAssertEqual(object.arrayValue, ["base", "subclass"])
164164
}
165165

166166
func testMultipleHooks() throws {
167167
let object = ExampleClass()
168-
XCTAssertEqual(object.arrayValue, ["superclass"])
168+
XCTAssertEqual(object.arrayValue, ["base"])
169169

170170
let hook1 = try Interpose.applyHook(
171171
on: ExampleClass.self,
@@ -177,7 +177,7 @@ final class ClassHookTests: XCTestCase {
177177
return hook.original(self, hook.selector) + ["hook1"]
178178
}
179179
}
180-
XCTAssertEqual(object.arrayValue, ["superclass", "hook1"])
180+
XCTAssertEqual(object.arrayValue, ["base", "hook1"])
181181

182182
let hook2 = try Interpose.applyHook(
183183
on: ExampleClass.self,
@@ -189,15 +189,15 @@ final class ClassHookTests: XCTestCase {
189189
return hook.original(self, hook.selector) + ["hook2"]
190190
}
191191
}
192-
XCTAssertEqual(object.arrayValue, ["superclass", "hook1", "hook2"])
192+
XCTAssertEqual(object.arrayValue, ["base", "hook1", "hook2"])
193193

194194
// For now, reverting works only in the opposite order. Reverting hook1 before hook2
195195
// would throw `revertCorrupted(…)` error.
196196
try hook2.revert()
197-
XCTAssertEqual(object.arrayValue, ["superclass", "hook1"])
197+
XCTAssertEqual(object.arrayValue, ["base", "hook1"])
198198

199199
try hook1.revert()
200-
XCTAssertEqual(object.arrayValue, ["superclass"])
200+
XCTAssertEqual(object.arrayValue, ["base"])
201201
}
202202

203203
func testValidationFailure_methodNotFound_nonExistent() throws {
@@ -295,7 +295,7 @@ final class ClassHookTests: XCTestCase {
295295
)
296296
}
297297

298-
func testCleanup_implementationPreserved() throws {
298+
func testCleanUp_implementationPreserved() throws {
299299
var deallocated = false
300300

301301
try autoreleasepool {
@@ -317,7 +317,7 @@ final class ClassHookTests: XCTestCase {
317317
XCTAssertFalse(deallocated)
318318
}
319319

320-
func testCleanup_implementationDeallocated() throws {
320+
func testCleanUp_implementationDeallocated() throws {
321321
var deallocated = false
322322

323323
try autoreleasepool {

Tests/InterposeKitTests/ObjectHookTests.swift

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import XCTest
33

44
fileprivate class ExampleClass: NSObject {
55
@objc dynamic var intValue = 1
6+
@objc dynamic func doSomething() {}
7+
@objc dynamic var arrayValue: [String] { ["base"] }
68
}
79

810
final class ObjectHookTests: XCTestCase {
@@ -46,6 +48,40 @@ final class ObjectHookTests: XCTestCase {
4648
)
4749
}
4850

51+
func testMultipleHooks() throws {
52+
let object = ExampleClass()
53+
XCTAssertEqual(object.arrayValue, ["base"])
54+
55+
let hook1 = try object.applyHook(
56+
for: #selector(getter: ExampleClass.arrayValue),
57+
methodSignature: (@convention(c) (NSObject, Selector) -> [String]).self,
58+
hookSignature: (@convention(block) (NSObject) -> [String]).self
59+
) { hook in
60+
return { `self` in
61+
return hook.original(self, hook.selector) + ["hook1"]
62+
}
63+
}
64+
XCTAssertEqual(object.arrayValue, ["base", "hook1"])
65+
66+
let hook2 = try object.applyHook(
67+
for: #selector(getter: ExampleClass.arrayValue),
68+
methodSignature: (@convention(c) (NSObject, Selector) -> [String]).self,
69+
hookSignature: (@convention(block) (NSObject) -> [String]).self
70+
) { hook in
71+
return { `self` in
72+
return hook.original(self, hook.selector) + ["hook2"]
73+
}
74+
}
75+
XCTAssertEqual(object.arrayValue, ["base", "hook1", "hook2"])
76+
77+
// Unlike with class hooks, we can revert object hooks in the middle of the chain.
78+
try hook1.revert()
79+
XCTAssertEqual(object.arrayValue, ["base", "hook2"])
80+
81+
try hook2.revert()
82+
XCTAssertEqual(object.arrayValue, ["base"])
83+
}
84+
4985
// Hooking fails on an object that has KVO activated.
5086
func testKVO_observationBeforeHooking() throws {
5187
let object = ExampleClass()
@@ -114,5 +150,51 @@ final class ObjectHookTests: XCTestCase {
114150

115151
_ = token
116152
}
153+
154+
func testCleanUp_implementationPreserved() throws {
155+
let object = ExampleClass()
156+
var deallocated = false
157+
158+
try autoreleasepool {
159+
let tracker = LifetimeTracker { deallocated = true }
160+
161+
try object.applyHook(
162+
for: #selector(ExampleClass.doSomething),
163+
methodSignature: (@convention(c) (NSObject, Selector) -> Void).self,
164+
hookSignature: (@convention(block) (NSObject) -> Void).self
165+
) { hook in
166+
return { `self` in
167+
tracker.keep()
168+
return hook.original(self, hook.selector)
169+
}
170+
}
171+
}
172+
173+
XCTAssertFalse(deallocated)
174+
}
175+
176+
func testCleanUp_implementationDeallocated() throws {
177+
let object = ExampleClass()
178+
var deallocated = false
179+
180+
try autoreleasepool {
181+
let tracker = LifetimeTracker { deallocated = true }
182+
183+
let hook = try object.applyHook(
184+
for: #selector(ExampleClass.doSomething),
185+
methodSignature: (@convention(c) (NSObject, Selector) -> Void).self,
186+
hookSignature: (@convention(block) (NSObject) -> Void).self
187+
) { hook in
188+
return { `self` in
189+
tracker.keep()
190+
return hook.original(self, hook.selector)
191+
}
192+
}
193+
194+
try hook.revert()
195+
}
196+
197+
XCTAssertTrue(deallocated)
198+
}
117199

118200
}

Tests/InterposeKitTests/ToBePolished/MultipleInterposing.swift

Lines changed: 0 additions & 76 deletions
This file was deleted.

Tests/InterposeKitTests/ToBePolished/ObjectInterposeTests.swift

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -218,32 +218,4 @@ final class ObjectInterposeTests: XCTestCase {
218218
// XCTAssertEqual(testObj.invert3DTransform(transform), transform.inverted)
219219
// }
220220

221-
func testRevertedCleanup_object() throws {
222-
var deallocated = false
223-
224-
try autoreleasepool {
225-
let tracker = LifetimeTracker {
226-
deallocated = true
227-
}
228-
229-
let object = TestClass()
230-
let hook = try Interpose.applyHook(
231-
on: object,
232-
for: #selector(TestClass.doNothing),
233-
methodSignature: (@convention(c) (NSObject, Selector) -> Void).self,
234-
hookSignature: (@convention(block) (NSObject) -> Void).self
235-
) { hook in
236-
return { `self` in
237-
tracker.keep()
238-
return hook.original(self, hook.selector)
239-
}
240-
}
241-
242-
try hook.revert()
243-
}
244-
245-
// Verify that the block was deallocated
246-
XCTAssertTrue(deallocated)
247-
}
248-
249221
}

0 commit comments

Comments
 (0)