Fix destructuring evaluation order for initializers

This commit is contained in:
Ron Buckton
2020-10-13 17:14:35 -07:00
parent 83d02a5f05
commit 7393dba6bd
40 changed files with 599 additions and 376 deletions
+1
View File
@@ -89,6 +89,7 @@
"unittests/evaluation/asyncArrow.ts",
"unittests/evaluation/asyncGenerator.ts",
"unittests/evaluation/awaiter.ts",
"unittests/evaluation/destructuring.ts",
"unittests/evaluation/forAwaitOf.ts",
"unittests/evaluation/forOf.ts",
"unittests/evaluation/optionalCall.ts",
@@ -0,0 +1,39 @@
describe("unittests:: evaluation:: destructuring", () => {
// https://github.com/microsoft/TypeScript/issues/39205
describe("correct order for array destructuring evaluation and initializers", () => {
it("when element is undefined", () => {
const result = evaluator.evaluateTypeScript(`
export const output: any[] = [];
const order = (n: any): any => output.push(n);
let [{ [order(1)]: x } = order(0)] = [];
`, { target: ts.ScriptTarget.ES5 });
assert.deepEqual(result.output, [0, 1]);
});
it("when element is defined", async () => {
const result = evaluator.evaluateTypeScript(`
export const output: any[] = [];
const order = (n: any): any => output.push(n);
let [{ [order(1)]: x } = order(0)] = [{}];
`, { target: ts.ScriptTarget.ES5 });
assert.deepEqual(result.output, [1]);
});
});
describe("correct order for array destructuring evaluation and initializers with spread", () => {
it("ES5", () => {
const result = evaluator.evaluateTypeScript(`
export const output: any[] = [];
const order = (n: any): any => output.push(n);
let { [order(0)]: { [order(2)]: z } = order(1), ...w } = {} as any;
`, { target: ts.ScriptTarget.ES5 });
assert.deepEqual(result.output, [0, 1, 2]);
});
it("ES2015", () => {
const result = evaluator.evaluateTypeScript(`
export const output: any[] = [];
const order = (n: any): any => output.push(n);
let { [order(0)]: { [order(2)]: z } = order(1), ...w } = {} as any;
`, { target: ts.ScriptTarget.ES2015 });
assert.deepEqual(result.output, [0, 1, 2]);
});
});
});