Skip to content

Commit

Permalink
feat(test): add easier way to annotate code
Browse files Browse the repository at this point in the history
Fix #235
  • Loading branch information
mgechev committed Feb 19, 2017
1 parent 126677d commit 77ef89e
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 20 deletions.
28 changes: 9 additions & 19 deletions test/invokeInjectableRule.spec.ts
@@ -1,4 +1,4 @@
import {assertFailure, assertSuccess} from './testHelper';
import {assertFailure, assertSuccess, assertAnnotated} from './testHelper';

describe('invoke-injectable', () => {
describe('success', () => {
Expand Down Expand Up @@ -35,41 +35,31 @@ describe('invoke-injectable', () => {
it('should fail when injectable is not invoked', () => {
let source = `
@Injectable
~~~~~~~~~~~
class Foobar {
foo() {}
}
`;
assertFailure('invoke-injectable', source, {
assertAnnotated({
ruleName: 'invoke-injectable',
message: 'You have to invoke @Injectable()',
startPosition: {
line: 1,
character: 8
},
endPosition: {
line: 1,
character: 19
}
source
});
});

it('should fail when injectable is not invoked and multiple decorators are used', () => {
let source = `
@Injectable
~~~~~~~~~~~
@Component()
class Foobar {
foo() {}
}
`;
assertFailure('invoke-injectable', source, {
assertAnnotated({
ruleName: 'invoke-injectable',
message: 'You have to invoke @Injectable()',
startPosition: {
line: 1,
character: 8
},
endPosition: {
line: 1,
character: 19
}
source
});
});

Expand Down
64 changes: 63 additions & 1 deletion test/testHelper.ts
Expand Up @@ -33,6 +33,68 @@ function lint(ruleName: string, source: string, options): tslint.LintResult {
return linter.getResult();
}

export interface AssertConfig {
ruleName: string;
source: string;
options?: any;
message?: string;
}

const parseInvalidSource = (source: string, message: string) => {
let start = null;
let end = null;
let ended = false;
let line = 0;
let col = 0;
let linearStart = 0;
let linearEnd = 0;
for (let i = 0; i < source.length && !ended; i += 1) {
if (source[i] === '~' && source[i - 1] !== '/' && start === null) {
start = {
line: line - 1,
character: col
};
linearStart = i;
} else if (start !== null && source[i] !== '~') {
end = {
line: line - 1,
character: col
};
linearEnd = i;
ended = true;
}
if (source[i] === '\n') {
col = 0;
line += 1;
} else {
col += 1;
}
}
let whitespace = '';
for (let i = start; i < end; i += 1) {
whitespace += ' ';
}
source = source.substring(0, linearStart) + whitespace + source.substring(linearEnd, source.length);
console.log(source.substring(0, linearStart));
return {
source: source,
failure: {
message: message,
startPosition: start,
endPosition: end
}
};
};

export function assertAnnotated(config: AssertConfig) {
if (config.message) {
const parsed = parseInvalidSource(config.source, config.message);
assertFailure(config.ruleName, parsed.source, parsed.failure, config.options);
} else {
assertSuccess(config.ruleName, config.source, config.options);
}
};

export function assertFailure(ruleName: string, source: string, fail: IExpectedFailure, options = null) {
let result;
try {
Expand All @@ -41,7 +103,7 @@ export function assertFailure(ruleName: string, source: string, fail: IExpectedF
console.log(e.stack);
}
chai.assert(result.failureCount > 0, 'no failures');
result.failures.forEach(ruleFail => {
result.failures.forEach((ruleFail: tslint.RuleFailure) => {
chai.assert.equal(fail.message, ruleFail.getFailure(), 'error messages dont\'t match');
chai.assert.deepEqual(fail.startPosition, ruleFail.getStartPosition().getLineAndCharacter(), 'start char doesn\'t match');
chai.assert.deepEqual(fail.endPosition, ruleFail.getEndPosition().getLineAndCharacter(), 'end char doesn\'t match');
Expand Down

0 comments on commit 77ef89e

Please sign in to comment.