Skip to content

Instantly share code, notes, and snippets.

func testDelegateKeepsWeakReference() {
// Arrange
let sut = MasterClass()
// Act
let listener = weaklyScoped(MasterListener()) {
sut.add($0)
}
// Assert
XCTAssertNil(listener)
}
func weaklyScoped<T: AnyObject>(_ v: @autoclosure () -> T, action: (T) throws -> ()) rethrows -> T? {
weak var weakValue: T?
do { // optionally autoreleasepool
let value = v()
try action(value)
weakValue = value
}
return weakValue
}
func weaklyScopedNaive<T: AnyObject>(_ v: T, action: (inout T) -> ()) -> T? {
weak var weakValue: T?
do {
action(&v)
weakValue = v
}
return weakValue
}
func with<T>(x: T, _ f: (inout T) -> Void) -> T {
var value = x
f(&value)
return value
}
func testListenerKeptWeakReferenceUsingTeardown() {
// Arrange
let sut = MasterClass()
let listener = MasterListener()
// Act
sut.add(listener)
// Assert
addTeardownBlock { [weak listener] in
XCTAssertNil(listener)
}
func testListenerKeptWithWeakReference() {
// Arrange
let sut = MasterClass()
var listener: MasterClassListener? = MasterListener()
weak var weakListener = listener
// Act
sut.add(listener!)
listener = nil
// Assert
XCTAssertNil(weakListener)
func testListenerIsKeeptWithWeakReference() {
// Arrange
let sut = MasterClass()
weak var weakListener: MasterClassListener?
do {
let listener = MasterListener()
weakListener = listener
// Act
sut.add(listener)
}
func stub<T>(of v: T) -> T {
return nil!
}
class DatabaseStub: Database {
lazy var addUserAction = stub(of: addUser)
func addUser(name: String) -> Bool {
return addUserAction(name)
}
}
protocol Loader{
func load(_ url: @autoclosure ()->(URL), completion: @escaping (URLResponse)->()) throws -> CancelToken
}
// Before
class LoaderStub: Loader {
var loadAction: ((@autoclosure () -> (URL), (URLResponse) -> ()) throws -> CancelToken)?
func load(_ url: @autoclosure...){...}
}
class DatabaseStub {
lazy var addUserAction = asNil(addUser)
func addUser(name: String) -> Bool {
return addUserAction(name) ?? false
}
}