angular/packages/zone.js/test/browser/requestAnimationFrame.spec.ts
Paul Gschwendtner d2b444a8a2 test: update tests to account for karma-jasmine v5.0.0
Karma jasmine updated the `jasmine-core` dependency. Jasmine is now more
strict when:

* The done callback is invoked multiple times
* The done callback is used, while a promise is also returned
* The done callback is treated as error when e.g. a number is returned
  as first argument. This was the case with `requestAnimationFrame`.
2022-07-18 19:19:00 +02:00

57 lines
1.9 KiB
TypeScript

/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
describe('requestAnimationFrame', function() {
const functions =
['requestAnimationFrame', 'webkitRequestAnimationFrame', 'mozRequestAnimationFrame'];
functions.forEach(function(fnName) {
if ((global as any)[fnName] !== undefined) {
describe(fnName, function() {
const originalTimeout: number = (<any>jasmine).DEFAULT_TIMEOUT_INTERVAL;
beforeEach(() => {
(<any>jasmine).DEFAULT_TIMEOUT_INTERVAL = 10000;
});
afterEach(() => {
(<any>jasmine).DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
});
const requestAnimationFrameFn = (window as any)[fnName];
it('should be tolerant of invalid arguments', function() {
// requestAnimationFrameFn throws an error on invalid arguments, so expect that.
expect(function() {
requestAnimationFrameFn(null);
}).toThrow();
});
it('should bind to same zone when called recursively', function(done) {
Zone.current.fork({name: 'TestZone'}).run(() => {
let frames = 0;
let previousTimeStamp = 0;
function frameCallback(timestamp: number) {
expect(timestamp).toMatch(/^[\d.]+$/);
// expect previous <= current
expect(previousTimeStamp).not.toBeGreaterThan(timestamp);
previousTimeStamp = timestamp;
if (frames++ > 15) {
(<any>jasmine).DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
return done();
}
requestAnimationFrameFn(frameCallback);
}
requestAnimationFrameFn(frameCallback);
});
});
});
}
});
});