diff --git a/packages/trace-viewer/src/ui/watchMode.tsx b/packages/trace-viewer/src/ui/watchMode.tsx
index 95c3c0d484..51da4491a6 100644
--- a/packages/trace-viewer/src/ui/watchMode.tsx
+++ b/packages/trace-viewer/src/ui/watchMode.tsx
@@ -203,34 +203,12 @@ export const TestList: React.FC<{
;
}}
icon={treeItem => {
- if (treeItem.kind === 'case') {
- let allOk = true;
- let hasFailed = false;
- let hasRunning = false;
- for (const test of treeItem.tests) {
- allOk = allOk && test.outcome() === 'expected';
- hasFailed = hasFailed || (!!test.results.length && test.outcome() !== 'expected');
- hasRunning = hasRunning || test.results.some(r => r.duration === -1);
- }
- if (hasRunning)
- return 'codicon-loading';
- if (allOk)
- return 'codicon-check';
- if (hasFailed)
- return 'codicon-error';
- }
-
- if (treeItem.kind === 'test') {
- const ok = treeItem.test.outcome() === 'expected';
- const failed = treeItem.test.results.length && treeItem.test.outcome() !== 'expected';
- const running = treeItem.test.results.some(r => r.duration === -1);
- if (running)
- return 'codicon-loading';
- if (ok)
- return 'codicon-check';
- if (failed)
- return 'codicon-error';
- }
+ if (treeItem.status === 'running')
+ return 'codicon-loading';
+ if (treeItem.status === 'failed')
+ return 'codicon-error';
+ if (treeItem.status === 'passed')
+ return 'codicon-check';
return 'codicon-circle-outline';
}}
selectedItem={selectedTreeItem}
@@ -254,15 +232,15 @@ export const SettingsView: React.FC<{
{[...projects.entries()].map(([projectName, value]) => {
- return
-
{
+ return
+ {
const copy = new Map(projects);
copy.set(projectName, !copy.get(projectName));
if (![...copy.values()].includes(true))
copy.set(projectName, true);
setProjects(copy);
- }} style={{ margin: '0 5px 0 10px' }} />
-
;
@@ -441,7 +419,7 @@ type TreeItemBase = {
title: string;
parent: TreeItem | null;
children: TreeItem[];
- expanded?: boolean;
+ status: 'none' | 'running' | 'passed' | 'failed';
};
type RootItem = TreeItemBase & {
@@ -475,6 +453,7 @@ function createTree(rootSuite: Suite | undefined, projects: Map
title: '',
parent: null,
children: [],
+ status: 'none',
};
const fileItems = new Map();
for (const projectSuite of rootSuite?.suites || []) {
@@ -492,7 +471,7 @@ function createTree(rootSuite: Suite | undefined, projects: Map
file,
parent: null,
children: [],
- expanded: false,
+ status: 'none',
};
fileItems.set(fileSuite.location!.file, fileItem);
rootItem.children.push(fileItem);
@@ -509,11 +488,20 @@ function createTree(rootSuite: Suite | undefined, projects: Map
parent: fileItem,
children: [],
tests: [],
- expanded: false,
location: test.location,
+ status: 'none',
};
fileItem.children.push(testCaseItem);
}
+
+ let status: 'none' | 'running' | 'passed' | 'failed' = 'none';
+ if (test.results.some(r => r.duration === -1))
+ status = 'running';
+ else if (test.results.length && test.outcome() !== 'expected')
+ status = 'failed';
+ else if (test.outcome() === 'expected')
+ status = 'passed';
+
testCaseItem.tests.push(test);
testCaseItem.children.push({
kind: 'test',
@@ -522,11 +510,35 @@ function createTree(rootSuite: Suite | undefined, projects: Map
parent: testCaseItem,
test,
children: [],
+ status,
});
}
(fileItem.children as TestCaseItem[]).sort((a, b) => a.location.line - b.location.line);
}
}
+
+ const propagateStatus = (treeItem: TreeItem) => {
+ for (const child of treeItem.children)
+ propagateStatus(child);
+
+ let allPassed = treeItem.children.length > 0;
+ let hasFailed = false;
+ let hasRunning = false;
+
+ for (const child of treeItem.children) {
+ allPassed = allPassed && child.status === 'passed';
+ hasFailed = hasFailed || child.status === 'failed';
+ hasRunning = hasRunning || child.status === 'running';
+ }
+
+ if (hasRunning)
+ treeItem.status = 'running';
+ else if (hasFailed)
+ treeItem.status = 'failed';
+ else if (allPassed)
+ treeItem.status = 'passed';
+ };
+ propagateStatus(rootItem);
return rootItem;
}