From 8fa215e4dd4ea400356c5ad9b44ca5f7a28c033e Mon Sep 17 00:00:00 2001 From: Darren Anderson Date: Tue, 5 Mar 2019 15:48:27 +0000 Subject: [PATCH 1/5] Add junit output for files which are successfully linted. --- src/formatters/junitFormatter.ts | 20 +++++++++++++++++++- test/formatters/junitFormatterTests.ts | 22 ++++++++++++++++------ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/formatters/junitFormatter.ts b/src/formatters/junitFormatter.ts index b0ccf13b663..02b15e57643 100644 --- a/src/formatters/junitFormatter.ts +++ b/src/formatters/junitFormatter.ts @@ -41,7 +41,7 @@ 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 = ''; if (failures.length !== 0) { @@ -76,6 +76,24 @@ export class Formatter extends AbstractFormatter { } } + if(fileNames && fileNames.length !== 0) { + // Filter out files which have had a failure associated with them. + const filteredFileNames = fileNames.filter((fileName) => { + for(const failure of failures) { + if(fileName === failure.getFileName()) { + return false; + } + } + return true; + }); + + 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..d4b8d64250d 100644 --- a/test/formatters/junitFormatterTests.ts +++ b/test/formatters/junitFormatterTests.ts @@ -106,14 +106,24 @@ 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); }); }); From becaf70ef6e1d41ca32754d29b889712dfea2166 Mon Sep 17 00:00:00 2001 From: Darren Anderson Date: Tue, 5 Mar 2019 16:29:44 +0000 Subject: [PATCH 2/5] Fix linting issues --- src/formatters/junitFormatter.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/formatters/junitFormatter.ts b/src/formatters/junitFormatter.ts index 02b15e57643..69b61cc0182 100644 --- a/src/formatters/junitFormatter.ts +++ b/src/formatters/junitFormatter.ts @@ -76,20 +76,20 @@ export class Formatter extends AbstractFormatter { } } - if(fileNames && fileNames.length !== 0) { + if (fileNames !== undefined && fileNames.length !== 0) { // Filter out files which have had a failure associated with them. - const filteredFileNames = fileNames.filter((fileName) => { - for(const failure of failures) { - if(fileName === failure.getFileName()) { + const filteredFileNames = fileNames.filter(fileName => { + for (const failure of failures) { + if (fileName === failure.getFileName()) { return false; } } return true; }); - for(const fileName of filteredFileNames) { + for (const fileName of filteredFileNames) { output += ``; - output += `` + output += ``; output += ``; } } From b40c4695ac590b1042d415e041712e3c1a254ee4 Mon Sep 17 00:00:00 2001 From: Darren Anderson Date: Thu, 7 Mar 2019 09:50:27 +0000 Subject: [PATCH 3/5] Optimised JUnit formatter. --- src/formatters/junitFormatter.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/formatters/junitFormatter.ts b/src/formatters/junitFormatter.ts index 69b61cc0182..006581e337e 100644 --- a/src/formatters/junitFormatter.ts +++ b/src/formatters/junitFormatter.ts @@ -44,12 +44,17 @@ export class Formatter extends AbstractFormatter { public format(failures: RuleFailure[], _fixes?: RuleFailure[], fileNames?: string[]): string { let output = ''; + const failureFileNames: Set = new Set(); + if (failures.length !== 0) { const failuresSorted = failures.sort((a, b) => a.getFileName().localeCompare(b.getFileName()), ); let previousFilename: string | null = null; for (const failure of failuresSorted) { + if (!failureFileNames.has(failure.getFileName())) { + failureFileNames.add(failure.getFileName()); + } const lineAndCharacter = failure.getStartPosition().getLineAndCharacter(); const message = this.escapeXml(failure.getFailure()); const rule = this.escapeXml(failure.getRuleName()); @@ -78,14 +83,7 @@ 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 => { - for (const failure of failures) { - if (fileName === failure.getFileName()) { - return false; - } - } - return true; - }); + const filteredFileNames = fileNames.filter(fileName => !failureFileNames.has(fileName)); for (const fileName of filteredFileNames) { output += ``; From c0e6932e1220acfba2e54f84e0a623bc46df470a Mon Sep 17 00:00:00 2001 From: Darren Anderson Date: Thu, 7 Mar 2019 10:26:27 +0000 Subject: [PATCH 4/5] Added test which confirms that JUnit formatter correctly handles a mixture of files which lint successfully and files which contain errors. --- test/formatters/junitFormatterTests.ts | 51 ++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/test/formatters/junitFormatterTests.ts b/test/formatters/junitFormatterTests.ts index d4b8d64250d..6436177339f 100644 --- a/test/formatters/junitFormatterTests.ts +++ b/test/formatters/junitFormatterTests.ts @@ -126,4 +126,55 @@ describe("JUnit Formatter", () => { 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); + }); }); From 5e0272a781d9bc7b1293b2f13b5d07aa41ab1d9a Mon Sep 17 00:00:00 2001 From: Darren Anderson Date: Thu, 7 Mar 2019 15:38:18 +0000 Subject: [PATCH 5/5] Refactored JUnit formatter. --- src/formatters/junitFormatter.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/formatters/junitFormatter.ts b/src/formatters/junitFormatter.ts index 006581e337e..385745a056f 100644 --- a/src/formatters/junitFormatter.ts +++ b/src/formatters/junitFormatter.ts @@ -44,7 +44,7 @@ export class Formatter extends AbstractFormatter { public format(failures: RuleFailure[], _fixes?: RuleFailure[], fileNames?: string[]): string { let output = ''; - const failureFileNames: Set = new Set(); + const failureFileNames: Set = new Set([...failures.map(f => f.getFileName())]); if (failures.length !== 0) { const failuresSorted = failures.sort((a, b) => @@ -52,9 +52,6 @@ export class Formatter extends AbstractFormatter { ); let previousFilename: string | null = null; for (const failure of failuresSorted) { - if (!failureFileNames.has(failure.getFileName())) { - failureFileNames.add(failure.getFileName()); - } const lineAndCharacter = failure.getStartPosition().getLineAndCharacter(); const message = this.escapeXml(failure.getFailure()); const rule = this.escapeXml(failure.getRuleName());