| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 | "use strict";var __extends = (this && this.__extends) || (function () {    var extendStatics = function (d, b) {        extendStatics = Object.setPrototypeOf ||            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };        return extendStatics(d, b);    }    return function (d, b) {        extendStatics(d, b);        function __() { this.constructor = d; }        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());    };})();Object.defineProperty(exports, "__esModule", { value: true });var Observable_1 = require("../Observable");var Notification_1 = require("../Notification");var ColdObservable_1 = require("./ColdObservable");var HotObservable_1 = require("./HotObservable");var SubscriptionLog_1 = require("./SubscriptionLog");var VirtualTimeScheduler_1 = require("../scheduler/VirtualTimeScheduler");var AsyncScheduler_1 = require("../scheduler/AsyncScheduler");var defaultMaxFrame = 750;var TestScheduler = (function (_super) {    __extends(TestScheduler, _super);    function TestScheduler(assertDeepEqual) {        var _this = _super.call(this, VirtualTimeScheduler_1.VirtualAction, defaultMaxFrame) || this;        _this.assertDeepEqual = assertDeepEqual;        _this.hotObservables = [];        _this.coldObservables = [];        _this.flushTests = [];        _this.runMode = false;        return _this;    }    TestScheduler.prototype.createTime = function (marbles) {        var indexOf = marbles.indexOf('|');        if (indexOf === -1) {            throw new Error('marble diagram for time should have a completion marker "|"');        }        return indexOf * TestScheduler.frameTimeFactor;    };    TestScheduler.prototype.createColdObservable = function (marbles, values, error) {        if (marbles.indexOf('^') !== -1) {            throw new Error('cold observable cannot have subscription offset "^"');        }        if (marbles.indexOf('!') !== -1) {            throw new Error('cold observable cannot have unsubscription marker "!"');        }        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);        var cold = new ColdObservable_1.ColdObservable(messages, this);        this.coldObservables.push(cold);        return cold;    };    TestScheduler.prototype.createHotObservable = function (marbles, values, error) {        if (marbles.indexOf('!') !== -1) {            throw new Error('hot observable cannot have unsubscription marker "!"');        }        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);        var subject = new HotObservable_1.HotObservable(messages, this);        this.hotObservables.push(subject);        return subject;    };    TestScheduler.prototype.materializeInnerObservable = function (observable, outerFrame) {        var _this = this;        var messages = [];        observable.subscribe(function (value) {            messages.push({ frame: _this.frame - outerFrame, notification: Notification_1.Notification.createNext(value) });        }, function (err) {            messages.push({ frame: _this.frame - outerFrame, notification: Notification_1.Notification.createError(err) });        }, function () {            messages.push({ frame: _this.frame - outerFrame, notification: Notification_1.Notification.createComplete() });        });        return messages;    };    TestScheduler.prototype.expectObservable = function (observable, subscriptionMarbles) {        var _this = this;        if (subscriptionMarbles === void 0) { subscriptionMarbles = null; }        var actual = [];        var flushTest = { actual: actual, ready: false };        var subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);        var subscriptionFrame = subscriptionParsed.subscribedFrame === Number.POSITIVE_INFINITY ?            0 : subscriptionParsed.subscribedFrame;        var unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;        var subscription;        this.schedule(function () {            subscription = observable.subscribe(function (x) {                var value = x;                if (x instanceof Observable_1.Observable) {                    value = _this.materializeInnerObservable(value, _this.frame);                }                actual.push({ frame: _this.frame, notification: Notification_1.Notification.createNext(value) });            }, function (err) {                actual.push({ frame: _this.frame, notification: Notification_1.Notification.createError(err) });            }, function () {                actual.push({ frame: _this.frame, notification: Notification_1.Notification.createComplete() });            });        }, subscriptionFrame);        if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {            this.schedule(function () { return subscription.unsubscribe(); }, unsubscriptionFrame);        }        this.flushTests.push(flushTest);        var runMode = this.runMode;        return {            toBe: function (marbles, values, errorValue) {                flushTest.ready = true;                flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);            }        };    };    TestScheduler.prototype.expectSubscriptions = function (actualSubscriptionLogs) {        var flushTest = { actual: actualSubscriptionLogs, ready: false };        this.flushTests.push(flushTest);        var runMode = this.runMode;        return {            toBe: function (marbles) {                var marblesArray = (typeof marbles === 'string') ? [marbles] : marbles;                flushTest.ready = true;                flushTest.expected = marblesArray.map(function (marbles) {                    return TestScheduler.parseMarblesAsSubscriptions(marbles, runMode);                });            }        };    };    TestScheduler.prototype.flush = function () {        var _this = this;        var hotObservables = this.hotObservables;        while (hotObservables.length > 0) {            hotObservables.shift().setup();        }        _super.prototype.flush.call(this);        this.flushTests = this.flushTests.filter(function (test) {            if (test.ready) {                _this.assertDeepEqual(test.actual, test.expected);                return false;            }            return true;        });    };    TestScheduler.parseMarblesAsSubscriptions = function (marbles, runMode) {        var _this = this;        if (runMode === void 0) { runMode = false; }        if (typeof marbles !== 'string') {            return new SubscriptionLog_1.SubscriptionLog(Number.POSITIVE_INFINITY);        }        var len = marbles.length;        var groupStart = -1;        var subscriptionFrame = Number.POSITIVE_INFINITY;        var unsubscriptionFrame = Number.POSITIVE_INFINITY;        var frame = 0;        var _loop_1 = function (i) {            var nextFrame = frame;            var advanceFrameBy = function (count) {                nextFrame += count * _this.frameTimeFactor;            };            var c = marbles[i];            switch (c) {                case ' ':                    if (!runMode) {                        advanceFrameBy(1);                    }                    break;                case '-':                    advanceFrameBy(1);                    break;                case '(':                    groupStart = frame;                    advanceFrameBy(1);                    break;                case ')':                    groupStart = -1;                    advanceFrameBy(1);                    break;                case '^':                    if (subscriptionFrame !== Number.POSITIVE_INFINITY) {                        throw new Error('found a second subscription point \'^\' in a ' +                            'subscription marble diagram. There can only be one.');                    }                    subscriptionFrame = groupStart > -1 ? groupStart : frame;                    advanceFrameBy(1);                    break;                case '!':                    if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {                        throw new Error('found a second subscription point \'^\' in a ' +                            'subscription marble diagram. There can only be one.');                    }                    unsubscriptionFrame = groupStart > -1 ? groupStart : frame;                    break;                default:                    if (runMode && c.match(/^[0-9]$/)) {                        if (i === 0 || marbles[i - 1] === ' ') {                            var buffer = marbles.slice(i);                            var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);                            if (match) {                                i += match[0].length - 1;                                var duration = parseFloat(match[1]);                                var unit = match[2];                                var durationInMs = void 0;                                switch (unit) {                                    case 'ms':                                        durationInMs = duration;                                        break;                                    case 's':                                        durationInMs = duration * 1000;                                        break;                                    case 'm':                                        durationInMs = duration * 1000 * 60;                                        break;                                    default:                                        break;                                }                                advanceFrameBy(durationInMs / this_1.frameTimeFactor);                                break;                            }                        }                    }                    throw new Error('there can only be \'^\' and \'!\' markers in a ' +                        'subscription marble diagram. Found instead \'' + c + '\'.');            }            frame = nextFrame;            out_i_1 = i;        };        var this_1 = this, out_i_1;        for (var i = 0; i < len; i++) {            _loop_1(i);            i = out_i_1;        }        if (unsubscriptionFrame < 0) {            return new SubscriptionLog_1.SubscriptionLog(subscriptionFrame);        }        else {            return new SubscriptionLog_1.SubscriptionLog(subscriptionFrame, unsubscriptionFrame);        }    };    TestScheduler.parseMarbles = function (marbles, values, errorValue, materializeInnerObservables, runMode) {        var _this = this;        if (materializeInnerObservables === void 0) { materializeInnerObservables = false; }        if (runMode === void 0) { runMode = false; }        if (marbles.indexOf('!') !== -1) {            throw new Error('conventional marble diagrams cannot have the ' +                'unsubscription marker "!"');        }        var len = marbles.length;        var testMessages = [];        var subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');        var frame = subIndex === -1 ? 0 : (subIndex * -this.frameTimeFactor);        var getValue = typeof values !== 'object' ?            function (x) { return x; } :            function (x) {                if (materializeInnerObservables && values[x] instanceof ColdObservable_1.ColdObservable) {                    return values[x].messages;                }                return values[x];            };        var groupStart = -1;        var _loop_2 = function (i) {            var nextFrame = frame;            var advanceFrameBy = function (count) {                nextFrame += count * _this.frameTimeFactor;            };            var notification = void 0;            var c = marbles[i];            switch (c) {                case ' ':                    if (!runMode) {                        advanceFrameBy(1);                    }                    break;                case '-':                    advanceFrameBy(1);                    break;                case '(':                    groupStart = frame;                    advanceFrameBy(1);                    break;                case ')':                    groupStart = -1;                    advanceFrameBy(1);                    break;                case '|':                    notification = Notification_1.Notification.createComplete();                    advanceFrameBy(1);                    break;                case '^':                    advanceFrameBy(1);                    break;                case '#':                    notification = Notification_1.Notification.createError(errorValue || 'error');                    advanceFrameBy(1);                    break;                default:                    if (runMode && c.match(/^[0-9]$/)) {                        if (i === 0 || marbles[i - 1] === ' ') {                            var buffer = marbles.slice(i);                            var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);                            if (match) {                                i += match[0].length - 1;                                var duration = parseFloat(match[1]);                                var unit = match[2];                                var durationInMs = void 0;                                switch (unit) {                                    case 'ms':                                        durationInMs = duration;                                        break;                                    case 's':                                        durationInMs = duration * 1000;                                        break;                                    case 'm':                                        durationInMs = duration * 1000 * 60;                                        break;                                    default:                                        break;                                }                                advanceFrameBy(durationInMs / this_2.frameTimeFactor);                                break;                            }                        }                    }                    notification = Notification_1.Notification.createNext(getValue(c));                    advanceFrameBy(1);                    break;            }            if (notification) {                testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification: notification });            }            frame = nextFrame;            out_i_2 = i;        };        var this_2 = this, out_i_2;        for (var i = 0; i < len; i++) {            _loop_2(i);            i = out_i_2;        }        return testMessages;    };    TestScheduler.prototype.run = function (callback) {        var prevFrameTimeFactor = TestScheduler.frameTimeFactor;        var prevMaxFrames = this.maxFrames;        TestScheduler.frameTimeFactor = 1;        this.maxFrames = Number.POSITIVE_INFINITY;        this.runMode = true;        AsyncScheduler_1.AsyncScheduler.delegate = this;        var helpers = {            cold: this.createColdObservable.bind(this),            hot: this.createHotObservable.bind(this),            flush: this.flush.bind(this),            expectObservable: this.expectObservable.bind(this),            expectSubscriptions: this.expectSubscriptions.bind(this),        };        try {            var ret = callback(helpers);            this.flush();            return ret;        }        finally {            TestScheduler.frameTimeFactor = prevFrameTimeFactor;            this.maxFrames = prevMaxFrames;            this.runMode = false;            AsyncScheduler_1.AsyncScheduler.delegate = undefined;        }    };    return TestScheduler;}(VirtualTimeScheduler_1.VirtualTimeScheduler));exports.TestScheduler = TestScheduler;//# sourceMappingURL=TestScheduler.js.map
 |