From c5da14a1951c63ec1d08636224cfc0266f63f36d Mon Sep 17 00:00:00 2001 From: Darren Anderson Date: Sun, 10 Mar 2019 23:17:44 +0000 Subject: [PATCH] Add junit output for files which are successfully linted. (#4566) * Add junit output for files which are successfully linted. * Fix linting issues * Optimised JUnit formatter. * Added test which confirms that JUnit formatter correctly handles a mixture of files which lint successfully and files which contain errors. * Refactored JUnit formatter. --- src/formatters/junitFormatter.ts | 15 +++++- test/formatters/junitFormatterTests.ts | 73 +++++++++++++++++++++++--- 2 files changed, 81 insertions(+), 7 deletions(-) diff --git a/src/formatters/junitFormatter.ts b/src/formatters/junitFormatter.ts index b0ccf13b663..385745a056f 100644 --- a/src/formatters/junitFormatter.ts +++ b/src/formatters/junitFormatter.ts @@ -41,9 +41,11 @@ export class Formatter extends AbstractFormatter { }; /* tslint:enable:object-literal-sort-keys */ - public format(failures: RuleFailure[]): string { + public format(failures: RuleFailure[], _fixes?: RuleFailure[], fileNames?: string[]): string { let output = ''; + const failureFileNames: Set = new Set([...failures.map(f => f.getFileName())]); + if (failures.length !== 0) { const failuresSorted = failures.sort((a, b) => a.getFileName().localeCompare(b.getFileName()), @@ -76,6 +78,17 @@ export class Formatter extends AbstractFormatter { } } + if (fileNames !== undefined && fileNames.length !== 0) { + // Filter out files which have had a failure associated with them. + const filteredFileNames = fileNames.filter(fileName => !failureFileNames.has(fileName)); + + for (const fileName of filteredFileNames) { + output += ``; + output += ``; + output += ``; + } + } + output += ""; return output; } diff --git a/test/formatters/junitFormatterTests.ts b/test/formatters/junitFormatterTests.ts index 519e712a564..6436177339f 100644 --- a/test/formatters/junitFormatterTests.ts +++ b/test/formatters/junitFormatterTests.ts @@ -106,14 +106,75 @@ describe("JUnit Formatter", () => { `.replace(/>\s+/g, ">"); // Remove whitespace between tags; - assert.equal(formatter.format(failures), expectedResult); + assert.equal(formatter.format(failures, [], [TEST_FILE_1, TEST_FILE_2]), expectedResult); }); it("handles no failures", () => { - const result = formatter.format([]); - assert.deepEqual( - result, - '', - ); + const result = formatter.format([], [], ["test1.ts", "test2.ts", "test3.ts"]); + const expectedResult = ` + + + + + + + + + + + `.replace(/>\s+/g, ">"); + + assert.equal(result, expectedResult); + }); + + it("handles a mixture of failures and successes", () => { + const maxPosition1 = sourceFile1.getFullWidth(); + + const failures = [ + createFailure(sourceFile1, 0, 1, "first failure", "first-name", undefined, "error"), + createFailure( + sourceFile1, + 2, + 3, + "&<>'\" should be escaped", + "escape", + undefined, + "error", + ), + createFailure( + sourceFile1, + maxPosition1 - 1, + maxPosition1, + "last failure", + "last-name", + undefined, + "error", + ), + ]; + + const expectedResult = ` + + + + first failure Line 1, Column 1 + + + &<>'" should be escaped Line 1, Column 3 + + + last failure Line 6, Column 3 + + + + + + + + + `.replace(/>\s+/g, ">"); + + const result = formatter.format(failures, [], [TEST_FILE_1, "test1.ts", "test2.ts"]); + + assert.equal(result, expectedResult); }); });