Merge branch 'traceur'

This commit is contained in:
Sebastian McKenzie
2015-01-06 10:40:42 +11:00
224 changed files with 636 additions and 2163 deletions

View File

@@ -3,7 +3,7 @@ var fs = require("fs");
var _ = require("lodash");
var humanise = function (val) {
return val.replace(/-/g, " ");
return path.basename(val, path.extname(val)).replace(/-/g, " ");
};
var readFile = exports.readFile = function (filename) {
@@ -16,11 +16,11 @@ var readFile = exports.readFile = function (filename) {
}
};
exports.get = function (entryName) {
exports.get = function (entryName, entryLoc) {
if (exports.cache[entryName]) return exports.cache[entryName];
var suites = [];
var entryLoc = __dirname + "/fixtures/" + entryName;
var entryLoc = entryLoc || __dirname + "/fixtures/" + entryName;
_.each(fs.readdirSync(entryLoc), function (suiteName) {
if (suiteName[0] === ".") return;
@@ -36,8 +36,18 @@ exports.get = function (entryName) {
var suiteOptsLoc = suite.filename + "/options.json";
if (fs.existsSync(suiteOptsLoc)) suite.options = require(suiteOptsLoc);
_.each(fs.readdirSync(suite.filename), function (taskName) {
var taskDir = suite.filename + "/" + taskName;
if (fs.statSync(suite.filename).isFile()) {
push(suiteName, suite.filename);
} else {
_.each(fs.readdirSync(suite.filename), function (taskName) {
var taskDir = suite.filename + "/" + taskName;
push(taskName, taskDir);
});
}
function push(taskName, taskDir) {
// tracuer error tests
if (taskName.indexOf("Error_") >= 0) return;
var actualLocAlias = suiteName + "/" + taskName + "/actual.js";
var expectLocAlias = suiteName + "/" + taskName + "/expected.js";
@@ -49,7 +59,7 @@ exports.get = function (entryName) {
if (fs.statSync(taskDir).isFile()) {
var ext = path.extname(taskDir);
if (ext !== ".js") return;
if (ext !== ".js" && ext !== ".module.js") return;
execLoc = taskDir;
}
@@ -84,6 +94,18 @@ exports.get = function (entryName) {
}
};
// traceur checks
var shouldSkip = function (code) {
return code.indexOf("// Error:") >= 0 || code.indexOf("// Skip.") >= 0;
};
if (shouldSkip(test.actual.code) || shouldSkip(test.exec.code)) {
return;
} else if (test.exec.code.indexOf("// Async.") >= 0) {
//test.options.asyncExec = true;
}
suite.tests.push(test);
var sourceMappingsLoc = taskDir + "/source-mappings.json";
@@ -97,7 +119,7 @@ exports.get = function (entryName) {
test.options.sourceMap = true;
test.sourceMap = require(sourceMap);
}
});
}
});
return exports.cache[entryName] = suites;
@@ -111,4 +133,5 @@ try {
var cache = exports.cache = {};
cache.transformation = exports.get("transformation");
cache.generation = exports.get("generation");
cache.esnext = exports.get("esnext");
}

View File

@@ -0,0 +1,152 @@
var genHelpers = require("./_generator-helpers");
var transform = require("../lib/6to5/transformation/transform");
var sourceMap = require("source-map");
var Module = require("module");
var helper = require("./_helper");
var assert = require("assert");
var chai = require("chai");
var path = require("path");
var util = require("../lib/6to5/util");
var _ = require("lodash");
require("../lib/6to5/polyfill");
global.assertNoOwnProperties = function (obj) {
assert.equal(Object.getOwnPropertyNames(obj).length, 0);
};
global.assertArrayEquals = assert.deepEqual;
global.assert = chai.assert;
global.chai = chai;
global.genHelpers = genHelpers;
// Different Traceur generator message
chai.assert._throw = chai.assert.throw;
chai.assert.throw = function (fn, msg) {
if (msg === '"throw" on executing generator' ||
msg === '"next" on executing generator') {
msg = "Generator is already running";
} else if (msg === "Sent value to newborn generator") {
msg = /^attempt to send (.*?) to newborn generator$/;
}
return chai.assert._throw(fn, msg);
};
var run = function (task, done) {
var actual = task.actual;
var expect = task.expect;
var exec = task.exec;
var opts = task.options;
var getOpts = function (self) {
return _.merge({
filename: self.loc
}, opts);
};
var execCode = exec.code;
var result;
if (execCode) {
result = transform(execCode, getOpts(exec));
execCode = result.code;
try {
var fakeRequire = function (loc) {
if (loc === "../../../src/runtime/polyfills/Number.js") {
return Number;
} else if (loc === "../../../src/runtime/polyfills/Math.js") {
return Math;
} else {
return require(path.resolve(exec.loc, "..", loc));
}
};
var fn = new Function("require", "done", execCode);
fn.call(global, fakeRequire, chai.assert, done);
} catch (err) {
err.message = exec.loc + ": " + err.message;
err.message += util.codeFrame(execCode);
throw err;
}
}
var actualCode = actual.code;
var expectCode = expect.code;
if (!execCode || actualCode) {
result = transform(actualCode, getOpts(actual));
actualCode = result.code;
chai.expect(actualCode).to.be.equal(expectCode, actual.loc + " !== " + expect.loc);
}
if (task.sourceMap) {
chai.expect(result.map).to.deep.equal(task.sourceMap);
}
if (task.sourceMappings) {
var consumer = new sourceMap.SourceMapConsumer(result.map);
_.each(task.sourceMappings, function (mapping, i) {
var expect = mapping.original;
var actual = consumer.originalPositionFor(mapping.generated);
chai.expect({ line: actual.line, column: actual.column }).to.deep.equal(expect);
});
}
};
module.exports = function (suiteOpts, taskOpts, dynamicOpts) {
taskOpts = taskOpts || {};
require("6to5/register")(taskOpts);
_.each(helper.get(suiteOpts.name, suiteOpts.loc), function (testSuite) {
if (_.contains(suiteOpts.ignoreSuites, testSuite.title)) return;
suite(suiteOpts.name + "/" + testSuite.title, function () {
_.each(testSuite.tests, function (task) {
if (_.contains(suiteOpts.ignoreTasks, task.title) || _.contains(suiteOpts.ignoreTasks, testSuite.title + "/" + task.title)) return;
var runTest = function (done) {
var runTask = function () {
try {
run(task, done);
} catch (err) {
if (task.options.after) task.options.after();
throw err;
}
};
_.extend(task.options, taskOpts);
if (dynamicOpts) dynamicOpts(task.options, task);
var throwMsg = task.options.throws;
if (throwMsg) {
// internal api doesn't have this option but it's best not to pollute
// the options object with useless options
delete task.options.throws;
assert.throws(runTask, function (err) {
return throwMsg === true || err.message.indexOf(throwMsg) >= 0;
});
} else {
runTask();
}
};
var callback;
if (task.options.asyncExec) {
callback = runTest;
} else {
callback = function () {
return runTest();
};
}
test(task.title, !task.disabled && callback);
});
});
});
};

5
test/esnext.js Normal file
View File

@@ -0,0 +1,5 @@
if (!process.env.ALL_6TO5_TESTS) return;
require("./_transformation-helper")({
name: "esnext"
});

View File

@@ -2,6 +2,9 @@
var _slice = Array.prototype.slice;
var _inherits = function (child, parent) {
if (typeof parent !== "function" && parent !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof parent);
}
child.prototype = Object.create(parent && parent.prototype, {
constructor: {
value: child,

View File

@@ -1,6 +1,9 @@
"use strict";
var _inherits = function (child, parent) {
if (typeof parent !== "function" && parent !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof parent);
}
child.prototype = Object.create(parent && parent.prototype, {
constructor: {
value: child,

View File

@@ -1,6 +1,9 @@
"use strict";
var _inherits = function (child, parent) {
if (typeof parent !== "function" && parent !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof parent);
}
child.prototype = Object.create(parent && parent.prototype, {
constructor: {
value: child,

View File

@@ -1,6 +1,9 @@
"use strict";
var _inherits = function (child, parent) {
if (typeof parent !== "function" && parent !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof parent);
}
child.prototype = Object.create(parent && parent.prototype, {
constructor: {
value: child,

View File

@@ -1,6 +1,9 @@
"use strict";
var _inherits = function (child, parent) {
if (typeof parent !== "function" && parent !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof parent);
}
child.prototype = Object.create(parent && parent.prototype, {
constructor: {
value: child,

View File

@@ -1,6 +1,9 @@
"use strict";
var _inherits = function (child, parent) {
if (typeof parent !== "function" && parent !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof parent);
}
child.prototype = Object.create(parent && parent.prototype, {
constructor: {
value: child,

View File

@@ -1,7 +0,0 @@
Copyright (c) 2014, Facebook, Inc.
All rights reserved.
This source code is licensed under the BSD-style license found in the
https://raw.github.com/facebook/regenerator/master/LICENSE file. An
additional grant of patent rights can be found in the PATENTS file in
the same directory.

View File

@@ -1,24 +0,0 @@
function *gen() {
var a$0 = 0, a$1 = 1;
let a = 3;
{
let a = 1;
yield a + a$0;
}
{
let a = 2;
yield a - 1 + a$1;
}
yield a;
}
var g = gen();
assert.deepEqual(g.next(), { value: 1, done: false });
assert.deepEqual(g.next(), { value: 2, done: false });
assert.deepEqual(g.next(), { value: 3, done: false });
assert.deepEqual(g.next(), { value: void 0, done: true });

View File

@@ -1,22 +0,0 @@
function *gen() {
let arr = [];
for (let x = 0; x < 3; x++) {
let y = x;
arr.push(function() { return y; });
}
{
let x;
while( x = arr.pop() ) {
yield x;
}
}
}
var g = gen();
assert.equal(g.next().value(), 2);
assert.equal(g.next().value(), 1);
assert.equal(g.next().value(), 0);
assert.deepEqual(g.next(), { value: void 0, done: true });

View File

@@ -1,15 +0,0 @@
function *gen() {
try {
genHelpers.raise("e1");
} catch (e) {
yield e;
try {
genHelpers.raise("e2");
} catch (e) {
yield e;
}
yield e;
}
}
genHelpers.check(gen(), ["e1", "e2", "e1"]);

View File

@@ -1,22 +0,0 @@
function *gen(x) {
var y = x + 1;
try {
throw x + 2;
} catch (x) {
yield x;
x += 1;
yield x;
}
yield x;
try {
throw x + 3;
} catch (y) {
yield y;
y *= 2;
yield y;
}
yield y;
}
genHelpers.check(gen(1), [3, 4, 1, 4, 8, 2]);
genHelpers.check(gen(2), [4, 5, 2, 5, 10, 3]);

View File

@@ -1,32 +0,0 @@
function *gen(x) {
try {
throw x;
} catch (x) {
yield x;
yield (function(x) {
return x += 1;
}(x + 1));
yield (function() {
var x = arguments[0];
return x * 2;
}(x + 2));
yield (function() {
function notCalled(x) {
throw x;
}
x >>= 1;
return x;
}());
yield x -= 1;
}
yield x;
}
genHelpers.check(gen(10), [10, 12, 24, 5, 4, 10]);
genHelpers.check(gen(11), [11, 13, 26, 5, 4, 11]);

View File

@@ -1,42 +0,0 @@
function *gen(n) {
var count = 0;
yield n;
while (n !== 1) {
count += 1;
if (n % 2) {
yield n = n * 3 + 1;
} else {
yield n >>= 1;
}
}
return count;
}
function collatz(n) {
var result = [n];
while (n !== 1) {
if (n % 2) {
n *= 3;
n += 1;
} else {
n >>= 1;
}
result.push(n);
}
return result;
}
var seven = collatz(7);
var fiftyTwo = seven.slice(seven.indexOf(52));
var eightyTwo = collatz(82);
genHelpers.check(gen(7), seven, 16);
genHelpers.check(gen(52), fiftyTwo, 11);
genHelpers.check(gen(82), eightyTwo, 110);

View File

@@ -1,11 +0,0 @@
function *gen() {
return "ALL DONE";
}
var g = gen();
assert.deepEqual(g.next(), {
value: "ALL DONE", done: true
});
genHelpers.assertAlreadyFinished(g);

View File

@@ -1,27 +0,0 @@
var error = new Error("thrown");
function *outer(n) {
try {
yield 0;
yield* inner(n);
yield 1;
} catch (err) {
yield err.message;
}
yield 4;
}
function *inner(n) {
while (n --> 0) {
try {
if (n === 3) {
genHelpers.raise(error);
}
} finally {
yield n;
}
}
}
genHelpers.check(outer(3), [0, 2, 1, 0, 1, 4]);
genHelpers.check(outer(5), [0, 4, 3, "thrown", 4]);

View File

@@ -1,10 +0,0 @@
function *gen(condition) {
if (condition) {
yield 0;
yield* gen(false);
yield 1;
}
}
genHelpers.check(gen(true), [0, 1]);
genHelpers.check(gen(false), []);

View File

@@ -1,12 +0,0 @@
function *gen(condition) {
yield 0;
if (condition) {
yield 1;
yield* gen(false);
yield 2;
}
yield 3;
}
genHelpers.check(gen(true), [0, 1, 0, 3, 2, 3]);
genHelpers.check(gen(false), [0, 3]);

View File

@@ -1,37 +0,0 @@
var count = 0;
function *gen() {
yield* inner();
try {
yield* inner();
} catch (err) {
// pass
}
return yield* inner();
}
function *inner() {
return yield count++;
}
var g = gen();
assert.deepEqual(g.next(), {
value: 0,
done: false
});
assert.deepEqual(g.next(), {
value: 1,
done: false
});
assert.deepEqual(g.throw(new Error("lol")), {
value: 2,
done: false,
});
assert.deepEqual(g.next("sent"), {
value: "sent",
done: true
});

View File

@@ -1,15 +0,0 @@
function *outer(n) {
yield* inner(n << 1);
yield "zxcv";
}
function *inner(n) {
return yield yield yield n;
}
var g = outer(3);
assert.deepEqual(g.next(), { value: 6, done: false });
assert.deepEqual(g.next(1), { value: 1, done: false });
assert.deepEqual(g.next(2), { value: 2, done: false });
assert.deepEqual(g.next(4), { value: "zxcv", done: false });
assert.deepEqual(g.next(5), { value: void 0, done: true });

View File

@@ -1,18 +0,0 @@
function *outer(n) {
yield n;
yield* middle(n - 1, inner(n + 10));
yield n + 1;
}
function *middle(n, plusTen) {
yield n;
yield* inner(n - 1);
yield n + 1;
yield* plusTen;
}
function *inner(n) {
yield n;
}
genHelpers.check(outer(5), [5, 4, 3, 5, 15, 6]);

View File

@@ -1,11 +0,0 @@
function *gen() {
yield 0;
yield* [
yield "one",
yield "two",
yield "three"
];
yield 5;
}
genHelpers.check(gen(), [0, "one", "two", "three", 2, 3, 4, 5]);

View File

@@ -1,20 +0,0 @@
function *gen(x, fname) {
try {
return fns[fname](x);
} catch (thrown) {
yield thrown;
}
}
var fns = {
f: function(x) {
throw x;
},
g: function(x) {
return x;
}
};
genHelpers.check(gen("asdf", "f"), ["asdf"]);
genHelpers.check(gen("asdf", "g"), [], "asdf");

View File

@@ -1,16 +0,0 @@
function *gen(x) {
while (x) {
// empty while loop
}
do {
// empty do-while loop
} while (x);
return gen.toString();
}
var info = gen(false).next();
assert.strictEqual(info.done, true);
assert.ok(/do \{/.test(info.value));
assert.ok(/while \(/.test(info.value));

View File

@@ -1,19 +0,0 @@
function *gen(obj) {
var count = 0;
for (var key in (yield "why not", obj)) {
if (obj.hasOwnProperty(key)) {
if (key === "skip") {
break;
}
count += 1;
yield [key, obj[key]];
}
}
return count;
}
genHelpers.check(
gen({ a: 1, b: 2, skip: 3, c: 4 }),
["why not", ["a", 1], ["b", 2]],
2
);

View File

@@ -1,13 +0,0 @@
function *gen() {
var count = 0;
var obj = {foo: 1, bar: 2};
for (var key in obj) {
assert(obj.hasOwnProperty(key), key + " must be own property");
yield [key, obj[key]];
delete obj.bar;
count += 1;
}
return count;
}
genHelpers.check(gen(), [["foo", 1]], 1);

View File

@@ -1,26 +0,0 @@
function a(sent) {
assert.strictEqual(sent, 1);
a.called = true;
}
function b(sent) {
assert.strictEqual(sent, 2);
b.called = true;
return { callee: b };
}
function *gen() {
assert.ok(!a.called);
assert.ok(!b.called);
for (var key in a(yield 0), b(yield 1)) {
assert.ok(a.called);
assert.ok(b.called);
assert.strictEqual(yield key, 3);
}
for (var key in a(1), { foo: "foo", bar: "bar" }) {
yield key;
}
}
genHelpers.check(gen(), [0, 1, "callee", "foo", "bar"]);

View File

@@ -1,12 +0,0 @@
function *gen() {
var count = 0;
var obj = {foo: 1, bar: 2};
for (var key in obj) {
assert(obj.hasOwnProperty(key), key + " must be own property");
yield [key, obj[key]];
count += 1;
}
return count;
}
genHelpers.check(gen(), [["foo", 1], ["bar", 2]], 2);

View File

@@ -1,16 +0,0 @@
function *gen() {
var count = 0;
function Foo() {
this.baz = 1
}
Foo.prototype.bar = 2;
var foo = new Foo();
for (var key in foo) {
yield [key, foo[key]];
count += 1;
}
return count;
}
genHelpers.check(gen(), [["baz", 1], ["bar", 2]], 2);

View File

@@ -1,7 +0,0 @@
// https://github.com/facebook/regenerator/issues/103
function *range() {
for (var i = 0; false; ) {
}
}
genHelpers.check(range(), []);

View File

@@ -1,5 +0,0 @@
var sum = 0;
for (var x of [1, 2].concat(3)) {
sum += x;
}
assert.strictEqual(sum, 6);

View File

@@ -1,10 +0,0 @@
function *range(n) {
for (var i = 0; i < n; ++i) {
yield i;
}
}
var value, values = [];
for (value of range(3))
values.push(value);
assert.deepEqual(values, [0, 1, 2]);

View File

@@ -1,45 +0,0 @@
function *yieldPermutations(list) {
if (list.length < 2) {
yield list;
return 1;
}
var count = 0;
var first = list.slice(0, 1);
var genRest = yieldPermutations(list.slice(1));
for (var perm of genRest) {
for (var i = 0; i < list.length; ++i) {
var prefix = perm.slice(0, i);
var suffix = perm.slice(i);
yield prefix.concat(first, suffix);
}
count += i;
}
return count;
}
var count = 0;
for (var perm of yieldPermutations([])) {
assert.deepEqual(perm, []);
++count;
}
assert.strictEqual(count, 1);
genHelpers.check(yieldPermutations([1]), [[1]], 1);
genHelpers.check(yieldPermutations([2, 1]), [
[2, 1],
[1, 2]
], 2);
genHelpers.check(yieldPermutations([1,3,2]), [
[1, 3, 2],
[3, 1, 2],
[3, 2, 1],
[1, 2, 3],
[2, 1, 3],
[2, 3, 1]
], 6);

View File

@@ -1,24 +0,0 @@
function *gen(n) {
yield increment(n);
function increment(x) {
return x + 1;
}
if (n % 2) {
yield halve(decrement(n));
function halve(x) {
return x >> 1;
}
function decrement(x) {
return x - 1;
}
}
yield increment(increment(n));
}
genHelpers.check(gen(3), [4, 1, 5]);
genHelpers.check(gen(4), [5, 6]);

View File

@@ -1,15 +0,0 @@
function *outer(n) {
yield 0;
assert.ok(regeneratorRuntime.isGeneratorFunction(inner));
return yield* inner(n);
// Note that this function declaration comes after everything else
// in the outer function, but needs to be fully available above.
function *inner(n) {
yield n - 1;
yield n;
return yield n + 1;
}
}
genHelpers.check(outer(2), [0, 1, 2, 3], 4);

View File

@@ -1,6 +0,0 @@
genHelpers.check(function *(x, y) {
yield x;
yield y;
yield x + y;
return x * y;
}(3, 7), [3, 7, 10], 21);

View File

@@ -1,60 +0,0 @@
var GeneratorFunctionPrototype = f.__proto__;
var GeneratorFunction = GeneratorFunctionPrototype.constructor;
assert.strictEqual(GeneratorFunction.name, 'GeneratorFunction');
assert.strictEqual(GeneratorFunction.prototype,
GeneratorFunctionPrototype);
assert.strictEqual(GeneratorFunctionPrototype.prototype.constructor,
GeneratorFunctionPrototype);
assert.strictEqual(GeneratorFunctionPrototype.prototype,
f.prototype.__proto__);
assert.strictEqual(GeneratorFunctionPrototype.__proto__,
Function.prototype);
assert.strictEqual(GeneratorFunctionPrototype.name,
"GeneratorFunctionPrototype");
assert.strictEqual(typeof f2, "function");
assert.strictEqual(f2.constructor, GeneratorFunction);
assert.ok(f2 instanceof GeneratorFunction);
assert.strictEqual(f2.name, "f2");
var g = f();
assert.ok(g instanceof f);
assert.strictEqual(g.__proto__, f.prototype);
assert.deepEqual([], Object.getOwnPropertyNames(f.prototype));
// assert.deepEqual([], Object.getOwnPropertyNames(g));
f.prototype.x = 42;
var g2 = f();
assert.strictEqual(g2.x, 42);
var g3 = new f();
assert.strictEqual(g3.x, 42);
function* f2() {
yield 1;
}
assert.strictEqual(f.__proto__, f2.__proto__);
assert.strictEqual(f.hasOwnProperty('constructor'), false);
assert.strictEqual(f.__proto__.constructor.name, 'GeneratorFunction');
// Intentionally at the end to test hoisting.
function* f() {
yield this;
}
function* f() {
yield 1;
}
var f2 = f;
f = 42;
var g = f2();
assert.deepEqual(g.next(), { value: 1, done: false });
assert.deepEqual(g.next(), { value: void 0, done: true });
assert.ok(g instanceof f2);

Some files were not shown because too many files have changed in this diff Show More