Skip to content

Commit

Permalink
Fix: fails the test case if autofix made syntax error (fixes #11615)
Browse files Browse the repository at this point in the history
  • Loading branch information
mysticatea committed Jun 3, 2019
1 parent cb1922b commit 7e7caf1
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 18 deletions.
34 changes: 26 additions & 8 deletions lib/rule-tester/rule-tester.js
Expand Up @@ -313,7 +313,7 @@ class RuleTester {
*/
function runRuleForItem(item) {
let config = lodash.cloneDeep(testerConfig),
code, filename, beforeAST, afterAST;
code, filename, output, beforeAST, afterAST;

if (typeof item === "string") {
code = item;
Expand Down Expand Up @@ -396,8 +396,29 @@ class RuleTester {

validate(config, "rule-tester", id => (id === ruleName ? rule : null));

// Verify the code.
const messages = linter.verify(code, config, filename);

// Ignore syntax errors for backward compatibility if `errors` is a number.
if (typeof item.errors !== "number") {
const errorMessage = messages.find(m => m.fatal);

assert(!errorMessage, `A fatal parsing error occurred: ${errorMessage && errorMessage.message}`);
}

// Verify if autofix makes a syntax error or not.
if (messages.some(m => m.fix)) {
output = SourceCodeFixer.applyFixes(code, messages).output;
const errorMessageInFix = linter.verify(output, config, filename).find(m => m.fatal);

assert(!errorMessageInFix, `A fatal parsing error occurred in autofix: ${errorMessageInFix && errorMessageInFix.message}`);
} else {
output = code;
}

return {
messages: linter.verify(code, config, filename, true),
messages,
output,
beforeAST,
afterAST: cloneDeeplyExcludesParent(afterAST)
};
Expand Down Expand Up @@ -488,7 +509,6 @@ class RuleTester {
const error = item.errors[i];
const message = messages[i];

assert(!message.fatal, `A fatal parsing error occurred: ${message.message}`);
assert(hasMessageOfThisRule, "Error rule name should be the same as the name of the rule being tested");

if (typeof error === "string" || error instanceof RegExp) {
Expand Down Expand Up @@ -574,14 +594,12 @@ class RuleTester {
if (Object.prototype.hasOwnProperty.call(item, "output")) {
if (item.output === null) {
assert.strictEqual(
messages.filter(message => message.fix).length,
0,
result.output,
item.code,
"Expected no autofixes to be suggested"
);
} else {
const fixResult = SourceCodeFixer.applyFixes(item.code, messages);

assert.strictEqual(fixResult.output, item.output, "Output is incorrect.");
assert.strictEqual(result.output, item.output, "Output is incorrect.");
}
}

Expand Down
50 changes: 40 additions & 10 deletions tests/lib/rule-tester/rule-tester.js
Expand Up @@ -42,22 +42,28 @@ const NODE_ASSERT_STRICT_EQUAL_OPERATOR = (() => {

const ruleTesterTestEmitter = new EventEmitter();

RuleTester.describe = function(text, method) {
ruleTesterTestEmitter.emit("describe", text, method);
return method.call(this);
};

RuleTester.it = function(text, method) {
ruleTesterTestEmitter.emit("it", text, method);
return method.call(this);
};

//------------------------------------------------------------------------------
// Tests
//------------------------------------------------------------------------------

describe("RuleTester", () => {

// Stub `describe()` and `it()` while this test suite.
before(() => {
RuleTester.describe = function(text, method) {
ruleTesterTestEmitter.emit("describe", text, method);
return method.call(this);
};
RuleTester.it = function(text, method) {
ruleTesterTestEmitter.emit("it", text, method);
return method.call(this);
};
});
after(() => {
RuleTester.describe = null;
RuleTester.it = null;
});

let ruleTester;

/**
Expand Down Expand Up @@ -1042,4 +1048,28 @@ describe("RuleTester", () => {
return assertion;
});
});

// https://github.com/eslint/eslint/issues/11615
it("should fail the case if autofix made a syntax error.", () => {
assert.throw(() => {
ruleTester.run(
"foo",
context => ({
Identifier(node) {
context.report({
node,
message: "make a syntax error",
fix(fixer) {
return fixer.replaceText(node, "one two");
}
});
}
}),
{
valid: ["one()"],
invalid: []
}
);
}, /A fatal parsing error occurred in autofix/u);
});
});

0 comments on commit 7e7caf1

Please sign in to comment.