From a0bf386834ca09e0438e2edf03d740eac3c4a6ce Mon Sep 17 00:00:00 2001 From: Krunoslav Zaher Date: Sun, 17 Sep 2017 22:54:42 +0200 Subject: [PATCH] Release 4.0.0-beta.0 --- CHANGELOG.md | 22 +- RxBlocking.podspec | 4 +- RxBlocking/Info.plist | Bin 457 -> 815 bytes RxCocoa.podspec | 4 +- RxCocoa/Info.plist | Bin 457 -> 815 bytes .../RxCLLocationManagerDelegateProxy.swift | 14 +- .../RxImagePickerDelegateProxy.swift | 6 +- ...ctionViewSectionedAnimatedDataSource.swift | 4 +- ...lectionViewSectionedReloadDataSource.swift | 2 +- ...TableViewSectionedAnimatedDataSource.swift | 2 +- ...RxTableViewSectionedReloadDataSource.swift | 2 +- .../CLLocationManager+RxTests.swift | 1 + RxExample/RxExample-iOSTests/Info.plist | 4 + .../RxExample_iOSTests.swift | 2 +- .../UIImagePickerController+RxTests.swift | 1 + RxExample/RxExample.xcodeproj/project.pbxproj | 8 - .../xcschemes/RxExample-iOSTests.xcscheme | 2 + .../GeolocationViewController.swift | 4 +- .../UINavigationController+Extensions.swift | 4 +- .../GitHubSignup/BindingExtensions.swift | 4 +- ...ckerViewAdapterExampleViewController.swift | 4 +- RxExample/RxExample/Info-iOS.plist | 2 + .../UIImageView+DownloadableImage.swift | 6 +- RxExample/RxExample/iOS/AppDelegate.swift | 5 +- RxSwift.podspec | 2 +- RxSwift/Info.plist | 2 +- RxTest.podspec | 4 +- RxTest/Info.plist | Bin 457 -> 815 bytes Sources/AllTestz/PrimitiveSequenceTest.swift | 1 - Sources/AllTestz/main.swift | 83 - Tests/RxCocoaTests/NSButton+RxTests.swift | 36 - .../RxSwiftTests/PrimitiveSequenceTest.swift | 1538 ----------------- default.profraw | Bin 151096 -> 154920 bytes 33 files changed, 74 insertions(+), 1699 deletions(-) delete mode 120000 Sources/AllTestz/PrimitiveSequenceTest.swift delete mode 100644 Tests/RxSwiftTests/PrimitiveSequenceTest.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 805e8cfcb..757103580 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,27 @@ All notable changes to this project will be documented in this file. ## Master * Adds `materialize()` operator for RxBlocking's `BlockingObservable`. #1383 -* Adds `first` operator to ObservableType. +* Adds `first` operator to `ObservableType`. + +#### Anomalies + +* Call `controlTextDidChange(…)` as an optional method. #1406 +* Fixed issue with `NSControl.rx.value` regarding multiple observers. #1399 + +## [4.0.0-beta.0](https://github.com/ReactiveX/RxSwift/releases/tag/4.0.0-beta.0) + +* Adds `materialize()` operator for RxBlocking's `BlockingObservable`. #1383 +* Adds `first` operator to `ObservableType`. +* Deprecates `UIBindingObserver` in favor of `Binder`. #1411 +* Adds another specialization of `SharedSequence` called `Signal`. +* Refactors `DelegateProxy` to be type safe. +* Changes nested `SharedSequence` strategy to use inner sharing strategy for result. + +#### Anomalies + +* Call `controlTextDidChange(…)` as an optional method. #1406 +* Fixed issue with `NSControl.rx.value` regarding multiple observers. #1399 +* Removes useless extensions from `PrimitiveSequence`. #1248 ## [4.0.0-alpha.1](https://github.com/ReactiveX/RxSwift/releases/tag/4.0.0-alpha.1) diff --git a/RxBlocking.podspec b/RxBlocking.podspec index 31504c16f..40e28b207 100644 --- a/RxBlocking.podspec +++ b/RxBlocking.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "RxBlocking" - s.version = "4.0.0-alpha.1" + s.version = "4.0.0-beta.0" s.summary = "RxSwift Blocking operatos" s.description = <<-DESC Set of blocking operators for RxSwift. These operators are mostly intended for unit/integration tests @@ -25,5 +25,5 @@ Waiting for observable sequence to complete before exiting command line applicat s.source_files = 'RxBlocking/**/*.swift', 'Platform/**/*.swift' s.exclude_files = 'RxBlocking/Platform/**/*.swift' - s.dependency 'RxSwift', '~> 4.0.0-alpha.1' + s.dependency 'RxSwift', '~> 4.0.0-beta.0' end diff --git a/RxBlocking/Info.plist b/RxBlocking/Info.plist index a8342d759b0a61d332b4837026158e1ee1895d6d..07aca14b2b72239becf915e76ee90460045a7edc 100644 GIT binary patch literal 815 zcmaJLG00u(X5e0F>dHI6S;c$@2sY;HD>{M7Iw<=0n@x}%)2^!>>$0E>N z(0|E+*O*0I9o#5e+Nipz?eaLK2Hn%NC^MRKk0u~qL8ou1s(A(CRSGZHYpWF>X|&^H zmC|<4@D6`qJq)IrjhD`JhVT0@tQd&dn$fC@;d*l;)PtoKItJia26h6=w6NEYmahu~ zOo9zkHH*tM+Q3ips85YUvOm0h>-g7*OQJ1FXwZ}$1atQO*2m~?ii%%_`scvgavx!; zBWXoB>DTSEBqw}Vb*LwB`lx&28Q$rk=Rwp<@coJ*{{{AZYwmPXcYGH%Bw{5=^_0|g RTlo*Mf-bA4pz~s?gD>(O30?pI literal 457 zcmYk2%TB^T6ozNKB3>9k7aG~IfQ3y>j0-mk?O>`>nqJTaW-^qaOe}5F79$&d1s}wh z@F`4u1K+`gBU1Hj{>=ZM^PQ9FM?OzdS$>BLi%ZKZtGTuO`o`u~0ToN-ZG!fcR&x>z zd}fWpIPJ1H;bCBM?s73Ad2BzhIx|qN!N7wU&m>x_v52VE=mbMjO|y zV@WpI_i5D{zQKxPH=1H_mf5ZL^`-d3YE5xWQ;>+jUtodnV$;$(dffmyPyr{P16&Y+ mXYc}E!5jDhpD+*WP=aSrh3BvbDSQO8T7W+acIG-4`1A$RB7y4w diff --git a/RxCocoa.podspec b/RxCocoa.podspec index 8bfeed808..73526e1e6 100644 --- a/RxCocoa.podspec +++ b/RxCocoa.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "RxCocoa" - s.version = "4.0.0-alpha.1" + s.version = "4.0.0-beta.0" s.summary = "RxSwift Cocoa extensions" s.description = <<-DESC * UI extensions @@ -27,5 +27,5 @@ Pod::Spec.new do |s| s.watchos.source_files = 'RxCocoa/iOS/**/*.swift' s.tvos.source_files = 'RxCocoa/iOS/**/*.swift' - s.dependency 'RxSwift', '~> 4.0.0-alpha.1' + s.dependency 'RxSwift', '~> 4.0.0-beta.0' end diff --git a/RxCocoa/Info.plist b/RxCocoa/Info.plist index a8342d759b0a61d332b4837026158e1ee1895d6d..07aca14b2b72239becf915e76ee90460045a7edc 100644 GIT binary patch literal 815 zcmaJLG00u(X5e0F>dHI6S;c$@2sY;HD>{M7Iw<=0n@x}%)2^!>>$0E>N z(0|E+*O*0I9o#5e+Nipz?eaLK2Hn%NC^MRKk0u~qL8ou1s(A(CRSGZHYpWF>X|&^H zmC|<4@D6`qJq)IrjhD`JhVT0@tQd&dn$fC@;d*l;)PtoKItJia26h6=w6NEYmahu~ zOo9zkHH*tM+Q3ips85YUvOm0h>-g7*OQJ1FXwZ}$1atQO*2m~?ii%%_`scvgavx!; zBWXoB>DTSEBqw}Vb*LwB`lx&28Q$rk=Rwp<@coJ*{{{AZYwmPXcYGH%Bw{5=^_0|g RTlo*Mf-bA4pz~s?gD>(O30?pI literal 457 zcmYk2%TB^T6ozNKB3>9k7aG~IfQ3y>j0-mk?O>`>nqJTaW-^qaOe}5F79$&d1s}wh z@F`4u1K+`gBU1Hj{>=ZM^PQ9FM?OzdS$>BLi%ZKZtGTuO`o`u~0ToN-ZG!fcR&x>z zd}fWpIPJ1H;bCBM?s73Ad2BzhIx|qN!N7wU&m>x_v52VE=mbMjO|y zV@WpI_i5D{zQKxPH=1H_mf5ZL^`-d3YE5xWQ;>+jUtodnV$;$(dffmyPyr{P16&Y+ mXYc}E!5jDhpD+*WP=aSrh3BvbDSQO8T7W+acIG-4`1A$RB7y4w diff --git a/RxExample/Extensions/RxCLLocationManagerDelegateProxy.swift b/RxExample/Extensions/RxCLLocationManagerDelegateProxy.swift index c64315df6..89e42b568 100644 --- a/RxExample/Extensions/RxCLLocationManagerDelegateProxy.swift +++ b/RxExample/Extensions/RxCLLocationManagerDelegateProxy.swift @@ -12,19 +12,27 @@ import CoreLocation import RxCocoa #endif -class RxCLLocationManagerDelegateProxy +public class RxCLLocationManagerDelegateProxy : DelegateProxy , DelegateProxyType , CLLocationManagerDelegate { + public init(parentObject: CLLocationManager) { + super.init(parentObject: parentObject, delegateProxy: RxCLLocationManagerDelegateProxy.self) + } + + public static func registerKnownImplementations() { + self.register { RxCLLocationManagerDelegateProxy(parentObject: $0) } + } + internal lazy var didUpdateLocationsSubject = PublishSubject<[CLLocation]>() internal lazy var didFailWithErrorSubject = PublishSubject() - override class func currentDelegate(for object: ParentObject) -> CLLocationManagerDelegate? { + public class func currentDelegate(for object: ParentObject) -> CLLocationManagerDelegate? { return object.delegate } - override class func setCurrentDelegate(_ delegate: CLLocationManagerDelegate?, toObject object: ParentObject) { + public class func setCurrentDelegate(_ delegate: CLLocationManagerDelegate?, to object: ParentObject) { object.delegate = delegate } diff --git a/RxExample/Extensions/RxImagePickerDelegateProxy.swift b/RxExample/Extensions/RxImagePickerDelegateProxy.swift index e448747e1..1846907b0 100644 --- a/RxExample/Extensions/RxImagePickerDelegateProxy.swift +++ b/RxExample/Extensions/RxImagePickerDelegateProxy.swift @@ -16,7 +16,11 @@ open class RxImagePickerDelegateProxy : RxNavigationControllerDelegateProxy, UIImagePickerControllerDelegate { - + + public init(parentObject: UIImagePickerController) { + super.init(parentObject: parentObject) + } + } #endif diff --git a/RxExample/RxDataSources/DataSources+Rx/RxCollectionViewSectionedAnimatedDataSource.swift b/RxExample/RxDataSources/DataSources+Rx/RxCollectionViewSectionedAnimatedDataSource.swift index 33328afaf..88d3644df 100644 --- a/RxExample/RxDataSources/DataSources+Rx/RxCollectionViewSectionedAnimatedDataSource.swift +++ b/RxExample/RxDataSources/DataSources+Rx/RxCollectionViewSectionedAnimatedDataSource.swift @@ -54,7 +54,7 @@ open class RxCollectionViewSectionedAnimatedDataSource) { - UIBindingObserver(UIElement: self) { dataSource, newSections in + Binder(self) { dataSource, newSections in let oldSections = dataSource.sectionModels do { let differences = try differencesForSectionedView(oldSections, finalSections: newSections) @@ -77,7 +77,7 @@ open class RxCollectionViewSectionedAnimatedDataSource) { - UIBindingObserver(UIElement: self) { dataSource, newSections in + Binder(self) { dataSource, newSections in #if DEBUG self._dataSourceBound = true #endif diff --git a/RxExample/RxDataSources/DataSources+Rx/RxCollectionViewSectionedReloadDataSource.swift b/RxExample/RxDataSources/DataSources+Rx/RxCollectionViewSectionedReloadDataSource.swift index 1b422ad09..956369afa 100644 --- a/RxExample/RxDataSources/DataSources+Rx/RxCollectionViewSectionedReloadDataSource.swift +++ b/RxExample/RxDataSources/DataSources+Rx/RxCollectionViewSectionedReloadDataSource.swift @@ -24,7 +24,7 @@ open class RxCollectionViewSectionedReloadDataSource } open func collectionView(_ collectionView: UICollectionView, observedEvent: Event) { - UIBindingObserver(UIElement: self) { dataSource, element in + Binder(self) { dataSource, element in #if DEBUG self._dataSourceBound = true #endif diff --git a/RxExample/RxDataSources/DataSources+Rx/RxTableViewSectionedAnimatedDataSource.swift b/RxExample/RxDataSources/DataSources+Rx/RxTableViewSectionedAnimatedDataSource.swift index 96366c979..b893d3877 100644 --- a/RxExample/RxDataSources/DataSources+Rx/RxTableViewSectionedAnimatedDataSource.swift +++ b/RxExample/RxDataSources/DataSources+Rx/RxTableViewSectionedAnimatedDataSource.swift @@ -27,7 +27,7 @@ open class RxTableViewSectionedAnimatedDataSource } open func tableView(_ tableView: UITableView, observedEvent: Event) { - UIBindingObserver(UIElement: self) { dataSource, newSections in + Binder(self) { dataSource, newSections in #if DEBUG self._dataSourceBound = true #endif diff --git a/RxExample/RxDataSources/DataSources+Rx/RxTableViewSectionedReloadDataSource.swift b/RxExample/RxDataSources/DataSources+Rx/RxTableViewSectionedReloadDataSource.swift index e8bdb76bf..45af0a863 100644 --- a/RxExample/RxDataSources/DataSources+Rx/RxTableViewSectionedReloadDataSource.swift +++ b/RxExample/RxDataSources/DataSources+Rx/RxTableViewSectionedReloadDataSource.swift @@ -23,7 +23,7 @@ open class RxTableViewSectionedReloadDataSource } open func tableView(_ tableView: UITableView, observedEvent: Event) { - UIBindingObserver(UIElement: self) { dataSource, element in + Binder(self) { dataSource, element in #if DEBUG self._dataSourceBound = true #endif diff --git a/RxExample/RxExample-iOSTests/CLLocationManager+RxTests.swift b/RxExample/RxExample-iOSTests/CLLocationManager+RxTests.swift index bec261b85..33d09c0bd 100644 --- a/RxExample/RxExample-iOSTests/CLLocationManager+RxTests.swift +++ b/RxExample/RxExample-iOSTests/CLLocationManager+RxTests.swift @@ -10,6 +10,7 @@ import RxSwift import RxCocoa import XCTest import CoreLocation +import RxExample_iOS class CLLocationManagerTests : RxTest { diff --git a/RxExample/RxExample-iOSTests/Info.plist b/RxExample/RxExample-iOSTests/Info.plist index ba72822e8..e4b5a84ca 100644 --- a/RxExample/RxExample-iOSTests/Info.plist +++ b/RxExample/RxExample-iOSTests/Info.plist @@ -2,6 +2,10 @@ + NSLocationAlwaysAndWhenInUseUsageDescription + We use it + NSLocationWhenInUseUsageDescription + We use it CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/RxExample/RxExample-iOSTests/RxExample_iOSTests.swift b/RxExample/RxExample-iOSTests/RxExample_iOSTests.swift index d3e3351fc..bd8890469 100644 --- a/RxExample/RxExample-iOSTests/RxExample_iOSTests.swift +++ b/RxExample/RxExample-iOSTests/RxExample_iOSTests.swift @@ -140,7 +140,7 @@ class RxExample_iOSTests This method enables using mock schedulers for while testing drivers. */ - driveOnScheduler(scheduler) { + SharingScheduler.mock(scheduler: scheduler) { let viewModel = GithubSignupViewModel2( input: ( diff --git a/RxExample/RxExample-iOSTests/UIImagePickerController+RxTests.swift b/RxExample/RxExample-iOSTests/UIImagePickerController+RxTests.swift index 3a393c138..d5dad3da7 100644 --- a/RxExample/RxExample-iOSTests/UIImagePickerController+RxTests.swift +++ b/RxExample/RxExample-iOSTests/UIImagePickerController+RxTests.swift @@ -14,6 +14,7 @@ import RxSwift import RxCocoa import XCTest import UIKit +import RxExample_iOS class UIImagePickerControllerTests: RxTest { diff --git a/RxExample/RxExample.xcodeproj/project.pbxproj b/RxExample/RxExample.xcodeproj/project.pbxproj index 8ac25ec21..6e7476fbe 100644 --- a/RxExample/RxExample.xcodeproj/project.pbxproj +++ b/RxExample/RxExample.xcodeproj/project.pbxproj @@ -122,9 +122,6 @@ C886A6911D85AD7E00653EE4 /* CLLocationManager+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C886A6901D85AD7E00653EE4 /* CLLocationManager+RxTests.swift */; }; C886A6931D85ADA100653EE4 /* UIImagePickerController+RxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C886A6921D85ADA100653EE4 /* UIImagePickerController+RxTests.swift */; }; C886A6951D85AEA300653EE4 /* RxTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C886A6941D85AEA300653EE4 /* RxTest.swift */; }; - C886A6991D85B0E400653EE4 /* CLLocationManager+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C886A68C1D85AD2000653EE4 /* CLLocationManager+Rx.swift */; }; - C886A69A1D85B0E400653EE4 /* RxCLLocationManagerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C886A68D1D85AD2000653EE4 /* RxCLLocationManagerDelegateProxy.swift */; }; - C886A69B1D85B0E500653EE4 /* UIImagePickerController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C886A68A1D85AC9400653EE4 /* UIImagePickerController+Rx.swift */; }; C88BB8BB1B07E6C90064D411 /* SearchResultViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C86E2F321AE5A0CA00C31024 /* SearchResultViewModel.swift */; }; C88BB8BC1B07E6C90064D411 /* HtmlParsing.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83367111AD029AE00C668A7 /* HtmlParsing.swift */; }; C88BB8BE1B07E6C90064D411 /* ImageService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C83367121AD029AE00C668A7 /* ImageService.swift */; }; @@ -136,7 +133,6 @@ C88BB8CC1B07E6C90064D411 /* WikipediaPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C86E2F3C1AE5A0CA00C31024 /* WikipediaPage.swift */; }; C88C2B2A1D67EC5200B01A98 /* FlowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88C2B291D67EC5200B01A98 /* FlowTests.swift */; }; C88CB7261D8F253D0021D83F /* RxImagePickerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88CB7251D8F253D0021D83F /* RxImagePickerDelegateProxy.swift */; }; - C88CB73B1D8F25440021D83F /* RxImagePickerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88CB7251D8F253D0021D83F /* RxImagePickerDelegateProxy.swift */; }; C890A65D1AEC084100AFF7E6 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C890A65C1AEC084100AFF7E6 /* ViewController.swift */; }; C89634081B95BE50002AE38C /* RxBlocking.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C8A468EF1B8A8BD000BF917B /* RxBlocking.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; C89634091B95BE50002AE38C /* RxCocoa.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C8A468ED1B8A8BCC00BF917B /* RxCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -1558,13 +1554,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C886A6991D85B0E400653EE4 /* CLLocationManager+Rx.swift in Sources */, C89C2BD61C321DA200EBC99C /* TestScheduler+MarbleTests.swift in Sources */, C886A6951D85AEA300653EE4 /* RxTest.swift in Sources */, C849EF901C319E9A0048AC4A /* GithubSignupViewModel1.swift in Sources */, C849EF641C3190360048AC4A /* RxExample_iOSTests.swift in Sources */, - C886A69B1D85B0E500653EE4 /* UIImagePickerController+Rx.swift in Sources */, - C88CB73B1D8F25440021D83F /* RxImagePickerDelegateProxy.swift in Sources */, C886A6911D85AD7E00653EE4 /* CLLocationManager+RxTests.swift in Sources */, C849EF921C319E9A0048AC4A /* DefaultImplementations.swift in Sources */, C849EF991C31A63C0048AC4A /* Wireframe.swift in Sources */, @@ -1573,7 +1566,6 @@ C849EF9A1C31A7680048AC4A /* ActivityIndicator.swift in Sources */, C849EF951C319E9D0048AC4A /* GithubSignupViewModel2.swift in Sources */, C886A6931D85ADA100653EE4 /* UIImagePickerController+RxTests.swift in Sources */, - C886A69A1D85B0E400653EE4 /* RxCLLocationManagerDelegateProxy.swift in Sources */, C89C2BDD1C32231A00EBC99C /* MockWireframe.swift in Sources */, C89C2BDF1C32231A00EBC99C /* ValidationResult+Equatable.swift in Sources */, C849EF911C319E9A0048AC4A /* Protocols.swift in Sources */, diff --git a/RxExample/RxExample.xcodeproj/xcshareddata/xcschemes/RxExample-iOSTests.xcscheme b/RxExample/RxExample.xcodeproj/xcshareddata/xcschemes/RxExample-iOSTests.xcscheme index 2235c4bd9..41f6f34f9 100644 --- a/RxExample/RxExample.xcodeproj/xcshareddata/xcschemes/RxExample-iOSTests.xcscheme +++ b/RxExample/RxExample.xcodeproj/xcshareddata/xcschemes/RxExample-iOSTests.xcscheme @@ -10,6 +10,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" shouldUseLaunchSchemeArgsEnv = "YES"> { - return UIBindingObserver(UIElement: base) { label, location in + var coordinates: Binder { + return Binder(base) { label, location in label.text = "Lat: \(location.latitude)\nLon: \(location.longitude)" } } diff --git a/RxExample/RxExample/Examples/GitHubSearchRepositories/UINavigationController+Extensions.swift b/RxExample/RxExample/Examples/GitHubSearchRepositories/UINavigationController+Extensions.swift index 4abc4e197..aefdf3915 100644 --- a/RxExample/RxExample/Examples/GitHubSearchRepositories/UINavigationController+Extensions.swift +++ b/RxExample/RxExample/Examples/GitHubSearchRepositories/UINavigationController+Extensions.swift @@ -16,8 +16,8 @@ struct Colors { } extension Reactive where Base: UINavigationController { - var isOffline: UIBindingObserver { - return UIBindingObserver(UIElement: base) { navigationController, isOffline in + var isOffline: Binder { + return Binder(base) { navigationController, isOffline in navigationController.navigationBar.barTintColor = isOffline ? Colors.offlineColor : Colors.onlineColor diff --git a/RxExample/RxExample/Examples/GitHubSignup/BindingExtensions.swift b/RxExample/RxExample/Examples/GitHubSignup/BindingExtensions.swift index 0cfefe534..03568c58a 100644 --- a/RxExample/RxExample/Examples/GitHubSignup/BindingExtensions.swift +++ b/RxExample/RxExample/Examples/GitHubSignup/BindingExtensions.swift @@ -48,8 +48,8 @@ extension ValidationResult { } extension Reactive where Base: UILabel { - var validationResult: UIBindingObserver { - return UIBindingObserver(UIElement: base) { label, result in + var validationResult: Binder { + return Binder(base) { label, result in label.textColor = result.textColor label.text = result.description } diff --git a/RxExample/RxExample/Examples/UIPickerViewExample/CustomPickerViewAdapterExampleViewController.swift b/RxExample/RxExample/Examples/UIPickerViewExample/CustomPickerViewAdapterExampleViewController.swift index ffae0c442..5a39ce063 100644 --- a/RxExample/RxExample/Examples/UIPickerViewExample/CustomPickerViewAdapterExampleViewController.swift +++ b/RxExample/RxExample/Examples/UIPickerViewExample/CustomPickerViewAdapterExampleViewController.swift @@ -61,10 +61,10 @@ final class PickerViewViewAdapter } func pickerView(_ pickerView: UIPickerView, observedEvent: Event) { - UIBindingObserver(UIElement: self) { (adapter, items) in + Binder(self) { (adapter, items) in adapter.items = items pickerView.reloadAllComponents() - }.on(observedEvent) + }.on(observedEvent) } } diff --git a/RxExample/RxExample/Info-iOS.plist b/RxExample/RxExample/Info-iOS.plist index 0e6f54c99..061288de6 100644 --- a/RxExample/RxExample/Info-iOS.plist +++ b/RxExample/RxExample/Info-iOS.plist @@ -2,6 +2,8 @@ + NSLocationWhenInUseUsageDescription + We need location CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/RxExample/RxExample/Services/UIImageView+DownloadableImage.swift b/RxExample/RxExample/Services/UIImageView+DownloadableImage.swift index c8daa0387..9f9abb123 100644 --- a/RxExample/RxExample/Services/UIImageView+DownloadableImage.swift +++ b/RxExample/RxExample/Services/UIImageView+DownloadableImage.swift @@ -15,12 +15,12 @@ import UIKit extension Reactive where Base: UIImageView { - var downloadableImage: UIBindingObserver{ + var downloadableImage: Binder{ return downloadableImageAnimated(nil) } - func downloadableImageAnimated(_ transitionType:String?) -> UIBindingObserver { - return UIBindingObserver(UIElement: base) { imageView, image in + func downloadableImageAnimated(_ transitionType:String?) -> Binder { + return Binder(base) { imageView, image in for subview in imageView.subviews { subview.removeFromSuperview() } diff --git a/RxExample/RxExample/iOS/AppDelegate.swift b/RxExample/RxExample/iOS/AppDelegate.swift index f2c5c2651..068a0c7a4 100644 --- a/RxExample/RxExample/iOS/AppDelegate.swift +++ b/RxExample/RxExample/iOS/AppDelegate.swift @@ -18,9 +18,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { if UIApplication.isInUITest { UIView.setAnimationsEnabled(false) } - - // Install delegate proxy - RxImagePickerDelegateProxy.register(for: UIImagePickerController.self) + + RxImagePickerDelegateProxy.register { RxImagePickerDelegateProxy(parentObject: $0) } #if DEBUG _ = Observable.interval(1, scheduler: MainScheduler.instance) diff --git a/RxSwift.podspec b/RxSwift.podspec index 34c133dec..e15575631 100644 --- a/RxSwift.podspec +++ b/RxSwift.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "RxSwift" - s.version = "4.0.0-alpha.1" + s.version = "4.0.0-beta.0" s.summary = "RxSwift is a Swift implementation of Reactive Extensions" s.description = <<-DESC This is a Swift port of [ReactiveX.io](https://github.com/ReactiveX) diff --git a/RxSwift/Info.plist b/RxSwift/Info.plist index 8b2195f93..07aca14b2 100644 --- a/RxSwift/Info.plist +++ b/RxSwift/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 4.0.0-alpha.1 + 4.0.0-beta.0 CFBundleSignature ???? CFBundleVersion diff --git a/RxTest.podspec b/RxTest.podspec index 2bd0958ed..15a7ed3e2 100644 --- a/RxTest.podspec +++ b/RxTest.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "RxTest" - s.version = "4.0.0-alpha.1" + s.version = "4.0.0-beta.0" s.summary = "RxSwift Testing extensions" s.description = <<-DESC Unit testing extensions for RxSwift. This library contains mock schedulers, observables, and observers @@ -56,7 +56,7 @@ func testMap() { s.framework = 'XCTest' - s.dependency 'RxSwift', '~> 4.0.0-alpha.1' + s.dependency 'RxSwift', '~> 4.0.0-beta.0' s.pod_target_xcconfig = { 'ENABLE_BITCODE' => 'NO' } end diff --git a/RxTest/Info.plist b/RxTest/Info.plist index a8342d759b0a61d332b4837026158e1ee1895d6d..07aca14b2b72239becf915e76ee90460045a7edc 100644 GIT binary patch literal 815 zcmaJLG00u(X5e0F>dHI6S;c$@2sY;HD>{M7Iw<=0n@x}%)2^!>>$0E>N z(0|E+*O*0I9o#5e+Nipz?eaLK2Hn%NC^MRKk0u~qL8ou1s(A(CRSGZHYpWF>X|&^H zmC|<4@D6`qJq)IrjhD`JhVT0@tQd&dn$fC@;d*l;)PtoKItJia26h6=w6NEYmahu~ zOo9zkHH*tM+Q3ips85YUvOm0h>-g7*OQJ1FXwZ}$1atQO*2m~?ii%%_`scvgavx!; zBWXoB>DTSEBqw}Vb*LwB`lx&28Q$rk=Rwp<@coJ*{{{AZYwmPXcYGH%Bw{5=^_0|g RTlo*Mf-bA4pz~s?gD>(O30?pI literal 457 zcmYk2%TB^T6ozNKB3>9k7aG~IfQ3y>j0-mk?O>`>nqJTaW-^qaOe}5F79$&d1s}wh z@F`4u1K+`gBU1Hj{>=ZM^PQ9FM?OzdS$>BLi%ZKZtGTuO`o`u~0ToN-ZG!fcR&x>z zd}fWpIPJ1H;bCBM?s73Ad2BzhIx|qN!N7wU&m>x_v52VE=mbMjO|y zV@WpI_i5D{zQKxPH=1H_mf5ZL^`-d3YE5xWQ;>+jUtodnV$;$(dffmyPyr{P16&Y+ mXYc}E!5jDhpD+*WP=aSrh3BvbDSQO8T7W+acIG-4`1A$RB7y4w diff --git a/Sources/AllTestz/PrimitiveSequenceTest.swift b/Sources/AllTestz/PrimitiveSequenceTest.swift deleted file mode 120000 index ad2f1901c..000000000 --- a/Sources/AllTestz/PrimitiveSequenceTest.swift +++ /dev/null @@ -1 +0,0 @@ -../../Tests/RxSwiftTests/PrimitiveSequenceTest.swift \ No newline at end of file diff --git a/Sources/AllTestz/main.swift b/Sources/AllTestz/main.swift index 7c79c4eff..0367a0d03 100644 --- a/Sources/AllTestz/main.swift +++ b/Sources/AllTestz/main.swift @@ -81,88 +81,6 @@ final class ObservableTakeLastTest_ : ObservableTakeLastTest, RxTestCase { ] } } -final class PrimitiveSequenceTest_ : PrimitiveSequenceTest, RxTestCase { - #if os(macOS) - required override init() { - super.init() - } - #endif - - static var allTests: [(String, (PrimitiveSequenceTest_) -> () -> ())] { return [ - ("testSingle_Subscription_success", PrimitiveSequenceTest.testSingle_Subscription_success), - ("testSingle_Subscription_error", PrimitiveSequenceTest.testSingle_Subscription_error), - ("testSingle_create_success", PrimitiveSequenceTest.testSingle_create_success), - ("testSingle_create_error", PrimitiveSequenceTest.testSingle_create_error), - ("testSingle_create_disposing", PrimitiveSequenceTest.testSingle_create_disposing), - ("testMaybe_Subscription_success", PrimitiveSequenceTest.testMaybe_Subscription_success), - ("testMaybe_Subscription_completed", PrimitiveSequenceTest.testMaybe_Subscription_completed), - ("testMaybe_Subscription_error", PrimitiveSequenceTest.testMaybe_Subscription_error), - ("testMaybe_create_success", PrimitiveSequenceTest.testMaybe_create_success), - ("testMaybe_create_completed", PrimitiveSequenceTest.testMaybe_create_completed), - ("testMaybe_create_error", PrimitiveSequenceTest.testMaybe_create_error), - ("testMaybe_create_disposing", PrimitiveSequenceTest.testMaybe_create_disposing), - ("testCompletable_Subscription_completed", PrimitiveSequenceTest.testCompletable_Subscription_completed), - ("testCompletable_Subscription_error", PrimitiveSequenceTest.testCompletable_Subscription_error), - ("testCompletable_create_completed", PrimitiveSequenceTest.testCompletable_create_completed), - ("testCompletable_create_error", PrimitiveSequenceTest.testCompletable_create_error), - ("testCompletable_create_disposing", PrimitiveSequenceTest.testCompletable_create_disposing), - ("testSingle_deferred_producesSingleElement", PrimitiveSequenceTest.testSingle_deferred_producesSingleElement), - ("testSingle_just_producesSingleElement", PrimitiveSequenceTest.testSingle_just_producesSingleElement), - ("testSingle_just2_producesSingleElement", PrimitiveSequenceTest.testSingle_just2_producesSingleElement), - ("testSingle_error_fails", PrimitiveSequenceTest.testSingle_error_fails), - ("testSingle_never_producesSingleElement", PrimitiveSequenceTest.testSingle_never_producesSingleElement), - ("testSingle_delaySubscription_producesSingleElement", PrimitiveSequenceTest.testSingle_delaySubscription_producesSingleElement), - ("testSingle_delay_producesSingleElement", PrimitiveSequenceTest.testSingle_delay_producesSingleElement), - ("testSingle_do_producesSingleElement", PrimitiveSequenceTest.testSingle_do_producesSingleElement), - ("testSingle_filter_resultIsMaybe", PrimitiveSequenceTest.testSingle_filter_resultIsMaybe), - ("testSingle_map_producesSingleElement", PrimitiveSequenceTest.testSingle_map_producesSingleElement), - ("testSingle_flatMap_producesSingleElement", PrimitiveSequenceTest.testSingle_flatMap_producesSingleElement), - ("testSingle_observeOn_producesSingleElement", PrimitiveSequenceTest.testSingle_observeOn_producesSingleElement), - ("testSingle_subscribeOn_producesSingleElement", PrimitiveSequenceTest.testSingle_subscribeOn_producesSingleElement), - ("testSingle_catchError_producesSingleElement", PrimitiveSequenceTest.testSingle_catchError_producesSingleElement), - ("testSingle_retry_producesSingleElement", PrimitiveSequenceTest.testSingle_retry_producesSingleElement), - ("testSingle_retryWhen1_producesSingleElement", PrimitiveSequenceTest.testSingle_retryWhen1_producesSingleElement), - ("testSingle_retryWhen2_producesSingleElement", PrimitiveSequenceTest.testSingle_retryWhen2_producesSingleElement), - ("testSingle_timer_producesSingleElement", PrimitiveSequenceTest.testSingle_timer_producesSingleElement), - ("testSingle_using_producesSingleElement", PrimitiveSequenceTest.testSingle_using_producesSingleElement), - ("testSingle_timeout", PrimitiveSequenceTest.testSingle_timeout), - ("testSingle_timeout_other", PrimitiveSequenceTest.testSingle_timeout_other), - ("testMaybe_timeout", PrimitiveSequenceTest.testMaybe_timeout), - ("testMaybe_timeout_other", PrimitiveSequenceTest.testMaybe_timeout_other), - ("testCompletable_timeout", PrimitiveSequenceTest.testCompletable_timeout), - ("testCompletable_timeout_other", PrimitiveSequenceTest.testCompletable_timeout_other), - ("testCompletable_timeout_succeeds", PrimitiveSequenceTest.testCompletable_timeout_succeeds), - ("testCompletable_timeout_other_succeeds", PrimitiveSequenceTest.testCompletable_timeout_other_succeeds), - ("testAsSingle_Empty", PrimitiveSequenceTest.testAsSingle_Empty), - ("testAsSingle_One", PrimitiveSequenceTest.testAsSingle_One), - ("testAsSingle_Many", PrimitiveSequenceTest.testAsSingle_Many), - ("testAsSingle_Error", PrimitiveSequenceTest.testAsSingle_Error), - ("testAsSingle_Error2", PrimitiveSequenceTest.testAsSingle_Error2), - ("testAsSingle_subscribeOnSuccess", PrimitiveSequenceTest.testAsSingle_subscribeOnSuccess), - ("testAsSingle_subscribeOnError", PrimitiveSequenceTest.testAsSingle_subscribeOnError), - ("testFirst_Empty", PrimitiveSequenceTest.testFirst_Empty), - ("testFirst_One", PrimitiveSequenceTest.testFirst_One), - ("testFirst_Many", PrimitiveSequenceTest.testFirst_Many), - ("testFirst_ManyWithoutCompletion", PrimitiveSequenceTest.testFirst_ManyWithoutCompletion), - ("testFirst_Error", PrimitiveSequenceTest.testFirst_Error), - ("testAsMaybe_Empty", PrimitiveSequenceTest.testAsMaybe_Empty), - ("testAsMaybe_One", PrimitiveSequenceTest.testAsMaybe_One), - ("testAsMaybe_Many", PrimitiveSequenceTest.testAsMaybe_Many), - ("testAsMaybe_Error", PrimitiveSequenceTest.testAsMaybe_Error), - ("testAsMaybe_Error2", PrimitiveSequenceTest.testAsMaybe_Error2), - ("testAsMaybe_subscribeOnSuccess", PrimitiveSequenceTest.testAsMaybe_subscribeOnSuccess), - ("testAsMaybe_subscribeOnError", PrimitiveSequenceTest.testAsMaybe_subscribeOnError), - ("testAsMaybe_subscribeOnCompleted", PrimitiveSequenceTest.testAsMaybe_subscribeOnCompleted), - ("testAsCompletable_Empty", PrimitiveSequenceTest.testAsCompletable_Empty), - ("testAsCompletable_Error", PrimitiveSequenceTest.testAsCompletable_Error), - ("testAsCompletable_subscribeOnCompleted", PrimitiveSequenceTest.testAsCompletable_subscribeOnCompleted), - ("testAsCompletable_subscribeOnError", PrimitiveSequenceTest.testAsCompletable_subscribeOnError), - ("testCompletable_merge", PrimitiveSequenceTest.testCompletable_merge), - ("testCompletable_concat", PrimitiveSequenceTest.testCompletable_concat), - ("testDebug_producesSingleElement", PrimitiveSequenceTest.testDebug_producesSingleElement), - ] } -} - final class VirtualSchedulerTest_ : VirtualSchedulerTest, RxTestCase { #if os(macOS) required override init() { @@ -2050,7 +1968,6 @@ func XCTMain(_ tests: [() -> ()]) { testCase(ObservableOptionalTest_.allTests), testCase(AnomaliesTest_.allTests), testCase(ObservableTakeLastTest_.allTests), - testCase(PrimitiveSequenceTest_.allTests), testCase(VirtualSchedulerTest_.allTests), testCase(ObservableBlockingTest_.allTests), testCase(ObservableRetryWhenTest_.allTests), diff --git a/Tests/RxCocoaTests/NSButton+RxTests.swift b/Tests/RxCocoaTests/NSButton+RxTests.swift index 28989a3f1..56c916d38 100644 --- a/Tests/RxCocoaTests/NSButton+RxTests.swift +++ b/Tests/RxCocoaTests/NSButton+RxTests.swift @@ -75,40 +75,4 @@ extension NSButtonTests { XCTAssertEqual(value1, NSControl.StateValue.on) XCTAssertEqual(value2, NSControl.StateValue.on) } - - func testButton_multipleObservers() { - let button = NSButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) - var value1: Int? = nil - var value2: Int? = nil - - var numberOfTimesReceivedValue = 0 - - _ = Observable.just(NSOffState).bind(to: button.rx.state) - let d1 = button.rx.state.subscribe(onNext: { numberOfTimesReceivedValue += 1; value1 = $0 }) - let d2 = button.rx.state.subscribe(onNext: { numberOfTimesReceivedValue += 1; value2 = $0 }) - _ = Observable.just(NSOnState).bind(to: button.rx.state) - - if let target = button.target, let action = button.action { - _ = target.perform(action, with: button) - } - - - XCTAssertEqual(button.state, NSOnState) - XCTAssertEqual(value1, NSOnState) - XCTAssertEqual(value2, NSOnState) - - XCTAssertEqual(numberOfTimesReceivedValue, 4) - - d1.dispose() - d2.dispose() - - _ = button.rx.state.subscribe(onNext: { numberOfTimesReceivedValue += 1; value1 = $0 }) - _ = button.rx.state.subscribe(onNext: { numberOfTimesReceivedValue += 1; value2 = $0 }) - - XCTAssertEqual(numberOfTimesReceivedValue, 6) - - XCTAssertEqual(button.state, NSOnState) - XCTAssertEqual(value1, NSOnState) - XCTAssertEqual(value2, NSOnState) - } } diff --git a/Tests/RxSwiftTests/PrimitiveSequenceTest.swift b/Tests/RxSwiftTests/PrimitiveSequenceTest.swift deleted file mode 100644 index 5bc9a154e..000000000 --- a/Tests/RxSwiftTests/PrimitiveSequenceTest.swift +++ /dev/null @@ -1,1538 +0,0 @@ -// -// PrimitiveSequenceTest.swift -// Tests -// -// Created by Krunoslav Zaher on 3/11/17. -// Copyright © 2017 Krunoslav Zaher. All rights reserved. -// - -import XCTest -import RxSwift -import RxTest - -class PrimitiveSequenceTest : RxTest { - -} - -// single -extension PrimitiveSequenceTest { - func testSingle_Subscription_success() { - let xs = Single.just(1) - - var events: [SingleEvent] = [] - - _ = xs.subscribe { event in - events.append(event) - } - - XCTAssertEqual(events, [.success(1)]) - } - - func testSingle_Subscription_error() { - let xs = Single.error(testError) - - var events: [SingleEvent] = [] - - _ = xs.subscribe { event in - events.append(event) - } - - XCTAssertEqual(events, [.error(testError)]) - } - - func testSingle_create_success() { - let scheduler = TestScheduler(initialClock: 0) - - var observer: ((SingleEvent) -> ())! = nil - - var disposedTime: Int? = nil - - scheduler.scheduleAt(201, action: { - observer(.success(1)) - }) - scheduler.scheduleAt(202, action: { - observer(.success(1)) - }) - scheduler.scheduleAt(203, action: { - observer(.error(testError)) - }) - - let res = scheduler.start { - Single.create { _observer in - observer = _observer - return Disposables.create { - disposedTime = scheduler.clock - } - }.asObservable() - } - - XCTAssertEqual(res.events, [ - next(201, 1), - completed(201) - ]) - - XCTAssertEqual(disposedTime, 201) - } - - func testSingle_create_error() { - let scheduler = TestScheduler(initialClock: 0) - - var observer: ((SingleEvent) -> ())! = nil - - var disposedTime: Int? = nil - - scheduler.scheduleAt(201, action: { - observer(.error(testError)) - }) - scheduler.scheduleAt(202, action: { - observer(.success(1)) - }) - scheduler.scheduleAt(203, action: { - observer(.error(testError)) - }) - - let res = scheduler.start { - Single.create { _observer in - observer = _observer - return Disposables.create { - disposedTime = scheduler.clock - } - }.asObservable() - } - - XCTAssertEqual(res.events, [ - error(201, testError) - ]) - - XCTAssertEqual(disposedTime, 201) - } - - func testSingle_create_disposing() { - let scheduler = TestScheduler(initialClock: 0) - - var observer: ((SingleEvent) -> ())! = nil - var disposedTime: Int? = nil - var subscription: Disposable! = nil - let res = scheduler.createObserver(Int.self) - - scheduler.scheduleAt(201, action: { - subscription = Single.create { _observer in - observer = _observer - return Disposables.create { - disposedTime = scheduler.clock - } - } - .asObservable() - .subscribe(res) - }) - scheduler.scheduleAt(202, action: { - subscription.dispose() - }) - scheduler.scheduleAt(203, action: { - observer(.success(1)) - }) - scheduler.scheduleAt(204, action: { - observer(.error(testError)) - }) - - scheduler.start() - - XCTAssertEqual(res.events, [ - ]) - - XCTAssertEqual(disposedTime, 202) - } -} - -// maybe -extension PrimitiveSequenceTest { - func testMaybe_Subscription_success() { - let xs = Maybe.just(1) - - var events: [MaybeEvent] = [] - - _ = xs.subscribe { event in - events.append(event) - } - - XCTAssertEqual(events, [.success(1)]) - } - - func testMaybe_Subscription_completed() { - let xs = Maybe.empty() - - var events: [MaybeEvent] = [] - - _ = xs.subscribe { event in - events.append(event) - } - - XCTAssertEqual(events, [.completed]) - } - - func testMaybe_Subscription_error() { - let xs = Maybe.error(testError) - - var events: [MaybeEvent] = [] - - _ = xs.subscribe { event in - events.append(event) - } - - XCTAssertEqual(events, [.error(testError)]) - } - - func testMaybe_create_success() { - let scheduler = TestScheduler(initialClock: 0) - - var observer: ((MaybeEvent) -> ())! = nil - - var disposedTime: Int? = nil - - scheduler.scheduleAt(201, action: { - observer(.success(1)) - }) - scheduler.scheduleAt(202, action: { - observer(.success(1)) - }) - scheduler.scheduleAt(203, action: { - observer(.error(testError)) - }) - scheduler.scheduleAt(204, action: { - observer(.completed) - }) - - let res = scheduler.start { - Maybe.create { _observer in - observer = _observer - return Disposables.create { - disposedTime = scheduler.clock - } - }.asObservable() - } - - XCTAssertEqual(res.events, [ - next(201, 1), - completed(201) - ]) - - XCTAssertEqual(disposedTime, 201) - } - - func testMaybe_create_completed() { - let scheduler = TestScheduler(initialClock: 0) - - var observer: ((MaybeEvent) -> ())! = nil - - var disposedTime: Int? = nil - - scheduler.scheduleAt(201, action: { - observer(.completed) - }) - scheduler.scheduleAt(202, action: { - observer(.success(1)) - }) - scheduler.scheduleAt(203, action: { - observer(.error(testError)) - }) - scheduler.scheduleAt(204, action: { - observer(.completed) - }) - - let res = scheduler.start { - Maybe.create { _observer in - observer = _observer - return Disposables.create { - disposedTime = scheduler.clock - } - }.asObservable() - } - - XCTAssertEqual(res.events, [ - completed(201) - ]) - - XCTAssertEqual(disposedTime, 201) - } - - func testMaybe_create_error() { - let scheduler = TestScheduler(initialClock: 0) - - var observer: ((MaybeEvent) -> ())! = nil - - var disposedTime: Int? = nil - - scheduler.scheduleAt(201, action: { - observer(.error(testError)) - }) - scheduler.scheduleAt(202, action: { - observer(.success(1)) - }) - scheduler.scheduleAt(203, action: { - observer(.error(testError)) - }) - - let res = scheduler.start { - Maybe.create { _observer in - observer = _observer - return Disposables.create { - disposedTime = scheduler.clock - } - }.asObservable() - } - - XCTAssertEqual(res.events, [ - error(201, testError) - ]) - - XCTAssertEqual(disposedTime, 201) - } - - func testMaybe_create_disposing() { - let scheduler = TestScheduler(initialClock: 0) - - var observer: ((MaybeEvent) -> ())! = nil - var disposedTime: Int? = nil - var subscription: Disposable! = nil - let res = scheduler.createObserver(Int.self) - - scheduler.scheduleAt(201, action: { - subscription = Maybe.create { _observer in - observer = _observer - return Disposables.create { - disposedTime = scheduler.clock - } - } - .asObservable() - .subscribe(res) - }) - scheduler.scheduleAt(202, action: { - subscription.dispose() - }) - scheduler.scheduleAt(203, action: { - observer(.success(1)) - }) - scheduler.scheduleAt(204, action: { - observer(.error(testError)) - }) - - scheduler.start() - - XCTAssertEqual(res.events, [ - ]) - - XCTAssertEqual(disposedTime, 202) - } -} - -// completable -extension PrimitiveSequenceTest { - func testCompletable_Subscription_completed() { - let xs = Completable.empty() - - var events: [CompletableEvent] = [] - - _ = xs.subscribe { event in - events.append(event) - } - - XCTAssertEqual(events, [.completed]) - } - - func testCompletable_Subscription_error() { - let xs = Completable.error(testError) - - var events: [CompletableEvent] = [] - - _ = xs.subscribe { event in - events.append(event) - } - - XCTAssertEqual(events, [.error(testError)]) - } - - func testCompletable_create_completed() { - let scheduler = TestScheduler(initialClock: 0) - - var observer: ((CompletableEvent) -> ())! = nil - - var disposedTime: Int? = nil - - scheduler.scheduleAt(201, action: { - observer(.completed) - }) - scheduler.scheduleAt(203, action: { - observer(.error(testError)) - }) - scheduler.scheduleAt(204, action: { - observer(.completed) - }) - - let res = scheduler.start { - Completable.create { _observer in - observer = _observer - return Disposables.create { - disposedTime = scheduler.clock - } - }.asObservable() - } - - XCTAssertEqual(res.events, [ - completed(201, Never.self) - ]) - - XCTAssertEqual(disposedTime, 201) - } - - func testCompletable_create_error() { - let scheduler = TestScheduler(initialClock: 0) - - var observer: ((CompletableEvent) -> ())! = nil - - var disposedTime: Int? = nil - - scheduler.scheduleAt(201, action: { - observer(.error(testError)) - }) - scheduler.scheduleAt(202, action: { - observer(.completed) - }) - scheduler.scheduleAt(203, action: { - observer(.error(testError)) - }) - - let res = scheduler.start { - Completable.create { _observer in - observer = _observer - return Disposables.create { - disposedTime = scheduler.clock - } - }.asObservable() - } - - XCTAssertEqual(res.events, [ - error(201, testError) - ]) - - XCTAssertEqual(disposedTime, 201) - } - - func testCompletable_create_disposing() { - let scheduler = TestScheduler(initialClock: 0) - - var observer: ((CompletableEvent) -> ())! = nil - var disposedTime: Int? = nil - var subscription: Disposable! = nil - let res = scheduler.createObserver(Never.self) - - scheduler.scheduleAt(201, action: { - subscription = Completable.create { _observer in - observer = _observer - return Disposables.create { - disposedTime = scheduler.clock - } - } - .asObservable() - .subscribe(res) - }) - scheduler.scheduleAt(202, action: { - subscription.dispose() - }) - scheduler.scheduleAt(203, action: { - observer(.completed) - }) - scheduler.scheduleAt(204, action: { - observer(.error(testError)) - }) - - scheduler.start() - - XCTAssertEqual(res.events, [ - ]) - - XCTAssertEqual(disposedTime, 202) - } -} - -// single operators -extension PrimitiveSequenceTest { - func testSingle_deferred_producesSingleElement() { - let result = try! (Single.deferred { Single.just(1) } as Single).toBlocking().first()! - XCTAssertEqual(result, 1) - } - - func testSingle_just_producesSingleElement() { - let result = try! (Single.just(1) as Single).toBlocking().first()! - XCTAssertEqual(result, 1) - } - - func testSingle_just2_producesSingleElement() { - let result = try! (Single.just(1, scheduler: CurrentThreadScheduler.instance) as Single).toBlocking().first()! - XCTAssertEqual(result, 1) - } - - func testSingle_error_fails() { - do { - _ = try (Single.error(testError) as Single).toBlocking().first() - XCTFail() - } - catch let e { - XCTAssertEqual(e as! TestError, testError) - } - } - - func testSingle_never_producesSingleElement() { - var event: SingleEvent? = nil - let subscription = (Single.never() as Single).subscribe { _event in - event = _event - } - - XCTAssertNil(event) - subscription.dispose() - } - - func testSingle_delaySubscription_producesSingleElement() { - let scheduler = TestScheduler(initialClock: 0) - - let res = scheduler.start { - (Single.just(1).delaySubscription(1.0, scheduler: scheduler) as Single).asObservable() - } - - XCTAssertEqual(res.events, [ - next(201, 1), - completed(201) - ]) - } - - func testSingle_delay_producesSingleElement() { - let scheduler = TestScheduler(initialClock: 0) - - let res = scheduler.start { - (Single.just(1) - .delay(1.0, scheduler: scheduler) as Single).asObservable() - } - - XCTAssertEqual(res.events, [ - next(201, 1), - completed(202) - ]) - } - - func testSingle_do_producesSingleElement() { - let singleResult: Single = Single.just(1) - .do() - - let result = try! singleResult - .toBlocking().first()! - XCTAssertEqual(result, 1) - } - - func testSingle_filter_resultIsMaybe() { - let filterResult: Maybe = Single.just(1) - .filter { _ in false } - - XCTAssertNil(try! filterResult.toBlocking().first()) - } - - func testSingle_map_producesSingleElement() { - let singleResult: Single = Single.just(1) - .map { $0 * 2 } - - let result = try! singleResult - .toBlocking().first()! - XCTAssertEqual(result, 2) - } - - func testSingle_flatMap_producesSingleElement() { - let singleResult: Single = Single.just(1) - .flatMap { Single.just($0 * 2) } - - let result = try! singleResult - .toBlocking().first()! - XCTAssertEqual(result, 2) - } - - func testSingle_observeOn_producesSingleElement() { - let scheduler = TestScheduler(initialClock: 0) - - let res = scheduler.start { () -> Observable in - let singleResult: Single = Single.just(1) - .observeOn(scheduler) - - return singleResult.asObservable() - } - - XCTAssertEqual(res.events, [ - next(201, 1), - completed(202) - ]) - } - - func testSingle_subscribeOn_producesSingleElement() { - let scheduler = TestScheduler(initialClock: 0) - - let res = scheduler.start { () -> Observable in - let singleResult: Single = Single.just(1) - .subscribeOn(scheduler) - - return singleResult.asObservable() - } - - XCTAssertEqual(res.events, [ - next(201, 1), - completed(201) - ]) - } - - func testSingle_catchError_producesSingleElement() { - let singleResult: Single = Single.error(testError) - .catchError { _ in Single.just(2) } - - let result = try! singleResult - .toBlocking().first()! - XCTAssertEqual(result, 2) - } - - func testSingle_retry_producesSingleElement() { - var isFirst = true - let singleResult: Single = Single.error(testError) - .catchError { e in - defer { - isFirst = false - } - if isFirst { - return Single.error(e) - } - - return Single.just(2) - } - .retry(2) - - let result = try! singleResult - .toBlocking().first()! - XCTAssertEqual(result, 2) - } - - func testSingle_retryWhen1_producesSingleElement() { - var isFirst = true - let singleResult: Single = Single.error(testError) - .catchError { e in - defer { - isFirst = false - } - if isFirst { - return Single.error(e) - } - - return Single.just(2) - } - .retryWhen { (e: Observable) in - return e - } - - let result = try! singleResult - .toBlocking().first()! - XCTAssertEqual(result, 2) - } - - func testSingle_retryWhen2_producesSingleElement() { - var isFirst = true - let singleResult: Single = Single.error(testError) - .catchError { e in - defer { - isFirst = false - } - if isFirst { - return Single.error(e) - } - - return Single.just(2) - } - .retryWhen { (e: Observable) in - return e - } - - let result = try! singleResult - .toBlocking().first()! - XCTAssertEqual(result, 2) - } - - func testSingle_timer_producesSingleElement() { - let scheduler = TestScheduler(initialClock: 0) - - let res = scheduler.start { () -> Observable in - let singleResult: Single = Single.timer(2, scheduler: scheduler) - - return singleResult.asObservable() - } - - XCTAssertEqual(res.events, [ - next(202, 0), - completed(202) - ]) - } - - func testSingle_using_producesSingleElement() { - let scheduler = TestScheduler(initialClock: 0) - - var disposeInvoked = 0 - var createInvoked = 0 - - var disposable: MockDisposable! - var xs: TestableObservable! - var _d: MockDisposable! - - let res = scheduler.start { - Single.using({ () -> MockDisposable in - disposeInvoked += 1 - disposable = MockDisposable(scheduler: scheduler) - return disposable - }, primitiveSequenceFactory: { (d: MockDisposable) -> Single in - _d = d - createInvoked += 1 - xs = scheduler.createColdObservable([ - next(100, scheduler.clock), - completed(100) - ]) - return xs.asObservable().asSingle() - }).asObservable() - } - - XCTAssert(disposable === _d) - - XCTAssertEqual(1, createInvoked) - XCTAssertEqual(1, disposeInvoked) - - XCTAssertEqual(res.events, [ - next(300, 200), - completed(300) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 300) - ]) - - XCTAssertEqual(disposable.ticks, [ - 200, - 300 - ]) - } - - func testSingle_timeout() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createColdObservable([ - next(10, 1), - completed(20) - ]).asSingle() - - let res = scheduler.start { () -> Observable in - let singleResult: Single = xs.timeout(5.0, scheduler: scheduler) - - return singleResult.asObservable() - } - - XCTAssertEqual(res.events, [ - error(205, RxError.timeout) - ]) - } - - func testSingle_timeout_other() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createColdObservable([ - next(10, 1), - completed(20) - ]).asSingle() - - let xs2 = scheduler.createColdObservable([ - next(20, 1), - completed(20) - ]).asSingle() - - let res = scheduler.start { () -> Observable in - let singleResult: Single = xs.timeout(5.0, other: xs2, scheduler: scheduler) - - return singleResult.asObservable() - } - - XCTAssertEqual(res.events, [ - next(225, 1), - completed(225) - ]) - } - - func testMaybe_timeout() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createColdObservable([ - next(10, 1), - completed(20) - ]).asMaybe() - - let res = scheduler.start { () -> Observable in - let result: Maybe = xs.timeout(5.0, scheduler: scheduler) - - return result.asObservable() - } - - XCTAssertEqual(res.events, [ - error(205, RxError.timeout) - ]) - } - - func testMaybe_timeout_other() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createColdObservable([ - next(10, 1), - completed(20) - ]).asMaybe() - - let xs2 = scheduler.createColdObservable([ - next(20, 1), - completed(20) - ]).asMaybe() - - let res = scheduler.start { () -> Observable in - let result: Maybe = xs.timeout(5.0, other: xs2, scheduler: scheduler) - - return result.asObservable() - } - - XCTAssertEqual(res.events, [ - next(225, 1), - completed(225) - ]) - } - - func testCompletable_timeout() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createColdObservable([ - completed(20, Never.self) - ]).asCompletable() - - let res = scheduler.start { () -> Observable in - let result: Completable = xs.timeout(5.0, scheduler: scheduler) - - return result.asObservable() - } - - XCTAssertEqual(res.events, [ - error(205, RxError.timeout) - ]) - } - - func testCompletable_timeout_other() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createColdObservable([ - completed(20, Never.self) - ]).asCompletable() - - let xs2 = scheduler.createColdObservable([ - completed(20, Never.self) - ]).asCompletable() - - let res = scheduler.start { () -> Observable in - let result: Completable = xs.timeout(5.0, other: xs2, scheduler: scheduler) - - return result.asObservable() - } - - XCTAssertEqual(res.events, [ - completed(225) - ]) - } - - func testCompletable_timeout_succeeds() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createColdObservable([ - completed(2, Never.self) - ]).asCompletable() - - let res = scheduler.start { () -> Observable in - let result: Completable = xs.timeout(5.0, scheduler: scheduler) - - return result.asObservable() - } - - XCTAssertEqual(res.events, [ - completed(202) - ]) - } - - func testCompletable_timeout_other_succeeds() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createColdObservable([ - completed(2, Never.self) - ]).asCompletable() - - let xs2 = scheduler.createColdObservable([ - completed(20, Never.self) - ]).asCompletable() - - let res = scheduler.start { () -> Observable in - let result: Completable = xs.timeout(5.0, other: xs2, scheduler: scheduler) - - return result.asObservable() - } - - XCTAssertEqual(res.events, [ - completed(202) - ]) - } -} - -extension PrimitiveSequenceTest { - func testAsSingle_Empty() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - completed(250), - error(260, testError) - ]) - - let res = scheduler.start { () -> Observable in - let single: Single = xs.asSingle() - return single.asObservable() - } - - XCTAssertEqual(res.events, [ - error(250, RxError.noElements) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 250) - ]) - } - - func testAsSingle_One() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - next(210, 2), - completed(250), - error(260, testError) - ]) - - let res = scheduler.start { () -> Observable in - let single: Single = xs.asSingle() - return single.asObservable() - } - - XCTAssertEqual(res.events, [ - next(250, 2), - completed(250) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 250) - ]) - } - - func testAsSingle_Many() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - next(210, 2), - next(220, 3), - completed(250), - error(260, testError) - ]) - - let res = scheduler.start { () -> Observable in - let single: Single = xs.asSingle() - return single.asObservable() - } - - XCTAssertEqual(res.events, [ - error(220, RxError.moreThanOneElement) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 220) - ]) - } - - func testAsSingle_Error() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - error(210, testError) - ]) - - let res = scheduler.start { () -> Observable in - let single: Single = xs.asSingle() - return single.asObservable() - } - - XCTAssertEqual(res.events, [ - error(210, testError) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 210) - ]) - } - - func testAsSingle_Error2() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - next(205, 2), - error(210, testError) - ]) - - let res = scheduler.start { () -> Observable in - let single: Single = xs.asSingle() - return single.asObservable() - } - - XCTAssertEqual(res.events, [ - error(210, testError) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 210) - ]) - } - - func testAsSingle_subscribeOnSuccess() { - var events: [SingleEvent] = [] - - _ = Single.just(1).subscribe(onSuccess: { element in - events.append(.success(element)) - }, onError: { error in - events.append(.error(error)) - }) - - XCTAssertEqual(events, [.success(1)]) - } - - func testAsSingle_subscribeOnError() { - var events: [SingleEvent] = [] - - _ = Single.error(testError).subscribe(onSuccess: { element in - events.append(.success(element)) - }, onError: { error in - events.append(.error(error)) - }) - - XCTAssertEqual(events, [.error(testError)]) - } - - #if TRACE_RESOURCES - func testAsSingleReleasesResourcesOnComplete() { - _ = Observable.just(1).asSingle().subscribe({ _ in }) - } - - func testAsSingleReleasesResourcesOnError1() { - _ = Observable.error(testError).asSingle().subscribe({ _ in }) - } - - func testAsSingleReleasesResourcesOnError2() { - _ = Observable.of(1, 2).asSingle().subscribe({ _ in }) - } - #endif -} - -extension PrimitiveSequenceTest { - func testFirst_Empty() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - completed(250), - error(260, testError) - ]) - - let res: TestableObserver = scheduler.start { () -> Observable in - let single: Single = xs.first() - return single.asObservable() - } - - XCTAssertEqual(res.events, [ - next(250, nil), - completed(250) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 250) - ]) - } - - func testFirst_One() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - next(210, 2), - completed(250), - error(260, testError) - ]) - - let res = scheduler.start { () -> Observable in - let single: Single = xs.first() - return single.asObservable() - } - - XCTAssertEqual(res.events, [ - next(210, 2), - completed(210) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 210) - ]) - } - - func testFirst_Many() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - next(210, 2), - next(220, 3), - completed(250), - error(260, testError) - ]) - - let res = scheduler.start { () -> Observable in - let single: Single = xs.first() - return single.asObservable() - } - - XCTAssertEqual(res.events, [ - next(210, 2), - completed(210) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 210) - ]) - } - - func testFirst_ManyWithoutCompletion() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - next(160, 2), - next(280, 3), - next(250, 4), - next(300, 5) - ]) - - let res = scheduler.start { () -> Observable in - let single: Single = xs.first() - return single.asObservable() - } - - XCTAssertEqual(res.events, [ - next(250, 4), - completed(250) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 250) - ]) - } - - func testFirst_Error() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - error(210, testError) - ]) - - let res = scheduler.start { () -> Observable in - let single: Single = xs.first() - return single.asObservable() - } - - XCTAssertEqual(res.events, [ - error(210, testError) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 210) - ]) - } - - #if TRACE_RESOURCES - func testFirstReleasesResourcesOnComplete() { - _ = Observable.just(1).first().subscribe({ _ in }) - } - - func testFirstReleasesResourcesOnError1() { - _ = Observable.error(testError).first().subscribe({ _ in }) - } - #endif -} - -extension PrimitiveSequenceTest { - func testAsMaybe_Empty() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - completed(250), - error(260, testError) - ]) - - let res = scheduler.start { () -> Observable in - let maybe: Maybe = xs.asMaybe() - return maybe.asObservable() - } - - XCTAssertEqual(res.events, [ - completed(250) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 250) - ]) - } - - func testAsMaybe_One() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - next(210, 2), - completed(250), - error(260, testError) - ]) - - let res = scheduler.start { () -> Observable in - let maybe: Maybe = xs.asMaybe() - return maybe.asObservable() - } - - XCTAssertEqual(res.events, [ - next(250, 2), - completed(250) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 250) - ]) - } - - func testAsMaybe_Many() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - next(210, 2), - next(220, 3), - completed(250), - error(260, testError) - ]) - - let res = scheduler.start { () -> Observable in - let maybe: Maybe = xs.asMaybe() - return maybe.asObservable() - } - - XCTAssertEqual(res.events, [ - error(220, RxError.moreThanOneElement) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 220) - ]) - } - - func testAsMaybe_Error() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - error(210, testError) - ]) - - let res = scheduler.start { () -> Observable in - let maybe: Maybe = xs.asMaybe() - return maybe.asObservable() - } - - XCTAssertEqual(res.events, [ - error(210, testError) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 210) - ]) - } - - func testAsMaybe_Error2() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - next(150, 1), - next(205, 2), - error(210, testError) - ]) - - let res = scheduler.start { () -> Observable in - let maybe: Maybe = xs.asMaybe() - return maybe.asObservable() - } - - XCTAssertEqual(res.events, [ - error(210, testError) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 210) - ]) - } - - func testAsMaybe_subscribeOnSuccess() { - var events: [MaybeEvent] = [] - - _ = Maybe.just(1).subscribe(onSuccess: { element in - events.append(.success(element)) - }, onError: { error in - events.append(.error(error)) - }, onCompleted: { - events.append(.completed) - }) - - XCTAssertEqual(events, [.success(1)]) - } - - func testAsMaybe_subscribeOnError() { - var events: [MaybeEvent] = [] - - _ = Maybe.error(testError).subscribe(onSuccess: { element in - events.append(.success(element)) - }, onError: { error in - events.append(.error(error)) - }, onCompleted: { - events.append(.completed) - }) - - XCTAssertEqual(events, [.error(testError)]) - } - - func testAsMaybe_subscribeOnCompleted() { - var events: [MaybeEvent] = [] - - _ = Maybe.empty().subscribe(onSuccess: { element in - events.append(.success(element)) - }, onError: { error in - events.append(.error(error)) - }, onCompleted: { - events.append(.completed) - }) - - XCTAssertEqual(events, [.completed]) - } - - #if TRACE_RESOURCES - func testAsMaybeReleasesResourcesOnComplete1() { - _ = Observable.empty().asMaybe().subscribe({ _ in }) - } - - func testAsMaybeReleasesResourcesOnComplete2() { - _ = Observable.just(1).asMaybe().subscribe({ _ in }) - } - - func testAsMaybeReleasesResourcesOnError1() { - _ = Observable.error(testError).asMaybe().subscribe({ _ in }) - } - - func testAsMaybeReleasesResourcesOnError2() { - _ = Observable.of(1, 2).asMaybe().subscribe({ _ in }) - } - #endif -} - -extension PrimitiveSequenceTest { - func testAsCompletable_Empty() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - completed(250, Never.self), - error(260, testError) - ]) - - let res = scheduler.start { () -> Observable in - let completable: Completable = xs.asCompletable() - return completable.asObservable() - } - - XCTAssertEqual(res.events, [ - completed(250) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 250) - ]) - } - - func testAsCompletable_Error() { - let scheduler = TestScheduler(initialClock: 0) - - let xs = scheduler.createHotObservable([ - error(210, testError, Never.self) - ]) - - let res = scheduler.start { () -> Observable in - let completable: Completable = xs.asCompletable() - return completable.asObservable() - } - - XCTAssertEqual(res.events, [ - error(210, testError) - ]) - - XCTAssertEqual(xs.subscriptions, [ - Subscription(200, 210) - ]) - } - - func testAsCompletable_subscribeOnCompleted() { - var events: [CompletableEvent] = [] - - _ = Completable.empty().subscribe(onCompleted: { - events.append(.completed) - }, onError: { error in - events.append(.error(error)) - }) - - XCTAssertEqual(events, [.completed]) - } - - func testAsCompletable_subscribeOnError() { - var events: [CompletableEvent] = [] - - _ = Completable.error(testError).subscribe(onCompleted: { - events.append(.completed) - }, onError: { error in - events.append(.error(error)) - }) - - XCTAssertEqual(events, [.error(testError)]) - } - - #if TRACE_RESOURCES - func testAsCompletableReleasesResourcesOnComplete() { - _ = Observable.empty().asCompletable().subscribe({ _ in }) - } - - func testAsCompletableReleasesResourcesOnError() { - _ = Observable.error(testError).asCompletable().subscribe({ _ in }) - } - #endif - - func testCompletable_merge() { - let factories: [(Completable, Completable) -> Completable] = - [ - { ys1, ys2 in Completable.merge(ys1, ys2) }, - { ys1, ys2 in Completable.merge([ys1, ys2]) }, - { ys1, ys2 in Completable.merge(AnyCollection([ys1, ys2])) }, - ] - - for factory in factories { - let scheduler = TestScheduler(initialClock: 0) - - let ys1 = scheduler.createHotObservable([ - completed(250, Never.self), - error(260, testError) - ]) - - let ys2 = scheduler.createHotObservable([ - completed(300, Never.self) - ]) - - let res = scheduler.start { () -> Observable in - let completable: Completable = factory(ys1.asCompletable(), ys2.asCompletable()) - return completable.asObservable() - } - - XCTAssertEqual(res.events, [ - completed(300) - ]) - - XCTAssertEqual(ys1.subscriptions, [ - Subscription(200, 250), - ]) - - XCTAssertEqual(ys2.subscriptions, [ - Subscription(200, 300), - ]) - } - } - - func testCompletable_concat() { - let factories: [(Completable, Completable) -> Completable] = - [ - { ys1, ys2 in Completable.concat(ys1, ys2) }, - { ys1, ys2 in Completable.concat([ys1, ys2]) }, - { ys1, ys2 in Completable.concat(AnyCollection([ys1, ys2])) }, - { ys1, ys2 in ys1.concat(ys2) } - ] - - for factory in factories { - let scheduler = TestScheduler(initialClock: 0) - - let ys1 = scheduler.createHotObservable([ - completed(250, Never.self), - error(260, testError) - ]) - - let ys2 = scheduler.createHotObservable([ - completed(300, Never.self) - ]) - - let res = scheduler.start { () -> Observable in - let completable: Completable = factory(ys1.asCompletable(), ys2.asCompletable()) - return completable.asObservable() - } - - XCTAssertEqual(res.events, [ - completed(300) - ]) - - XCTAssertEqual(ys1.subscriptions, [ - Subscription(200, 250), - ]) - - XCTAssertEqual(ys2.subscriptions, [ - Subscription(250, 300), - ]) - } - } -} - -extension PrimitiveSequenceTest { - func testDebug_producesSingleElement() { - let singleResult: Single = Single.just(1) - .debug("a", trimOutput: false) - - let result = try! singleResult - .toBlocking().first()! - XCTAssertEqual(result, 1) - } -} - -extension Never: Equatable { - -} - -public func == (lhs: Never, rhs: Never) -> Bool { - fatalError() -} diff --git a/default.profraw b/default.profraw index b91f3c00ba922ab61bddd88ef7b05a3c1cada3c8..56d1b28d744e68c81393edf6a86374c9ec17a017 100644 GIT binary patch delta 36344 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 z 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 Hzt#T({1^mg delta 33168 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 oH^$AH7Cirub