Home Manual Reference Source Test Repository

spec-js/operators/debounce-spec.js

"use strict";
var chai_1 = require('chai');
var Rx = require('../../dist/package/Rx');
var Observable = Rx.Observable;
/** @test {debounce} */
describe('Observable.prototype.debounce', function () {
    function getTimerSelector(x) {
        return function () { return Observable.timer(x, rxTestScheduler); };
    }
    asDiagram('debounce')('should debounce values by a specified cold Observable', function () {
        var e1 = hot('-a--bc--d---|');
        var e2 = cold('--|          ');
        var expected = '---a---c--d-|';
        var result = e1.debounce(function () { return e2; });
        expectObservable(result).toBe(expected);
    });
    it('should delay all element by selector observable', function () {
        var e1 = hot('--a--b--c--d---------|');
        var e1subs = '^                    !';
        var expected = '----a--b--c--d-------|';
        expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should debounce by selector observable', function () {
        var e1 = hot('--a--bc--d----|');
        var e1subs = '^             !';
        var expected = '----a---c--d--|';
        expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should complete when source does not emit', function () {
        var e1 = hot('-----|');
        var e1subs = '^    !';
        var expected = '-----|';
        expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should complete when source is empty', function () {
        var e1 = cold('|');
        var e1subs = '(^!)';
        var expected = '|';
        expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should raise error when source does not emit and raises error', function () {
        var e1 = hot('-----#');
        var e1subs = '^    !';
        var expected = '-----#';
        expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should raise error when source throws', function () {
        var e1 = cold('#');
        var e1subs = '(^!)';
        var expected = '#';
        expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should allow unsubscribing early and explicitly', function () {
        var e1 = hot('--a--bc--d----|');
        var e1subs = '^      !       ';
        var expected = '----a---       ';
        var unsub = '       !       ';
        var result = e1.debounce(getTimerSelector(20));
        expectObservable(result, unsub).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should not break unsubscription chains when unsubscribed explicitly', function () {
        var e1 = hot('--a--bc--d----|');
        var e1subs = '^      !       ';
        var expected = '----a---       ';
        var unsub = '       !       ';
        var result = e1
            .mergeMap(function (x) { return Observable.of(x); })
            .debounce(getTimerSelector(20))
            .mergeMap(function (x) { return Observable.of(x); });
        expectObservable(result, unsub).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should debounce and does not complete when source does not completes', function () {
        var e1 = hot('--a--bc--d---');
        var e1subs = '^            ';
        var expected = '----a---c--d-';
        expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should not completes when source does not completes', function () {
        var e1 = hot('-');
        var e1subs = '^';
        var expected = '-';
        expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should not completes when source never completes', function () {
        var e1 = cold('-');
        var e1subs = '^';
        var expected = '-';
        expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should delay all element until source raises error', function () {
        var e1 = hot('--a--b--c--d---------#');
        var e1subs = '^                    !';
        var expected = '----a--b--c--d-------#';
        expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should debounce all elements while source emits by selector observable', function () {
        var e1 = hot('---a---b---c---d---e|');
        var e1subs = '^                   !';
        var expected = '--------------------(e|)';
        expectObservable(e1.debounce(getTimerSelector(40))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should debounce all element while source emits by selector observable until raises error', function () {
        var e1 = hot('--a--b--c--d-#');
        var e1subs = '^            !';
        var expected = '-------------#';
        expectObservable(e1.debounce(getTimerSelector(50))).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should delay element by same selector observable emits multiple', function () {
        var e1 = hot('----a--b--c----d----e-------|');
        var e1subs = '^                           !';
        var expected = '------a--b--c----d----e-----|';
        var selector = cold('--x-y-');
        var selectorSubs = ['    ^ !                      ',
            '       ^ !                   ',
            '          ^ !                ',
            '               ^ !           ',
            '                    ^ !      '];
        expectObservable(e1.debounce(function () { return selector; })).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        expectSubscriptions(selector.subscriptions).toBe(selectorSubs);
    });
    it('should debounce by selector observable emits multiple', function () {
        var e1 = hot('----a--b--c----d----e-------|');
        var e1subs = '^                           !';
        var expected = '------a-----c---------e-----|';
        var selector = [cold('--x-y-'),
            cold('----x-y-'),
            cold('--x-y-'),
            cold('------x-y-'),
            cold('--x-y-')];
        var selectorSubs = ['    ^ !                      ',
            '       ^  !                  ',
            '          ^ !                ',
            '               ^    !        ',
            '                    ^ !      '];
        expectObservable(e1.debounce(function () { return selector.shift(); })).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        for (var i = 0; i < selectorSubs.length; i++) {
            expectSubscriptions(selector[i].subscriptions).toBe(selectorSubs[i]);
        }
    });
    it('should debounce by selector observable until source completes', function () {
        var e1 = hot('----a--b--c----d----e|');
        var e1subs = '^                    !';
        var expected = '------a-----c--------(e|)';
        var selector = [cold('--x-y-'),
            cold('----x-y-'),
            cold('--x-y-'),
            cold('------x-y-'),
            cold('--x-y-')];
        var selectorSubs = ['    ^ !               ',
            '       ^  !           ',
            '          ^ !         ',
            '               ^    ! ',
            '                    ^!'];
        expectObservable(e1.debounce(function () { return selector.shift(); })).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        for (var i = 0; i < selectorSubs.length; i++) {
            expectSubscriptions(selector[i].subscriptions).toBe(selectorSubs[i]);
        }
    });
    it('should raise error when selector observable raises error', function () {
        var e1 = hot('--------a--------b--------c---------|');
        var e1subs = '^                            !';
        var expected = '---------a---------b---------#';
        var selector = [cold('-x-y-'),
            cold('--x-y-'),
            cold('---#')];
        var selectorSubs = ['        ^!                    ',
            '                 ^ !          ',
            '                          ^  !'];
        expectObservable(e1.debounce(function () { return selector.shift(); })).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        for (var i = 0; i < selectorSubs.length; i++) {
            expectSubscriptions(selector[i].subscriptions).toBe(selectorSubs[i]);
        }
    });
    it('should raise error when source raises error with selector observable', function () {
        var e1 = hot('--------a--------b--------c---------d#');
        var e1subs = '^                                    !';
        var expected = '---------a---------b---------c-------#';
        var selector = [cold('-x-y-'),
            cold('--x-y-'),
            cold('---x-y-'),
            cold('----x-y-')];
        var selectorSubs = ['        ^!                            ',
            '                 ^ !                  ',
            '                          ^  !        ',
            '                                    ^!'];
        expectObservable(e1.debounce(function () { return selector.shift(); })).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        for (var i = 0; i < selectorSubs.length; i++) {
            expectSubscriptions(selector[i].subscriptions).toBe(selectorSubs[i]);
        }
    });
    it('should raise error when selector function throws', function () {
        var e1 = hot('--------a--------b--------c---------|');
        var e1subs = '^                         !';
        var expected = '---------a---------b------#';
        var selector = [cold('-x-y-'),
            cold('--x-y-')];
        var selectorSubs = ['        ^!                            ',
            '                 ^ !                  '];
        function selectorFunction(x) {
            if (x !== 'c') {
                return selector.shift();
            }
            else {
                throw 'error';
            }
        }
        expectObservable(e1.debounce(selectorFunction)).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        for (var i = 0; i < selectorSubs.length; i++) {
            expectSubscriptions(selector[i].subscriptions).toBe(selectorSubs[i]);
        }
    });
    it('should mirror the source when given an empty selector Observable', function () {
        var e1 = hot('--------a-x-yz---bxy---z--c--x--y--z|');
        var e1subs = '^                                   !';
        var expected = '--------a-x-yz---bxy---z--c--x--y--z|';
        function selectorFunction(x) { return Observable.empty(); }
        expectObservable(e1.debounce(selectorFunction)).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should ignore all values except last, when given a never selector Observable', function () {
        var e1 = hot('--------a-x-yz---bxy---z--c--x--y--z|');
        var e1subs = '^                                   !';
        var expected = '------------------------------------(z|)';
        function selectorFunction(x) { return Observable.never(); }
        expectObservable(e1.debounce(selectorFunction)).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
    it('should delay element by selector observable completes when it does not emits', function () {
        var e1 = hot('--------a--------b--------c---------|');
        var e1subs = '^                                   !';
        var expected = '---------a---------b---------c------|';
        var selector = [cold('-|'),
            cold('--|'),
            cold('---|')];
        var selectorSubs = ['        ^!                           ',
            '                 ^ !                 ',
            '                          ^  !       '];
        expectObservable(e1.debounce(function () { return selector.shift(); })).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        for (var i = 0; i < selectorSubs.length; i++) {
            expectSubscriptions(selector[i].subscriptions).toBe(selectorSubs[i]);
        }
    });
    it('should debounce by selector observable completes when it does not emits', function () {
        var e1 = hot('----a--b-c---------de-------------|');
        var e1subs = '^                                 !';
        var expected = '-----a------c------------e--------|';
        var selector = [cold('-|'),
            cold('--|'),
            cold('---|'),
            cold('----|'),
            cold('-----|')];
        var selectorSubs = ['    ^!                             ',
            '       ^ !                         ',
            '         ^  !                      ',
            '                   ^!              ',
            '                    ^    !         '];
        expectObservable(e1.debounce(function () { return selector.shift(); })).toBe(expected);
        expectSubscriptions(e1.subscriptions).toBe(e1subs);
        for (var i = 0; i < selectorSubs.length; i++) {
            expectSubscriptions(selector[i].subscriptions).toBe(selectorSubs[i]);
        }
    });
    it('should delay by promise resolves', function (done) {
        var e1 = Observable.concat(Observable.of(1), Observable.timer(10).mapTo(2), Observable.timer(10).mapTo(3), Observable.timer(100).mapTo(4));
        var expected = [1, 2, 3, 4];
        e1.debounce(function () {
            return new Promise(function (resolve) { resolve(42); });
        }).subscribe(function (x) {
            chai_1.expect(x).to.equal(expected.shift());
        }, function (x) {
            done(new Error('should not be called'));
        }, function () {
            chai_1.expect(expected.length).to.equal(0);
            done();
        });
    });
    it('should raises error when promise rejects', function (done) {
        var e1 = Observable.concat(Observable.of(1), Observable.timer(10).mapTo(2), Observable.timer(10).mapTo(3), Observable.timer(100).mapTo(4));
        var expected = [1, 2];
        var error = new Error('error');
        e1.debounce(function (x) {
            if (x === 3) {
                return new Promise(function (resolve, reject) { reject(error); });
            }
            else {
                return new Promise(function (resolve) { resolve(42); });
            }
        }).subscribe(function (x) {
            chai_1.expect(x).to.equal(expected.shift());
        }, function (err) {
            chai_1.expect(err).to.be.an('error', 'error');
            chai_1.expect(expected.length).to.equal(0);
            done();
        }, function () {
            done(new Error('should not be called'));
        });
    });
});
//# sourceMappingURL=debounce-spec.js.map