import config from 'core/config' import { queueWatcher } from 'core/observer/scheduler' describe('Scheduler', () => { let spy beforeEach(() => { spy = jasmine.createSpy('scheduler') }) it('queueWatcher', done => { queueWatcher({ run: spy }) waitForUpdate(() => { expect(spy.calls.count()).toBe(1) }).then(done) }) it('dedup', done => { queueWatcher({ id: 1, run: spy }) queueWatcher({ id: 1, run: spy }) waitForUpdate(() => { expect(spy.calls.count()).toBe(1) }).then(done) }) it('allow diplicate when flushing', done => { const job = { id: 1, run: spy } queueWatcher(job) queueWatcher({ id: 2, run () { queueWatcher(job) } }) waitForUpdate(() => { expect(spy.calls.count()).toBe(2) }).then(done) }) it('calls user watchers after directive updates', done => { const vals = [] function run () { vals.push(this.id) } queueWatcher({ id: 2, user: true, run () { run.call(this) // user watcher triggering another directive update! queueWatcher({ id: 3, run: run }) } }) queueWatcher({ id: 1, run: run }) waitForUpdate(() => { expect(vals[0]).toBe(1) expect(vals[1]).toBe(2) expect(vals[2]).toBe(3) }).then(done) }) it('warn against infinite update loops', function (done) { let count = 0 const job = { id: 1, run () { count++ queueWatcher(job) } } queueWatcher(job) waitForUpdate(() => { expect(count).toBe(config._maxUpdateCount + 1) expect('infinite update loop').toHaveBeenWarned() }).then(done) }) it('should call newly pushed watcher after current watcher is done', done => { const callOrder = [] queueWatcher({ id: 1, user: true, run () { callOrder.push(1) queueWatcher({ id: 2, run () { callOrder.push(3) } }) callOrder.push(2) } }) waitForUpdate(() => { expect(callOrder.join()).toBe('1,2,3') }).then(done) }) })