RxSwift/Tests/RxCocoaTests/RxTest+Controls.swift

112 lines
3.3 KiB
Swift

//
// RxTest+Controls.swift
// Rx
//
// Created by Krunoslav Zaher on 3/12/16.
// Copyright © 2016 Krunoslav Zaher. All rights reserved.
//
import Foundation
import RxCocoa
import RxSwift
import XCTest
extension RxTest {
func ensurePropertyDeallocated<C, T: Equatable>(_ createControl: () -> C, _ initialValue: T, _ propertySelector: (C) -> ControlProperty<T>) where C: NSObject {
let variable = Variable(initialValue)
var completed = false
var deallocated = false
var lastReturnedPropertyValue: T!
autoreleasepool {
var control: C! = createControl()
let property = propertySelector(control)
let disposable = variable.asObservable().bindTo(property)
_ = property.subscribe(onNext: { n in
lastReturnedPropertyValue = n
}, onCompleted: {
completed = true
disposable.dispose()
})
_ = (control as NSObject).rx.deallocated.subscribe(onNext: { _ in
deallocated = true
})
control = nil
}
// this code is here to flush any events that were scheduled to
// run on main loop
DispatchQueue.main.async {
let runLoop = CFRunLoopGetCurrent()
CFRunLoopStop(runLoop)
}
let runLoop = CFRunLoopGetCurrent()
CFRunLoopWakeUp(runLoop)
CFRunLoopRun()
XCTAssertTrue(deallocated)
XCTAssertTrue(completed)
XCTAssertEqual(initialValue, lastReturnedPropertyValue)
}
func ensureEventDeallocated<C, T>(_ createControl: @escaping () -> C, _ eventSelector: (C) -> ControlEvent<T>) where C: NSObject {
return ensureEventDeallocated({ () -> (C, Disposable) in (createControl(), Disposables.create()) }, eventSelector)
}
func ensureEventDeallocated<C, T>(_ createControl: () -> (C, Disposable), _ eventSelector: (C) -> ControlEvent<T>) where C: NSObject {
var completed = false
var deallocated = false
let outerDisposable = SingleAssignmentDisposable()
autoreleasepool {
let (control, disposable) = createControl()
let eventObservable = eventSelector(control)
_ = eventObservable.subscribe(onNext: { n in
}, onCompleted: {
completed = true
})
_ = (control as NSObject).rx.deallocated.subscribe(onNext: { _ in
deallocated = true
})
outerDisposable.disposable = disposable
}
outerDisposable.dispose()
XCTAssertTrue(deallocated)
XCTAssertTrue(completed)
}
func ensureControlObserverHasWeakReference<C, T>( _ createControl: @autoclosure() -> (C), _ observerSelector: (C) -> AnyObserver<T>, _ observableSelector: () -> (Observable<T>)) where C: NSObject {
var deallocated = false
let disposeBag = DisposeBag()
autoreleasepool {
let control = createControl()
let propertyObserver = observerSelector(control)
let observable = observableSelector()
observable.bindTo(propertyObserver).addDisposableTo(disposeBag)
_ = (control as NSObject).rx.deallocated.subscribe(onNext: { _ in
deallocated = true
})
}
XCTAssertTrue(deallocated)
}
}