Merge branch 'master' into harmony

This commit is contained in:
Anthony Van de Gejuchte
2016-07-02 01:50:18 +02:00
committed by Richard van Velzen
21 changed files with 481 additions and 113 deletions

View File

@@ -2,6 +2,7 @@ ascii_only_true: {
options = {}
beautify = {
ascii_only : true,
screw_ie8 : true,
beautify : false,
}
input: {
@@ -12,13 +13,14 @@ ascii_only_true: {
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
}
}
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b\\t\\n\\x0B\\f\\r\\x0e\\x0f"+"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"+\' !"# ... }~\\x7f\\x80\\x81 ... \\xfe\\xff\\u0fff\\uffff\'}'
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b\\t\\n\\v\\f\\r\\x0e\\x0f"+"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"+\' !"# ... }~\\x7f\\x80\\x81 ... \\xfe\\xff\\u0fff\\uffff\'}'
}
ascii_only_false: {
options = {}
beautify = {
ascii_only : false,
screw_ie8 : true,
beautify : false,
}
input: {
@@ -29,6 +31,6 @@ ascii_only_false: {
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
}
}
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\x01\x02\x03\x04\x05\x06\x07\\b\\t\\n\\x0B\\f\\r\x0e\x0f"+"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"+\' !"# ... }~\x7f\x80\x81 ... \xfe\xff\u0fff\uffff\'}'
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\x01\x02\x03\x04\x05\x06\x07\\b\\t\\n\\v\\f\\r\x0e\x0f"+"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"+\' !"# ... }~\x7f\x80\x81 ... \xfe\xff\u0fff\uffff\'}'
}

View File

@@ -868,3 +868,41 @@ trivial_boolean_ternary_expressions : {
f(!(x >= y));
}
}
issue_1154: {
options = {
conditionals: true,
evaluate : true,
booleans : true,
};
input: {
function f1(x) { return x ? -1 : -1; }
function f2(x) { return x ? +2 : +2; }
function f3(x) { return x ? ~3 : ~3; }
function f4(x) { return x ? !4 : !4; }
function f5(x) { return x ? void 5 : void 5; }
function f6(x) { return x ? typeof 6 : typeof 6; }
function g1() { return g() ? -1 : -1; }
function g2() { return g() ? +2 : +2; }
function g3() { return g() ? ~3 : ~3; }
function g4() { return g() ? !4 : !4; }
function g5() { return g() ? void 5 : void 5; }
function g6() { return g() ? typeof 6 : typeof 6; }
}
expect: {
function f1(x) { return -1; }
function f2(x) { return 2; }
function f3(x) { return -4; }
function f4(x) { return !1; }
function f5(x) { return; }
function f6(x) { return "number"; }
function g1() { return g(), -1; }
function g2() { return g(), 2; }
function g3() { return g(), -4; }
function g4() { return g(), !1; }
function g5() { return g(), void 0; }
function g6() { return g(), "number"; }
}
}

View File

@@ -144,4 +144,97 @@ check_drop_unused_in_peer_function: {
bar();
}
}
}
}
Infinity_not_in_with_scope: {
options = {
unused: true
}
input: {
var o = { Infinity: 'oInfinity' };
var vInfinity = "Infinity";
vInfinity = Infinity;
}
expect: {
var o = { Infinity: 'oInfinity' }
var vInfinity = "Infinity"
vInfinity = 1/0
}
}
Infinity_in_with_scope: {
options = {
unused: true
}
input: {
var o = { Infinity: 'oInfinity' };
var vInfinity = "Infinity";
with (o) { vInfinity = Infinity; }
}
expect: {
var o = { Infinity: 'oInfinity' }
var vInfinity = "Infinity"
with (o) vInfinity = Infinity
}
}
assorted_Infinity_NaN_undefined_in_with_scope: {
options = {
unused: true,
evaluate: true,
dead_code: true,
conditionals: true,
comparisons: true,
booleans: true,
hoist_funs: true,
keep_fargs: true,
if_return: true,
join_vars: true,
cascade: true,
side_effects: true,
sequences: false,
}
input: {
var o = {
undefined : 3,
NaN : 4,
Infinity : 5,
}
if (o) {
f(undefined, void 0);
f(NaN, 0/0);
f(Infinity, 1/0);
f(-Infinity, -(1/0));
f(2 + 7 + undefined, 2 + 7 + void 0);
}
with (o) {
f(undefined, void 0);
f(NaN, 0/0);
f(Infinity, 1/0);
f(-Infinity, -(1/0));
f(2 + 7 + undefined, 2 + 7 + void 0);
}
}
expect: {
var o = {
undefined : 3,
NaN : 4,
Infinity : 5
}
if (o) {
f(void 0, void 0);
f(NaN, NaN);
f(1/0, 1/0);
f(-(1/0), -(1/0));
f(NaN, NaN);
}
with (o) {
f(undefined, void 0);
f(NaN, 0/0);
f(Infinity, 1/0);
f(-Infinity, -(1/0));
f(9 + undefined, 9 + void 0);
}
}
}

