UNPKG

@reactivex/rxjs

Version:

Reactive Extensions for modern JavaScript

303 lines 14.6 kB
"use strict"; var chai_1 = require('chai'); var Rx = require('../../dist/cjs/Rx'); var Notification = Rx.Notification; var TestScheduler = Rx.TestScheduler; /** @test {TestScheduler} */ describe('TestScheduler', function () { it('should exist', function () { chai_1.expect(TestScheduler).exist; chai_1.expect(TestScheduler).to.be.a('function'); }); describe('parseMarbles()', function () { it('should parse a marble string into a series of notifications and types', function () { var result = TestScheduler.parseMarbles('-------a---b---|', { a: 'A', b: 'B' }); chai_1.expect(result).deep.equal([ { frame: 70, notification: Notification.createNext('A') }, { frame: 110, notification: Notification.createNext('B') }, { frame: 150, notification: Notification.createComplete() } ]); }); it('should parse a marble string, allowing spaces too', function () { var result = TestScheduler.parseMarbles('--a--b--| ', { a: 'A', b: 'B' }); chai_1.expect(result).deep.equal([ { frame: 20, notification: Notification.createNext('A') }, { frame: 50, notification: Notification.createNext('B') }, { frame: 80, notification: Notification.createComplete() } ]); }); it('should parse a marble string with a subscription point', function () { var result = TestScheduler.parseMarbles('---^---a---b---|', { a: 'A', b: 'B' }); chai_1.expect(result).deep.equal([ { frame: 40, notification: Notification.createNext('A') }, { frame: 80, notification: Notification.createNext('B') }, { frame: 120, notification: Notification.createComplete() } ]); }); it('should parse a marble string with an error', function () { var result = TestScheduler.parseMarbles('-------a---b---#', { a: 'A', b: 'B' }, 'omg error!'); chai_1.expect(result).deep.equal([ { frame: 70, notification: Notification.createNext('A') }, { frame: 110, notification: Notification.createNext('B') }, { frame: 150, notification: Notification.createError('omg error!') } ]); }); it('should default in the letter for the value if no value hash was passed', function () { var result = TestScheduler.parseMarbles('--a--b--c--'); chai_1.expect(result).deep.equal([ { frame: 20, notification: Notification.createNext('a') }, { frame: 50, notification: Notification.createNext('b') }, { frame: 80, notification: Notification.createNext('c') }, ]); }); it('should handle grouped values', function () { var result = TestScheduler.parseMarbles('---(abc)---'); chai_1.expect(result).deep.equal([ { frame: 30, notification: Notification.createNext('a') }, { frame: 30, notification: Notification.createNext('b') }, { frame: 30, notification: Notification.createNext('c') } ]); }); }); describe('parseMarblesAsSubscriptions()', function () { it('should parse a subscription marble string into a subscriptionLog', function () { var result = TestScheduler.parseMarblesAsSubscriptions('---^---!-'); chai_1.expect(result.subscribedFrame).to.equal(30); chai_1.expect(result.unsubscribedFrame).to.equal(70); }); it('should parse a subscription marble string with an unsubscription', function () { var result = TestScheduler.parseMarblesAsSubscriptions('---^-'); chai_1.expect(result.subscribedFrame).to.equal(30); chai_1.expect(result.unsubscribedFrame).to.equal(Number.POSITIVE_INFINITY); }); it('should parse a subscription marble string with a synchronous unsubscription', function () { var result = TestScheduler.parseMarblesAsSubscriptions('---(^!)-'); chai_1.expect(result.subscribedFrame).to.equal(30); chai_1.expect(result.unsubscribedFrame).to.equal(30); }); }); describe('time()', function () { it('should parse a simple time marble string to a number', function () { var scheduler = new TestScheduler(null); var time = scheduler.time('-----|'); chai_1.expect(time).to.equal(50); }); it('should throw if not given good marble input', function () { var scheduler = new TestScheduler(null); chai_1.expect(function () { scheduler.time('-a-b-#'); }).to.throw(); }); }); describe('cold()', function () { it('should create a cold observable', function () { var expected = ['A', 'B']; var scheduler = new TestScheduler(null); var source = scheduler.cold('--a---b--|', { a: 'A', b: 'B' }); chai_1.expect(source instanceof Rx.Observable).to.be.true; source.subscribe(function (x) { chai_1.expect(x).to.equal(expected.shift()); }); scheduler.flush(); chai_1.expect(expected.length).to.equal(0); }); }); describe('hot()', function () { it('should create a cold observable', function () { var expected = ['A', 'B']; var scheduler = new TestScheduler(null); var source = scheduler.hot('--a---b--|', { a: 'A', b: 'B' }); chai_1.expect(source).to.be.an.instanceof(Rx.Subject); source.subscribe(function (x) { chai_1.expect(x).to.equal(expected.shift()); }); scheduler.flush(); chai_1.expect(expected.length).to.equal(0); }); }); describe('jasmine helpers', function () { describe('rxTestScheduler', function () { it('should exist', function () { chai_1.expect(rxTestScheduler).to.be.an.instanceof(TestScheduler); }); }); describe('cold()', function () { it('should exist', function () { chai_1.expect(cold).to.exist; chai_1.expect(cold).to.be.a('function'); }); it('should create a cold observable', function () { var expected = [1, 2]; var source = cold('-a-b-|', { a: 1, b: 2 }); source.subscribe(function (x) { chai_1.expect(x).to.equal(expected.shift()); }, null, function () { chai_1.expect(expected.length).to.equal(0); }); expectObservable(source).toBe('-a-b-|', { a: 1, b: 2 }); }); }); describe('hot()', function () { it('should exist', function () { chai_1.expect(hot).to.exist; chai_1.expect(hot).to.be.a('function'); }); it('should create a hot observable', function () { var source = hot('---^-a-b-|', { a: 1, b: 2 }); chai_1.expect(source instanceof Rx.Subject).to.be.true; expectObservable(source).toBe('--a-b-|', { a: 1, b: 2 }); }); }); describe('time()', function () { it('should exist', function () { chai_1.expect(time).to.exist; chai_1.expect(time).to.be.a('function'); }); it('should parse a simple time marble string to a number', function () { chai_1.expect(time('-----|')).to.equal(50); }); }); describe('expectObservable()', function () { it('should exist', function () { chai_1.expect(expectObservable).to.exist; chai_1.expect(expectObservable).to.be.a('function'); }); it('should return an object with a toBe function', function () { chai_1.expect(expectObservable(Rx.Observable.of(1)).toBe).to.be.a('function'); }); it('should append to flushTests array', function () { expectObservable(Rx.Observable.empty()); chai_1.expect(rxTestScheduler.flushTests.length).to.equal(1); }); it('should handle empty', function () { expectObservable(Rx.Observable.empty()).toBe('|', {}); }); it('should handle never', function () { expectObservable(Rx.Observable.never()).toBe('-', {}); expectObservable(Rx.Observable.never()).toBe('---', {}); }); it('should accept an unsubscription marble diagram', function () { var source = hot('---^-a-b-|'); var unsubscribe = '---!'; var expected = '--a'; expectObservable(source, unsubscribe).toBe(expected); }); }); describe('expectSubscriptions()', function () { it('should exist', function () { chai_1.expect(expectSubscriptions).to.exist; chai_1.expect(expectSubscriptions).to.be.a('function'); }); it('should return an object with a toBe function', function () { chai_1.expect(expectSubscriptions([]).toBe).to.be.a('function'); }); it('should append to flushTests array', function () { expectSubscriptions([]); chai_1.expect(rxTestScheduler.flushTests.length).to.equal(1); }); it('should assert subscriptions of a cold observable', function () { var source = cold('---a---b-|'); var subs = '^--------!'; expectSubscriptions(source.subscriptions).toBe(subs); source.subscribe(); }); }); describe('end-to-end helper tests', function () { it('should be awesome', function () { var values = { a: 1, b: 2 }; var myObservable = cold('---a---b--|', values); var subs = '^---------!'; expectObservable(myObservable).toBe('---a---b--|', values); expectSubscriptions(myObservable.subscriptions).toBe(subs); }); it('should support testing metastreams', function () { var x = cold('-a-b|'); var y = cold('-c-d|'); var myObservable = hot('---x---y----|', { x: x, y: y }); var expected = '---x---y----|'; var expectedx = cold('-a-b|'); var expectedy = cold('-c-d|'); expectObservable(myObservable).toBe(expected, { x: expectedx, y: expectedy }); }); }); }); describe('TestScheduler.run()', function () { it('should provide an instance of TestScheduler', function () { var called = false; TestScheduler.run(function (scheduler) { called = true; chai_1.expect(scheduler).to.be.an.instanceOf(TestScheduler); }); chai_1.expect(called).to.be.true; }); it('should flush the provided test scheduler after it executes the callback', function () { var results = []; TestScheduler.run(function (scheduler) { var s = scheduler.hot('--^--a--b--c--|'); s.subscribe(function (x) { results.push(x); }); chai_1.expect(results).to.deep.equal([]); }); chai_1.expect(results).to.deep.equal(['a', 'b', 'c']); }); it('should use TestScheduler.assertDeepEqual to compare observable notifications', function () { var called = 0; TestScheduler.assertDeepEqual = function (a, b) { called++; chai_1.expect(a).to.deep.equal(b); }; TestScheduler.run(function (scheduler) { chai_1.expect(scheduler.assertDeepEqual).to.equal(TestScheduler.assertDeepEqual); var s = scheduler.cold('--a--b--c--|'); scheduler.expectObservable(s).toBe('--a--b--c--|'); }); chai_1.expect(called).to.equal(1); }); it('should patch schedulers provided in TestScheduler.schedulersToPatch', function () { var scheduleFn = function (action, delay, state) { if (delay === void 0) { delay = 0; } return new Rx.Subscription(); }; var nowFn = function () { return 1337; }; var fakeScheduler = { schedule: scheduleFn, now: nowFn }; TestScheduler.schedulersToPatch = [ fakeScheduler ]; TestScheduler.run(function (scheduler) { chai_1.expect(fakeScheduler.now).not.to.equal(nowFn); chai_1.expect(fakeScheduler.schedule).not.to.equal(scheduleFn); }); chai_1.expect(fakeScheduler.now).to.equal(nowFn); chai_1.expect(fakeScheduler.schedule).to.equal(scheduleFn); }); it('should run patched Rx library schedulers in the proper order', function () { var queue = Rx.Scheduler.queue; var asap = Rx.Scheduler.asap; var async = Rx.Scheduler.async; var animationFrame = Rx.Scheduler.animationFrame; var results = []; TestScheduler.schedulersToPatch = [ queue, asap, async, animationFrame ]; TestScheduler.run(function (scheduler) { scheduler.schedule(function () { return results.push('testScheduler'); }); animationFrame.schedule(function () { return results.push('animationFrame'); }); async.schedule(function () { return results.push('async'); }); asap.schedule(function () { return results.push('asap'); }); queue.schedule(function () { return results.push('queue'); }); chai_1.expect(results).to.deep.equal([]); }); chai_1.expect(results).to.deep.equal(['testScheduler', 'queue', 'asap', 'async', 'animationFrame']); }); }); }); //# sourceMappingURL=TestScheduler-spec.js.map