Skip to content

Commit

Permalink
Added subclassing tests
Browse files Browse the repository at this point in the history
  • Loading branch information
nzakas committed Jan 14, 2022
1 parent ddc53e2 commit da9d3f8
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 60 deletions.
10 changes: 5 additions & 5 deletions lib/rule-tester/flat-rule-tester.js
Expand Up @@ -1008,10 +1008,10 @@ class FlatRuleTester {
* This creates a mocha test suite and pipes all supplied info through
* one of the templates above.
*/
FlatRuleTester.describe(ruleName, () => {
FlatRuleTester.describe("valid", () => {
this.constructor.describe(ruleName, () => {
this.constructor.describe("valid", () => {
test.valid.forEach(valid => {
FlatRuleTester[valid.only ? "itOnly" : "it"](
this.constructor[valid.only ? "itOnly" : "it"](
sanitize(typeof valid === "object" ? valid.name || valid.code : valid),
() => {
testValidTemplate(valid);
Expand All @@ -1020,9 +1020,9 @@ class FlatRuleTester {
});
});

FlatRuleTester.describe("invalid", () => {
this.constructor.describe("invalid", () => {
test.invalid.forEach(invalid => {
FlatRuleTester[invalid.only ? "itOnly" : "it"](
this.constructor[invalid.only ? "itOnly" : "it"](
sanitize(invalid.name || invalid.code),
() => {
testInvalidTemplate(invalid);
Expand Down
85 changes: 65 additions & 20 deletions tests/lib/rule-tester/flat-rule-tester.js
Expand Up @@ -2131,27 +2131,27 @@ describe("FlatRuleTester", () => {
});
});

describe("naming test cases", () => {

/**
* Asserts that a particular value will be emitted from an EventEmitter.
* @param {EventEmitter} emitter The emitter that should emit a value
* @param {string} emitType The type of emission to listen for
* @param {any} expectedValue The value that should be emitted
* @returns {Promise<void>} A Promise that fulfills if the value is emitted, and rejects if something else is emitted.
* The Promise will be indefinitely pending if no value is emitted.
*/
function assertEmitted(emitter, emitType, expectedValue) {
return new Promise((resolve, reject) => {
emitter.once(emitType, emittedValue => {
if (emittedValue === expectedValue) {
resolve();
} else {
reject(new Error(`Expected ${expectedValue} to be emitted but ${emittedValue} was emitted instead.`));
}
});
/**
* Asserts that a particular value will be emitted from an EventEmitter.
* @param {EventEmitter} emitter The emitter that should emit a value
* @param {string} emitType The type of emission to listen for
* @param {any} expectedValue The value that should be emitted
* @returns {Promise<void>} A Promise that fulfills if the value is emitted, and rejects if something else is emitted.
* The Promise will be indefinitely pending if no value is emitted.
*/
function assertEmitted(emitter, emitType, expectedValue) {
return new Promise((resolve, reject) => {
emitter.once(emitType, emittedValue => {
if (emittedValue === expectedValue) {
resolve();
} else {
reject(new Error(`Expected ${expectedValue} to be emitted but ${emittedValue} was emitted instead.`));
}
});
}
});
}

describe("naming test cases", () => {

it("should use the first argument as the name of the test suite", () => {
const assertion = assertEmitted(ruleTesterTestEmitter, "describe", "this-is-a-rule-name");
Expand Down Expand Up @@ -2464,4 +2464,49 @@ describe("FlatRuleTester", () => {
});
});

describe("Subclassing", () => {
it("should allow subclasses to s`et the describe/it/itOnly statics and should correctly use those values", () => {
const assertionDescribe = assertEmitted(ruleTesterTestEmitter, "custom describe", "this-is-a-rule-name");
const assertionIt = assertEmitted(ruleTesterTestEmitter, "custom it", "valid(code);");
const assertionItOnly = assertEmitted(ruleTesterTestEmitter, "custom itOnly", "validOnly(code);");

/**
* Subclass for testing
*/
class RuleTesterSubclass extends FlatRuleTester { }
RuleTesterSubclass.describe = function(text, method) {
ruleTesterTestEmitter.emit("custom describe", text, method);
return method.call(this);
};
RuleTesterSubclass.it = function(text, method) {
ruleTesterTestEmitter.emit("custom it", text, method);
return method.call(this);
};
RuleTesterSubclass.itOnly = function(text, method) {
ruleTesterTestEmitter.emit("custom itOnly", text, method);
return method.call(this);
};

const ruleTesterSubclass = new RuleTesterSubclass();

ruleTesterSubclass.run("this-is-a-rule-name", require("../../fixtures/testers/rule-tester/no-var"), {
valid: [
"valid(code);",
{
code: "validOnly(code);",
only: true
}
],
invalid: []
});

return Promise.all([
assertionDescribe,
assertionIt,
assertionItOnly
]);
});

});

});
75 changes: 40 additions & 35 deletions tests/lib/rule-tester/rule-tester.js
Expand Up @@ -2628,45 +2628,50 @@ describe("RuleTester", () => {
});
});

it("should allow subclasses to set the describe/it/itOnly statics and should correctly use those values", () => {
const assertionDescribe = assertEmitted(ruleTesterTestEmitter, "custom describe", "this-is-a-rule-name");
const assertionIt = assertEmitted(ruleTesterTestEmitter, "custom it", "valid(code);");
const assertionItOnly = assertEmitted(ruleTesterTestEmitter, "custom itOnly", "validOnly(code);");
describe("Subclassing", () => {

it("should allow subclasses to set the describe/it/itOnly statics and should correctly use those values", () => {
const assertionDescribe = assertEmitted(ruleTesterTestEmitter, "custom describe", "this-is-a-rule-name");
const assertionIt = assertEmitted(ruleTesterTestEmitter, "custom it", "valid(code);");
const assertionItOnly = assertEmitted(ruleTesterTestEmitter, "custom itOnly", "validOnly(code);");

/**
* Subclass for testing
*/
class RuleTesterSubclass extends RuleTester { }
RuleTesterSubclass.describe = function(text, method) {
ruleTesterTestEmitter.emit("custom describe", text, method);
return method.call(this);
};
RuleTesterSubclass.it = function(text, method) {
ruleTesterTestEmitter.emit("custom it", text, method);
return method.call(this);
};
RuleTesterSubclass.itOnly = function(text, method) {
ruleTesterTestEmitter.emit("custom itOnly", text, method);
return method.call(this);
};

/**
* Subclass for testing
*/
class RuleTesterSubclass extends RuleTester { }
RuleTesterSubclass.describe = function(text, method) {
ruleTesterTestEmitter.emit("custom describe", text, method);
return method.call(this);
};
RuleTesterSubclass.it = function(text, method) {
ruleTesterTestEmitter.emit("custom it", text, method);
return method.call(this);
};
RuleTesterSubclass.itOnly = function(text, method) {
ruleTesterTestEmitter.emit("custom itOnly", text, method);
return method.call(this);
};
const ruleTesterSubclass = new RuleTesterSubclass();

const ruleTesterSubclass = new RuleTesterSubclass();
ruleTesterSubclass.run("this-is-a-rule-name", require("../../fixtures/testers/rule-tester/no-var"), {
valid: [
"valid(code);",
{
code: "validOnly(code);",
only: true
}
],
invalid: []
});

ruleTesterSubclass.run("this-is-a-rule-name", require("../../fixtures/testers/rule-tester/no-var"), {
valid: [
"valid(code);",
{
code: "validOnly(code);",
only: true
}
],
invalid: []
return Promise.all([
assertionDescribe,
assertionIt,
assertionItOnly
]);
});

return Promise.all([
assertionDescribe,
assertionIt,
assertionItOnly
]);
});

});

0 comments on commit da9d3f8

Please sign in to comment.