View File

@@ -12,7 +12,8 @@ keep_properties: {
dot_properties: {
options = {
properties: true
properties: true,
screw_ie8: false
};
input: {
a["foo"] = "bar";

View File

@@ -0,0 +1,10 @@
octal_escape_sequence: {
input: {
var boundaries = "\0\7\00\07\70\77\000\077\300\377";
var border_check = "\400\700\0000\3000";
}
expect: {
var boundaries = "\x00\x07\x00\x07\x38\x3f\x00\x3f\xc0\xff";
var border_check = "\x20\x30\x38\x30\x00\x30\xc0\x30";
}
}

22
test/mocha/cli.js Normal file
View File

@@ -0,0 +1,22 @@
var assert = require("assert");
var exec = require("child_process").exec;
describe("bin/uglifyjs", function () {
it("should produce a functional build when using --self", function (done) {
this.timeout(5000);
var uglifyjs = '"' + process.argv[0] + '" bin/uglifyjs';
var command = uglifyjs + ' --self -cm --wrap WrappedUglifyJS';
exec(command, function (err, stdout) {
if (err) throw err;
eval(stdout);
assert.strictEqual(typeof WrappedUglifyJS, 'object');
assert.strictEqual(true, WrappedUglifyJS.parse('foo;') instanceof WrappedUglifyJS.AST_Node);
done();
});
});
});

50
test/mocha/comment.js Normal file
View File

@@ -0,0 +1,50 @@
var assert = require("assert");
var uglify = require("../../");
describe("Comment", function() {
it("Should recognize eol of single line comments", function() {
var tests = [
"//Some comment 1\n>",
"//Some comment 2\r>",
"//Some comment 3\r\n>",
"//Some comment 4\u2028>",
"//Some comment 5\u2029>"
];
var fail = function(e) {
return e instanceof uglify.JS_Parse_Error &&
e.message === "SyntaxError: Unexpected token: operator (>)" &&
e.line === 2 &&
e.col === 0;
}
for (var i = 0; i < tests.length; i++) {
assert.throws(function() {
uglify.parse(tests[i], {fromString: true})
}, fail, tests[i]);
}
});
it("Should update the position of a multiline comment correctly", function() {
var tests = [
"/*Some comment 1\n\n\n*/\n>\n\n\n\n\n\n",
"/*Some comment 2\r\n\r\n\r\n*/\r\n>\n\n\n\n\n\n",
"/*Some comment 3\r\r\r*/\r>\n\n\n\n\n\n",
"/*Some comment 4\u2028\u2028\u2028*/\u2028>\n\n\n\n\n\n",
"/*Some comment 5\u2029\u2029\u2029*/\u2029>\n\n\n\n\n\n"
];
var fail = function(e) {
return e instanceof uglify.JS_Parse_Error &&
e.message === "SyntaxError: Unexpected token: operator (>)" &&
e.line === 5 &&
e.col === 0;
}
for (var i = 0; i < tests.length; i++) {
assert.throws(function() {
uglify.parse(tests[i], {fromString: true})
}, fail, tests[i]);
}
});
});

View File

@@ -37,6 +37,10 @@ describe("line-endings", function() {
"/\r/",
"/\u2028/",
"/\u2029/",
"/\\\n/",
"/\\\r/",
"/\\\u2028/",
"/\\\u2029/",
"/someRandomTextLike[]()*AndThen\n/"
]
var test = function(input) {
@@ -46,7 +50,7 @@ describe("line-endings", function() {
}
var fail = function(e) {
return e instanceof Uglify.JS_Parse_Error &&
e.message === "Unexpected line terminator";
e.message === "SyntaxError: Unexpected line terminator";
}
for (var i = 0; i < inputs.length; i++) {
assert.throws(test(inputs[i]), fail);

View File

@@ -0,0 +1,40 @@
var Uglify = require('../../');
var assert = require("assert");
describe("Input file as map", function() {
it("Should accept object", function() {
var jsMap = {
'/scripts/foo.js': 'var foo = {"x": 1, y: 2, \'z\': 3};'
};
var result = Uglify.minify(jsMap, {fromString: true, outSourceMap: true});
var map = JSON.parse(result.map);
assert.strictEqual(result.code, 'var foo={x:1,y:2,z:3};');
assert.deepEqual(map.sources, ['/scripts/foo.js']);
});
it("Should accept array of objects and strings", function() {
var jsSeq = [
{'/scripts/foo.js': 'var foo = {"x": 1, y: 2, \'z\': 3};'},
'var bar = 15;'
];
var result = Uglify.minify(jsSeq, {fromString: true, outSourceMap: true});
var map = JSON.parse(result.map);
assert.strictEqual(result.code, 'var foo={x:1,y:2,z:3},bar=15;');
assert.strictEqual(map.sources[0], '/scripts/foo.js');
});
it("Should correctly include source", function() {
var jsSeq = [
{'/scripts/foo.js': 'var foo = {"x": 1, y: 2, \'z\': 3};'},
'var bar = 15;'
];
var result = Uglify.minify(jsSeq, {fromString: true, outSourceMap: true, sourceMapIncludeSources: true});
var map = JSON.parse(result.map);
assert.strictEqual(result.code, 'var foo={x:1,y:2,z:3},bar=15;');
assert.deepEqual(map.sourcesContent, ['var foo = {"x": 1, y: 2, \'z\': 3};', 'var bar = 15;']);
});
});

View File

@@ -0,0 +1,33 @@
var assert = require("assert");
var exec = require("child_process").exec;
describe("spidermonkey export/import sanity test", function() {
it("should produce a functional build when using --self with spidermonkey", function (done) {
this.timeout(20000);
var uglifyjs = '"' + process.argv[0] + '" bin/uglifyjs';
var command = uglifyjs + " --self -cm --wrap SpiderUglify --dump-spidermonkey-ast | " +
uglifyjs + " --spidermonkey -cm";
exec(command, function (err, stdout) {
if (err) throw err;
eval(stdout);
assert.strictEqual(typeof SpiderUglify, "object");
var ast = SpiderUglify.parse("foo([true,,2+3]);");
assert.strictEqual(true, ast instanceof SpiderUglify.AST_Node);
ast.figure_out_scope();
ast = SpiderUglify.Compressor({}).compress(ast);
assert.strictEqual(true, ast instanceof SpiderUglify.AST_Node);
var stream = SpiderUglify.OutputStream({});
ast.print(stream);
var code = stream.toString();
assert.strictEqual(code, "foo([!0,,5]);");
done();
});
});
});

View File

@@ -19,7 +19,7 @@ describe("String literals", function() {
var error = function(e) {
return e instanceof UglifyJS.JS_Parse_Error &&
e.message === "Unterminated string constant";
e.message === "SyntaxError: Unterminated string constant";
};
for (var input in inputs) {
@@ -49,7 +49,7 @@ describe("String literals", function() {
var error = function(e) {
return e instanceof UglifyJS.JS_Parse_Error &&
e.message === "Octal literals are not allowed in strict mode";
e.message === "SyntaxError: Octal literals are not allowed in strict mode";
}
for (var input in inputs) {