Skip to content

Commit

Permalink
fix(error): add domain error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
azu committed Mar 22, 2014
1 parent 9cb8d63 commit 324b87e
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 63 deletions.
5 changes: 5 additions & 0 deletions example/async-code.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
"use strict";
var a = "string";
setTimeout(function () {
a;// => "ss";
}, 1);
5 changes: 0 additions & 5 deletions example/example.js

This file was deleted.

2 changes: 2 additions & 0 deletions example/string.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
var result = [1, 2];
result.toString(); // > "1,2"
24 changes: 20 additions & 4 deletions lib/ast-generator/mixin-assert.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,16 @@ function mixinGenerator(node, commentExpression) {
"expression": {
"type": "CallExpression",
"callee": {
"type": "Identifier",
"name": "_docDeepEqual"
"type": "MemberExpression",
"computed": false,
"object": {
"type": "Identifier",
"name": "assert"
},
"property": {
"type": "Identifier",
"name": "deepEqual"
}
},
"arguments": [
{ // actual
Expand All @@ -114,8 +122,16 @@ function mixinGenerator(node, commentExpression) {
"expression": {
"type": "CallExpression",
"callee": {
"type": "Identifier",
"name": "_docAssert"
"type": "MemberExpression",
"computed": false,
"object": {
"type": "Identifier",
"name": "assert"
},
"property": {
"type": "Identifier",
"name": "ok"
}
},
"arguments": [
{
Expand Down
15 changes: 8 additions & 7 deletions lib/cli/exec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ var path = require("path");
var docPower = require("../power-doctest");
module.exports = function (argv, filePath) {
var fileData = fs.readFileSync(filePath, "utf-8");
var results = docPower.runDocTest({
fileData: fileData,
filePath: filePath
}, {isDebug: argv.debug});
docPower.printTestResult(results);
if (results.length > 0) {
docPower.runDocTestAsPromise(fileData, {
filePath: filePath,
isDebug: argv.debug
}).then(function (results) {
docPower.printTestResult(results);
}).catch(function (error) {
docPower.printTestResult([error]);
process.exit(1);
}
});
};

8 changes: 7 additions & 1 deletion lib/count-method.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,13 @@ function isFunctionCall(node,functionName) {
if(node.expression.type !== estraverse.Syntax.CallExpression) {
return false
}
return node.expression.callee.name === functionName;
var callee = node.expression.callee;
if(callee.type === estraverse.Syntax.MemberExpression) {
if(callee.object.name === functionName) {
return true;
}
}
return callee.name === functionName;
}
function countMethodCall(ast, functionName) {
var count = 0;
Expand Down
67 changes: 21 additions & 46 deletions lib/power-doctest.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@ var astUtil = {
token.type === 'LineBreak' ||
token.type === 'Indent');
},
isWhiteSpace: function isWhiteSpace(node) {
return node.type === "WhiteSpace";
},
isSemicolon: function isSemicolon(node) {
return node.type === "Punctuator" && node.value === ";";
},
Expand Down Expand Up @@ -296,49 +293,15 @@ function powerizeCode(source, options) {
var espower = require('espower');
var reCode = convertCode(source, options);
var jsAst = esprima.parse(reCode, {loc: true, range: true});
var assertCount = require("./count-method").countMethodCall(jsAst, "_docAssert");
var assertCount = require("./count-method").countMethodCall(jsAst, "assert");
var espowerOptions = {
source: reCode
};
var modifiedAst = espower(jsAst, espowerOptions);
var generated = escodegen.generate(modifiedAst);
return {context: context, generated: generated, assertCount: assertCount};
return {context: context, generated: generated, assertCount: assertCount / 2};

}
function runDocTest(source, options) {
eventEmitter.on("parse-error", function (node, message) {
if (node instanceof Error) {
console.error(node.message);
} else if (typeof node === "object") {
var logPath = [source.filePath, node.loc.start.line, node.loc.start.column].join(":");
console.error(logPath + "\n" + message);
} else {
console.error(node);
}
});
options = getOptions(options);
var __ret = powerizeCode(source, options);
var context = __ret.context;
var generated = __ret.generated;
var resultError = [];

if (options.isDebug) {
console.info("====== Generated Code ==========\n", generated, "\n====== /Generated Code ==========");
}
try {
require("vm").runInNewContext(generated, context);
} catch (error) {
// When unexpected error
if (error.name !== "AssertionError") {
throw error;
}
var filteredError = filterPowerAssertMessage(error);
filteredError.filePath = source.filePath;
resultError.push(filteredError);
}
eventEmitter.removeAllListeners("parse-error");
return resultError;
}
function runDocTestAsPromise(source, options) {
eventEmitter.on("parse-error", function (node, message) {
if (node instanceof Error) {
Expand All @@ -358,6 +321,8 @@ function runDocTestAsPromise(source, options) {
if (options.isDebug) {
console.info("====== Generated Code ==========\n", generated, "\n====== /Generated Code ==========");
}
var domain = require('domain');
var vmDoamin = domain.create();
var promise = new Promise(function (resolve, reject) {
var calledCount = 0;

Expand All @@ -368,16 +333,27 @@ function runDocTestAsPromise(source, options) {
}
}

var assert = require("assert");
context._docAssert = function () {
assert.apply(null, arguments);
var assertOK = context.assert.ok;
var deepEqual = context.assert.deepEqual;
context.assert.ok = function () {
assertOK.apply(context.assert, arguments);
assertCallback();
};
context._docDeepEqual = function () {
assert.deepEqual.apply(null, arguments);
context.assert.deepEqual = function () {
deepEqual.apply(context.assert, arguments);
assertCallback();
};
require("vm").runInNewContext(generated, context);
vmDoamin.on('error', function (error) {
if (error.name !== "AssertionError") {
return reject(error);
}
var filteredError = filterPowerAssertMessage(error);
filteredError.filePath = options.filePath;
reject(filteredError);
});
vmDoamin.run(function () {
require("vm").runInNewContext(generated, context);
});
if (assertCount === 0) {
return resolve(0);
}
Expand Down Expand Up @@ -436,7 +412,6 @@ function insertAssertModule(ast) {
// options
exports.convertCode = convertCode;
exports.convertFromCodeToTree = convertFromCodeToTree;
exports.runDocTest = runDocTest;
exports.runDocTestAsPromise = runDocTestAsPromise;
exports.printTestResult = printTestResult;
exports.insertAssertModule = insertAssertModule;

0 comments on commit 324b87e

Please sign in to comment.