Home Manual Reference Source Test Repository

spec-js/operators/combineAll-spec.js

"use strict";
var chai_1 = require('chai');
var Rx = require('../../dist/cjs/Rx');
var Observable = Rx.Observable;
var queueScheduler = Rx.Scheduler.queue;
/** @test {combineAll} */
describe('Observable.prototype.combineAll', function () {
    asDiagram('combineAll')('should combine events from two observables', function () {
        var x = cold('-a-----b---|');
        var y = cold('--1-2-|     ');
        var outer = hot('-x----y--------|           ', { x: x, y: y });
        var expected = '-----------------A-B--C---|';
        var result = outer.combineAll(function (a, b) { return String(a) + String(b); });
        expectObservable(result).toBe(expected, { A: 'a1', B: 'a2', C: 'b2' });
    });
    it('should work with two nevers', function () {
        var e1 = cold('-');
        var e1subs = '^';
        var e2 = cold('-');
        var e2subs = '^';
        var expected = '-';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with never and empty', function () {
        var e1 = cold('-');
        var e1subs = '^';
        var e2 = cold('|');
        var e2subs = '(^!)';
        var expected = '-';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with empty and never', function () {
        var e1 = cold('|');
        var e1subs = '(^!)';
        var e2 = cold('-');
        var e2subs = '^';
        var expected = '-';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with empty and empty', function () {
        var e1 = cold('|');
        var e1subs = '(^!)';
        var e2 = cold('|');
        var e2subs = '(^!)';
        var expected = '|';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with hot-empty and hot-single', function () {
        var e1 = hot('-a-^-|');
        var e1subs = '^ !';
        var e2 = hot('-b-^-c-|');
        var e2subs = '^   !';
        var expected = '----|';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with hot-single and hot-empty', function () {
        var e1 = hot('-a-^-|');
        var e1subs = '^ !';
        var e2 = hot('-b-^-c-|');
        var e2subs = '^   !';
        var expected = '----|';
        var result = Observable.of(e2, e1).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with hot-single and never', function () {
        var e1 = hot('-a-^-|');
        var e1subs = '^ !';
        var e2 = hot('------'); //never
        var e2subs = '^  ';
        var expected = '-'; //never
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with never and hot-single', function () {
        var e1 = hot('--------'); //never
        var e1subs = '^    ';
        var e2 = hot('-a-^-b-|');
        var e2subs = '^   !';
        var expected = '-----'; //never
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with hot and hot', function () {
        var e1 = hot('--a--^--b--c--|');
        var e1subs = '^        !';
        var e2 = hot('---e-^---f--g--|');
        var e2subs = '^         !';
        var expected = '----x-yz--|';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, { x: 'bf', y: 'cf', z: 'cg' });
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should allow unsubscribing early and explicitly', function () {
        var e1 = hot('--a--^--b--c---d-| ');
        var e1subs = '^        !    ';
        var e2 = hot('---e-^---f--g---h-|');
        var e2subs = '^        !    ';
        var expected = '----x-yz--    ';
        var unsub = '         !    ';
        var values = { x: 'bf', y: 'cf', z: 'cg' };
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result, unsub).toBe(expected, values);
        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 = '----x-yz--    ';
        var unsub = '         !    ';
        var values = { x: 'bf', y: 'cf', z: 'cg' };
        var result = Observable.of(e1, e2)
            .mergeMap(function (x) { return Observable.of(x); })
            .combineAll(function (x, y) { return x + y; })
            .mergeMap(function (x) { return Observable.of(x); });
        expectObservable(result, unsub).toBe(expected, values);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should combine 3 observables', function () {
        var e1 = hot('--a--^--b--c--|');
        var e1subs = '^        !';
        var e2 = hot('---e-^---f--g--|');
        var e2subs = '^         !';
        var e3 = hot('---h-^----i--j-|');
        var e3subs = '^         !';
        var expected = '-----wxyz-|';
        var result = Observable.of(e1, e2, e3).combineAll(function (x, y, z) { return x + y + z; });
        expectObservable(result).toBe(expected, { w: 'bfi', x: 'cfi', y: 'cgi', z: 'cgj' });
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
        expectSubscriptions(e3.subscriptions).toBe(e3subs);
    });
    it('should work with empty and error', function () {
        var e1 = hot('----------|'); //empty
        var e1subs = '^     !';
        var e2 = hot('------#', undefined, 'shazbot!'); //error
        var e2subs = '^     !';
        var expected = '------#';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'shazbot!');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with error and empty', function () {
        var e1 = hot('--^---#', undefined, 'too bad, honk'); //error
        var e1subs = '^   !';
        var e2 = hot('--^--------|'); //empty
        var e2subs = '^   !';
        var expected = '----#';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'too bad, honk');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with hot and throw', function () {
        var e1 = hot('-a-^--b--c--|');
        var e1subs = '^ !';
        var e2 = hot('---^-#', undefined, 'bazinga');
        var e2subs = '^ !';
        var expected = '--#';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'bazinga');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with throw and hot', function () {
        var e1 = hot('---^-#', undefined, 'bazinga');
        var e1subs = '^ !';
        var e2 = hot('-a-^--b--c--|');
        var e2subs = '^ !';
        var expected = '--#';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'bazinga');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with throw and throw', function () {
        var e1 = hot('---^----#', undefined, 'jenga');
        var e1subs = '^ !';
        var e2 = hot('---^-#', undefined, 'bazinga');
        var e2subs = '^ !';
        var expected = '--#';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'bazinga');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with error and throw', function () {
        var e1 = hot('-a-^--b--#', undefined, 'wokka wokka');
        var e1subs = '^ !';
        var e2 = hot('---^-#', undefined, 'flurp');
        var e2subs = '^ !';
        var expected = '--#';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'flurp');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with throw and error', function () {
        var e1 = hot('---^-#', undefined, 'flurp');
        var e1subs = '^ !';
        var e2 = hot('-a-^--b--#', undefined, 'wokka wokka');
        var e2subs = '^ !';
        var expected = '--#';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'flurp');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with never and throw', function () {
        var e1 = hot('---^-----------');
        var e1subs = '^     !';
        var e2 = hot('---^-----#', undefined, 'wokka wokka');
        var e2subs = '^     !';
        var expected = '------#';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'wokka wokka');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with throw and never', function () {
        var e1 = hot('---^----#', undefined, 'wokka wokka');
        var e1subs = '^    !';
        var e2 = hot('---^-----------');
        var e2subs = '^    !';
        var expected = '-----#';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'wokka wokka');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with some and throw', function () {
        var e1 = hot('---^----a---b--|');
        var e1subs = '^  !';
        var e2 = hot('---^--#', undefined, 'wokka wokka');
        var e2subs = '^  !';
        var expected = '---#';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, { a: 1, b: 2 }, 'wokka wokka');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should work with throw and some', function () {
        var e1 = hot('---^--#', undefined, 'wokka wokka');
        var e1subs = '^  !';
        var e2 = hot('---^----a---b--|');
        var e2subs = '^  !';
        var expected = '---#';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'wokka wokka');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should handle throw after complete left', function () {
        var left = hot('--a--^--b---|');
        var leftSubs = '^      !';
        var right = hot('-----^--------#', undefined, 'bad things');
        var rightSubs = '^        !';
        var expected = '---------#';
        var result = Observable.of(left, right).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'bad things');
        expectSubscriptions(left.subscriptions).toBe(leftSubs);
        expectSubscriptions(right.subscriptions).toBe(rightSubs);
    });
    it('should handle throw after complete right', function () {
        var left = hot('-----^--------#', undefined, 'bad things');
        var leftSubs = '^        !';
        var right = hot('--a--^--b---|');
        var rightSubs = '^      !';
        var expected = '---------#';
        var result = Observable.of(left, right).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'bad things');
        expectSubscriptions(left.subscriptions).toBe(leftSubs);
        expectSubscriptions(right.subscriptions).toBe(rightSubs);
    });
    it('should handle interleaved with tail', function () {
        var e1 = hot('-a--^--b---c---|');
        var e1subs = '^          !';
        var e2 = hot('--d-^----e---f--|');
        var e2subs = '^           !';
        var expected = '-----x-y-z--|';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, { x: 'be', y: 'ce', z: 'cf' });
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should handle two consecutive hot observables', function () {
        var e1 = hot('--a--^--b--c--|');
        var e1subs = '^        !';
        var e2 = hot('-----^----------d--e--f--|');
        var e2subs = '^                   !';
        var expected = '-----------x--y--z--|';
        var result = Observable.of(e1, e2).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, { x: 'cd', y: 'ce', z: 'cf' });
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should handle two consecutive hot observables with error left', function () {
        var left = hot('--a--^--b--c--#', undefined, 'jenga');
        var leftSubs = '^        !';
        var right = hot('-----^----------d--e--f--|');
        var rightSubs = '^        !';
        var expected = '---------#';
        var result = Observable.of(left, right).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, null, 'jenga');
        expectSubscriptions(left.subscriptions).toBe(leftSubs);
        expectSubscriptions(right.subscriptions).toBe(rightSubs);
    });
    it('should handle two consecutive hot observables with error right', function () {
        var left = hot('--a--^--b--c--|');
        var leftSubs = '^        !';
        var right = hot('-----^----------d--e--f--#', undefined, 'dun dun dun');
        var rightSubs = '^                   !';
        var expected = '-----------x--y--z--#';
        var result = Observable.of(left, right).combineAll(function (x, y) { return x + y; });
        expectObservable(result).toBe(expected, { x: 'cd', y: 'ce', z: 'cf' }, 'dun dun dun');
        expectSubscriptions(left.subscriptions).toBe(leftSubs);
        expectSubscriptions(right.subscriptions).toBe(rightSubs);
    });
    it('should handle selector throwing', function () {
        var e1 = hot('--a--^--b--|');
        var e1subs = '^  !';
        var e2 = hot('--c--^--d--|');
        var e2subs = '^  !';
        var expected = '---#';
        var result = Observable.of(e1, e2).combineAll((function (x, y) { throw 'ha ha ' + x + ', ' + y; }));
        expectObservable(result).toBe(expected, null, 'ha ha b, d');
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(e2.subscriptions).toBe(e2subs);
    });
    it('should combine two observables', function (done) {
        var a = Observable.of(1, 2, 3);
        var b = Observable.of(4, 5, 6, 7, 8);
        var expected = [[3, 4], [3, 5], [3, 6], [3, 7], [3, 8]];
        Observable.of(a, b).combineAll().subscribe(function (vals) {
            chai_1.expect(vals).to.deep.equal(expected.shift());
        }, null, function () {
            chai_1.expect(expected.length).to.equal(0);
            done();
        });
    });
    it('should combine two immediately-scheduled observables', function (done) {
        var a = Observable.of(1, 2, 3, queueScheduler);
        var b = Observable.of(4, 5, 6, 7, 8, queueScheduler);
        var r = [[1, 4], [2, 4], [2, 5], [3, 5], [3, 6], [3, 7], [3, 8]];
        Observable.of(a, b, queueScheduler).combineAll()
            .subscribe(function (vals) {
            chai_1.expect(vals).to.deep.equal(r.shift());
        }, null, function () {
            chai_1.expect(r.length).to.equal(0);
            done();
        });
    });
});
//# sourceMappingURL=combineAll-spec.js.map