fix corner case in `--reduce-test` (#3985)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 10 Jun 2020 14:51:00 +0000 (15:51 +0100)
committerGitHub <noreply@github.com>
Wed, 10 Jun 2020 14:51:00 +0000 (15:51 +0100)
test/input/reduce/diff_error.js [new file with mode: 0644]
test/input/reduce/diff_error.reduced.js [new file with mode: 0644]
test/mocha/reduce.js
test/reduce.js

diff --git a/test/input/reduce/diff_error.js b/test/input/reduce/diff_error.js
new file mode 100644 (file)
index 0000000..ba267c5
--- /dev/null
@@ -0,0 +1,5 @@
+(function f(a) {
+    do {
+        console.log(f.length);
+    } while (console.log(f += 0));
+})();
diff --git a/test/input/reduce/diff_error.reduced.js b/test/input/reduce/diff_error.reduced.js
new file mode 100644 (file)
index 0000000..a76e3d9
--- /dev/null
@@ -0,0 +1,19 @@
+// (beautified)
+(function f(a) {
+    do {
+        console.log(f.length);
+    } while (console.log(f += 0));
+})();
+// output: 1
+// function(){}0
+// 
+// minify: 0
+// function(){}0
+// 
+// options: {
+//   "compress": {
+//     "keep_fargs": false,
+//     "unsafe": true
+//   },
+//   "mangle": false
+// }
\ No newline at end of file
index 271358b..c186473 100644 (file)
@@ -296,4 +296,18 @@ describe("test/reduce.js", function() {
             "// }",
         ]).join("\n"));
     });
+    it("Should handle corner cases when intermediate case differs only in Error.message", function() {
+        if (semver.satisfies(process.version, "<=0.10")) return;
+        var result = reduce_test(read("test/input/reduce/diff_error.js"), {
+            compress: {
+                keep_fargs: false,
+                unsafe: true,
+            },
+            mangle: false,
+        }, {
+            verbose: false,
+        });
+        if (result.error) throw result.error;
+        assert.strictEqual(result.code, read("test/input/reduce/diff_error.reduced.js"));
+    });
 });
index ff2f787..7f37ea2 100644 (file)
@@ -438,7 +438,8 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
                     }
                 }));
                 var code = testcase_ast.print_to_string();
-                if (diff = test_for_diff(code, minify_options, result_cache, max_timeout)) {
+                var diff = test_for_diff(code, minify_options, result_cache, max_timeout);
+                if (diff && !diff.timed_out && !diff.error) {
                     testcase = code;
                     differs = diff;
                 } else {