UNPKG

@enact/core

Version:

Enact is an open source JavaScript framework containing everything you need to create a fast, scalable mobile or web application.

275 lines (274 loc) 8.26 kB
"use strict"; var _react = require("@testing-library/react"); var _Job = _interopRequireDefault(require("../Job")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } describe('Job', function () { beforeEach(function () { jest.useFakeTimers(); }); afterEach(function () { jest.useRealTimers(); }); describe('#start', function () { test('should start job', function (done) { var j = new _Job["default"](done, 10); j.start(); jest.runAllTimers(); }); test('should pass args to fn', function (done) { var value = 'argument'; var fn = function fn(arg) { if (arg === value) { done(); } else { done(new Error('fn did not receive argument')); } }; var j = new _Job["default"](fn, 10); j.start(value); jest.runAllTimers(); }); }); describe('#stop', function () { test('should stop job', function (done) { var ran = false; var j = new _Job["default"](function () { ran = true; done(new Error('job wasn\'t stopped')); }, 10); j.start(); j.stop(); (0, _react.act)(function () { return jest.advanceTimersByTime(30); }); if (!ran) done(); }); test('should stop requestAnimationFrame job', function (done) { var ran = false; var j = new _Job["default"](function () { ran = true; done(new Error('job wasn\'t stopped')); }, 10); j.startRaf(); j.stop(); (0, _react.act)(function () { return jest.advanceTimersByTime(30); }); if (!ran) done(); }); }); describe('#throttle', function () { test('should throttle job', function (done) { var number = 0; var j = new _Job["default"](function () { number++; }, 20); j.throttle(); (0, _react.act)(function () { return jest.advanceTimersByTime(5); }); j.throttle(); (0, _react.act)(function () { return jest.advanceTimersByTime(10); }); j.throttle(); (0, _react.act)(function () { return jest.advanceTimersByTime(10); }); j.throttle(); (0, _react.act)(function () { return jest.advanceTimersByTime(5); }); if (number === 2) { done(); } else { done(new Error('too many or too few calls' + number)); } }); test('should pass args to fn', function (done) { var value = 'argument'; var fn = function fn(arg) { if (arg === value) { done(); } else { done(new Error('fn did not receive argument')); } }; var j = new _Job["default"](fn, 10); j.throttle(value); }); }); describe('#idle', function () { // polyfill for PhantomJS to verify expected idle behavior as much as possible var windowRequest = window.requestIdleCallback; var windowCancel = window.cancelIdleCallback; beforeAll(function () { window.requestIdleCallback = windowRequest || function (fn) { return setTimeout(fn, 0); }; window.cancelIdleCallback = windowCancel || function (id) { clearTimeout(id); }; }); afterAll(function () { window.requestIdleCallback = windowRequest; window.cancelIdleCallback = windowCancel; }); test('should start job', function (done) { var j = new _Job["default"](done, 10); j.idle(); jest.runAllTimers(); }); test('should pass args to fn', function (done) { var value = 'argument'; var fn = function fn(arg) { if (arg === value) { done(); } else { done(new Error('fn did not receive argument')); } }; var j = new _Job["default"](fn, 10); j.idle(value); jest.runAllTimers(); }); test('should clear an existing job id before starting job', function (done) { var fn = function fn(arg) { if (arg === 'first') { done(new Error('First job ran')); } else { done(); } }; var j = new _Job["default"](fn); j.idle('first'); j.idle('second'); jest.runAllTimers(); }); test('should start job when it cannot request idle callback', function (done) { var backup = window.requestIdleCallback; window.requestIdleCallback = null; var j = new _Job["default"](done, 0); j.idle(); jest.runAllTimers(); window.requestIdleCallback = backup; }); }); describe('#startRaf', function () { test('should start job', function (done) { var j = new _Job["default"](done, 10); j.startRaf(); jest.runAllTimers(); }); test('should pass args to fn', function (done) { var value = 'argument'; var fn = function fn(arg) { if (arg === value) { done(); } else { done(new Error('fn did not receive argument')); } }; var j = new _Job["default"](fn, 10); j.startRaf(value); jest.runAllTimers(); }); test('should start job immediately when window is not defined', function (done) { function returnsUndefined() {} var windowSpy = jest.spyOn(window, 'window', 'get').mockImplementation(returnsUndefined); var j = new _Job["default"](done, 0); j.startRaf(); windowSpy.mockRestore(); }); }); describe('#promise', function () { test('should throw when passed a non-thenable argument', function (done) { var j = new _Job["default"](function () { return done(new Error('Unexpected job execution')); }); try { j.promise({}); } catch (msg) { done(); } }); test('should support a non-Promise, thenable argument', function (done) { var j = new _Job["default"](function () { return done(); }); try { j.promise({ then: function then(fn) { return fn(true); } }); } catch (msg) { done(msg); } }); test('should start job for a resolved promise', function (done) { var j = new _Job["default"](function () { return done(); }); j.promise(Promise.resolve(true)); }); test('should not start job for a rejected promise', function (done) { var j = new _Job["default"](function () { done(new Error('Job ran for rejected promise')); }); j.promise(Promise.reject(true))["catch"](function () {}); (0, _react.act)(function () { return jest.advanceTimersByTime(10); }); done(); }); test('should not start job when stopped before promise resolves', function (done) { var j = new _Job["default"](function () { done(new Error('Job ran for stopped promise')); }); j.promise(new Promise(function (resolve) { return setTimeout(resolve, 20); })); (0, _react.act)(function () { return jest.advanceTimersByTime(10); }); j.stop(); (0, _react.act)(function () { return jest.advanceTimersByTime(20); }); done(); }); test('should not start job when another is started', function (done) { var j = new _Job["default"](function (value) { expect(value).toBe(2); done(); }); j.promise(new Promise(function (resolve) { return resolve(1); })); j.promise(new Promise(function (resolve) { return resolve(2); })); }); test('should return the value from the job to the resolved promise', function (done) { var j = new _Job["default"](function () { return 'job value'; }); j.promise(Promise.resolve(true)).then(function (value) { expect(value).toBe('job value'); done(); }); }); test('should not return the value from the job to the replaced promise', function (done) { var j = new _Job["default"](function () { return 'job value'; }); j.promise(Promise.resolve(true)).then(function (value) { expect(value).toBeUndefined(); }); j.promise(Promise.resolve(true)).then(function () { return done(); }); }); }); });