Adds unit tests for Driver unit.

This commit is contained in:
Krunoslav Zaher 2015-10-15 23:11:09 +02:00
parent eba73eec26
commit f9b19afd10
17 changed files with 742 additions and 99 deletions

View File

@ -24,7 +24,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ resultSelector: (O1.E, O2.E) throws -> R)
(source1: O1, _ source2: O2, resultSelector: (O1.E, O2.E) throws -> R)
-> Driver<R> {
let source = zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(),
@ -41,7 +41,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ resultSelector: (O1.E, O2.E) throws -> R)
(source1: O1, _ source2: O2, resultSelector: (O1.E, O2.E) throws -> R)
-> Driver<R> {
let source = combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(),
@ -62,7 +62,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ resultSelector: (O1.E, O2.E, O3.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, resultSelector: (O1.E, O2.E, O3.E) throws -> R)
-> Driver<R> {
let source = zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(),
@ -79,7 +79,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ resultSelector: (O1.E, O2.E, O3.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, resultSelector: (O1.E, O2.E, O3.E) throws -> R)
-> Driver<R> {
let source = combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(),
@ -100,7 +100,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ resultSelector: (O1.E, O2.E, O3.E, O4.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: (O1.E, O2.E, O3.E, O4.E) throws -> R)
-> Driver<R> {
let source = zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(),
@ -117,7 +117,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ resultSelector: (O1.E, O2.E, O3.E, O4.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: (O1.E, O2.E, O3.E, O4.E) throws -> R)
-> Driver<R> {
let source = combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(),
@ -138,7 +138,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> R)
-> Driver<R> {
let source = zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(),
@ -155,7 +155,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> R)
-> Driver<R> {
let source = combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(),
@ -176,7 +176,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> R)
-> Driver<R> {
let source = zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(),
@ -193,7 +193,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> R)
-> Driver<R> {
let source = combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(),
@ -214,7 +214,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> R)
-> Driver<R> {
let source = zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(),
@ -231,7 +231,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> R)
-> Driver<R> {
let source = combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(),
@ -252,7 +252,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func zip<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType, O8: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, _ resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> R)
-> Driver<R> {
let source = zip(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), source8.asDriver().asObservable(),
@ -269,7 +269,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func combineLatest<O1: DriverConvertibleType, O2: DriverConvertibleType, O3: DriverConvertibleType, O4: DriverConvertibleType, O5: DriverConvertibleType, O6: DriverConvertibleType, O7: DriverConvertibleType, O8: DriverConvertibleType, R>
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, _ resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> R)
(source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> R)
-> Driver<R> {
let source = combineLatest(
source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), source8.asDriver().asObservable(),

View File

@ -22,7 +22,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func zip<<%= (Array(1...i).map { "O\($0): DriverConvertibleType" }).joinWithSeparator(", ") %>, R>
(<%= (Array(1...i).map { "source\($0): O\($0)" }).joinWithSeparator(", _ ") %>, _ resultSelector: (<%= (Array(1...i).map { "O\($0).E" }).joinWithSeparator(", ") %>) throws -> R)
(<%= (Array(1...i).map { "source\($0): O\($0)" }).joinWithSeparator(", _ ") %>, resultSelector: (<%= (Array(1...i).map { "O\($0).E" }).joinWithSeparator(", ") %>) throws -> R)
-> Driver<R> {
let source = zip(
<%= (Array(1...i).map { "source\($0).asDriver().asObservable()" }).joinWithSeparator(", ") %>,
@ -39,7 +39,7 @@ Merges the specified observable sequences into one observable sequence by using
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func combineLatest<<%= (Array(1...i).map { "O\($0): DriverConvertibleType" }).joinWithSeparator(", ") %>, R>
(<%= (Array(1...i).map { "source\($0): O\($0)" }).joinWithSeparator(", _ ") %>, _ resultSelector: (<%= (Array(1...i).map { "O\($0).E" }).joinWithSeparator(", ") %>) throws -> R)
(<%= (Array(1...i).map { "source\($0): O\($0)" }).joinWithSeparator(", _ ") %>, resultSelector: (<%= (Array(1...i).map { "O\($0).E" }).joinWithSeparator(", ") %>) throws -> R)
-> Driver<R> {
let source = combineLatest(
<%= (Array(1...i).map { "source\($0).asDriver().asObservable()" }).joinWithSeparator(", ") %>,

View File

@ -25,18 +25,6 @@ extension Driver {
return Driver<R>(source)
}
/**
Projects each element of an observable sequence into a new form by incorporating the element's index.
- parameter selector: A transform function to apply to each source element; the second parameter of the function represents the index of the source element.
- returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.
*/
public func mapWithIndex<R>(selector: (E, Int) -> R) -> Driver<R> {
let source = _source
.mapWithIndex(selector)
return Driver<R>(source)
}
/**
Filters the elements of an observable sequence based on a predicate.
@ -127,7 +115,7 @@ extension Driver where Element: Equatable {
public func distinctUntilChanged()
-> Driver<E> {
let source = _source
.self.distinctUntilChanged({ $0 }, comparer: { ($0 == $1) })
.distinctUntilChanged({ $0 }, comparer: { ($0 == $1) })
return Driver(source)
}
@ -188,20 +176,6 @@ extension Driver {
return Driver<R>(source)
}
/**
Projects each element of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.
- parameter selector: A transform function to apply to each element; the second parameter of the function represents the index of the source element.
- returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.
*/
public func flatMapWithIndex<R>(selector: (E, Int) -> Driver<R>)
-> Driver<R> {
let source = _source
.flatMapWithIndex(selector)
return Driver<R>(source.asObservable())
}
}
// merge
@ -317,4 +291,18 @@ extension CollectionType where Generator.Element : DriverConvertibleType {
let source: Observable<R> = self.map { $0.asDriver() }.zip(resultSelector)
return Driver<R>(source)
}
}
extension CollectionType where Generator.Element : DriverConvertibleType {
/**
Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.
- parameter resultSelector: Function to invoke whenever any of the sources produces an element.
- returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
*/
public func combineLatest<R>(resultSelector: [Generator.Element.E] throws -> R) -> Driver<R> {
let source : Observable<R> = self.map { $0.asDriver() }.combineLatest(resultSelector)
return Driver<R>(source)
}
}

View File

@ -21,8 +21,9 @@ extension ObservableConvertibleType {
public func asDriver(onErrorJustReturn onErrorJustReturn: E) -> Driver<E> {
let source = self
.asObservable()
.catchErrorJustReturn(onErrorJustReturn)
.subscribeOn(MainScheduler.sharedInstance)
.observeOn(MainScheduler.sharedInstance)
.catchErrorJustReturn(onErrorJustReturn)
return Driver(source)
}
@ -35,10 +36,11 @@ extension ObservableConvertibleType {
public func asDriver(onErrorDriveWith onErrorDriveWith: Driver<E>) -> Driver<E> {
let source = self
.asObservable()
.subscribeOn(MainScheduler.sharedInstance)
.observeOn(MainScheduler.sharedInstance)
.catchError { _ in
onErrorDriveWith.asObservable()
}
.observeOn(MainScheduler.sharedInstance)
return Driver(source)
}
@ -51,10 +53,11 @@ extension ObservableConvertibleType {
public func asDriver(onErrorRecover onErrorRecover: (error: ErrorType) -> Driver<E>) -> Driver<E> {
let source = self
.asObservable()
.subscribeOn(MainScheduler.sharedInstance)
.observeOn(MainScheduler.sharedInstance)
.catchError { error in
onErrorRecover(error: error).asObservable()
}
.observeOn(MainScheduler.sharedInstance)
return Driver(source)
}
}

View File

@ -8,7 +8,7 @@
import Foundation
class CombineLatestCollectionTypeSink<C: CollectionType, R, O: ObserverType where C.Generator.Element : ObservableType, O.E == R> : Sink<O> {
class CombineLatestCollectionTypeSink<C: CollectionType, R, O: ObserverType where C.Generator.Element : ObservableConvertibleType, O.E == R> : Sink<O> {
typealias Parent = CombineLatestCollectionType<C, R>
typealias SourceElement = C.Generator.Element.E
@ -91,7 +91,8 @@ class CombineLatestCollectionTypeSink<C: CollectionType, R, O: ObserverType wher
var j = 0
for i in parent.sources.startIndex ..< parent.sources.endIndex {
let index = j
self.subscriptions[j].disposable = self.parent.sources[i].subscribeSafe(ObserverOf { event in
let source = self.parent.sources[i].asObservable()
self.subscriptions[j].disposable = source.subscribeSafe(ObserverOf { event in
self.on(event, atIndex: index)
})
@ -102,7 +103,7 @@ class CombineLatestCollectionTypeSink<C: CollectionType, R, O: ObserverType wher
}
}
class CombineLatestCollectionType<C: CollectionType, R where C.Generator.Element : ObservableType> : Producer<R> {
class CombineLatestCollectionType<C: CollectionType, R where C.Generator.Element : ObservableConvertibleType> : Producer<R> {
typealias ResultSelector = [C.Generator.Element.E] throws -> R
let sources: C

View File

@ -10,7 +10,7 @@ import Foundation
// combineLatest
extension CollectionType where Generator.Element : ObservableType {
extension CollectionType where Generator.Element : ObservableConvertibleType {
/**
Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.

View File

@ -0,0 +1,20 @@
//
// EquatableArray.swift
// RxTests
//
// Created by Krunoslav Zaher on 10/15/15.
//
//
import Foundation
struct EquatableArray<Element: Equatable> : Equatable {
let elements: [Element]
init(_ elements: [Element]) {
self.elements = elements
}
}
func == <E: Equatable>(lhs: EquatableArray<E>, rhs: EquatableArray<E>) -> Bool {
return lhs.elements == rhs.elements
}

View File

@ -0,0 +1,18 @@
//
// MainThreadPrimitiveHotObservable.swift
// RxTests
//
// Created by Krunoslav Zaher on 10/14/15.
//
//
import Foundation
import RxSwift
import XCTest
class MainThreadPrimitiveHotObservable<ElementType: Equatable> : PrimitiveHotObservable<ElementType> {
override func subscribe<O : ObserverType where O.E == E>(observer: O) -> Disposable {
XCTAssertTrue(NSThread.isMainThread())
return super.subscribe(observer)
}
}

View File

@ -8,6 +8,7 @@
import Foundation
import RxSwift
import RxCocoa
public func == <T>(lhs: Observable<T>, rhs: Observable<T>) -> Bool {
return lhs === rhs
@ -27,4 +28,12 @@ func == <T>(lhs: HotObservable<T>, rhs: HotObservable<T>) -> Bool {
func == <T>(lhs: ColdObservable<T>, rhs: ColdObservable<T>) -> Bool {
return lhs === rhs
}
extension Driver : Equatable {
}
public func == <T>(lhs: Driver<T>, rhs: Driver<T>) -> Bool {
return lhs.asObservable() === rhs.asObservable()
}

View File

@ -8,6 +8,7 @@
import Foundation
import RxSwift
import Swift
struct Recorded<Element : Equatable> : CustomStringConvertible, Equatable {
let time: Time
@ -43,14 +44,3 @@ func == <T: Equatable>(lhs: Recorded<T>, rhs: Recorded<T>) -> Bool {
}
// workaround for swift compiler bug
struct EquatableArray<Element: Equatable> : Equatable {
let elements: [Element]
init(_ elements: [Element]) {
self.elements = elements
}
}
func == <E: Equatable>(lhs: EquatableArray<E>, rhs: EquatableArray<E>) -> Bool {
return lhs.elements == rhs.elements
}

View File

@ -1,14 +0,0 @@
//
// TestExtensions.swift
// Rx
//
// Created by Krunoslav Zaher on 2/15/15.
// Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
//
import Foundation
import XCTest
func assertEquals<T: Equatable>(lhs: T, rhs: T) {
XCTAssertTrue(lhs == rhs)
}

View File

@ -0,0 +1,610 @@
//
// Driver+Test.swift
// RxTests
//
// Created by Krunoslav Zaher on 10/14/15.
//
//
import Foundation
import RxSwift
import RxCocoa
import XCTest
class DriverTest : RxTest {
var backgroundScheduler = SerialDispatchQueueScheduler(globalConcurrentQueuePriority: .Default)
override func tearDown() {
super.tearDown()
}
}
// test helpers that make sure that resulting driver operator honors definition
// * only one subscription is made and shared - shareReplay(1)
// * subscription is made on main thread - subscribeOn(MainScheduler.sharedInstance)
// * events are observed on main thread - observeOn(MainScheduler.sharedInstance)
// * it can't error out - it needs to have catch somewhere
extension DriverTest {
func subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler<R: Equatable>(driver: Driver<R>, subscribedOnBackground: () -> ()) -> [R] {
var firstElements = [R]()
var secondElements = [R]()
let subscribeFinished = self.expectationWithDescription("subscribeFinished")
var expectation1: XCTestExpectation!
var expectation2: XCTestExpectation!
backgroundScheduler.schedule(()) { _ in
_ = driver.asObservable().subscribe { e in
XCTAssertTrue(NSThread.isMainThread())
switch e {
case .Next(let element):
firstElements.append(element)
case .Error(let error):
XCTFail("Error passed \(error)")
case .Completed:
expectation1.fulfill()
}
}
_ = driver.asDriver().asObservable().subscribe { e in
XCTAssertTrue(NSThread.isMainThread())
switch e {
case .Next(let element):
secondElements.append(element)
case .Error(let error):
XCTFail("Error passed \(error)")
case .Completed:
expectation2.fulfill()
}
}
// Subscription should be made on main scheduler
// so this will make sure execution is continued after
// subscription because of serial nature of main scheduler.
MainScheduler.sharedInstance.schedule(()) { _ in
subscribeFinished.fulfill()
return NopDisposable.instance
}
return NopDisposable.instance
}
waitForExpectationsWithTimeout(1.0) { error in
XCTAssertTrue(error == nil)
}
expectation1 = self.expectationWithDescription("finished1")
expectation2 = self.expectationWithDescription("finished2")
subscribedOnBackground()
waitForExpectationsWithTimeout(1.0) { error in
XCTAssertTrue(error == nil)
}
XCTAssertTrue(firstElements == secondElements)
return firstElements
}
}
// conversions
extension DriverTest {
func testAsDriver_onErrorJustReturn() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1)
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [1, 2, -1])
}
func testAsDriver_onErrorDriveWith() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorDriveWith: Drive.just(-1))
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [1, 2, -1])
}
func testAsDriver_onErrorRecover() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver { e in
return Drive.empty()
}
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [1, 2])
}
}
// map
extension DriverTest {
func testAsDriver_map() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).map { (n: Int) -> Int in
XCTAssertTrue(NSThread.isMainThread())
return n + 1
}
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [2, 3, 0])
}
}
// filter
extension DriverTest {
func testAsDriver_filter() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).filter { n in
XCTAssertTrue(NSThread.isMainThread())
return n % 2 == 0
}
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [2])
}
}
// switch latest
extension DriverTest {
func testAsDriver_switchLatest() {
let hotObservable = MainThreadPrimitiveHotObservable<Driver<Int>>()
let hotObservable1 = MainThreadPrimitiveHotObservable<Int>()
let hotObservable2 = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: hotObservable1.asDriver(onErrorJustReturn: -1)).switchLatest()
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(hotObservable1.asDriver(onErrorJustReturn: -2)))
hotObservable1.on(.Next(1))
hotObservable1.on(.Next(2))
hotObservable1.on(.Error(testError))
hotObservable.on(.Next(hotObservable2.asDriver(onErrorJustReturn: -3)))
hotObservable2.on(.Next(10))
hotObservable2.on(.Next(11))
hotObservable2.on(.Error(testError))
hotObservable.on(.Error(testError))
hotObservable1.on(.Completed)
hotObservable.on(.Completed)
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [
1, 2, -2,
10, 11, -3
])
}
}
// doOn
extension DriverTest {
func testAsDriver_doOn() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
var events = [Event<Int>]()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).doOn { e in
XCTAssertTrue(NSThread.isMainThread())
events.append(e)
}
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [1, 2, -1])
let expectedEvents = [Event.Next(1), Event.Next(2), Event.Next(-1), Event.Completed] as [Event<Int>]
XCTAssertEqual(events, expectedEvents, ==)
}
}
// distinct until change
extension DriverTest {
func testAsDriver_distinctUntilChanged1() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).distinctUntilChanged()
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [1, 2, -1])
}
func testAsDriver_distinctUntilChanged2() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).distinctUntilChanged({ $0 })
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [1, 2, -1])
}
func testAsDriver_distinctUntilChanged3() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).distinctUntilChanged({ $0 == $1 })
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [1, 2, -1])
}
func testAsDriver_distinctUntilChanged4() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).distinctUntilChanged({ $0 }) { $0 == $1 }
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [1, 2, -1])
}
}
// flat map
extension DriverTest {
func testAsDriver_flatMap() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).flatMap { (n: Int) -> Driver<Int> in
XCTAssertTrue(NSThread.isMainThread())
return Drive.just(n + 1)
}
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [2, 3, 0])
}
}
// merge
extension DriverTest {
func testAsDriver_merge() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).map { (n: Int) -> Driver<Int> in
XCTAssertTrue(NSThread.isMainThread())
return Drive.just(n + 1)
}.merge()
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [2, 3, 0])
}
func testAsDriver_merge2() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).map { (n: Int) -> Driver<Int> in
XCTAssertTrue(NSThread.isMainThread())
return Drive.just(n + 1)
}.merge(maxConcurrent: 1)
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [2, 3, 0])
}
}
// debounce
extension DriverTest {
func testAsDriver_debounce() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).debounce(0.0, MainScheduler.sharedInstance)
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [-1])
}
func testAsDriver_throttle() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).throttle(0.0, MainScheduler.sharedInstance)
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [-1])
}
}
// scan
extension DriverTest {
func testAsDriver_scan() {
let hotObservable = MainThreadPrimitiveHotObservable<Int>()
let driver = hotObservable.asDriver(onErrorJustReturn: -1).scan(0) { (a: Int, n: Int) -> Int in
XCTAssertTrue(NSThread.isMainThread())
return a + n
}
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable])
hotObservable.on(.Next(1))
hotObservable.on(.Next(2))
hotObservable.on(.Error(testError))
XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [1, 3, 2])
}
}
// concat
extension DriverTest {
func testAsDriver_concat() {
let hotObservable1 = MainThreadPrimitiveHotObservable<Int>()
let hotObservable2 = MainThreadPrimitiveHotObservable<Int>()
let driver = [hotObservable1.asDriver(onErrorJustReturn: -1), hotObservable2.asDriver(onErrorJustReturn: -2)].concat()
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable1.subscriptions == [SubscribedToHotObservable])
hotObservable1.on(.Next(1))
hotObservable1.on(.Next(2))
hotObservable1.on(.Error(testError))
XCTAssertTrue(hotObservable1.subscriptions == [UnsunscribedFromHotObservable])
XCTAssertTrue(hotObservable2.subscriptions == [SubscribedToHotObservable])
hotObservable2.on(.Next(4))
hotObservable2.on(.Next(5))
hotObservable2.on(.Error(testError))
XCTAssertTrue(hotObservable2.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [1, 2, -1, 4, 5, -2])
}
}
// combine latest
extension DriverTest {
func testAsDriver_combineLatest_array() {
let hotObservable1 = MainThreadPrimitiveHotObservable<Int>()
let hotObservable2 = MainThreadPrimitiveHotObservable<Int>()
let driver = [hotObservable1.asDriver(onErrorJustReturn: -1), hotObservable2.asDriver(onErrorJustReturn: -2)].combineLatest { a in a.reduce(0, combine: +) }
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable1.subscriptions == [SubscribedToHotObservable])
XCTAssertTrue(hotObservable2.subscriptions == [SubscribedToHotObservable])
hotObservable1.on(.Next(1))
hotObservable2.on(.Next(4))
hotObservable1.on(.Next(2))
hotObservable2.on(.Next(5))
hotObservable1.on(.Error(testError))
hotObservable2.on(.Error(testError))
XCTAssertTrue(hotObservable1.subscriptions == [UnsunscribedFromHotObservable])
XCTAssertTrue(hotObservable2.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [5, 6, 7, 4, -3])
}
func testAsDriver_combineLatest() {
let hotObservable1 = MainThreadPrimitiveHotObservable<Int>()
let hotObservable2 = MainThreadPrimitiveHotObservable<Int>()
let driver = combineLatest(hotObservable1.asDriver(onErrorJustReturn: -1), hotObservable2.asDriver(onErrorJustReturn: -2), resultSelector: +)
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable1.subscriptions == [SubscribedToHotObservable])
XCTAssertTrue(hotObservable2.subscriptions == [SubscribedToHotObservable])
hotObservable1.on(.Next(1))
hotObservable2.on(.Next(4))
hotObservable1.on(.Next(2))
hotObservable2.on(.Next(5))
hotObservable1.on(.Error(testError))
hotObservable2.on(.Error(testError))
XCTAssertTrue(hotObservable1.subscriptions == [UnsunscribedFromHotObservable])
XCTAssertTrue(hotObservable2.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [5, 6, 7, 4, -3])
}
}
// zip
extension DriverTest {
func testAsDriver_zip_array() {
let hotObservable1 = MainThreadPrimitiveHotObservable<Int>()
let hotObservable2 = MainThreadPrimitiveHotObservable<Int>()
let driver = [hotObservable1.asDriver(onErrorJustReturn: -1), hotObservable2.asDriver(onErrorJustReturn: -2)].zip { a in a.reduce(0, combine: +) }
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable1.subscriptions == [SubscribedToHotObservable])
XCTAssertTrue(hotObservable2.subscriptions == [SubscribedToHotObservable])
hotObservable1.on(.Next(1))
hotObservable2.on(.Next(4))
hotObservable1.on(.Next(2))
hotObservable2.on(.Next(5))
hotObservable1.on(.Error(testError))
hotObservable2.on(.Error(testError))
XCTAssertTrue(hotObservable1.subscriptions == [UnsunscribedFromHotObservable])
XCTAssertTrue(hotObservable2.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [5, 7, -3])
}
func testAsDriver_zip() {
let hotObservable1 = MainThreadPrimitiveHotObservable<Int>()
let hotObservable2 = MainThreadPrimitiveHotObservable<Int>()
let driver = zip(hotObservable1.asDriver(onErrorJustReturn: -1), hotObservable2.asDriver(onErrorJustReturn: -2), resultSelector: +)
let results = subscribeTwiceOnBackgroundSchedulerAndExpectResultsOnMainScheduler(driver) {
XCTAssertTrue(hotObservable1.subscriptions == [SubscribedToHotObservable])
XCTAssertTrue(hotObservable2.subscriptions == [SubscribedToHotObservable])
hotObservable1.on(.Next(1))
hotObservable2.on(.Next(4))
hotObservable1.on(.Next(2))
hotObservable2.on(.Next(5))
hotObservable1.on(.Error(testError))
hotObservable2.on(.Error(testError))
XCTAssertTrue(hotObservable1.subscriptions == [UnsunscribedFromHotObservable])
XCTAssertTrue(hotObservable2.subscriptions == [UnsunscribedFromHotObservable])
}
XCTAssertEqual(results, [5, 7, -3])
}
}

View File

@ -12,10 +12,6 @@ import RxBlocking
import XCTest
class ObservableBlockingTest : RxTest {
override func tearDown() {
sleep(0.1)
super.tearDown()
}
}
// toArray

View File

@ -21,9 +21,6 @@ class ObservableConcurrencyTestBase : RxTest {
}
override func tearDown() {
#if TRACE_RESOURCES
sleep(0.1) // wait 100 ms for proper scheduler disposal
#endif
super.tearDown()
}
}

View File

@ -16,14 +16,6 @@ class ObservableTimeTest : RxTest {
override func setUp() {
super.setUp()
}
override func tearDown() {
#if TRACE_RESOURCES
sleep(0.1) // wait 100 ms for proper scheduler disposal
#endif
super.tearDown()
}
}
// throttle

View File

@ -29,6 +29,11 @@ func XCTAssertErrorEqual(lhs: ErrorType, _ rhs: ErrorType) {
XCTAssertTrue(lhs as NSError === rhs as NSError)
}
func XCTAssertEqual<T>(lhs: [T], _ rhs: [T], _ comparison: (T, T) -> Bool) {
XCTAssertEqual(lhs.count, rhs.count)
XCTAssertTrue(zip(lhs, rhs).reduce(true) { (a: Bool, z: (T, T)) in a && comparison(z.0, z.1) })
}
let testError = NSError(domain: "dummyError", code: -232, userInfo: nil)
let testError1 = NSError(domain: "dummyError1", code: -233, userInfo: nil)
let testError2 = NSError(domain: "dummyError2", code: -234, userInfo: nil)
@ -65,7 +70,7 @@ class RxTest: XCTestCase {
}
func sleep(time: NSTimeInterval) {
NSThread.sleepForTimeInterval(time)
NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow: time))
}
private var startResourceCount: Int32 = 0
@ -100,6 +105,18 @@ class RxTest: XCTestCase {
super.tearDown()
#if TRACE_RESOURCES
// give 5 sec to clean up resources
for var i = 0; i < 100; ++i {
if self.startResourceCount < resourceCount {
// main schedulers need to finish work
NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow: 0.05))
}
else {
break
}
}
XCTAssertEqual(self.startResourceCount, resourceCount)
let (endNumberOfAllocatedBytes, endNumberOfAllocations) = getMemoryInfo()

View File

@ -12,6 +12,12 @@
C69B65011BA8957C00A7FA73 /* ObserverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C69B64FF1BA88FAC00A7FA73 /* ObserverTests.swift */; };
C801EB5A1B97951100C4D8C4 /* Observable+CreationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C801EB591B97951100C4D8C4 /* Observable+CreationTest.swift */; };
C801EB5B1B97951100C4D8C4 /* Observable+CreationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C801EB591B97951100C4D8C4 /* Observable+CreationTest.swift */; };
C80DDEDC1BCE9A03006A1832 /* Driver+Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEDB1BCE9A03006A1832 /* Driver+Test.swift */; };
C80DDEDD1BCE9A03006A1832 /* Driver+Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEDB1BCE9A03006A1832 /* Driver+Test.swift */; };
C80DDEDE1BCE9A03006A1832 /* Driver+Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEDB1BCE9A03006A1832 /* Driver+Test.swift */; };
C80DDEE01BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEDF1BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift */; };
C80DDEE11BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEDF1BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift */; };
C80DDEE21BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DDEDF1BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift */; };
C811084D1AF50E2A001C13E4 /* NSNotificationCenterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811082B1AF50E2A001C13E4 /* NSNotificationCenterTests.swift */; };
C811084F1AF50E2A001C13E4 /* ColdObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81108301AF50E2A001C13E4 /* ColdObservable.swift */; };
C81108501AF50E2A001C13E4 /* TestConnectableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81108311AF50E2A001C13E4 /* TestConnectableObservable.swift */; };
@ -25,7 +31,6 @@
C81108591AF50E2A001C13E4 /* TestScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811083B1AF50E2A001C13E4 /* TestScheduler.swift */; };
C811085A1AF50E2A001C13E4 /* VirtualTimeSchedulerBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811083C1AF50E2A001C13E4 /* VirtualTimeSchedulerBase.swift */; };
C811085B1AF50E2A001C13E4 /* Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811083D1AF50E2A001C13E4 /* Subscription.swift */; };
C811085C1AF50E2A001C13E4 /* TestExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811083E1AF50E2A001C13E4 /* TestExtensions.swift */; };
C811085D1AF50E2A001C13E4 /* AssumptionsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81108401AF50E2A001C13E4 /* AssumptionsTest.swift */; };
C811085E1AF50E2A001C13E4 /* ConcurrencyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81108411AF50E2A001C13E4 /* ConcurrencyTest.swift */; };
C811085F1AF50E2A001C13E4 /* DisposableTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81108421AF50E2A001C13E4 /* DisposableTest.swift */; };
@ -79,7 +84,6 @@
C88BB8A81B07E64B0064D411 /* TestScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811083B1AF50E2A001C13E4 /* TestScheduler.swift */; };
C88BB8A91B07E64B0064D411 /* Observable+AggregateTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81108431AF50E2A001C13E4 /* Observable+AggregateTest.swift */; };
C88BB8AA1B07E64B0064D411 /* MockObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81108331AF50E2A001C13E4 /* MockObserver.swift */; };
C88BB8AB1B07E64B0064D411 /* TestExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811083E1AF50E2A001C13E4 /* TestExtensions.swift */; };
C88BB8AC1B07E64B0064D411 /* AssumptionsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81108401AF50E2A001C13E4 /* AssumptionsTest.swift */; };
C88BB8AD1B07E64B0064D411 /* TestConnectableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81108311AF50E2A001C13E4 /* TestConnectableObservable.swift */; };
C88BB8AE1B07E64B0064D411 /* VariableTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C814CEA21AF5622600E98087 /* VariableTest.swift */; };
@ -108,6 +112,9 @@
C8E3812B1B2083C2008CDC33 /* PrimitiveMockObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E3812A1B2083C2008CDC33 /* PrimitiveMockObserver.swift */; };
C8E3812C1B2083C2008CDC33 /* PrimitiveMockObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E3812A1B2083C2008CDC33 /* PrimitiveMockObserver.swift */; };
C8E3813A1B21B77E008CDC33 /* Observable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E381221B2063CC008CDC33 /* Observable+Extensions.swift */; };
C8EA2D371BD02E1900FB22AC /* EquatableArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8EA2D361BD02E1900FB22AC /* EquatableArray.swift */; };
C8EA2D381BD02E1900FB22AC /* EquatableArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8EA2D361BD02E1900FB22AC /* EquatableArray.swift */; };
C8EA2D391BD02E1900FB22AC /* EquatableArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8EA2D361BD02E1900FB22AC /* EquatableArray.swift */; };
C8FDC5F81B2B5B7E0065F8D9 /* ElementIndexPair.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8FDC5F71B2B5B7E0065F8D9 /* ElementIndexPair.swift */; };
C8FDC5F91B2B5B7E0065F8D9 /* ElementIndexPair.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8FDC5F71B2B5B7E0065F8D9 /* ElementIndexPair.swift */; };
D203C4EB1BB9C22800D02D00 /* NSNotificationCenterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811082B1AF50E2A001C13E4 /* NSNotificationCenterTests.swift */; };
@ -131,7 +138,6 @@
D2EBEB5D1BB9B7D6003A27DC /* TestScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811083B1AF50E2A001C13E4 /* TestScheduler.swift */; };
D2EBEB5E1BB9B7D8003A27DC /* VirtualTimeSchedulerBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811083C1AF50E2A001C13E4 /* VirtualTimeSchedulerBase.swift */; };
D2EBEB5F1BB9B7DB003A27DC /* Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811083D1AF50E2A001C13E4 /* Subscription.swift */; };
D2EBEB601BB9B7DF003A27DC /* TestExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811083E1AF50E2A001C13E4 /* TestExtensions.swift */; };
D2EBEB611BB9B7E2003A27DC /* Observable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E381221B2063CC008CDC33 /* Observable+Extensions.swift */; };
D2EBEB621BB9B7E5003A27DC /* ElementIndexPair.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8FDC5F71B2B5B7E0065F8D9 /* ElementIndexPair.swift */; };
D2EBEB631BB9B7EA003A27DC /* AnonymousObservable+Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8B605EB1B6260A10044410E /* AnonymousObservable+Test.swift */; };
@ -166,6 +172,8 @@
5E5D10BA1B48355200432B25 /* UIControl+RxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIControl+RxTests.swift"; sourceTree = "<group>"; };
C69B64FF1BA88FAC00A7FA73 /* ObserverTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObserverTests.swift; sourceTree = "<group>"; };
C801EB591B97951100C4D8C4 /* Observable+CreationTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Observable+CreationTest.swift"; sourceTree = "<group>"; };
C80DDEDB1BCE9A03006A1832 /* Driver+Test.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Driver+Test.swift"; sourceTree = "<group>"; };
C80DDEDF1BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainThreadPrimitiveHotObservable.swift; sourceTree = "<group>"; };
C81108201AF50E11001C13E4 /* RxTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RxTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
C81108241AF50E11001C13E4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C811082B1AF50E2A001C13E4 /* NSNotificationCenterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSNotificationCenterTests.swift; sourceTree = "<group>"; };
@ -181,7 +189,6 @@
C811083B1AF50E2A001C13E4 /* TestScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestScheduler.swift; sourceTree = "<group>"; };
C811083C1AF50E2A001C13E4 /* VirtualTimeSchedulerBase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VirtualTimeSchedulerBase.swift; sourceTree = "<group>"; };
C811083D1AF50E2A001C13E4 /* Subscription.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Subscription.swift; sourceTree = "<group>"; };
C811083E1AF50E2A001C13E4 /* TestExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestExtensions.swift; sourceTree = "<group>"; };
C81108401AF50E2A001C13E4 /* AssumptionsTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssumptionsTest.swift; sourceTree = "<group>"; };
C81108411AF50E2A001C13E4 /* ConcurrencyTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConcurrencyTest.swift; sourceTree = "<group>"; };
C81108421AF50E2A001C13E4 /* DisposableTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisposableTest.swift; sourceTree = "<group>"; };
@ -221,6 +228,7 @@
C8E381221B2063CC008CDC33 /* Observable+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Observable+Extensions.swift"; sourceTree = "<group>"; };
C8E381271B207D03008CDC33 /* PrimitiveHotObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrimitiveHotObservable.swift; sourceTree = "<group>"; };
C8E3812A1B2083C2008CDC33 /* PrimitiveMockObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrimitiveMockObserver.swift; sourceTree = "<group>"; };
C8EA2D361BD02E1900FB22AC /* EquatableArray.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EquatableArray.swift; sourceTree = "<group>"; };
C8FDC5F71B2B5B7E0065F8D9 /* ElementIndexPair.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ElementIndexPair.swift; sourceTree = "<group>"; };
D2EBEB491BB9B7AE003A27DC /* RxTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RxTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
@ -338,9 +346,9 @@
C81108381AF50E2A001C13E4 /* Recorded.swift */,
C811083A1AF50E2A001C13E4 /* Schedulers */,
C811083D1AF50E2A001C13E4 /* Subscription.swift */,
C811083E1AF50E2A001C13E4 /* TestExtensions.swift */,
C8E381221B2063CC008CDC33 /* Observable+Extensions.swift */,
C8FDC5F71B2B5B7E0065F8D9 /* ElementIndexPair.swift */,
C8EA2D361BD02E1900FB22AC /* EquatableArray.swift */,
);
path = TestImplementations;
sourceTree = "<group>";
@ -358,6 +366,7 @@
C81108371AF50E2A001C13E4 /* TestObserver.swift */,
C8E381271B207D03008CDC33 /* PrimitiveHotObservable.swift */,
C8E3812A1B2083C2008CDC33 /* PrimitiveMockObserver.swift */,
C80DDEDF1BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift */,
);
path = Mocks;
sourceTree = "<group>";
@ -399,6 +408,7 @@
C814CEA21AF5622600E98087 /* VariableTest.swift */,
C69B64FF1BA88FAC00A7FA73 /* ObserverTests.swift */,
C89CDB951BCDA1F1002063D9 /* Observable+SubscriptionTest.swift */,
C80DDEDB1BCE9A03006A1832 /* Driver+Test.swift */,
);
path = Tests;
sourceTree = "<group>";
@ -568,6 +578,7 @@
C81108551AF50E2A001C13E4 /* TestObservable.swift in Sources */,
C8E3812B1B2083C2008CDC33 /* PrimitiveMockObserver.swift in Sources */,
C811085B1AF50E2A001C13E4 /* Subscription.swift in Sources */,
C80DDEDC1BCE9A03006A1832 /* Driver+Test.swift in Sources */,
C81108531AF50E2A001C13E4 /* MySubject.swift in Sources */,
C814CEA71AF642D600E98087 /* UI+RxTests.swift in Sources */,
C81108611AF50E2A001C13E4 /* Observable+BindingTest.swift in Sources */,
@ -584,6 +595,7 @@
C8AF26EF1B499E5C00131C03 /* DelegateProxyTest.swift in Sources */,
C8E381281B207D03008CDC33 /* PrimitiveHotObservable.swift in Sources */,
C81108661AF50E2A001C13E4 /* Observable+StandardSequenceOperatorsTest.swift in Sources */,
C80DDEE01BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift in Sources */,
C81108641AF50E2A001C13E4 /* Observable+MultipleTest.swift in Sources */,
C811084F1AF50E2A001C13E4 /* ColdObservable.swift in Sources */,
C8FDC5F81B2B5B7E0065F8D9 /* ElementIndexPair.swift in Sources */,
@ -602,8 +614,8 @@
C81108601AF50E2A001C13E4 /* Observable+AggregateTest.swift in Sources */,
C81108521AF50E2A001C13E4 /* MockObserver.swift in Sources */,
C8633AE51B0A9FF300375D60 /* KVOObservableTests.swift in Sources */,
C811085C1AF50E2A001C13E4 /* TestExtensions.swift in Sources */,
C8B605EC1B6260A10044410E /* AnonymousObservable+Test.swift in Sources */,
C8EA2D371BD02E1900FB22AC /* EquatableArray.swift in Sources */,
C811085D1AF50E2A001C13E4 /* AssumptionsTest.swift in Sources */,
C81108501AF50E2A001C13E4 /* TestConnectableObservable.swift in Sources */,
C814CEA31AF5622600E98087 /* VariableTest.swift in Sources */,
@ -639,6 +651,7 @@
C88BB89C1B07E64B0064D411 /* ConcurrencyTest.swift in Sources */,
C88BB89D1B07E64B0064D411 /* TestObserver.swift in Sources */,
C88BB89E1B07E64B0064D411 /* VirtualTimeSchedulerBase.swift in Sources */,
C80DDEDD1BCE9A03006A1832 /* Driver+Test.swift in Sources */,
C88BB89F1B07E64B0064D411 /* DisposableTest.swift in Sources */,
C88BB8A01B07E64B0064D411 /* Observable+StandardSequenceOperatorsTest.swift in Sources */,
C88BB8A11B07E64B0064D411 /* Observable+MultipleTest.swift in Sources */,
@ -662,10 +675,11 @@
C88BB8A81B07E64B0064D411 /* TestScheduler.swift in Sources */,
C88BB8A91B07E64B0064D411 /* Observable+AggregateTest.swift in Sources */,
C88BB8AA1B07E64B0064D411 /* MockObserver.swift in Sources */,
C80DDEE11BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift in Sources */,
C8AF26F01B499E5C00131C03 /* DelegateProxyTest.swift in Sources */,
C69B65011BA8957C00A7FA73 /* ObserverTests.swift in Sources */,
C8633AE61B0AA0ED00375D60 /* KVOObservableTests.swift in Sources */,
C88BB8AB1B07E64B0064D411 /* TestExtensions.swift in Sources */,
C8EA2D381BD02E1900FB22AC /* EquatableArray.swift in Sources */,
C88BB8AC1B07E64B0064D411 /* AssumptionsTest.swift in Sources */,
C88BB8AD1B07E64B0064D411 /* TestConnectableObservable.swift in Sources */,
C8E3813A1B21B77E008CDC33 /* Observable+Extensions.swift in Sources */,
@ -685,6 +699,7 @@
D203C4EC1BB9C22800D02D00 /* UI+RxTests.swift in Sources */,
D2EBEB591BB9B7CC003A27DC /* TestObserver.swift in Sources */,
D2EBEB5E1BB9B7D8003A27DC /* VirtualTimeSchedulerBase.swift in Sources */,
C80DDEDE1BCE9A03006A1832 /* Driver+Test.swift in Sources */,
D2EBEB641BB9B7EF003A27DC /* AssumptionsTest.swift in Sources */,
D2EBEB6A1BB9B7EF003A27DC /* DisposableTest.swift in Sources */,
D2EBEB791BB9B7FD003A27DC /* RxTest.swift in Sources */,
@ -701,6 +716,7 @@
D2EBEB681BB9B7EF003A27DC /* ConcurrencyTest.swift in Sources */,
D2EBEB721BB9B7F6003A27DC /* Observable+MultipleTest+Zip.swift in Sources */,
D2EBEB731BB9B7F9003A27DC /* Observable+SingleTest.swift in Sources */,
C80DDEE21BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift in Sources */,
D2EBEB6C1BB9B7EF003A27DC /* Observable+BindingTest.swift in Sources */,
D2EBEB621BB9B7E5003A27DC /* ElementIndexPair.swift in Sources */,
D2EBEB5F1BB9B7DB003A27DC /* Subscription.swift in Sources */,
@ -720,9 +736,9 @@
D2EBEB611BB9B7E2003A27DC /* Observable+Extensions.swift in Sources */,
D203C4EE1BB9C22800D02D00 /* KVOObservableTests.swift in Sources */,
D203C4F01BB9C22800D02D00 /* NSObject+RxTests.swift in Sources */,
C8EA2D391BD02E1900FB22AC /* EquatableArray.swift in Sources */,
D2EBEB531BB9B7CC003A27DC /* TestConnectableObservable.swift in Sources */,
D2EBEB571BB9B7CC003A27DC /* Observable.Extensions.swift in Sources */,
D2EBEB601BB9B7DF003A27DC /* TestExtensions.swift in Sources */,
D2EBEB741BB9B7F9003A27DC /* Observable+StandardSequenceOperatorsTest.swift in Sources */,
D2EBEB6D1BB9B7EF003A27DC /* Observable+BlockingTest.swift in Sources */,
);