Log a deprecation warning on reentrant calls to Clock#tick

See #1929
This commit is contained in:
Steve Gravrock
2021-12-31 11:38:01 -08:00
parent 57c294b307
commit d963be5eec
3 changed files with 79 additions and 8 deletions

View File

@@ -3879,13 +3879,30 @@ getJasmineRequireObj().DelayedFunctionScheduler = function(j$) {
var currentTime = 0;
var delayedFnCount = 0;
var deletedKeys = [];
var ticking = false;
self.tick = function(millis, tickDate) {
millis = millis || 0;
var endTime = currentTime + millis;
if (ticking) {
j$.getEnv().deprecated('The behavior of reentrant calls to ' +
'jasmine.clock().tick() will change in a future version. Either ' +
'modify the affected spec to not call tick() from within a ' +
'setTimeout or setInterval handler, or be aware that it may ' +
'behave differently in the future. See ' +
'<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-reentrant-calls-to-jasmine-clock-tick> ' +
'for details.');
}
runScheduledFunctions(endTime, tickDate);
currentTime = endTime;
ticking = true;
try {
millis = millis || 0;
var endTime = currentTime + millis;
runScheduledFunctions(endTime, tickDate);
currentTime = endTime;
} finally {
ticking = false;
}
};
self.scheduleFunction = function(

View File

@@ -1259,6 +1259,42 @@ describe('Env integration', function() {
});
});
it('logs a deprecation warning when the mock clock is ticked reentrantly', function(done) {
var ticked = false,
env = jasmineUnderTest.getEnv();
spyOn(env, 'deprecated');
env.beforeEach(function() {
env.clock.install();
});
env.afterEach(function() {
env.clock.uninstall();
});
env.it('ticks inside tick', function() {
setTimeout(function() {
ticked = true;
env.clock.tick();
}, 1);
env.clock.tick(1);
});
env.execute(null, function() {
expect(ticked).toBeTrue();
expect(env.deprecated).toHaveBeenCalledWith(
'The behavior of reentrant calls to jasmine.clock().tick() will ' +
'change in a future version. Either modify the affected spec to ' +
'not call tick() from within a setTimeout or setInterval handler, ' +
'or be aware that it may behave differently in the future. See ' +
'<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-reentrant-calls-to-jasmine-clock-tick> ' +
'for details.'
);
done();
});
});
it('should run async specs in order, waiting for them to complete', function(done) {
var mutatedVar;

View File

@@ -6,13 +6,31 @@ getJasmineRequireObj().DelayedFunctionScheduler = function(j$) {
var currentTime = 0;
var delayedFnCount = 0;
var deletedKeys = [];
var ticking = false;
self.tick = function(millis, tickDate) {
millis = millis || 0;
var endTime = currentTime + millis;
if (ticking) {
j$.getEnv().deprecated(
'The behavior of reentrant calls to jasmine.clock().tick() will ' +
'change in a future version. Either modify the affected spec to ' +
'not call tick() from within a setTimeout or setInterval handler, ' +
'or be aware that it may behave differently in the future. See ' +
'<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-reentrant-calls-to-jasmine-clock-tick> ' +
'for details.'
);
}
runScheduledFunctions(endTime, tickDate);
currentTime = endTime;
ticking = true;
try {
millis = millis || 0;
var endTime = currentTime + millis;
runScheduledFunctions(endTime, tickDate);
currentTime = endTime;
} finally {
ticking = false;
}
};
self.scheduleFunction = function(