Resolve all time-based snippet variables using the same time

This commit is contained in:
Michael Overmeyer 2021-07-13 15:39:35 -04:00
parent 05fd05dc00
commit 5b0d37ef72
2 changed files with 47 additions and 12 deletions

View file

@ -255,33 +255,37 @@ export class TimeBasedVariableResolver implements VariableResolver {
private static readonly monthNames = [nls.localize('January', "January"), nls.localize('February', "February"), nls.localize('March', "March"), nls.localize('April', "April"), nls.localize('May', "May"), nls.localize('June', "June"), nls.localize('July', "July"), nls.localize('August', "August"), nls.localize('September', "September"), nls.localize('October', "October"), nls.localize('November', "November"), nls.localize('December', "December")];
private static readonly monthNamesShort = [nls.localize('JanuaryShort', "Jan"), nls.localize('FebruaryShort', "Feb"), nls.localize('MarchShort', "Mar"), nls.localize('AprilShort', "Apr"), nls.localize('MayShort', "May"), nls.localize('JuneShort', "Jun"), nls.localize('JulyShort', "Jul"), nls.localize('AugustShort', "Aug"), nls.localize('SeptemberShort', "Sep"), nls.localize('OctoberShort', "Oct"), nls.localize('NovemberShort', "Nov"), nls.localize('DecemberShort', "Dec")];
constructor(private readonly _date: Date = new Date()) {
//
}
resolve(variable: Variable): string | undefined {
const { name } = variable;
if (name === 'CURRENT_YEAR') {
return String(new Date().getFullYear());
return String(this._date.getFullYear());
} else if (name === 'CURRENT_YEAR_SHORT') {
return String(new Date().getFullYear()).slice(-2);
return String(this._date.getFullYear()).slice(-2);
} else if (name === 'CURRENT_MONTH') {
return String(new Date().getMonth().valueOf() + 1).padStart(2, '0');
return String(this._date.getMonth().valueOf() + 1).padStart(2, '0');
} else if (name === 'CURRENT_DATE') {
return String(new Date().getDate().valueOf()).padStart(2, '0');
return String(this._date.getDate().valueOf()).padStart(2, '0');
} else if (name === 'CURRENT_HOUR') {
return String(new Date().getHours().valueOf()).padStart(2, '0');
return String(this._date.getHours().valueOf()).padStart(2, '0');
} else if (name === 'CURRENT_MINUTE') {
return String(new Date().getMinutes().valueOf()).padStart(2, '0');
return String(this._date.getMinutes().valueOf()).padStart(2, '0');
} else if (name === 'CURRENT_SECOND') {
return String(new Date().getSeconds().valueOf()).padStart(2, '0');
return String(this._date.getSeconds().valueOf()).padStart(2, '0');
} else if (name === 'CURRENT_DAY_NAME') {
return TimeBasedVariableResolver.dayNames[new Date().getDay()];
return TimeBasedVariableResolver.dayNames[this._date.getDay()];
} else if (name === 'CURRENT_DAY_NAME_SHORT') {
return TimeBasedVariableResolver.dayNamesShort[new Date().getDay()];
return TimeBasedVariableResolver.dayNamesShort[this._date.getDay()];
} else if (name === 'CURRENT_MONTH_NAME') {
return TimeBasedVariableResolver.monthNames[new Date().getMonth()];
return TimeBasedVariableResolver.monthNames[this._date.getMonth()];
} else if (name === 'CURRENT_MONTH_NAME_SHORT') {
return TimeBasedVariableResolver.monthNamesShort[new Date().getMonth()];
return TimeBasedVariableResolver.monthNamesShort[this._date.getMonth()];
} else if (name === 'CURRENT_SECONDS_UNIX') {
return String(Math.floor(Date.now() / 1000));
return String(Math.floor(this._date.getTime() / 1000));
}
return undefined;

View file

@ -17,6 +17,7 @@ import { Workspace } from 'vs/platform/workspace/test/common/testWorkspace';
import { extUriBiasedIgnorePathCase } from 'vs/base/common/resources';
import { sep } from 'vs/base/common/path';
import { toWorkspaceFolders } from 'vs/platform/workspaces/common/workspaces';
import * as sinon from 'sinon';
suite('Snippet Variables Resolver', function () {
@ -291,6 +292,36 @@ suite('Snippet Variables Resolver', function () {
assertVariableResolve3(resolver, 'CURRENT_SECONDS_UNIX');
});
test('Time-based snippet variables resolve to the same values even as time progresses', async function () {
const snippetText = `
$CURRENT_YEAR
$CURRENT_YEAR_SHORT
$CURRENT_MONTH
$CURRENT_DATE
$CURRENT_HOUR
$CURRENT_MINUTE
$CURRENT_SECOND
$CURRENT_DAY_NAME
$CURRENT_DAY_NAME_SHORT
$CURRENT_MONTH_NAME
$CURRENT_MONTH_NAME_SHORT
$CURRENT_SECONDS_UNIX
`;
const clock = sinon.useFakeTimers();
try {
const resolver = new TimeBasedVariableResolver;
const firstResolve = new SnippetParser().parse(snippetText).resolveVariables(resolver);
clock.tick((365 * 24 * 3600 * 1000) + (24 * 3600 * 1000) + (3661 * 1000)); // 1 year + 1 day + 1 hour + 1 minute + 1 second
const secondResolve = new SnippetParser().parse(snippetText).resolveVariables(resolver);
assert.strictEqual(firstResolve.toString(), secondResolve.toString(), `Time-based snippet variables resolved differently`);
} finally {
clock.restore();
}
});
test('creating snippet - format-condition doesn\'t work #53617', function () {
const snippet = new SnippetParser().parse('${TM_LINE_NUMBER/(10)/${1:?It is:It is not}/} line 10', true);