Skip to content

Commit 53d42db

Browse files
authored
Merge pull request #396 from recca0120/refactor/result-summary
refactor: use parsed result summary and align detail index
2 parents 2a8e73c + 92eae18 commit 53d42db

7 files changed

Lines changed: 75 additions & 9 deletions

File tree

packages/phpunit/src/Printer/Printer.test.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import styles from 'ansi-styles';
12
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
23
import { phpUnitProject } from '../../tests/utils';
34
import { PHPUnitXML } from '../Configuration/PHPUnitXML';
@@ -918,3 +919,39 @@ describe('Printer inline error display', () => {
918919
expect(printer.end()).toBeUndefined();
919920
});
920921
});
922+
923+
describe('Printer testResultSummary colorizes each status segment', () => {
924+
const phpUnitXML = new PHPUnitXML().setRoot(phpUnitProject(''));
925+
926+
it('colors passed count green when all tests pass', () => {
927+
const printer = new Printer(phpUnitXML, resolveFormat('collision'));
928+
printer.start();
929+
930+
const output = printer.testResultSummary({
931+
text: ' Tests: 78 passed (85 assertions)',
932+
passed: 78,
933+
assertions: 85,
934+
} as unknown as TestResultSummary);
935+
936+
expect(output).toContain(`${styles.green.open}78 passed${styles.green.close}`);
937+
expect(output).toContain('(85 assertions)');
938+
});
939+
940+
it('colors failed red, skipped yellow, passed green separately', () => {
941+
const printer = new Printer(phpUnitXML, resolveFormat('collision'));
942+
printer.start();
943+
944+
const output = printer.testResultSummary({
945+
text: ' Tests: 1 failed, 2 skipped, 78 passed (85 assertions)',
946+
failed: 1,
947+
skipped: 2,
948+
passed: 78,
949+
assertions: 85,
950+
} as unknown as TestResultSummary);
951+
952+
expect(output).toContain(`${styles.red.open}1 failed${styles.red.close}`);
953+
expect(output).toContain(`${styles.yellow.open}2 skipped${styles.yellow.close}`);
954+
expect(output).toContain(`${styles.green.open}78 passed${styles.green.close}`);
955+
expect(output).toContain('(85 assertions)');
956+
});
957+
});

packages/phpunit/src/Printer/Printer.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -185,23 +185,20 @@ export class Printer {
185185
}
186186

187187
testResultSummary(result: TestResultSummary) {
188-
const hasFailures = (result.errors ?? 0) > 0 || (result.failures ?? 0) > 0;
188+
const hasFailures = (result.failed ?? result.failures ?? result.errors ?? 0) > 0;
189189
const countColor = hasFailures
190190
? this.style.failed.bind(this.style)
191191
: this.style.passed.bind(this.style);
192192

193193
const parts: string[] = [];
194-
const failedCount = (result.errors ?? 0) + (result.failures ?? 0) + (result.warnings ?? 0);
195-
if (failedCount > 0) {
196-
parts.push(this.style.failed(`${failedCount} failed`));
194+
if ((result.failed ?? 0) > 0) {
195+
parts.push(this.style.failed(`${result.failed} failed`));
197196
}
198197
if ((result.skipped ?? 0) > 0) {
199198
parts.push(this.style.ignored(`${result.skipped} skipped`));
200199
}
201-
const passedCount =
202-
(result.tests ?? 0) - failedCount - (result.skipped ?? 0) - (result.incomplete ?? 0);
203-
if (passedCount > 0) {
204-
parts.push(this.style.passed(`${passedCount} passed`));
200+
if ((result.passed ?? 0) > 0) {
201+
parts.push(this.style.passed(`${result.passed} passed`));
205202
}
206203

207204
const summary =
@@ -218,6 +215,8 @@ export class Printer {
218215
'skipped',
219216
'incomplete',
220217
'risky',
218+
'passed',
219+
'failed',
221220
] as const;
222221
const vars: Record<string, string | undefined> = {
223222
text: result.text.trim(),
@@ -511,11 +510,13 @@ export class Printer {
511510
return undefined;
512511
}
513512

513+
const maxIndexWidth = String(result.details.length).length;
514+
514515
return [
515516
'',
516517
...result.details.map(({ file, line }, index) =>
517518
this.interpolate(this.format.error.detail.line, {
518-
index: String(index + 1),
519+
index: String(index + 1).padStart(maxIndexWidth),
519520
file: fileFormat(file, line),
520521
}),
521522
),

packages/phpunit/src/Printer/PrinterForPreset.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ function runLifecycle(printer: Printer) {
139139
tests: 4,
140140
assertions: 4,
141141
failures: 2,
142+
failed: 2,
143+
passed: 2,
142144
} as unknown as TestResultSummary),
143145
]);
144146
}

packages/phpunit/src/TestOutput/PHPUnitTestOutputParser.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,8 @@ describe('PHPUnit TestOutputParser Text', () => {
225225
skipped: 1,
226226
incomplete: 1,
227227
risky: 2,
228+
failed: 6,
229+
passed: 11,
228230
},
229231
);
230232
});

packages/phpunit/src/TestOutput/TeamcityLineParser.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ describe('TeamcityLineParser', () => {
393393
event: TeamcityEvent.testResultSummary,
394394
tests: 1,
395395
assertions: 1,
396+
passed: 1,
396397
text,
397398
});
398399
});
@@ -410,6 +411,8 @@ describe('TeamcityLineParser', () => {
410411
skipped: 1,
411412
incomplete: 1,
412413
risky: 2,
414+
failed: 6,
415+
passed: 11,
413416
text,
414417
});
415418
});
@@ -423,6 +426,7 @@ describe('TeamcityLineParser', () => {
423426
assertions: 1,
424427
phpunitDeprecations: 1,
425428
risky: 1,
429+
passed: 1,
426430
text,
427431
});
428432
});

packages/phpunit/src/TestOutput/TestResultSummaryParser.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,24 @@ export class TestResultSummaryParser implements IParser<TestResultSummary> {
4444
: [matched.name2, matched.count2];
4545
result[this.normalize(name)] = parseInt(count, 10);
4646
}
47+
48+
if (result.failed == null && result.tests != null) {
49+
const failed = (result.errors ?? 0) + (result.failures ?? 0) + (result.warnings ?? 0);
50+
if (failed > 0) {
51+
result.failed = failed;
52+
}
53+
}
54+
if (result.passed == null && result.tests != null) {
55+
const passed =
56+
(result.tests ?? 0) -
57+
(result.failed ?? 0) -
58+
(result.skipped ?? 0) -
59+
(result.incomplete ?? 0);
60+
if (passed > 0) {
61+
result.passed = passed;
62+
}
63+
}
64+
4765
return result;
4866
}
4967

packages/phpunit/src/TestOutput/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ export type TestResultSummary = InfoResult & {
103103
skipped?: number;
104104
incomplete?: number;
105105
risky?: number;
106+
passed?: number;
107+
failed?: number;
106108
phpunitDeprecations?: number;
107109
};
108110

0 commit comments

Comments
 (0)