diff --git a/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.swift b/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.swift index 9d51cd7e..8ca3a622 100644 --- a/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.swift +++ b/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.swift @@ -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 - (source1: O1, _ source2: O2, _ resultSelector: (O1.E, O2.E) throws -> R) + (source1: O1, _ source2: O2, resultSelector: (O1.E, O2.E) throws -> R) -> Driver { 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 - (source1: O1, _ source2: O2, _ resultSelector: (O1.E, O2.E) throws -> R) + (source1: O1, _ source2: O2, resultSelector: (O1.E, O2.E) throws -> R) -> Driver { 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 - (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 { 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 - (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 { 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 - (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 { 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 - (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 { 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 - (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 { 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 - (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 { 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 - (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 { 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 - (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 { 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 - (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 { 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 - (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 { 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 - (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 { 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 - (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 { 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(), diff --git a/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.tt b/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.tt index 781da9cd..349b85fa 100644 --- a/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.tt +++ b/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.tt @@ -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 { 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 { let source = combineLatest( <%= (Array(1...i).map { "source\($0).asDriver().asObservable()" }).joinWithSeparator(", ") %>, diff --git a/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift b/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift index 7d49271f..f535a521 100644 --- a/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift +++ b/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift @@ -25,18 +25,6 @@ extension Driver { return Driver(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(selector: (E, Int) -> R) -> Driver { - let source = _source - .mapWithIndex(selector) - return Driver(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 { 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(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(selector: (E, Int) -> Driver) - -> Driver { - let source = _source - .flatMapWithIndex(selector) - - return Driver(source.asObservable()) - } } // merge @@ -317,4 +291,18 @@ extension CollectionType where Generator.Element : DriverConvertibleType { let source: Observable = self.map { $0.asDriver() }.zip(resultSelector) return Driver(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(resultSelector: [Generator.Element.E] throws -> R) -> Driver { + let source : Observable = self.map { $0.asDriver() }.combineLatest(resultSelector) + return Driver(source) + } } \ No newline at end of file diff --git a/RxCocoa/Common/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift b/RxCocoa/Common/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift index d6ea653c..a89dfc3b 100644 --- a/RxCocoa/Common/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift +++ b/RxCocoa/Common/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift @@ -21,8 +21,9 @@ extension ObservableConvertibleType { public func asDriver(onErrorJustReturn onErrorJustReturn: E) -> Driver { 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) -> Driver { 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) -> Driver { let source = self .asObservable() + .subscribeOn(MainScheduler.sharedInstance) + .observeOn(MainScheduler.sharedInstance) .catchError { error in onErrorRecover(error: error).asObservable() } - .observeOn(MainScheduler.sharedInstance) return Driver(source) } } \ No newline at end of file diff --git a/RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift b/RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift index 204fb6ca..4da0028b 100644 --- a/RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift +++ b/RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift @@ -8,7 +8,7 @@ import Foundation -class CombineLatestCollectionTypeSink : Sink { +class CombineLatestCollectionTypeSink : Sink { typealias Parent = CombineLatestCollectionType typealias SourceElement = C.Generator.Element.E @@ -91,7 +91,8 @@ class CombineLatestCollectionTypeSink : Producer { +class CombineLatestCollectionType : Producer { typealias ResultSelector = [C.Generator.Element.E] throws -> R let sources: C diff --git a/RxSwift/Observables/Observable+Multiple.swift b/RxSwift/Observables/Observable+Multiple.swift index 7b8f1f48..a5b6e23b 100644 --- a/RxSwift/Observables/Observable+Multiple.swift +++ b/RxSwift/Observables/Observable+Multiple.swift @@ -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. diff --git a/RxTests/RxSwiftTests/TestImplementations/EquatableArray.swift b/RxTests/RxSwiftTests/TestImplementations/EquatableArray.swift new file mode 100644 index 00000000..4fda0037 --- /dev/null +++ b/RxTests/RxSwiftTests/TestImplementations/EquatableArray.swift @@ -0,0 +1,20 @@ +// +// EquatableArray.swift +// RxTests +// +// Created by Krunoslav Zaher on 10/15/15. +// +// + +import Foundation + +struct EquatableArray : Equatable { + let elements: [Element] + init(_ elements: [Element]) { + self.elements = elements + } +} + +func == (lhs: EquatableArray, rhs: EquatableArray) -> Bool { + return lhs.elements == rhs.elements +} diff --git a/RxTests/RxSwiftTests/TestImplementations/Mocks/MainThreadPrimitiveHotObservable.swift b/RxTests/RxSwiftTests/TestImplementations/Mocks/MainThreadPrimitiveHotObservable.swift new file mode 100644 index 00000000..28870dc4 --- /dev/null +++ b/RxTests/RxSwiftTests/TestImplementations/Mocks/MainThreadPrimitiveHotObservable.swift @@ -0,0 +1,18 @@ +// +// MainThreadPrimitiveHotObservable.swift +// RxTests +// +// Created by Krunoslav Zaher on 10/14/15. +// +// + +import Foundation +import RxSwift +import XCTest + +class MainThreadPrimitiveHotObservable : PrimitiveHotObservable { + override func subscribe(observer: O) -> Disposable { + XCTAssertTrue(NSThread.isMainThread()) + return super.subscribe(observer) + } +} \ No newline at end of file diff --git a/RxTests/RxSwiftTests/TestImplementations/Observable+Extensions.swift b/RxTests/RxSwiftTests/TestImplementations/Observable+Extensions.swift index a468879f..b7cdb388 100644 --- a/RxTests/RxSwiftTests/TestImplementations/Observable+Extensions.swift +++ b/RxTests/RxSwiftTests/TestImplementations/Observable+Extensions.swift @@ -8,6 +8,7 @@ import Foundation import RxSwift +import RxCocoa public func == (lhs: Observable, rhs: Observable) -> Bool { return lhs === rhs @@ -27,4 +28,12 @@ func == (lhs: HotObservable, rhs: HotObservable) -> Bool { func == (lhs: ColdObservable, rhs: ColdObservable) -> Bool { return lhs === rhs +} + +extension Driver : Equatable { + +} + +public func == (lhs: Driver, rhs: Driver) -> Bool { + return lhs.asObservable() === rhs.asObservable() } \ No newline at end of file diff --git a/RxTests/RxSwiftTests/TestImplementations/Recorded.swift b/RxTests/RxSwiftTests/TestImplementations/Recorded.swift index cfb227a0..606f3a2e 100644 --- a/RxTests/RxSwiftTests/TestImplementations/Recorded.swift +++ b/RxTests/RxSwiftTests/TestImplementations/Recorded.swift @@ -8,6 +8,7 @@ import Foundation import RxSwift +import Swift struct Recorded : CustomStringConvertible, Equatable { let time: Time @@ -43,14 +44,3 @@ func == (lhs: Recorded, rhs: Recorded) -> Bool { } -// workaround for swift compiler bug -struct EquatableArray : Equatable { - let elements: [Element] - init(_ elements: [Element]) { - self.elements = elements - } -} - -func == (lhs: EquatableArray, rhs: EquatableArray) -> Bool { - return lhs.elements == rhs.elements -} \ No newline at end of file diff --git a/RxTests/RxSwiftTests/TestImplementations/TestExtensions.swift b/RxTests/RxSwiftTests/TestImplementations/TestExtensions.swift deleted file mode 100644 index bc799558..00000000 --- a/RxTests/RxSwiftTests/TestImplementations/TestExtensions.swift +++ /dev/null @@ -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(lhs: T, rhs: T) { - XCTAssertTrue(lhs == rhs) -} \ No newline at end of file diff --git a/RxTests/RxSwiftTests/Tests/Driver+Test.swift b/RxTests/RxSwiftTests/Tests/Driver+Test.swift new file mode 100644 index 00000000..95bc89a8 --- /dev/null +++ b/RxTests/RxSwiftTests/Tests/Driver+Test.swift @@ -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(driver: Driver, 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() + 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() + 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() + 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() + 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() + 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>() + let hotObservable1 = MainThreadPrimitiveHotObservable() + let hotObservable2 = MainThreadPrimitiveHotObservable() + + 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() + + var events = [Event]() + + 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] + XCTAssertEqual(events, expectedEvents, ==) + } +} + +// distinct until change +extension DriverTest { + func testAsDriver_distinctUntilChanged1() { + let hotObservable = MainThreadPrimitiveHotObservable() + + 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() + + 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() + + 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() + + 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() + let driver = hotObservable.asDriver(onErrorJustReturn: -1).flatMap { (n: Int) -> Driver 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() + let driver = hotObservable.asDriver(onErrorJustReturn: -1).map { (n: Int) -> Driver 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() + let driver = hotObservable.asDriver(onErrorJustReturn: -1).map { (n: Int) -> Driver 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() + 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() + 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() + 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() + let hotObservable2 = MainThreadPrimitiveHotObservable() + + 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() + let hotObservable2 = MainThreadPrimitiveHotObservable() + + 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() + let hotObservable2 = MainThreadPrimitiveHotObservable() + + 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() + let hotObservable2 = MainThreadPrimitiveHotObservable() + + 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() + let hotObservable2 = MainThreadPrimitiveHotObservable() + + 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]) + } +} \ No newline at end of file diff --git a/RxTests/RxSwiftTests/Tests/Observable+BlockingTest.swift b/RxTests/RxSwiftTests/Tests/Observable+BlockingTest.swift index 11358e16..a736e6c9 100644 --- a/RxTests/RxSwiftTests/Tests/Observable+BlockingTest.swift +++ b/RxTests/RxSwiftTests/Tests/Observable+BlockingTest.swift @@ -12,10 +12,6 @@ import RxBlocking import XCTest class ObservableBlockingTest : RxTest { - override func tearDown() { - sleep(0.1) - super.tearDown() - } } // toArray diff --git a/RxTests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift b/RxTests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift index cbea87f2..785aadf9 100644 --- a/RxTests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift +++ b/RxTests/RxSwiftTests/Tests/Observable+ConcurrencyTest.swift @@ -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() } } diff --git a/RxTests/RxSwiftTests/Tests/Observable+TimeTest.swift b/RxTests/RxSwiftTests/Tests/Observable+TimeTest.swift index ddbc3d35..77c2fc44 100644 --- a/RxTests/RxSwiftTests/Tests/Observable+TimeTest.swift +++ b/RxTests/RxSwiftTests/Tests/Observable+TimeTest.swift @@ -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 diff --git a/RxTests/RxTest.swift b/RxTests/RxTest.swift index 6939dc30..2f661520 100644 --- a/RxTests/RxTest.swift +++ b/RxTests/RxTest.swift @@ -29,6 +29,11 @@ func XCTAssertErrorEqual(lhs: ErrorType, _ rhs: ErrorType) { XCTAssertTrue(lhs as NSError === rhs as NSError) } +func XCTAssertEqual(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() diff --git a/RxTests/RxTests.xcodeproj/project.pbxproj b/RxTests/RxTests.xcodeproj/project.pbxproj index 7b6f4428..4cad61fa 100644 --- a/RxTests/RxTests.xcodeproj/project.pbxproj +++ b/RxTests/RxTests.xcodeproj/project.pbxproj @@ -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 = ""; }; C69B64FF1BA88FAC00A7FA73 /* ObserverTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObserverTests.swift; sourceTree = ""; }; C801EB591B97951100C4D8C4 /* Observable+CreationTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Observable+CreationTest.swift"; sourceTree = ""; }; + C80DDEDB1BCE9A03006A1832 /* Driver+Test.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Driver+Test.swift"; sourceTree = ""; }; + C80DDEDF1BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainThreadPrimitiveHotObservable.swift; sourceTree = ""; }; 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 = ""; }; C811082B1AF50E2A001C13E4 /* NSNotificationCenterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSNotificationCenterTests.swift; sourceTree = ""; }; @@ -181,7 +189,6 @@ C811083B1AF50E2A001C13E4 /* TestScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestScheduler.swift; sourceTree = ""; }; C811083C1AF50E2A001C13E4 /* VirtualTimeSchedulerBase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VirtualTimeSchedulerBase.swift; sourceTree = ""; }; C811083D1AF50E2A001C13E4 /* Subscription.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Subscription.swift; sourceTree = ""; }; - C811083E1AF50E2A001C13E4 /* TestExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestExtensions.swift; sourceTree = ""; }; C81108401AF50E2A001C13E4 /* AssumptionsTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssumptionsTest.swift; sourceTree = ""; }; C81108411AF50E2A001C13E4 /* ConcurrencyTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConcurrencyTest.swift; sourceTree = ""; }; C81108421AF50E2A001C13E4 /* DisposableTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisposableTest.swift; sourceTree = ""; }; @@ -221,6 +228,7 @@ C8E381221B2063CC008CDC33 /* Observable+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Observable+Extensions.swift"; sourceTree = ""; }; C8E381271B207D03008CDC33 /* PrimitiveHotObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrimitiveHotObservable.swift; sourceTree = ""; }; C8E3812A1B2083C2008CDC33 /* PrimitiveMockObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrimitiveMockObserver.swift; sourceTree = ""; }; + C8EA2D361BD02E1900FB22AC /* EquatableArray.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EquatableArray.swift; sourceTree = ""; }; C8FDC5F71B2B5B7E0065F8D9 /* ElementIndexPair.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ElementIndexPair.swift; sourceTree = ""; }; 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 = ""; @@ -358,6 +366,7 @@ C81108371AF50E2A001C13E4 /* TestObserver.swift */, C8E381271B207D03008CDC33 /* PrimitiveHotObservable.swift */, C8E3812A1B2083C2008CDC33 /* PrimitiveMockObserver.swift */, + C80DDEDF1BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift */, ); path = Mocks; sourceTree = ""; @@ -399,6 +408,7 @@ C814CEA21AF5622600E98087 /* VariableTest.swift */, C69B64FF1BA88FAC00A7FA73 /* ObserverTests.swift */, C89CDB951BCDA1F1002063D9 /* Observable+SubscriptionTest.swift */, + C80DDEDB1BCE9A03006A1832 /* Driver+Test.swift */, ); path = Tests; sourceTree = ""; @@ -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 */, );