tslint-clean-code
Version:
TSLint rules for enforcing Clean Code
116 lines • 9.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var TestHelper_1 = require("./TestHelper");
var stripIndent = require("strip-indent");
describe('noFeatureEnvyRule', function () {
var ruleName = 'no-feature-envy';
context('when default options', function () {
context('when using this', function () {
it('should pass on method using this', function () {
var script = "\n class Warehouse {\n salePrice(item) {\n return item.salePrice * this.vat;\n }\n }\n ";
TestHelper_1.TestHelper.assertViolations(ruleName, stripIndent(script), []);
});
it('should fail on class method which calls item more than this', function () {
var script = "\n class Warehouse {\n salePrice(item) {\n return (item.price - item.rebate) * this.vat;\n }\n }\n ";
TestHelper_1.TestHelper.assertViolations(ruleName, stripIndent(script), [
{
failure: 'Method "salePrice" uses "item" more than its own class "Warehouse". ' +
'Extract or Move Method from "salePrice" into "item".',
name: 'file.ts',
ruleName: ruleName,
startPosition: { character: 5, line: 3 },
},
]);
});
it('should pass on method using chained property accesses on item', function () {
var script = "\n class Warehouse {\n salePrice(item) {\n return item.price.sale * this.vat;\n }\n }\n ";
TestHelper_1.TestHelper.assertViolations(ruleName, stripIndent(script), []);
});
it('should pass on method using chained property accesses on this', function () {
var script = "\n class Warehouse {\n salePrice(item) {\n return item.salePrice * this.sale.vat;\n }\n }\n ";
TestHelper_1.TestHelper.assertViolations(ruleName, stripIndent(script), []);
});
context('when multiple instances of feature envy', function () {
it('should fail on class method with the highest feature envy', function () {
var script = "\n class SocialNetwork {\n connectMessage(person1, person2) {\n const person1Name = `${person1.firstName} ${person1.lastName}`;\n const person2Name = `${person2.firstName} ${person2.lastName}`;\n return `${person1Name} just met ${person2Name}`;\n }\n }\n ";
TestHelper_1.TestHelper.assertViolations(ruleName, stripIndent(script), [
{
failure: 'Method "connectMessage" uses "person1" more than its own class "SocialNetwork". ' +
'Extract or Move Method from "connectMessage" into "person1".',
name: 'file.ts',
ruleName: ruleName,
startPosition: { character: 5, line: 3 },
},
]);
});
});
});
context('when using super', function () {
it('should pass on method using super instead of this', function () {
var script = "\n class CustomWarehouse extends BaseWarehouse {\n salePrice(item) {\n return item.salePrice * super.vat;\n }\n }\n ";
TestHelper_1.TestHelper.assertViolations(ruleName, stripIndent(script), []);
});
it('should fail on class method which calls item more than super', function () {
var script = "\n class CustomWarehouse extends BaseWarehouse {\n salePrice(item) {\n return (item.price - item.rebate) * super.vat;\n }\n }\n ";
TestHelper_1.TestHelper.assertViolations(ruleName, stripIndent(script), [
{
failure: 'Method "salePrice" uses "item" more than its own class "CustomWarehouse". ' +
'Extract or Move Method from "salePrice" into "item".',
name: 'file.ts',
ruleName: ruleName,
startPosition: { character: 5, line: 3 },
},
]);
});
});
context('when using static properties / methods', function () {
it('should pass on method using static properties instead of this', function () {
var script = "\n class CustomWarehouse {\n private static readonly vat: number = 1.2;\n salePrice(item) {\n return item.salePrice * CustomWarehouse.vat;\n }\n }\n ";
TestHelper_1.TestHelper.assertViolations(ruleName, stripIndent(script), []);
});
it('should pass on method using static methods instead of this', function () {
var script = "\n class CustomWarehouse {\n private static getVat() { return 1.2; }\n salePrice(item) {\n return item.salePrice * CustomWarehouse.getVat();\n }\n }\n ";
TestHelper_1.TestHelper.assertViolations(ruleName, stripIndent(script), []);
});
it('should fail on class method which calls item more than static properties', function () {
var script = "\n class CustomWarehouse {\n private static readonly vat: number = 1.2;\n salePrice(item) {\n return (item.price - item.rebate) * CustomWarehouse.vat;\n }\n }\n ";
TestHelper_1.TestHelper.assertViolations(ruleName, stripIndent(script), [
{
failure: 'Method "salePrice" uses "item" more than its own class "CustomWarehouse". ' +
'Extract or Move Method from "salePrice" into "item".',
name: 'file.ts',
ruleName: ruleName,
startPosition: { character: 5, line: 4 },
},
]);
});
it('should fail on class method which calls item more than static methods', function () {
var script = "\n class CustomWarehouse {\n private static getVat() { return 1.2; }\n salePrice(item) {\n return (item.price - item.rebate) * CustomWarehouse.getVat();\n }\n }\n ";
TestHelper_1.TestHelper.assertViolations(ruleName, stripIndent(script), [
{
failure: 'Method "salePrice" uses "item" more than its own class "CustomWarehouse". ' +
'Extract or Move Method from "salePrice" into "item".',
name: 'file.ts',
ruleName: ruleName,
startPosition: { character: 5, line: 4 },
},
]);
});
});
});
context('when threshold option changed', function () {
it('should pass on class method which calls item more than this within the threshold', function () {
var options = [1];
var script = "\n class Warehouse {\n salePrice(item) {\n return (item.price - item.rebate) * this.vat;\n }\n }\n ";
TestHelper_1.TestHelper.assertViolationsWithOptions(ruleName, options, stripIndent(script), []);
});
});
context('when exclude option changed', function () {
it('should pass on class method which calls excluded item more than this', function () {
var options = [['item']];
var script = "\n class Warehouse {\n salePrice(item) {\n return (item.price - item.rebate) * this.vat;\n }\n }\n ";
TestHelper_1.TestHelper.assertViolationsWithOptions(ruleName, options, stripIndent(script), []);
});
});
});
//# sourceMappingURL=NoFeatureEnvyRuleTests.js.map