diff --git a/RxSwift/DataStructures/Queue.swift b/RxSwift/DataStructures/Queue.swift index 6cc023e6..0a3d5370 100644 --- a/RxSwift/DataStructures/Queue.swift +++ b/RxSwift/DataStructures/Queue.swift @@ -168,33 +168,22 @@ public struct Queue: SequenceType { - returns: Generator of contained elements. */ public func generate() -> Generator { - return QueueGenerator(queue: self) + var i = dequeueIndex + var count = _count + + return anyGenerator { + if count == 0 { + return nil + } + + count -= 1 + if i >= self._storage.count { + i -= self._storage.count + } + + let element = self._storage[i] + i += 1 + return element + } } } - -class QueueGenerator : AnyGenerator { - let _queue: Queue - var _i: Int - var _remaining: Int - - init(queue: Queue) { - _queue = queue - _i = queue.dequeueIndex - _remaining = queue.count - } - - override func next() -> Element? { - if _remaining == 0 { - return nil - } - - _remaining -= 1 - if _i >= _queue._storage.count { - _i -= _queue._storage.count - } - - let element = _queue._storage[_i] - _i += 1 - return element - } -} \ No newline at end of file diff --git a/Tests/RxCocoaTests/ControlEventTests.swift b/Tests/RxCocoaTests/ControlEventTests.swift index e5fc4d91..5f90c65b 100644 --- a/Tests/RxCocoaTests/ControlEventTests.swift +++ b/Tests/RxCocoaTests/ControlEventTests.swift @@ -20,7 +20,7 @@ class ControlEventTests : RxTest { let expectSubscribeOffMainThread = expectationWithDescription("Did subscribe off main thread") let controlProperty = ControlEvent(events: Observable.deferred { () -> Observable in - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) observedOnMainThread = true return hotObservable.asObservable() }) diff --git a/Tests/RxCocoaTests/ControlPropertyTests.swift b/Tests/RxCocoaTests/ControlPropertyTests.swift index 74a0d54f..2d5fd258 100644 --- a/Tests/RxCocoaTests/ControlPropertyTests.swift +++ b/Tests/RxCocoaTests/ControlPropertyTests.swift @@ -20,7 +20,7 @@ class ControlPropertyTests : RxTest { let expectSubscribeOffMainThread = expectationWithDescription("Did subscribe off main thread") let controlProperty = ControlProperty(values: Observable.deferred { () -> Observable in - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) observedOnMainThread = true return hotObservable.asObservable() }, valueSink: AnyObserver { n in diff --git a/Tests/RxCocoaTests/Driver+Test.swift b/Tests/RxCocoaTests/Driver+Test.swift index 0b4e2809..650cb1eb 100644 --- a/Tests/RxCocoaTests/Driver+Test.swift +++ b/Tests/RxCocoaTests/Driver+Test.swift @@ -38,7 +38,7 @@ extension DriverTest { backgroundScheduler.schedule(()) { _ in _ = driver.asObservable().subscribe { e in - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) switch e { case .Next(let element): firstElements.append(element) @@ -49,7 +49,7 @@ extension DriverTest { } } _ = driver.asDriver().asObservable().subscribe { e in - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) switch e { case .Next(let element): secondElements.append(element) @@ -319,7 +319,7 @@ extension DriverTest { func testAsDriver_map() { let hotObservable = BackgroundThreadPrimitiveHotObservable() let driver = hotObservable.asDriver(onErrorJustReturn: -1).map { (n: Int) -> Int in - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) return n + 1 } @@ -342,7 +342,7 @@ extension DriverTest { func testAsDriver_filter() { let hotObservable = BackgroundThreadPrimitiveHotObservable() let driver = hotObservable.asDriver(onErrorJustReturn: -1).filter { n in - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) return n % 2 == 0 } @@ -498,7 +498,7 @@ extension DriverTest { var events = [Event]() let driver = hotObservable.asDriver(onErrorJustReturn: -1).doOn { e in - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) events.append(e) } @@ -605,7 +605,7 @@ extension DriverTest { func testAsDriver_flatMap() { let hotObservable = BackgroundThreadPrimitiveHotObservable() let driver = hotObservable.asDriver(onErrorJustReturn: -1).flatMap { (n: Int) -> Driver in - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) return Driver.just(n + 1) } @@ -629,7 +629,7 @@ extension DriverTest { func testAsDriver_merge() { let hotObservable = BackgroundThreadPrimitiveHotObservable() let driver = hotObservable.asDriver(onErrorJustReturn: -1).map { (n: Int) -> Driver in - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) return Driver.just(n + 1) }.merge() @@ -649,7 +649,7 @@ extension DriverTest { func testAsDriver_merge2() { let hotObservable = BackgroundThreadPrimitiveHotObservable() let driver = hotObservable.asDriver(onErrorJustReturn: -1).map { (n: Int) -> Driver in - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) return Driver.just(n + 1) }.merge(maxConcurrent: 1) @@ -708,7 +708,7 @@ extension DriverTest { func testAsDriver_scan() { let hotObservable = BackgroundThreadPrimitiveHotObservable() let driver = hotObservable.asDriver(onErrorJustReturn: -1).scan(0) { (a: Int, n: Int) -> Int in - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) return a + n } diff --git a/Tests/RxSwiftTests/TestImplementations/Mocks/BackgroundThreadPrimitiveHotObservable.swift b/Tests/RxSwiftTests/TestImplementations/Mocks/BackgroundThreadPrimitiveHotObservable.swift index 9a733e44..14b1fd15 100644 --- a/Tests/RxSwiftTests/TestImplementations/Mocks/BackgroundThreadPrimitiveHotObservable.swift +++ b/Tests/RxSwiftTests/TestImplementations/Mocks/BackgroundThreadPrimitiveHotObservable.swift @@ -12,7 +12,7 @@ import XCTest class BackgroundThreadPrimitiveHotObservable : PrimitiveHotObservable { override func subscribe(observer: O) -> Disposable { - XCTAssertTrue(!NSThread.isMainThread()) + XCTAssertTrue(!isMainThread()) return super.subscribe(observer) } } \ No newline at end of file diff --git a/Tests/RxSwiftTests/TestImplementations/Mocks/MainThreadPrimitiveHotObservable.swift b/Tests/RxSwiftTests/TestImplementations/Mocks/MainThreadPrimitiveHotObservable.swift index 28870dc4..a4dceb83 100644 --- a/Tests/RxSwiftTests/TestImplementations/Mocks/MainThreadPrimitiveHotObservable.swift +++ b/Tests/RxSwiftTests/TestImplementations/Mocks/MainThreadPrimitiveHotObservable.swift @@ -12,7 +12,7 @@ import XCTest class MainThreadPrimitiveHotObservable : PrimitiveHotObservable { override func subscribe(observer: O) -> Disposable { - XCTAssertTrue(NSThread.isMainThread()) + XCTAssertTrue(isMainThread()) return super.subscribe(observer) } } \ No newline at end of file diff --git a/Tests/RxSwiftTests/Tests/Observable+BlockingTest.swift b/Tests/RxSwiftTests/Tests/Observable+BlockingTest.swift index 780090af..c739e7d3 100644 --- a/Tests/RxSwiftTests/Tests/Observable+BlockingTest.swift +++ b/Tests/RxSwiftTests/Tests/Observable+BlockingTest.swift @@ -31,7 +31,7 @@ extension ObservableBlockingTest { XCTFail("It should fail") } catch let e { - XCTAssertTrue(e as NSError === testError) + XCTAssertErrorEqual(e, testError) } } @@ -68,7 +68,7 @@ extension ObservableBlockingTest { XCTFail() } catch let e { - XCTAssertTrue(e as NSError === testError) + XCTAssertErrorEqual(e, testError) } } @@ -105,7 +105,7 @@ extension ObservableBlockingTest { XCTFail() } catch let e { - XCTAssertTrue(e as NSError === testError) + XCTAssertErrorEqual(e, testError) } } @@ -169,7 +169,7 @@ extension ObservableBlockingTest { XCTFail() } catch let e { - XCTAssertTrue(e as NSError === testError) + XCTAssertErrorEqual(e, testError) } } @@ -255,7 +255,7 @@ extension ObservableBlockingTest { XCTFail() } catch let e { - XCTAssertTrue(e as NSError === testError) + XCTAssertErrorEqual(e, testError) } XCTAssertEqual(predicateVals, [42, 43]) } @@ -266,7 +266,7 @@ extension ObservableBlockingTest { XCTFail() } catch let e { - XCTAssertTrue(e as NSError === testError) + XCTAssertErrorEqual(e, testError) } } diff --git a/Tests/RxSwiftTests/Tests/SubjectConcurrencyTest.swift b/Tests/RxSwiftTests/Tests/SubjectConcurrencyTest.swift index fb1da520..d715fa74 100644 --- a/Tests/RxSwiftTests/Tests/SubjectConcurrencyTest.swift +++ b/Tests/RxSwiftTests/Tests/SubjectConcurrencyTest.swift @@ -63,11 +63,11 @@ extension SubjectConcurrencyTest { } } else if state == 1 { - XCTAssertTrue(!NSThread.currentThread().isMainThread) + XCTAssertTrue(!isMainThread()) state = 2 } else if state == 2 { - XCTAssertTrue(NSThread.currentThread().isMainThread) + XCTAssertTrue(isMainThread()) allDone = true } } diff --git a/Tests/Tests.xcodeproj/project.pbxproj b/Tests/Tests.xcodeproj/project.pbxproj index 783e0fa6..a07ef348 100644 --- a/Tests/Tests.xcodeproj/project.pbxproj +++ b/Tests/Tests.xcodeproj/project.pbxproj @@ -25,6 +25,10 @@ C810EED11C2DE85C000033CE /* PerformanceTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = C810EECF1C2DE85C000033CE /* PerformanceTools.swift */; }; C810EED21C2DE85C000033CE /* PerformanceTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = C810EECF1C2DE85C000033CE /* PerformanceTools.swift */; }; C810EED31C2DE85C000033CE /* PerformanceTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = C810EECF1C2DE85C000033CE /* PerformanceTools.swift */; }; + C810EED51C2DEBD1000033CE /* Foundation+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C810EED41C2DEBD1000033CE /* Foundation+Extensions.swift */; }; + C810EED61C2DEBD1000033CE /* Foundation+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C810EED41C2DEBD1000033CE /* Foundation+Extensions.swift */; }; + C810EED71C2DEBD1000033CE /* Foundation+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C810EED41C2DEBD1000033CE /* Foundation+Extensions.swift */; }; + C810EED81C2DEBD1000033CE /* Foundation+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C810EED41C2DEBD1000033CE /* Foundation+Extensions.swift */; }; C811084D1AF50E2A001C13E4 /* NSNotificationCenterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C811082B1AF50E2A001C13E4 /* NSNotificationCenterTests.swift */; }; C81108501AF50E2A001C13E4 /* TestConnectableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81108311AF50E2A001C13E4 /* TestConnectableObservable.swift */; }; C81108531AF50E2A001C13E4 /* MySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81108341AF50E2A001C13E4 /* MySubject.swift */; }; @@ -203,6 +207,7 @@ C80DDEDF1BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainThreadPrimitiveHotObservable.swift; sourceTree = ""; }; C810EEC71C2DE7CF000033CE /* TestErrors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestErrors.swift; sourceTree = ""; }; C810EECF1C2DE85C000033CE /* PerformanceTools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PerformanceTools.swift; sourceTree = ""; }; + C810EED41C2DEBD1000033CE /* Foundation+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Foundation+Extensions.swift"; sourceTree = ""; }; C81108201AF50E11001C13E4 /* AllTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AllTests.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 = ""; }; @@ -355,6 +360,7 @@ C88FA4F81C25BF6A00CCFEA4 /* RxMutableBox.swift */, C8A32CF61C2DE7A5008FE809 /* Recorded+Timeless.swift */, C810EEC71C2DE7CF000033CE /* TestErrors.swift */, + C810EED41C2DEBD1000033CE /* Foundation+Extensions.swift */, ); path = Tests; sourceTree = ""; @@ -655,6 +661,7 @@ C87BB6BB1C13A75600C66DF9 /* ControlEventTests.swift in Sources */, C8BCD3FE1C14BCAD005F1280 /* NSLayoutConstraint+RxTests.swift in Sources */, C81108641AF50E2A001C13E4 /* Observable+MultipleTest.swift in Sources */, + C810EED51C2DEBD1000033CE /* Foundation+Extensions.swift in Sources */, C8FDC5F81B2B5B7E0065F8D9 /* ElementIndexPair.swift in Sources */, C8E381231B2063CC008CDC33 /* Observable+Extensions.swift in Sources */, C84B8FC21B89D0D500C9CCCF /* BagTest.swift in Sources */, @@ -689,6 +696,7 @@ files = ( C810EED31C2DE85C000033CE /* PerformanceTools.swift in Sources */, C868D10C1BB950D4003D1474 /* main.swift in Sources */, + C810EED81C2DEBD1000033CE /* Foundation+Extensions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -728,6 +736,7 @@ C88BB8A41B07E64B0064D411 /* Observable.Extensions.swift in Sources */, C868D0F71BB75EAE003D1474 /* RxTest.swift in Sources */, C84B8FC31B89D0D500C9CCCF /* BagTest.swift in Sources */, + C810EED61C2DEBD1000033CE /* Foundation+Extensions.swift in Sources */, C87BB6B81C13A64000C66DF9 /* ControlPropertyTests.swift in Sources */, C8BCD3FC1C14B914005F1280 /* NSView+RxTests.swift in Sources */, C897EC3C1B10E000009C2CB0 /* BehaviorSubjectTest.swift in Sources */, @@ -792,6 +801,7 @@ C87BB6BD1C13A75600C66DF9 /* ControlEventTests.swift in Sources */, C8BCD4001C14BCAD005F1280 /* NSLayoutConstraint+RxTests.swift in Sources */, C80DDEE21BCEE898006A1832 /* MainThreadPrimitiveHotObservable.swift in Sources */, + C810EED71C2DEBD1000033CE /* Foundation+Extensions.swift in Sources */, D2EBEB6C1BB9B7EF003A27DC /* Observable+BindingTest.swift in Sources */, D2EBEB621BB9B7E5003A27DC /* ElementIndexPair.swift in Sources */, D2EBEB701BB9B7EF003A27DC /* Observable+MultipleTest.swift in Sources */, diff --git a/Tests/Tests/Foundation+Extensions.swift b/Tests/Tests/Foundation+Extensions.swift new file mode 100644 index 00000000..1aeeed30 --- /dev/null +++ b/Tests/Tests/Foundation+Extensions.swift @@ -0,0 +1,13 @@ +// +// Foundation+Extensions.swift +// Tests +// +// Created by Krunoslav Zaher on 12/25/15. +// +// + +import Foundation + +func isMainThread() -> Bool { + return NSThread.currentThread().isMainThread +} \ No newline at end of file diff --git a/Tests/Tests/XCTest+Rx.swift b/Tests/Tests/XCTest+Rx.swift index 4a2bbe35..91382910 100644 --- a/Tests/Tests/XCTest+Rx.swift +++ b/Tests/Tests/XCTest+Rx.swift @@ -37,12 +37,14 @@ func XCTAssertEqualAnyObjectArrayOfArrays(lhs: [[AnyObject]], _ rhs: [[AnyObject return zip(lhs, rhs).reduce(true) { acc, n in let pointerValuesAreEqual: Bool - if let firstPointer = (n.0 as? NSValue)?.pointerValue, secondPointer = (n.1 as? NSValue)?.pointerValue { - pointerValuesAreEqual = firstPointer == secondPointer - } - else { - pointerValuesAreEqual = false - } + #if !os(Linux) + if let firstPointer = (n.0 as? NSValue)?.pointerValue, secondPointer = (n.1 as? NSValue)?.pointerValue { + pointerValuesAreEqual = firstPointer == secondPointer + } + else { + pointerValuesAreEqual = false + } + #endif let res = n.0.isEqual(n.1) || pointerValuesAreEqual return acc && res }