UNPKG

@reactivex/rxjs

Version:

Reactive Extensions for modern JavaScript

169 lines 7.51 kB
"use strict"; var chai_1 = require('chai'); var sinon = require('sinon'); var Rx = require('../../dist/cjs/Rx'); var Observable = Rx.Observable; /** @test {race} */ describe('Observable.prototype.race', function () { it('should race cold and cold', function () { var e1 = cold('---a-----b-----c----|'); var e1subs = '^ !'; var e2 = cold('------x-----y-----z----|'); var e2subs = '^ !'; var expected = '---a-----b-----c----|'; var result = e1.race(e2); expectObservable(result).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); }); it('should race cold and cold and accept an Array of Observable argument', function () { var e1 = cold('---a-----b-----c----|'); var e1subs = '^ !'; var e2 = cold('------x-----y-----z----|'); var e2subs = '^ !'; var expected = '---a-----b-----c----|'; var result = e1.race([e2]); expectObservable(result).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); }); it('should race hot and hot', function () { var e1 = hot('---a-----b-----c----|'); var e1subs = '^ !'; var e2 = hot('------x-----y-----z----|'); var e2subs = '^ !'; var expected = '---a-----b-----c----|'; var result = e1.race(e2); expectObservable(result).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); }); it('should race hot and cold', function () { var e1 = cold('---a-----b-----c----|'); var e1subs = '^ !'; var e2 = hot('------x-----y-----z----|'); var e2subs = '^ !'; var expected = '---a-----b-----c----|'; var result = e1.race(e2); expectObservable(result).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); }); it('should race 2nd and 1st', function () { var e1 = cold('------x-----y-----z----|'); var e1subs = '^ !'; var e2 = cold('---a-----b-----c----|'); var e2subs = '^ !'; var expected = '---a-----b-----c----|'; var result = e1.race(e2); expectObservable(result).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); }); it('should race emit and complete', function () { var e1 = cold('-----|'); var e1subs = '^ !'; var e2 = hot('------x-----y-----z----|'); var e2subs = '^ !'; var expected = '-----|'; var result = e1.race(e2); expectObservable(result).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); }); it('should allow unsubscribing early and explicitly', function () { var e1 = cold('---a-----b-----c----|'); var e1subs = '^ !'; var e2 = hot('------x-----y-----z----|'); var e2subs = '^ !'; var expected = '---a-----b---'; var unsub = ' !'; var result = e1.race(e2); expectObservable(result, unsub).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); }); it('should not break unsubscription chains when unsubscribed explicitly', function () { var e1 = hot('--a--^--b--c---d-| '); var e1subs = '^ ! '; var e2 = hot('---e-^---f--g---h-|'); var e2subs = '^ ! '; var expected = '---b--c--- '; var unsub = ' ! '; var result = e1 .mergeMap(function (x) { return Observable.of(x); }) .race(e2) .mergeMap(function (x) { return Observable.of(x); }); expectObservable(result, unsub).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); }); it('should never emit when given non emitting sources', function () { var e1 = cold('---|'); var e2 = cold('---|'); var e1subs = '^ !'; var expected = '---|'; var source = e1.race(e2); expectObservable(source).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); }); it('should throw when error occurs mid stream', function () { var e1 = cold('---a-----#'); var e1subs = '^ !'; var e2 = cold('------x-----y-----z----|'); var e2subs = '^ !'; var expected = '---a-----#'; var result = e1.race(e2); expectObservable(result).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); }); it('should throw when error occurs before a winner is found', function () { var e1 = cold('---#'); var e1subs = '^ !'; var e2 = cold('------x-----y-----z----|'); var e2subs = '^ !'; var expected = '---#'; var result = e1.race(e2); expectObservable(result).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(e1subs); expectSubscriptions(e2.subscriptions).toBe(e2subs); }); it('should allow observable emits immediately', function (done) { var e1 = Observable.of(true); var e2 = Observable.timer(200).map(function (_) { return false; }); Observable.race(e1, e2).subscribe(function (x) { chai_1.expect(x).to.be.true; }, done, done); }); it('should ignore latter observables if a former one emits immediately', function () { var onNext = sinon.spy(); var onSubscribe = sinon.spy(); var e1 = Observable.of('a'); // Wins the race var e2 = Observable.defer(onSubscribe); // Should be ignored e1.race(e2).subscribe(onNext); chai_1.expect(onNext.calledWithExactly('a')).to.be.true; chai_1.expect(onSubscribe.called).to.be.false; }); it('should unsubscribe former observables if a latter one emits immediately', function () { var onNext = sinon.spy(); var onUnsubscribe = sinon.spy(); var e1 = Observable.never().finally(onUnsubscribe); // Should be unsubscribed var e2 = Observable.of('b'); // Wins the race e1.race(e2).subscribe(onNext); chai_1.expect(onNext.calledWithExactly('b')).to.be.true; chai_1.expect(onUnsubscribe.calledOnce).to.be.true; }); it('should unsubscribe from immediately emitting observable on unsubscription', function () { var onNext = sinon.spy(); var onUnsubscribe = sinon.spy(); var e1 = Observable.never().startWith('a').finally(onUnsubscribe); // Wins the race var e2 = Observable.never(); // Loses the race var subscription = e1.race(e2).subscribe(onNext); chai_1.expect(onNext.calledWithExactly('a')).to.be.true; chai_1.expect(onUnsubscribe.called).to.be.false; subscription.unsubscribe(); chai_1.expect(onUnsubscribe.calledOnce).to.be.true; }); }); //# sourceMappingURL=race-spec.js.map