Skip to content
This repository has been archived by the owner on Feb 27, 2024. It is now read-only.

Commit

Permalink
Add RuleDuplicatedParams
Browse files Browse the repository at this point in the history
  • Loading branch information
jhm-ciberman committed Jul 7, 2018
1 parent eaee26f commit a9eb669
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/config/entities/ScriptValidationRules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,9 @@ export default class ScriptValidationRules implements IScriptValidationRules {
* This rule fails if the script has no data type for the returned value
*/
public noReturnType: IValidationRuleConfig = new ValidationRuleConfig(true, true);

/**
* This rule fails if the script has one or more duplicated params names
*/
public duplicatedParams: IValidationRuleConfig = new ValidationRuleConfig(true, true);
}
1 change: 1 addition & 0 deletions src/config/interfaces/IScriptValidationRules.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ export default interface IScriptValidationRules {
functionSignatureInDescription: IValidationRuleConfig;
noReturnDescription: IValidationRuleConfig;
noReturnType: IValidationRuleConfig;
duplicatedParams: IValidationRuleConfig;
}
3 changes: 3 additions & 0 deletions src/validation/RulesProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import IScriptValidationRules from "../config/interfaces/IScriptValidationRules"
import IValidationRuleConfig from "../config/interfaces/IValidationRuleConfig";
import IRule from "./interfaces/IRule";
import IRulesProvider from "./interfaces/IRulesProvider";
import RuleDuplicateParam from "./rules/RuleDuplicatedParams";
import RuleFunctionSignatureInDescription from "./rules/RuleFunctionSignatureInDescription";
import RuleMismatchingArguments from "./rules/RuleMismatchingArguments";
import RuleMismatchingFunctionName from "./rules/RuleMismatchingFunctionName";
Expand Down Expand Up @@ -31,6 +32,7 @@ export default class RulesProvider implements IRulesProvider {
new RuleFunctionSignatureInDescription(),
new RuleNoReturnDescription(),
new RuleNoReturnType(),
new RuleDuplicateParam(),
];
}

Expand All @@ -49,6 +51,7 @@ export default class RulesProvider implements IRulesProvider {
rules.functionSignatureInDescription,
rules.noReturnDescription,
rules.noReturnType,
rules.duplicatedParams,
];
}
}
37 changes: 37 additions & 0 deletions src/validation/rules/RuleDuplicatedParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import IRule from "../interfaces/IRule";
import IValidableScript from "../interfaces/IValidableScript";

/**
* This rule checks if the script has some duplicate parameter
*/
export default class RuleDuplicatedParams implements IRule {
/**
* Method to validate the rule
* @param element The element to validate
*/
public isValid(element: IValidableScript): boolean {
const list = this._getDuplicatedParamsList(element);
return (list.length === 0);
}
/**
* Method to generate a warning message in case the rule is invalid
* @param element The element to validate
*/
public getWarnMessage(element: IValidableScript): string {
const list = this._getDuplicatedParamsList(element);
return `Script "${element.doc.name}" has duplicated ${list.join(", ")} arguments.`;
}

private _getDuplicatedParamsList(element: IValidableScript): string[] {
const set = new Set<string>();
const list: string[] = [];
for (const param of element.doc.params) {
if (set.has(param.name)) {
list.push(param.name);
} else {
set.add(param.name);
}
}
return list;
}
}
56 changes: 56 additions & 0 deletions tests/unit/validation/rules/RuleDuplicateParam.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import {
Expect,
Test,
TestFixture,
} from "alsatian";

import DocParam from "../../../../src/doc_models/DocParam";
import RuleDuplicatedParams from "../../../../src/validation/rules/RuleDuplicatedParams";
import MockValidableScript from "./__mock__/MockValidableScript.mock";

/* tslint:disable:max-classes-per-file completed-docs */

@TestFixture("RuleDuplicateParamFixture")
export class RuleDuplicateParamFixture {

@Test("isValid")
public isValid() {
const vs = new MockValidableScript();
const p1 = new DocParam();
const p2 = new DocParam();
p1.name = "arg1";
p2.name = "arg2";
vs.doc.params.push(p1, p2);

const rule = new RuleDuplicatedParams();
Expect(rule.isValid(vs)).toBe(true);
}

@Test("isValid_not")
public isValid_not() {
const vs = new MockValidableScript();
const p1 = new DocParam();
const p2 = new DocParam();
p1.name = "arg1";
p2.name = "arg1";
vs.doc.params.push(p1, p2);

const rule = new RuleDuplicatedParams();
Expect(rule.isValid(vs)).toBe(false);
}

@Test("isValid")
public getWarnMessage() {
const vs = new MockValidableScript();
const p1 = new DocParam();
const p2 = new DocParam();
p1.name = "arg1";
p2.name = "arg1";
vs.doc.params.push(p1, p2);

const rule = new RuleDuplicatedParams();
const str = rule.getWarnMessage(vs);
Expect(str).toContain("foo");
Expect(str).toContain("arg1");
}
}

0 comments on commit a9eb669

Please sign in to comment.