avoid false positive in --reduce-test (#4648)
This commit is contained in:
@@ -294,6 +294,39 @@ describe("test/reduce.js", function() {
|
|||||||
"// }",
|
"// }",
|
||||||
]).join("\n"));
|
]).join("\n"));
|
||||||
});
|
});
|
||||||
|
it("Should maintain block-scope for const & let", function() {
|
||||||
|
if (semver.satisfies(process.version, "<4")) return;
|
||||||
|
var code = [
|
||||||
|
'"use strict";',
|
||||||
|
"",
|
||||||
|
"L: for (let a = (1 - .8).toString(); ;) {",
|
||||||
|
" if (!console.log(a)) {",
|
||||||
|
" break L;",
|
||||||
|
" }",
|
||||||
|
"}",
|
||||||
|
].join("\n");
|
||||||
|
var result = reduce_test(code, {
|
||||||
|
compress: {
|
||||||
|
unsafe_math: true,
|
||||||
|
},
|
||||||
|
mangle: false,
|
||||||
|
});
|
||||||
|
if (result.error) throw result.error;
|
||||||
|
assert.strictEqual(result.code, [
|
||||||
|
"// (beautified)",
|
||||||
|
code,
|
||||||
|
"// output: 0.19999999999999996",
|
||||||
|
"// ",
|
||||||
|
"// minify: 0.2",
|
||||||
|
"// ",
|
||||||
|
"// options: {",
|
||||||
|
'// "compress": {',
|
||||||
|
'// "unsafe_math": true',
|
||||||
|
'// },',
|
||||||
|
'// "mangle": false',
|
||||||
|
"// }",
|
||||||
|
].join("\n"));
|
||||||
|
});
|
||||||
it("Should handle corner cases when intermediate case differs only in Error.message", function() {
|
it("Should handle corner cases when intermediate case differs only in Error.message", function() {
|
||||||
if (semver.satisfies(process.version, "<=0.10")) return;
|
if (semver.satisfies(process.version, "<=0.10")) return;
|
||||||
var result = reduce_test(read("test/input/reduce/diff_error.js"), {
|
var result = reduce_test(read("test/input/reduce/diff_error.js"), {
|
||||||
|
|||||||
@@ -300,7 +300,7 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
|
|||||||
node.start._permute += step;
|
node.start._permute += step;
|
||||||
if (expr && (expr !== node.body || !has_loopcontrol(expr, node, parent))) {
|
if (expr && (expr !== node.body || !has_loopcontrol(expr, node, parent))) {
|
||||||
CHANGED = true;
|
CHANGED = true;
|
||||||
return to_statement(expr);
|
return to_statement_init(expr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (node instanceof U.AST_ForEnumeration) {
|
else if (node instanceof U.AST_ForEnumeration) {
|
||||||
@@ -322,7 +322,7 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
|
|||||||
node.start._permute += step;
|
node.start._permute += step;
|
||||||
if (expr) {
|
if (expr) {
|
||||||
CHANGED = true;
|
CHANGED = true;
|
||||||
return to_statement(expr);
|
return to_statement_init(expr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (node instanceof U.AST_If) {
|
else if (node instanceof U.AST_If) {
|
||||||
@@ -695,6 +695,13 @@ function to_statement(node) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function to_statement_init(node) {
|
||||||
|
return node instanceof U.AST_Const || node instanceof U.AST_Let ? new U.AST_BlockStatement({
|
||||||
|
body: [ node ],
|
||||||
|
start: {},
|
||||||
|
}) : to_statement(node);;
|
||||||
|
}
|
||||||
|
|
||||||
function wrap_with_console_log(node) {
|
function wrap_with_console_log(node) {
|
||||||
// wrap with console.log()
|
// wrap with console.log()
|
||||||
return new U.AST_Call({
|
return new U.AST_Call({
|
||||||
|
|||||||
@@ -2139,6 +2139,17 @@ for (var round = 1; round <= num_iterations; round++) {
|
|||||||
ok = sandbox.same_stdout(original_result, uglify_result);
|
ok = sandbox.same_stdout(original_result, uglify_result);
|
||||||
// ignore v8 parser bug
|
// ignore v8 parser bug
|
||||||
if (!ok && bug_async_arrow_rest(uglify_result)) ok = true;
|
if (!ok && bug_async_arrow_rest(uglify_result)) ok = true;
|
||||||
|
// handle difference caused by time-outs
|
||||||
|
if (!ok && errored && is_error_timeout(original_result)) {
|
||||||
|
if (is_error_timeout(uglify_result)) {
|
||||||
|
// ignore difference in error message
|
||||||
|
ok = true;
|
||||||
|
} else {
|
||||||
|
// ignore spurious time-outs
|
||||||
|
if (!orig_result[toplevel ? 3 : 2]) orig_result[toplevel ? 3 : 2] = sandbox.run_code(original_code, toplevel, 10000);
|
||||||
|
ok = sandbox.same_stdout(orig_result[toplevel ? 3 : 2], uglify_result);
|
||||||
|
}
|
||||||
|
}
|
||||||
// ignore declaration order of global variables
|
// ignore declaration order of global variables
|
||||||
if (!ok && !toplevel) {
|
if (!ok && !toplevel) {
|
||||||
ok = sandbox.same_stdout(sandbox.run_code(sort_globals(original_code)), sandbox.run_code(sort_globals(uglify_code)));
|
ok = sandbox.same_stdout(sandbox.run_code(sort_globals(original_code)), sandbox.run_code(sort_globals(uglify_code)));
|
||||||
@@ -2157,16 +2168,6 @@ for (var round = 1; round <= num_iterations; round++) {
|
|||||||
}
|
}
|
||||||
// ignore difference in error message caused by Temporal Dead Zone
|
// ignore difference in error message caused by Temporal Dead Zone
|
||||||
if (!ok && errored && uglify_result.name == "ReferenceError" && original_result.name == "ReferenceError") ok = true;
|
if (!ok && errored && uglify_result.name == "ReferenceError" && original_result.name == "ReferenceError") ok = true;
|
||||||
if (!ok && errored && is_error_timeout(original_result)) {
|
|
||||||
if (is_error_timeout(uglify_result)) {
|
|
||||||
// ignore difference in error message
|
|
||||||
ok = true;
|
|
||||||
} else {
|
|
||||||
// ignore spurious time-outs
|
|
||||||
if (!orig_result[toplevel ? 3 : 2]) orig_result[toplevel ? 3 : 2] = sandbox.run_code(original_code, toplevel, 10000);
|
|
||||||
ok = sandbox.same_stdout(orig_result[toplevel ? 3 : 2], uglify_result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// ignore difference in error message caused by `in`
|
// ignore difference in error message caused by `in`
|
||||||
if (!ok && errored && is_error_in(uglify_result) && is_error_in(original_result)) ok = true;
|
if (!ok && errored && is_error_in(uglify_result) && is_error_in(original_result)) ok = true;
|
||||||
// ignore difference in error message caused by spread syntax
|
// ignore difference in error message caused by spread syntax
|
||||||
|
|||||||
Reference in New Issue
Block a user