Skip to content

Commit 00d0a56

Browse files
committed
fix: truncate Pest dataset labels beyond 3 items with ellipsis
Match Pest's Exporter behavior: show at most 3 values in dataset tuple descriptions, appending … for longer tuples. Deduplicate labels that collide after truncation by appending #1, #2, etc.
1 parent bc92934 commit 00d0a56

2 files changed

Lines changed: 71 additions & 2 deletions

File tree

packages/phpunit/src/Interpreter/Resolvers/PestResolver.ts

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,49 @@ function resolvePestLabels(node: AstNode): string[] {
159159
labels.push(datasetNamed(`dataset "${key}"`));
160160
}
161161
}
162-
return labels;
162+
return deduplicateLabels(labels);
163163
}
164164

165+
function deduplicateLabels(labels: string[]): string[] {
166+
const counts = new Map<string, number>();
167+
for (const label of labels) {
168+
counts.set(label, (counts.get(label) ?? 0) + 1);
169+
}
170+
171+
const duplicates = new Set<string>();
172+
for (const [label, count] of counts) {
173+
if (count > 1) {
174+
duplicates.add(label);
175+
}
176+
}
177+
178+
if (duplicates.size === 0) {
179+
return labels;
180+
}
181+
182+
const indices = new Map<string, number>();
183+
return labels.map((label) => {
184+
if (!duplicates.has(label)) {
185+
return label;
186+
}
187+
const idx = (indices.get(label) ?? 0) + 1;
188+
indices.set(label, idx);
189+
return `${label} #${idx}`;
190+
});
191+
}
192+
193+
const MAX_DATASET_ITEMS = 3;
194+
165195
function formatPestValue(value: unknown): string | undefined {
166196
if (value instanceof Map || Array.isArray(value)) {
167197
const items = value instanceof Map ? [...value.values()] : value;
168-
return `(${items.map((v) => (typeof v === 'string' ? `'${v}'` : String(v))).join(', ')})`;
198+
const truncated = items.length > MAX_DATASET_ITEMS;
199+
const visible = items.slice(0, MAX_DATASET_ITEMS);
200+
const parts = visible.map((v) => (typeof v === 'string' ? `'${v}'` : String(v)));
201+
if (truncated) {
202+
parts.push('…');
203+
}
204+
return `(${parts.join(', ')})`;
169205
}
170206
if (typeof value === 'string') {
171207
return `('${value}')`;

packages/phpunit/src/TestParser/TestExtractorForPest.test.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,39 @@ it('multiplies numbers', function (int $a, int $b, int $expected) {
431431
);
432432
});
433433

434+
it('truncates tuple values beyond 3 items with ellipsis', () => {
435+
const content = `<?php
436+
437+
it('has many args', function (int $a, int $b, int $c, int $d, int $e) {
438+
expect(true)->toBeTrue();
439+
})->with([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]);
440+
`;
441+
442+
const test = givenTest(file, content, 'it has many args');
443+
expect(test).toEqual(
444+
expect.objectContaining({
445+
annotations: {
446+
dataset: ['data set "(1, 2, 3, …)"', 'data set "(6, 7, 8, …)"'],
447+
},
448+
}),
449+
);
450+
});
451+
452+
it('truncated tuples with same prefix get unique labels', () => {
453+
const content = `<?php
454+
455+
it('same prefix', function (int $a, int $b, int $c, int $d) {
456+
expect(true)->toBeTrue();
457+
})->with([[1, 2, 3, 100], [1, 2, 3, 200]]);
458+
`;
459+
460+
const test = givenTest(file, content, 'it same prefix');
461+
const labels = test?.annotations?.dataset as string[];
462+
expect(labels).toBeDefined();
463+
expect(labels.length).toBe(2);
464+
expect(labels[0]).not.toBe(labels[1]);
465+
});
466+
434467
it('string values dataset', () => {
435468
const content = `<?php
436469

0 commit comments

Comments
 (0)