@codingame/monaco-vscode-testing-service-override 2.2.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -8
- package/vscode/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.js +11 -11
- package/vscode/src/vs/workbench/contrib/testing/browser/explorerProjections/index.js +6 -1
- package/vscode/src/vs/workbench/contrib/testing/browser/explorerProjections/treeProjection.js +6 -2
- package/vscode/src/vs/workbench/contrib/testing/browser/icons.js +3 -3
- package/vscode/src/vs/workbench/contrib/testing/browser/media/testing.css.js +1 -1
- package/vscode/src/vs/workbench/contrib/testing/browser/testCoverageBars.js +35 -48
- package/vscode/src/vs/workbench/contrib/testing/browser/testCoverageView.js +32 -32
- package/vscode/src/vs/workbench/contrib/testing/browser/testExplorerActions.js +16 -22
- package/vscode/src/vs/workbench/contrib/testing/browser/testingDecorations.js +2 -2
- package/vscode/src/vs/workbench/contrib/testing/browser/testingExplorerFilter.js +0 -1
- package/vscode/src/vs/workbench/contrib/testing/browser/testingExplorerView.js +1 -1
- package/vscode/src/vs/workbench/contrib/testing/browser/testingOutputPeek.js +24 -16
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codingame/monaco-vscode-testing-service-override",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"keywords": [],
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "CodinGame",
|
|
@@ -18,13 +18,13 @@
|
|
|
18
18
|
"module": "index.js",
|
|
19
19
|
"types": "index.d.ts",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"vscode": "npm:@codingame/monaco-vscode-api@
|
|
22
|
-
"@xterm/addon-canvas": "0.6.0-beta.
|
|
23
|
-
"@xterm/addon-image": "0.7.0-beta.
|
|
24
|
-
"@xterm/addon-search": "0.14.0-beta.
|
|
25
|
-
"@xterm/addon-serialize": "0.12.0-beta.
|
|
26
|
-
"@xterm/addon-unicode11": "0.7.0-beta.
|
|
27
|
-
"@xterm/addon-webgl": "0.17.0-beta.
|
|
21
|
+
"vscode": "npm:@codingame/monaco-vscode-api@3.0.0",
|
|
22
|
+
"@xterm/addon-canvas": "0.6.0-beta.31",
|
|
23
|
+
"@xterm/addon-image": "0.7.0-beta.29",
|
|
24
|
+
"@xterm/addon-search": "0.14.0-beta.31",
|
|
25
|
+
"@xterm/addon-serialize": "0.12.0-beta.31",
|
|
26
|
+
"@xterm/addon-unicode11": "0.7.0-beta.31",
|
|
27
|
+
"@xterm/addon-webgl": "0.17.0-beta.31",
|
|
28
28
|
"vscode-marked": "npm:marked@=3.0.2"
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -13,7 +13,7 @@ import { Position } from 'vscode/vscode/vs/editor/common/core/position';
|
|
|
13
13
|
import { Range } from 'vscode/vscode/vs/editor/common/core/range';
|
|
14
14
|
import { InjectedTextCursorStops } from 'vscode/vscode/vs/editor/common/model';
|
|
15
15
|
import { HoverOperation } from 'vscode/vscode/vs/editor/contrib/hover/browser/hoverOperation';
|
|
16
|
-
import { localizeWithPath } from 'vscode/vscode/vs/nls';
|
|
16
|
+
import { localizeWithPath, localize2WithPath } from 'vscode/vscode/vs/nls';
|
|
17
17
|
import { Categories } from 'vscode/vscode/vs/platform/action/common/actionCommonCategories';
|
|
18
18
|
import { registerAction2, Action2 } from 'vscode/vscode/vs/platform/actions/common/actions';
|
|
19
19
|
import { IInstantiationService } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
|
|
@@ -78,7 +78,7 @@ let CodeCoverageDecorations = class CodeCoverageDecorations extends Disposable {
|
|
|
78
78
|
const c = fileCoverage.read(reader);
|
|
79
79
|
if (c) {
|
|
80
80
|
const evt = configObs.read(reader);
|
|
81
|
-
if (evt?.hasChanged(
|
|
81
|
+
if (evt?.hasChanged(67 ) !== false) {
|
|
82
82
|
this.updateEditorStyles();
|
|
83
83
|
}
|
|
84
84
|
}
|
|
@@ -110,7 +110,7 @@ let CodeCoverageDecorations = class CodeCoverageDecorations extends Disposable {
|
|
|
110
110
|
}));
|
|
111
111
|
}
|
|
112
112
|
updateEditorStyles() {
|
|
113
|
-
const lineHeight = this.editor.getOption(
|
|
113
|
+
const lineHeight = this.editor.getOption(67 );
|
|
114
114
|
const { style } = this.editor.getContainerDomNode();
|
|
115
115
|
style.setProperty('--vscode-testing-coverage-lineHeight', `${lineHeight}px`);
|
|
116
116
|
}
|
|
@@ -224,7 +224,7 @@ let CodeCoverageDecorations = class CodeCoverageDecorations extends Disposable {
|
|
|
224
224
|
}
|
|
225
225
|
else {
|
|
226
226
|
target.className = `coverage-deco-inline ${cls}`;
|
|
227
|
-
if (primary) {
|
|
227
|
+
if (primary && typeof hits === 'number') {
|
|
228
228
|
target.before = countBadge(hits);
|
|
229
229
|
}
|
|
230
230
|
}
|
|
@@ -244,7 +244,7 @@ let CodeCoverageDecorations = class CodeCoverageDecorations extends Disposable {
|
|
|
244
244
|
const applyHoverOptions = (target) => {
|
|
245
245
|
target.className = `coverage-deco-inline ${cls}`;
|
|
246
246
|
target.hoverMessage = description;
|
|
247
|
-
if (primary) {
|
|
247
|
+
if (primary && typeof detail.count === 'number') {
|
|
248
248
|
target.before = countBadge(detail.count);
|
|
249
249
|
}
|
|
250
250
|
};
|
|
@@ -374,8 +374,8 @@ class CoverageDetailsModel {
|
|
|
374
374
|
if (detail.type === 0 ) {
|
|
375
375
|
return ( new MarkdownString()).appendMarkdown(( localizeWithPath(
|
|
376
376
|
'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
|
|
377
|
-
'coverage.
|
|
378
|
-
'
|
|
377
|
+
'coverage.declExecutedCount',
|
|
378
|
+
'`{0}` was executed {1} time(s).',
|
|
379
379
|
detail.name,
|
|
380
380
|
detail.count
|
|
381
381
|
)));
|
|
@@ -384,7 +384,7 @@ class CoverageDetailsModel {
|
|
|
384
384
|
const text = wrapName(model.getValueInRange(tidyLocation(detail.location)).trim() || `<empty statement>`);
|
|
385
385
|
const str = ( new MarkdownString());
|
|
386
386
|
if (detail.branches?.length) {
|
|
387
|
-
const covered = detail.branches.filter(b => b.count
|
|
387
|
+
const covered = detail.branches.filter(b => !!b.count).length;
|
|
388
388
|
str.appendMarkdown(( localizeWithPath(
|
|
389
389
|
'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
|
|
390
390
|
'coverage.branches',
|
|
@@ -531,7 +531,7 @@ let LineHoverWidget = class LineHoverWidget extends Disposable {
|
|
|
531
531
|
const editorLayout = editor.getLayoutInfo();
|
|
532
532
|
const topForLineNumber = editor.getTopForLineNumber(this.computer.line);
|
|
533
533
|
const editorScrollTop = editor.getScrollTop();
|
|
534
|
-
const lineHeight = editor.getOption(
|
|
534
|
+
const lineHeight = editor.getOption(67 );
|
|
535
535
|
const nodeHeight = h.containerDomNode.clientHeight;
|
|
536
536
|
const top = topForLineNumber - editorScrollTop - ((nodeHeight - lineHeight) / 2);
|
|
537
537
|
const left = editorLayout.lineNumbersLeft + editorLayout.lineNumbersWidth;
|
|
@@ -546,11 +546,11 @@ registerAction2(class ToggleInlineCoverage extends Action2 {
|
|
|
546
546
|
constructor() {
|
|
547
547
|
super({
|
|
548
548
|
id: TOGGLE_INLINE_COMMAND_ID,
|
|
549
|
-
title:
|
|
549
|
+
title: ( localize2WithPath(
|
|
550
550
|
'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
|
|
551
551
|
'coverage.toggleInline',
|
|
552
552
|
"Toggle Inline Coverage"
|
|
553
|
-
)),
|
|
553
|
+
)),
|
|
554
554
|
category: Categories.Test,
|
|
555
555
|
keybinding: {
|
|
556
556
|
weight: 200 ,
|
|
@@ -46,7 +46,12 @@ class TestTreeErrorMessage {
|
|
|
46
46
|
}
|
|
47
47
|
const testIdentityProvider = {
|
|
48
48
|
getId(element) {
|
|
49
|
-
|
|
49
|
+
const expandComponent = element instanceof TestTreeErrorMessage
|
|
50
|
+
? 'error'
|
|
51
|
+
: element.test.expand === 0
|
|
52
|
+
? !!element.children.size
|
|
53
|
+
: element.test.expand;
|
|
54
|
+
return element.treeId + '\0' + expandComponent;
|
|
50
55
|
}
|
|
51
56
|
};
|
|
52
57
|
const getChildrenForParent = (serialized, rootsWithChildren, node) => {
|
package/vscode/src/vs/workbench/contrib/testing/browser/explorerProjections/treeProjection.js
CHANGED
|
@@ -199,8 +199,12 @@ let TreeProjection = class TreeProjection extends Disposable {
|
|
|
199
199
|
storeItem(treeElement) {
|
|
200
200
|
treeElement.parent?.children.add(treeElement);
|
|
201
201
|
this.items.set(treeElement.test.item.extId, treeElement);
|
|
202
|
-
const
|
|
203
|
-
|
|
202
|
+
const affectsParent = treeElement.parent?.children.size === 1;
|
|
203
|
+
const affectedParent = affectsParent ? treeElement.parent.parent : treeElement.parent;
|
|
204
|
+
this.changedParents.add(affectedParent);
|
|
205
|
+
if (affectedParent?.depth === 0) {
|
|
206
|
+
this.changedParents.add(null);
|
|
207
|
+
}
|
|
204
208
|
if (treeElement.depth === 0 || isCollapsedInSerializedTestTree(this.lastState, treeElement.test.item.extId) === false) {
|
|
205
209
|
this.expandElement(treeElement, 0);
|
|
206
210
|
}
|
|
@@ -40,12 +40,12 @@ const testingDebugIcon = registerIcon('testing-debug-icon', Codicon.debugAltSmal
|
|
|
40
40
|
'testingDebugIcon',
|
|
41
41
|
'Icon of the "debug test" action.'
|
|
42
42
|
)));
|
|
43
|
-
const testingCoverageIcon = registerIcon('testing-coverage-icon', Codicon.
|
|
43
|
+
const testingCoverageIcon = registerIcon('testing-coverage-icon', Codicon.runCoverage, ( localizeWithPath(
|
|
44
44
|
'vs/workbench/contrib/testing/browser/icons',
|
|
45
45
|
'testingCoverageIcon',
|
|
46
46
|
'Icon of the "run test with coverage" action.'
|
|
47
47
|
)));
|
|
48
|
-
const testingCoverageAllIcon = registerIcon('testing-coverage-all-icon', Codicon.
|
|
48
|
+
const testingCoverageAllIcon = registerIcon('testing-coverage-all-icon', Codicon.runAllCoverage, ( localizeWithPath(
|
|
49
49
|
'vs/workbench/contrib/testing/browser/icons',
|
|
50
50
|
'testingRunAllWithCoverageIcon',
|
|
51
51
|
'Icon of the "run all tests with coverage" action.'
|
|
@@ -105,7 +105,7 @@ const testingCancelRefreshTests = registerIcon('testing-cancel-refresh-tests', C
|
|
|
105
105
|
'testingCancelRefreshTests',
|
|
106
106
|
'Icon on the button to cancel refreshing tests.'
|
|
107
107
|
)));
|
|
108
|
-
const testingCoverageReport = registerIcon('testing-coverage', Codicon.
|
|
108
|
+
const testingCoverageReport = registerIcon('testing-coverage', Codicon.coverage, ( localizeWithPath(
|
|
109
109
|
'vs/workbench/contrib/testing/browser/icons',
|
|
110
110
|
'testingCoverage',
|
|
111
111
|
'Icon representing test coverage'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import n from '../../../../../../../../external/rollup-plugin-styles/dist/runtime/inject-css.js';
|
|
2
2
|
|
|
3
|
-
var css = ".monaco-workbench .codicon-testing-error-icon{color:var(--vscode-testing-iconErrored)}.monaco-workbench .codicon-testing-failed-icon{color:var(--vscode-testing-iconFailed)}.monaco-workbench .codicon-testing-passed-icon{color:var(--vscode-testing-iconPassed)}.monaco-workbench .codicon-testing-queued-icon{color:var(--vscode-testing-iconQueued)}.monaco-workbench .codicon-testing-skipped-icon{color:var(--vscode-testing-iconSkipped)}.monaco-workbench .codicon-testing-unset-icon{color:var(--vscode-testing-iconUnset)}.test-explorer{display:flex;flex-direction:column}.test-explorer>.test-explorer-tree{flex-grow:1;height:0;position:relative}.test-coverage-list-item .name,.test-coverage-list-item-label,.test-explorer .test-item .label,.test-output-peek-tree .test-peek-item .name{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:0}.test-explorer .test-item .label .codicon,.test-output-peek-tree .test-peek-item .name .codicon{font-size:1em;margin:0 .125em;transform:scale(1.25);vertical-align:middle}.test-explorer .test-item,.test-output-peek-tree .test-peek-item{align-items:center;display:flex}.test-output-peek-tree{border-left:1px solid var(--vscode-panelSection-border);color:var(--vscode-editor-foreground)}.test-explorer .monaco-list-row .codicon-testing-hidden,.test-explorer .monaco-list-row .monaco-action-bar,.test-output-peek-tree .monaco-list-row .monaco-action-bar{display:none;flex-shrink:0;margin-right:.8em}.test-explorer .monaco-list-row .monaco-action-bar .codicon-testing-continuous-is-on{background:var(--vscode-inputOption-activeBackground);border-color:var(--vscode-inputOption-activeBorder);border:1px solid var(--vscode-inputOption-activeBorder);border-radius:3px;color:var(--vscode-inputOption-activeForeground)}.test-explorer .monaco-list-row:not(.focused,:hover) .monaco-action-bar.testing-is-continuous-run .action-item{display:none}.test-explorer .monaco-list-row .monaco-action-bar.testing-is-continuous-run .action-item:last-child{display:block!important}.test-explorer .monaco-list-row .monaco-action-bar.testing-is-continuous-run,.test-explorer .monaco-list-row.focused .monaco-action-bar,.test-explorer .monaco-list-row:hover .monaco-action-bar,.test-output-peek-tree .monaco-list-row.focused .monaco-action-bar,.test-output-peek-tree .monaco-list-row:hover .monaco-action-bar{display:initial}.test-explorer .monaco-list-row .test-is-hidden .codicon-testing-hidden{display:block;margin-right:9px}.test-explorer .monaco-list-row.focused .codicon-testing-hidden,.test-explorer .monaco-list-row:hover .codicon-testing-hidden{display:none}.test-explorer .monaco-list-row .error{background:var(--vscode-inputValidation-errorBackground);border-radius:2px;font-size:12px;height:17px;line-height:17px;margin:3px 12px 3px 3px;outline:1px solid var(--vscode-inputValidation-errorBorder);overflow:hidden;padding:2px 4px}.test-explorer .monaco-list-row .error p{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.test-explorer .monaco-list-row .error a{color:var(--vscode-textLink-foreground)}.test-explorer .monaco-list-row .error a:hover{color:var(--vscode-textLink-activeForeground)}.test-explorer .computed-state,.test-output-peek-tree .computed-state{margin-right:.25em}.test-explorer .computed-state.retired,.testing-run-glyph.retired{opacity:.7!important}.test-explorer .test-is-hidden{opacity:.8}.test-explorer .result-summary-container{box-sizing:border-box;font-variant-numeric:tabular-nums;height:27px;padding:0 12px 8px}.test-explorer .result-summary{align-items:center;display:flex;gap:2px}.test-explorer .result-summary>span{flex-grow:1}.monaco-workbench .test-explorer .monaco-action-bar .action-item>.action-label{margin-right:2px;padding:1px 2px}.monaco-workbench .part>.title>.title-actions .action-label.codicon-testing-autorun:after{border-radius:100%;content:\"\";display:none;height:.4em;left:50%;margin:.1em 0 0 .05em;position:absolute;top:50%;width:.4em}.monaco-workbench .part>.title>.title-actions .action-label.codicon-testing-autorun.checked:after{display:block}.codicon-testing-loading-icon:before{animation:codicon-spin 1.25s steps(30) infinite}.testing-no-test-placeholder{display:none;left:0;padding:0 20px;position:absolute;right:0;top:0;z-index:1}.testing-no-test-placeholder.visible{display:block}.monaco-editor .zone-widget.test-output-peek .zone-widget-container.peekview-widget{border-bottom-width:2px;border-top-width:2px}.monaco-editor .zone-widget.test-output-peek .type-decoration{background-color:var(--vscode-peekViewEditor-matchHighlightBackground);border:2px solid var(--vscode-peekViewEditor-matchHighlightBorder);box-sizing:border-box}.monaco-editor .zone-widget.test-output-peek .monaco-editor .inputarea.ime-input,.monaco-editor .zone-widget.test-output-peek .monaco-editor .monaco-editor-background,.monaco-editor .zone-widget.test-output-peek .test-output-peek-message-container{background-color:var(--vscode-peekViewEditor-background)}.monaco-editor .zone-widget.test-output-peek .monaco-editor .margin{background-color:var(--vscode-peekViewEditorGutter-background)}.test-output-peek-message-container{overflow:hidden}.test-output-peek-message-container .floating-click-widget{bottom:10px;position:absolute;right:20px}.test-output-peek-message-container,.test-output-peek-tree{height:100%}.test-output-peek-message-container .preview-text{height:calc(100% - 16px);padding:8px 12px 8px 20px}.test-output-peek-message-container .preview-text p:first-child{margin-top:0}.test-output-peek-message-container .preview-text p:last-child{margin-bottom:0}.test-output-peek-message-container .preview-text a{cursor:pointer}.monaco-action-bar.testing-filter-action-bar{flex-shrink:0;height:auto;margin:4px 12px}.testing-filter-action-item{align-items:center;display:flex!important;flex-grow:1;max-width:400px}.testing-filter-action-item>.monaco-action-bar .testing-filter-button.checked{background-color:var(--vscode-inputOption-activeBackground);border-color:var(--vscode-inputOption-activeBorder);color:var(--vscode-inputOption-activeForeground)}.testing-filter-action-bar .testing-filter-action-item{max-width:none}.testing-filter-action-item .testing-filter-wrapper{flex-grow:1}.testing-filter-action-item .testing-filter-wrapper input{padding-right:30px!important}.testing-filter-action-item .monaco-action-bar{align-items:center;bottom:0;display:flex;position:absolute;right:3px;top:0}.monaco-editor .testing-run-glyph{cursor:pointer}.testing-diff-title-widget{display:inline-block;font-size:12px;line-height:19px;overflow:hidden;padding-right:6px;text-overflow:ellipsis;white-space:nowrap}.test-message-inline-content{font-family:var(--testMessageDecorationFontFamily);font-size:var(--testMessageDecorationFontSize)}.test-message-inline-content-clickable{cursor:pointer}.test-label-description{font-size:.9em;margin-left:.5em;opacity:.7;white-space:pre}.testing-diff-lens-widget{color:var(--vscode-editorCodeLens-foreground)}.test-message-inline-content-s0{color:var(--vscode-testing-message-error-decorationForeground)!important}.test-message-inline-content-s1{color:var(--vscode-testing-message-info-decorationForeground)!important}.monaco-editor .testing-inline-message-severity-0{color:var(--vscode-testing-message-error-decorationForeground)!important}.monaco-editor .testing-inline-message-severity-1{color:var(--vscode-testing-message-info-decorationForeground)!important}.test-coverage-bars,.test-coverage-list-item{align-items:center;display:flex}.test-coverage-bars{font-size:11px;gap:4px;margin-right:.8em}.test-coverage-bars .bar{border:1px solid;border-radius:2px;height:8px;overflow:hidden;position:relative}.test-coverage-bars .bar:before{background:currentColor;content:\"\";height:100%;opacity:.7;position:absolute;width:var(--test-bar-width)}.test-coverage-list-item .icon{margin-right:.2em}.test-coverage-list-item.not-covered .name{opacity:.7}.explorer-item-with-test-coverage{display:flex}.explorer-item-with-test-coverage .explorer-item{flex-grow:1}.explorer-item-with-test-coverage .monaco-icon-label:after{margin-right:12px}.coverage-deco-gutter{z-index:0}.coverage-deco-gutter:before{content:\"\";inset:0;position:absolute;z-index:-1}.coverage-deco-gutter.coverage-deco-hit:before{background:var(--vscode-testing-coveredGutterBackground);border-color:var(--vscode-testing-coveredGutterBackground)}.coverage-deco-gutter.coverage-deco-miss:before{background:var(--vscode-testing-uncoveredGutterBackground);border-color:var(--vscode-testing-uncoveredGutterBackground)}.hc-black .coverage-deco-gutter:before,.hc-light .coverage-deco-gutter:before{background:none;border-style:solid;border-width:3px 0 3px 5px}.coverage-deco-gutter.coverage-deco-miss.coverage-deco-hit:before{background-color:transparent;background-image:linear-gradient(45deg,var(--vscode-testing-coveredGutterBackground) 25%,var(--vscode-testing-uncoveredGutterBackground) 25%,var(--vscode-testing-uncoveredGutterBackground) 50%,var(--vscode-testing-coveredGutterBackground) 50%,75%,var(--vscode-testing-uncoveredGutterBackground) 75%,var(--vscode-testing-uncoveredGutterBackground) 100%);background-size:6px 6px}.coverage-deco-inline{outline-offset:-1px}.coverage-deco-inline.coverage-deco-hit{background:var(--vscode-testing-coveredBackground);outline:1px solid var(--vscode-testing-coveredBorder)}.coverage-deco-inline.coverage-deco-miss{background:var(--vscode-testing-uncoveredBackground);outline:1px solid var(--vscode-testing-uncoveredBorder)}.hc-black .coverage-deco-inline.coverage-deco-hit,.hc-light .coverage-deco-inline.coverage-deco-hit{outline-style:dashed}.coverage-deco-branch-miss-indicator{display:inline-block;font:inherit!important;height:100%;position:relative;width:4ch}.coverage-deco-branch-miss-indicator:before{border:1px solid;border-radius:2px;font:normal normal normal calc(var(--vscode-testing-coverage-lineHeight)/2)/1 codicon;left:50%;padding:calc(var(--vscode-testing-coverage-lineHeight)/10);position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%)}.coverage-deco-inline-count{background:var(--vscode-testing-coverCountBadgeBackground);border-bottom-left-radius:2px;border-top-left-radius:2px;color:var(--vscode-testing-coverCountBadgeForeground);font-size:.7em;margin:0 .7em 0 .4em;padding:.2em 0 .2em .2em;position:relative}.coverage-deco-inline-count:after{background-image:linear-gradient(to bottom left,transparent 50%,var(--vscode-testing-coverCountBadgeBackground) 0),linear-gradient(to bottom right,var(--vscode-testing-coverCountBadgeBackground) 50%,transparent 0);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50%;bottom:0;content:\"\";display:block;left:100%;position:absolute;top:0;width:.5em}";
|
|
3
|
+
var css = ".monaco-workbench{.codicon-testing-error-icon{color:var(--vscode-testing-iconErrored)}.codicon-testing-failed-icon{color:var(--vscode-testing-iconFailed)}.codicon-testing-passed-icon{color:var(--vscode-testing-iconPassed)}.codicon-testing-queued-icon{color:var(--vscode-testing-iconQueued)}.codicon-testing-skipped-icon{color:var(--vscode-testing-iconSkipped)}.codicon-testing-unset-icon{color:var(--vscode-testing-iconUnset)}}.test-explorer{display:flex;flex-direction:column}.test-explorer>.test-explorer-tree{flex-grow:1;height:0;position:relative}.test-coverage-list-item .name,.test-coverage-list-item-label,.test-explorer .test-item .label,.test-output-peek-tree .test-peek-item .name{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:0}.test-explorer .test-item .label .codicon,.test-output-peek-tree .test-peek-item .name .codicon{font-size:1em;margin:0 .125em;transform:scale(1.25);vertical-align:middle}.test-explorer .test-item,.test-output-peek-tree .test-peek-item{align-items:center;display:flex}.test-output-peek-tree{border-left:1px solid var(--vscode-panelSection-border);color:var(--vscode-editor-foreground)}.test-explorer .monaco-list-row .codicon-testing-hidden,.test-explorer .monaco-list-row .monaco-action-bar,.test-output-peek-tree .monaco-list-row .monaco-action-bar{display:none;flex-shrink:0;margin-right:.8em}.test-explorer .monaco-list-row .monaco-action-bar .codicon-testing-continuous-is-on{background:var(--vscode-inputOption-activeBackground);border-color:var(--vscode-inputOption-activeBorder);border:1px solid var(--vscode-inputOption-activeBorder);border-radius:3px;color:var(--vscode-inputOption-activeForeground)}.test-explorer .monaco-list-row:not(.focused,:hover) .monaco-action-bar.testing-is-continuous-run .action-item{display:none}.test-explorer .monaco-list-row .monaco-action-bar.testing-is-continuous-run .action-item:last-child{display:block!important}.test-explorer .monaco-list-row .monaco-action-bar.testing-is-continuous-run,.test-explorer .monaco-list-row.focused .monaco-action-bar,.test-explorer .monaco-list-row:hover .monaco-action-bar,.test-output-peek-tree .monaco-list-row.focused .monaco-action-bar,.test-output-peek-tree .monaco-list-row:hover .monaco-action-bar{display:initial}.test-explorer .monaco-list-row .test-is-hidden .codicon-testing-hidden{display:block;margin-right:9px}.test-explorer .monaco-list-row.focused .codicon-testing-hidden,.test-explorer .monaco-list-row:hover .codicon-testing-hidden{display:none}.test-explorer .monaco-list-row .error{background:var(--vscode-inputValidation-errorBackground);border-radius:2px;font-size:12px;height:17px;line-height:17px;margin:3px 12px 3px 3px;outline:1px solid var(--vscode-inputValidation-errorBorder);overflow:hidden;padding:2px 4px}.test-explorer .monaco-list-row .error p{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.test-explorer .monaco-list-row .error a{color:var(--vscode-textLink-foreground)}.test-explorer .monaco-list-row .error a:hover{color:var(--vscode-textLink-activeForeground)}.test-explorer .computed-state,.test-output-peek-tree .computed-state{margin-right:.25em}.test-explorer .computed-state.retired,.testing-run-glyph.retired{opacity:.7!important}.test-explorer .test-is-hidden{opacity:.8}.test-explorer .result-summary-container{box-sizing:border-box;font-variant-numeric:tabular-nums;height:27px;padding:0 12px 8px}.test-explorer .result-summary{align-items:center;display:flex;gap:2px}.test-explorer .result-summary>span{flex-grow:1}.monaco-workbench .test-explorer .monaco-action-bar .action-item>.action-label{margin-right:2px;padding:1px 2px}.monaco-workbench .part>.title>.title-actions .action-label.codicon-testing-autorun:after{border-radius:100%;content:\"\";display:none;height:.4em;left:50%;margin:.1em 0 0 .05em;position:absolute;top:50%;width:.4em}.monaco-workbench .part>.title>.title-actions .action-label.codicon-testing-autorun.checked:after{display:block}.codicon-testing-loading-icon:before{animation:codicon-spin 1.25s steps(30) infinite}.testing-no-test-placeholder{display:none;left:0;padding:0 20px;position:absolute;right:0;top:0;z-index:1}.testing-no-test-placeholder.visible{display:block}.monaco-editor .zone-widget.test-output-peek .zone-widget-container.peekview-widget{border-bottom-width:2px;border-top-width:2px}.monaco-editor .zone-widget.test-output-peek .type-decoration{background-color:var(--vscode-peekViewEditor-matchHighlightBackground);border:2px solid var(--vscode-peekViewEditor-matchHighlightBorder);box-sizing:border-box}.monaco-editor .zone-widget.test-output-peek .monaco-editor .inputarea.ime-input,.monaco-editor .zone-widget.test-output-peek .monaco-editor .monaco-editor-background,.monaco-editor .zone-widget.test-output-peek .test-output-peek-message-container{background-color:var(--vscode-peekViewEditor-background)}.monaco-editor .zone-widget.test-output-peek .monaco-editor .margin{background-color:var(--vscode-peekViewEditorGutter-background)}.test-output-peek-message-container{overflow:hidden}.test-output-peek-message-container .floating-click-widget{bottom:10px;position:absolute;right:20px}.test-output-peek-message-container,.test-output-peek-tree{height:100%}.test-output-peek-message-container .preview-text{height:calc(100% - 16px);padding:8px 12px 8px 20px}.test-output-peek-message-container .preview-text p:first-child{margin-top:0}.test-output-peek-message-container .preview-text p:last-child{margin-bottom:0}.test-output-peek-message-container .preview-text a{cursor:pointer}.monaco-action-bar.testing-filter-action-bar{flex-shrink:0;height:auto;margin:4px 12px}.testing-filter-action-item{align-items:center;display:flex!important;flex-grow:1;max-width:400px}.testing-filter-action-item>.monaco-action-bar .testing-filter-button.checked{background-color:var(--vscode-inputOption-activeBackground);border-color:var(--vscode-inputOption-activeBorder);color:var(--vscode-inputOption-activeForeground)}.testing-filter-action-bar .testing-filter-action-item{max-width:none}.testing-filter-action-item .testing-filter-wrapper{flex-grow:1}.testing-filter-action-item .testing-filter-wrapper input{padding-right:30px!important}.testing-filter-action-item .monaco-action-bar{align-items:center;bottom:0;display:flex;position:absolute;right:3px;top:0}.monaco-editor .testing-run-glyph{cursor:pointer}.testing-diff-title-widget{display:inline-block;font-size:12px;line-height:19px;overflow:hidden;padding-right:6px;text-overflow:ellipsis;white-space:nowrap}.test-message-inline-content{font-family:var(--testMessageDecorationFontFamily);font-size:var(--testMessageDecorationFontSize)}.test-message-inline-content-clickable{cursor:pointer}.test-label-description{font-size:.9em;margin-left:.5em;opacity:.7;white-space:pre}.testing-diff-lens-widget{color:var(--vscode-editorCodeLens-foreground)}.test-message-inline-content-s0{color:var(--vscode-testing-message-error-decorationForeground)!important}.test-message-inline-content-s1{color:var(--vscode-testing-message-info-decorationForeground)!important}.monaco-editor .testing-inline-message-severity-0{color:var(--vscode-testing-message-error-decorationForeground)!important}.monaco-editor .testing-inline-message-severity-1{color:var(--vscode-testing-message-info-decorationForeground)!important}.test-coverage-bars,.test-coverage-list-item{align-items:center;display:flex}.test-coverage-bars{font-size:11px;gap:4px;margin-right:.8em}.test-coverage-bars .bar{border:1px solid;border-radius:2px;height:8px;overflow:hidden;position:relative}.test-coverage-bars .bar:before{background:currentColor;content:\"\";height:100%;opacity:.7;position:absolute;width:var(--test-bar-width)}.test-coverage-list-item .icon{margin-right:.2em}.test-coverage-list-item.not-covered .name{opacity:.7}.explorer-item-with-test-coverage{display:flex}.explorer-item-with-test-coverage .explorer-item{flex-grow:1}.explorer-item-with-test-coverage .monaco-icon-label:after{margin-right:12px}.coverage-deco-gutter{z-index:0}.coverage-deco-gutter:before{content:\"\";inset:0;position:absolute;z-index:-1}.coverage-deco-gutter.coverage-deco-hit:before{background:var(--vscode-testing-coveredGutterBackground);border-color:var(--vscode-testing-coveredGutterBackground)}.coverage-deco-gutter.coverage-deco-miss:before{background:var(--vscode-testing-uncoveredGutterBackground);border-color:var(--vscode-testing-uncoveredGutterBackground)}.hc-black .coverage-deco-gutter:before,.hc-light .coverage-deco-gutter:before{background:none;border-style:solid;border-width:3px 0 3px 5px}.coverage-deco-gutter.coverage-deco-miss.coverage-deco-hit:before{background-color:transparent;background-image:linear-gradient(45deg,var(--vscode-testing-coveredGutterBackground) 25%,var(--vscode-testing-uncoveredGutterBackground) 25%,var(--vscode-testing-uncoveredGutterBackground) 50%,var(--vscode-testing-coveredGutterBackground) 50%,75%,var(--vscode-testing-uncoveredGutterBackground) 75%,var(--vscode-testing-uncoveredGutterBackground) 100%);background-size:6px 6px}.coverage-deco-inline{outline-offset:-1px}.coverage-deco-inline.coverage-deco-hit{background:var(--vscode-testing-coveredBackground);outline:1px solid var(--vscode-testing-coveredBorder)}.coverage-deco-inline.coverage-deco-miss{background:var(--vscode-testing-uncoveredBackground);outline:1px solid var(--vscode-testing-uncoveredBorder)}.hc-black .coverage-deco-inline.coverage-deco-hit,.hc-light .coverage-deco-inline.coverage-deco-hit{outline-style:dashed}.coverage-deco-branch-miss-indicator{display:inline-block;font:inherit!important;height:100%;position:relative;width:4ch}.coverage-deco-branch-miss-indicator:before{border:1px solid;border-radius:2px;font:normal normal normal calc(var(--vscode-testing-coverage-lineHeight)/2)/1 codicon;left:50%;padding:calc(var(--vscode-testing-coverage-lineHeight)/10);position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%)}.coverage-deco-inline-count{background:var(--vscode-testing-coverCountBadgeBackground);border-bottom-left-radius:2px;border-top-left-radius:2px;color:var(--vscode-testing-coverCountBadgeForeground);font-size:.7em;margin:0 .7em 0 .4em;padding:.2em 0 .2em .2em;position:relative}.coverage-deco-inline-count:after{background-image:linear-gradient(to bottom left,transparent 50%,var(--vscode-testing-coverCountBadgeBackground) 0),linear-gradient(to bottom right,var(--vscode-testing-coverCountBadgeBackground) 50%,transparent 0);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50%;bottom:0;content:\"\";display:block;left:100%;position:absolute;top:0;width:.5em}";
|
|
4
4
|
n(css,{});
|
|
5
5
|
|
|
6
6
|
export { css, css as default };
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
|
|
2
2
|
import { h } from 'vscode/vscode/vs/base/browser/dom';
|
|
3
|
+
import { getDefaultHoverDelegate } from 'vscode/vscode/vs/base/browser/ui/hover/hoverDelegate';
|
|
4
|
+
import { setupCustomHover } from 'vscode/vscode/vs/base/browser/ui/iconLabel/iconLabelHover';
|
|
3
5
|
import { assertNever } from 'vscode/vscode/vs/base/common/assert';
|
|
4
6
|
import { MarkdownString } from 'vscode/vscode/vs/base/common/htmlContent';
|
|
5
7
|
import { Lazy } from 'vscode/vscode/vs/base/common/lazy';
|
|
@@ -12,7 +14,6 @@ import { asCssVariableName, chartsRed, chartsYellow, chartsGreen } from 'vscode/
|
|
|
12
14
|
import { getTestingConfiguration, observeTestingConfiguration } from '../common/configuration.js';
|
|
13
15
|
import { getTotalCoveragePercent } from 'vscode/vscode/vs/workbench/contrib/testing/common/testCoverage';
|
|
14
16
|
import { ITestCoverageService } from 'vscode/vscode/vs/workbench/contrib/testing/common/testCoverageService';
|
|
15
|
-
import { IHoverService } from 'vscode/vscode/vs/platform/hover/browser/hover';
|
|
16
17
|
import { observableValue } from 'vscode/vscode/vs/base/common/observableInternal/base';
|
|
17
18
|
import { autorun } from 'vscode/vscode/vs/base/common/observableInternal/autorun';
|
|
18
19
|
|
|
@@ -20,10 +21,9 @@ let ManagedTestCoverageBars = class ManagedTestCoverageBars extends Disposable {
|
|
|
20
21
|
get visible() {
|
|
21
22
|
return !!this._coverage;
|
|
22
23
|
}
|
|
23
|
-
constructor(options,
|
|
24
|
+
constructor(options, configurationService) {
|
|
24
25
|
super();
|
|
25
26
|
this.options = options;
|
|
26
|
-
this.hoverService = hoverService;
|
|
27
27
|
this.configurationService = configurationService;
|
|
28
28
|
this.el = ( new Lazy(() => {
|
|
29
29
|
if (this.options.compact) {
|
|
@@ -48,35 +48,17 @@ let ManagedTestCoverageBars = class ManagedTestCoverageBars extends Disposable {
|
|
|
48
48
|
}
|
|
49
49
|
}));
|
|
50
50
|
this.visibleStore = this._register(( new DisposableStore()));
|
|
51
|
+
this.customHovers = [];
|
|
51
52
|
}
|
|
52
53
|
attachHover(target, factory) {
|
|
53
|
-
|
|
54
|
-
if (!this._coverage) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const content = factory(this._coverage);
|
|
58
|
-
if (!content) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
const hover = this.hoverService.showHover({
|
|
62
|
-
content,
|
|
63
|
-
target,
|
|
64
|
-
appearance: {
|
|
65
|
-
showPointer: true,
|
|
66
|
-
compact: true,
|
|
67
|
-
skipFadeInAnimation: true,
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
if (hover) {
|
|
71
|
-
this.visibleStore.add(hover);
|
|
72
|
-
}
|
|
73
|
-
};
|
|
54
|
+
this._register(setupCustomHover(getDefaultHoverDelegate('element'), target, () => this._coverage && factory(this._coverage)));
|
|
74
55
|
}
|
|
75
56
|
setCoverageInfo(coverage) {
|
|
76
57
|
const ds = this.visibleStore;
|
|
77
58
|
if (!coverage) {
|
|
78
59
|
if (this._coverage) {
|
|
79
60
|
this._coverage = undefined;
|
|
61
|
+
this.customHovers.forEach(c => c.hide());
|
|
80
62
|
ds.clear();
|
|
81
63
|
}
|
|
82
64
|
return;
|
|
@@ -108,14 +90,13 @@ let ManagedTestCoverageBars = class ManagedTestCoverageBars extends Disposable {
|
|
|
108
90
|
}
|
|
109
91
|
else {
|
|
110
92
|
renderBar(el.statement, percent(coverage.statement), coverage.statement.total === 0, thresholds);
|
|
111
|
-
renderBar(el.function, coverage.
|
|
93
|
+
renderBar(el.function, coverage.declaration && percent(coverage.declaration), coverage.declaration?.total === 0, thresholds);
|
|
112
94
|
renderBar(el.branch, coverage.branch && percent(coverage.branch), coverage.branch?.total === 0, thresholds);
|
|
113
95
|
}
|
|
114
96
|
}
|
|
115
97
|
};
|
|
116
98
|
ManagedTestCoverageBars = ( __decorate([
|
|
117
|
-
( __param(1,
|
|
118
|
-
( __param(2, IConfigurationService))
|
|
99
|
+
( __param(1, IConfigurationService))
|
|
119
100
|
], ManagedTestCoverageBars));
|
|
120
101
|
const percent = (cc) => clamp(cc.total === 0 ? 1 : cc.covered / cc.total, 0, 1);
|
|
121
102
|
const epsilon = 10e-8;
|
|
@@ -159,13 +140,13 @@ const calculateDisplayedStat = (coverage, method) => {
|
|
|
159
140
|
if (coverage.branch) {
|
|
160
141
|
value = Math.min(value, percent(coverage.branch));
|
|
161
142
|
}
|
|
162
|
-
if (coverage.
|
|
163
|
-
value = Math.min(value, percent(coverage.
|
|
143
|
+
if (coverage.declaration) {
|
|
144
|
+
value = Math.min(value, percent(coverage.declaration));
|
|
164
145
|
}
|
|
165
146
|
return value;
|
|
166
147
|
}
|
|
167
148
|
case "totalCoverage" :
|
|
168
|
-
return getTotalCoveragePercent(coverage.statement, coverage.branch, coverage.
|
|
149
|
+
return getTotalCoveragePercent(coverage.statement, coverage.branch, coverage.declaration);
|
|
169
150
|
default:
|
|
170
151
|
assertNever();
|
|
171
152
|
}
|
|
@@ -177,38 +158,45 @@ const displayPercent = (value, precision = 2) => {
|
|
|
177
158
|
}
|
|
178
159
|
return `${display}%`;
|
|
179
160
|
};
|
|
161
|
+
const nf = new Intl.NumberFormat();
|
|
180
162
|
const stmtCoverageText = (coverage) => ( localizeWithPath(
|
|
181
163
|
'vs/workbench/contrib/testing/browser/testCoverageBars',
|
|
182
164
|
'statementCoverage',
|
|
183
165
|
'{0}/{1} statements covered ({2})',
|
|
184
|
-
coverage.statement.covered,
|
|
185
|
-
coverage.statement.total,
|
|
166
|
+
nf.format(coverage.statement.covered),
|
|
167
|
+
nf.format(coverage.statement.total),
|
|
186
168
|
displayPercent(percent(coverage.statement))
|
|
187
169
|
));
|
|
188
|
-
const fnCoverageText = (coverage) => coverage.
|
|
170
|
+
const fnCoverageText = (coverage) => coverage.declaration && ( localizeWithPath(
|
|
189
171
|
'vs/workbench/contrib/testing/browser/testCoverageBars',
|
|
190
172
|
'functionCoverage',
|
|
191
173
|
'{0}/{1} functions covered ({2})',
|
|
192
|
-
coverage.
|
|
193
|
-
coverage.
|
|
194
|
-
displayPercent(percent(coverage.
|
|
174
|
+
nf.format(coverage.declaration.covered),
|
|
175
|
+
nf.format(coverage.declaration.total),
|
|
176
|
+
displayPercent(percent(coverage.declaration))
|
|
195
177
|
));
|
|
196
178
|
const branchCoverageText = (coverage) => coverage.branch && ( localizeWithPath(
|
|
197
179
|
'vs/workbench/contrib/testing/browser/testCoverageBars',
|
|
198
180
|
'branchCoverage',
|
|
199
181
|
'{0}/{1} branches covered ({2})',
|
|
200
|
-
coverage.branch.covered,
|
|
201
|
-
coverage.branch.total,
|
|
182
|
+
nf.format(coverage.branch.covered),
|
|
183
|
+
nf.format(coverage.branch.total),
|
|
202
184
|
displayPercent(percent(coverage.branch))
|
|
203
185
|
));
|
|
204
|
-
const getOverallHoverText = (coverage) =>
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
186
|
+
const getOverallHoverText = (coverage) => {
|
|
187
|
+
const str = [
|
|
188
|
+
stmtCoverageText(coverage),
|
|
189
|
+
fnCoverageText(coverage),
|
|
190
|
+
branchCoverageText(coverage),
|
|
191
|
+
].filter(isDefined).join('\n\n');
|
|
192
|
+
return {
|
|
193
|
+
markdown: ( new MarkdownString()).appendText(str),
|
|
194
|
+
markdownNotSupportedFallback: str
|
|
195
|
+
};
|
|
196
|
+
};
|
|
209
197
|
let ExplorerTestCoverageBars = class ExplorerTestCoverageBars extends ManagedTestCoverageBars {
|
|
210
|
-
constructor(options,
|
|
211
|
-
super(options,
|
|
198
|
+
constructor(options, configurationService, testCoverageService) {
|
|
199
|
+
super(options, configurationService);
|
|
212
200
|
this.resource = observableValue(this, undefined);
|
|
213
201
|
const isEnabled = observeTestingConfiguration(configurationService, "testing.showCoverageInExplorer" );
|
|
214
202
|
this._register(autorun(async (reader) => {
|
|
@@ -232,9 +220,8 @@ let ExplorerTestCoverageBars = class ExplorerTestCoverageBars extends ManagedTes
|
|
|
232
220
|
}
|
|
233
221
|
};
|
|
234
222
|
ExplorerTestCoverageBars = ( __decorate([
|
|
235
|
-
( __param(1,
|
|
236
|
-
( __param(2,
|
|
237
|
-
( __param(3, ITestCoverageService))
|
|
223
|
+
( __param(1, IConfigurationService)),
|
|
224
|
+
( __param(2, ITestCoverageService))
|
|
238
225
|
], ExplorerTestCoverageBars));
|
|
239
226
|
|
|
240
227
|
export { ExplorerTestCoverageBars, ManagedTestCoverageBars };
|
|
@@ -36,7 +36,7 @@ import { SIDE_GROUP, ACTIVE_GROUP, IEditorService } from 'vscode/vscode/vs/workb
|
|
|
36
36
|
import { observableValue } from 'vscode/vscode/vs/base/common/observableInternal/base';
|
|
37
37
|
import { autorun } from 'vscode/vscode/vs/base/common/observableInternal/autorun';
|
|
38
38
|
|
|
39
|
-
var FileCoverageRenderer_1,
|
|
39
|
+
var FileCoverageRenderer_1, DeclarationCoverageRenderer_1;
|
|
40
40
|
let TestCoverageView = class TestCoverageView extends ViewPane {
|
|
41
41
|
constructor(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, coverageService) {
|
|
42
42
|
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
|
@@ -76,7 +76,7 @@ TestCoverageView = ( __decorate([
|
|
|
76
76
|
( __param(10, ITestCoverageService))
|
|
77
77
|
], TestCoverageView));
|
|
78
78
|
let fnNodeId = 0;
|
|
79
|
-
class
|
|
79
|
+
class DeclarationCoverageNode {
|
|
80
80
|
get hits() {
|
|
81
81
|
return this.data.count;
|
|
82
82
|
}
|
|
@@ -119,11 +119,11 @@ class FunctionCoverageNode {
|
|
|
119
119
|
if (detail.type !== 1 ) {
|
|
120
120
|
continue;
|
|
121
121
|
}
|
|
122
|
-
statement.covered += detail.count
|
|
122
|
+
statement.covered += detail.count ? 1 : 0;
|
|
123
123
|
statement.total++;
|
|
124
124
|
if (detail.branches) {
|
|
125
125
|
for (const { count } of detail.branches) {
|
|
126
|
-
branch.covered += count
|
|
126
|
+
branch.covered += count ? 1 : 0;
|
|
127
127
|
branch.total++;
|
|
128
128
|
}
|
|
129
129
|
}
|
|
@@ -131,15 +131,15 @@ class FunctionCoverageNode {
|
|
|
131
131
|
return { statement, branch };
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
|
-
|
|
134
|
+
DeclarationCoverageNode.__decorator = ( __decorate([
|
|
135
135
|
memoize
|
|
136
|
-
],
|
|
137
|
-
class
|
|
136
|
+
], DeclarationCoverageNode.prototype, "attributableCoverage", null));
|
|
137
|
+
class RevealUncoveredDeclarations {
|
|
138
138
|
get label() {
|
|
139
139
|
return ( localizeWithPath(
|
|
140
140
|
'vs/workbench/contrib/testing/browser/testCoverageView',
|
|
141
141
|
'functionsWithoutCoverage',
|
|
142
|
-
"{0}
|
|
142
|
+
"{0} declarations without coverage...",
|
|
143
143
|
this.n
|
|
144
144
|
));
|
|
145
145
|
}
|
|
@@ -159,14 +159,14 @@ class LoadingDetails {
|
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
const isFileCoverage = (c) => typeof c === 'object' && 'value' in c;
|
|
162
|
-
const
|
|
163
|
-
const
|
|
162
|
+
const isDeclarationCoverage = (c) => c instanceof DeclarationCoverageNode;
|
|
163
|
+
const shouldShowDeclDetailsOnExpand = (c) => isFileCoverage(c) && c.value instanceof FileCoverage && !!c.value.declaration?.total;
|
|
164
164
|
let TestCoverageTree = class TestCoverageTree extends Disposable {
|
|
165
165
|
constructor(container, labels, sortOrder, instantiationService, editorService) {
|
|
166
166
|
super();
|
|
167
167
|
this.tree = instantiationService.createInstance(WorkbenchCompressibleObjectTree, 'TestCoverageView', container, ( new TestCoverageTreeListDelegate()), [
|
|
168
168
|
instantiationService.createInstance(FileCoverageRenderer, labels),
|
|
169
|
-
instantiationService.createInstance(
|
|
169
|
+
instantiationService.createInstance(DeclarationCoverageRenderer),
|
|
170
170
|
instantiationService.createInstance(BasicRenderer),
|
|
171
171
|
], {
|
|
172
172
|
expandOnlyOnTwistieClick: true,
|
|
@@ -214,7 +214,7 @@ let TestCoverageTree = class TestCoverageTree extends Disposable {
|
|
|
214
214
|
this._register(this.tree);
|
|
215
215
|
this._register(this.tree.onDidChangeCollapseState(e => {
|
|
216
216
|
const el = e.node.element;
|
|
217
|
-
if (!e.node.collapsed && !e.node.children.length && el &&
|
|
217
|
+
if (!e.node.collapsed && !e.node.children.length && el && shouldShowDeclDetailsOnExpand(el)) {
|
|
218
218
|
if (el.value.hasSynchronousDetails) {
|
|
219
219
|
this.tree.setChildren(el, [{ element: ( new LoadingDetails()), incompressible: true }]);
|
|
220
220
|
}
|
|
@@ -228,7 +228,7 @@ let TestCoverageTree = class TestCoverageTree extends Disposable {
|
|
|
228
228
|
if (isFileCoverage(e.element) && !e.element.children?.size) {
|
|
229
229
|
resource = e.element.value.uri;
|
|
230
230
|
}
|
|
231
|
-
else if (
|
|
231
|
+
else if (isDeclarationCoverage(e.element)) {
|
|
232
232
|
resource = e.element.uri;
|
|
233
233
|
selection = e.element.location;
|
|
234
234
|
}
|
|
@@ -263,7 +263,7 @@ let TestCoverageTree = class TestCoverageTree extends Disposable {
|
|
|
263
263
|
element: file,
|
|
264
264
|
incompressible: isFile,
|
|
265
265
|
collapsed: isFile,
|
|
266
|
-
collapsible: !isFile || !!file.value?.
|
|
266
|
+
collapsible: !isFile || !!file.value?.declaration?.total,
|
|
267
267
|
children: file.children && ( Iterable.map(file.children?.values(), toChild))
|
|
268
268
|
};
|
|
269
269
|
};
|
|
@@ -276,12 +276,12 @@ let TestCoverageTree = class TestCoverageTree extends Disposable {
|
|
|
276
276
|
if (!this.tree.hasElement(el)) {
|
|
277
277
|
return;
|
|
278
278
|
}
|
|
279
|
-
const
|
|
279
|
+
const decl = [];
|
|
280
280
|
for (const fn of details) {
|
|
281
281
|
if (fn.type !== 0 ) {
|
|
282
282
|
continue;
|
|
283
283
|
}
|
|
284
|
-
let arr =
|
|
284
|
+
let arr = decl;
|
|
285
285
|
while (true) {
|
|
286
286
|
const parent = arr.find(p => ( p.containedDetails.has(fn)));
|
|
287
287
|
if (parent) {
|
|
@@ -291,7 +291,7 @@ let TestCoverageTree = class TestCoverageTree extends Disposable {
|
|
|
291
291
|
break;
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
|
-
arr.push(( new
|
|
294
|
+
arr.push(( new DeclarationCoverageNode(el.value.uri, fn, details)));
|
|
295
295
|
}
|
|
296
296
|
const makeChild = (fn) => ({
|
|
297
297
|
element: fn,
|
|
@@ -300,7 +300,7 @@ let TestCoverageTree = class TestCoverageTree extends Disposable {
|
|
|
300
300
|
collapsible: fn.children.length > 0,
|
|
301
301
|
children: ( fn.children.map(makeChild))
|
|
302
302
|
});
|
|
303
|
-
this.tree.setChildren(el, (
|
|
303
|
+
this.tree.setChildren(el, ( decl.map(makeChild)));
|
|
304
304
|
}
|
|
305
305
|
};
|
|
306
306
|
TestCoverageTree = ( __decorate([
|
|
@@ -315,10 +315,10 @@ class TestCoverageTreeListDelegate {
|
|
|
315
315
|
if (isFileCoverage(element)) {
|
|
316
316
|
return FileCoverageRenderer.ID;
|
|
317
317
|
}
|
|
318
|
-
if (
|
|
319
|
-
return
|
|
318
|
+
if (isDeclarationCoverage(element)) {
|
|
319
|
+
return DeclarationCoverageRenderer.ID;
|
|
320
320
|
}
|
|
321
|
-
if (element instanceof LoadingDetails || element instanceof
|
|
321
|
+
if (element instanceof LoadingDetails || element instanceof RevealUncoveredDeclarations) {
|
|
322
322
|
return BasicRenderer.ID;
|
|
323
323
|
}
|
|
324
324
|
assertNever();
|
|
@@ -339,7 +339,7 @@ class Sorter {
|
|
|
339
339
|
return b.value.tpc - a.value.tpc;
|
|
340
340
|
}
|
|
341
341
|
}
|
|
342
|
-
else if (
|
|
342
|
+
else if (isDeclarationCoverage(a) && isDeclarationCoverage(b)) {
|
|
343
343
|
switch (order) {
|
|
344
344
|
case 1 :
|
|
345
345
|
return Position.compare(a.location instanceof Range ? a.location.getStartPosition() : a.location, b.location instanceof Range ? b.location.getStartPosition() : b.location);
|
|
@@ -349,7 +349,7 @@ class Sorter {
|
|
|
349
349
|
const attrA = a.tpc;
|
|
350
350
|
const attrB = b.tpc;
|
|
351
351
|
return (attrA !== undefined && attrB !== undefined && attrB - attrA)
|
|
352
|
-
|| (b.hits - a.hits)
|
|
352
|
+
|| (+b.hits - +a.hits)
|
|
353
353
|
|| a.label.localeCompare(b.label);
|
|
354
354
|
}
|
|
355
355
|
}
|
|
@@ -406,12 +406,12 @@ FileCoverageRenderer = FileCoverageRenderer_1 = ( __decorate([
|
|
|
406
406
|
( __param(1, ILabelService)),
|
|
407
407
|
( __param(2, IInstantiationService))
|
|
408
408
|
], FileCoverageRenderer));
|
|
409
|
-
let
|
|
410
|
-
static {
|
|
409
|
+
let DeclarationCoverageRenderer = class DeclarationCoverageRenderer {
|
|
410
|
+
static { DeclarationCoverageRenderer_1 = this; }
|
|
411
411
|
static { this.ID = 'N'; }
|
|
412
412
|
constructor(instantiationService) {
|
|
413
413
|
this.instantiationService = instantiationService;
|
|
414
|
-
this.templateId =
|
|
414
|
+
this.templateId = DeclarationCoverageRenderer_1.ID;
|
|
415
415
|
}
|
|
416
416
|
renderTemplate(container) {
|
|
417
417
|
const templateDisposables = ( new DisposableStore());
|
|
@@ -436,7 +436,7 @@ let FunctionCoverageRenderer = class FunctionCoverageRenderer {
|
|
|
436
436
|
templateData.templateDisposables.dispose();
|
|
437
437
|
}
|
|
438
438
|
doRender(element, templateData, _filterData) {
|
|
439
|
-
const covered = element.hits
|
|
439
|
+
const covered = !!element.hits;
|
|
440
440
|
const icon = covered ? testingWasCovered : testingStatesToIcons.get(0 );
|
|
441
441
|
templateData.container.classList.toggle('not-covered', !covered);
|
|
442
442
|
templateData.icon.className = `computed-state ${ThemeIcon.asClassName(icon)}`;
|
|
@@ -444,9 +444,9 @@ let FunctionCoverageRenderer = class FunctionCoverageRenderer {
|
|
|
444
444
|
templateData.bars.setCoverageInfo(element.attributableCoverage());
|
|
445
445
|
}
|
|
446
446
|
};
|
|
447
|
-
|
|
447
|
+
DeclarationCoverageRenderer = DeclarationCoverageRenderer_1 = ( __decorate([
|
|
448
448
|
( __param(0, IInstantiationService))
|
|
449
|
-
],
|
|
449
|
+
], DeclarationCoverageRenderer));
|
|
450
450
|
class BasicRenderer {
|
|
451
451
|
constructor() {
|
|
452
452
|
this.templateId = BasicRenderer.ID;
|
|
@@ -503,7 +503,7 @@ registerAction2(class TestCoverageChangeSortingAction extends ViewAction {
|
|
|
503
503
|
)), value: 1 , description: ( localizeWithPath(
|
|
504
504
|
'vs/workbench/contrib/testing/browser/testCoverageView',
|
|
505
505
|
'testing.coverageSortByLocationDescription',
|
|
506
|
-
'Files are sorted alphabetically,
|
|
506
|
+
'Files are sorted alphabetically, declarations are sorted by position'
|
|
507
507
|
)) },
|
|
508
508
|
{ label: ( localizeWithPath(
|
|
509
509
|
'vs/workbench/contrib/testing/browser/testCoverageView',
|
|
@@ -512,7 +512,7 @@ registerAction2(class TestCoverageChangeSortingAction extends ViewAction {
|
|
|
512
512
|
)), value: 0 , description: ( localizeWithPath(
|
|
513
513
|
'vs/workbench/contrib/testing/browser/testCoverageView',
|
|
514
514
|
'testing.coverageSortByCoverageDescription',
|
|
515
|
-
'Files and
|
|
515
|
+
'Files and declarations are sorted by total coverage'
|
|
516
516
|
)) },
|
|
517
517
|
{ label: ( localizeWithPath(
|
|
518
518
|
'vs/workbench/contrib/testing/browser/testCoverageView',
|
|
@@ -521,7 +521,7 @@ registerAction2(class TestCoverageChangeSortingAction extends ViewAction {
|
|
|
521
521
|
)), value: 2 , description: ( localizeWithPath(
|
|
522
522
|
'vs/workbench/contrib/testing/browser/testCoverageView',
|
|
523
523
|
'testing.coverageSortByNameDescription',
|
|
524
|
-
'Files and
|
|
524
|
+
'Files and declarations are sorted alphabetically'
|
|
525
525
|
)) },
|
|
526
526
|
];
|
|
527
527
|
quickInput.placeholder = ( localizeWithPath(
|
|
@@ -8,7 +8,7 @@ import { Position } from 'vscode/vscode/vs/editor/common/core/position';
|
|
|
8
8
|
import { Range } from 'vscode/vscode/vs/editor/common/core/range';
|
|
9
9
|
import { EditorContextKeys } from 'vscode/vscode/vs/editor/common/editorContextKeys';
|
|
10
10
|
import { MessageController } from 'vscode/vscode/vs/editor/contrib/message/browser/messageController';
|
|
11
|
-
import {
|
|
11
|
+
import { localize2WithPath, localizeWithPath } from 'vscode/vscode/vs/nls';
|
|
12
12
|
import { Categories } from 'vscode/vscode/vs/platform/action/common/actionCommonCategories';
|
|
13
13
|
import { Action2, MenuId } from 'vscode/vscode/vs/platform/actions/common/actions';
|
|
14
14
|
import { ICommandService } from 'vscode/vscode/vs/platform/commands/common/commands';
|
|
@@ -41,21 +41,21 @@ import { IViewsService } from 'vscode/vscode/vs/workbench/services/views/common/
|
|
|
41
41
|
|
|
42
42
|
const category = Categories.Test;
|
|
43
43
|
const hasAnyTestProvider = ContextKeyGreaterExpr.create(TestingContextKeys.providerCount.key, 0);
|
|
44
|
-
const LABEL_RUN_TESTS =
|
|
44
|
+
const LABEL_RUN_TESTS = ( localize2WithPath(
|
|
45
45
|
'vs/workbench/contrib/testing/browser/testExplorerActions',
|
|
46
46
|
'runSelectedTests',
|
|
47
|
-
|
|
48
|
-
))
|
|
49
|
-
const LABEL_DEBUG_TESTS =
|
|
47
|
+
"Run Tests"
|
|
48
|
+
));
|
|
49
|
+
const LABEL_DEBUG_TESTS = ( localize2WithPath(
|
|
50
50
|
'vs/workbench/contrib/testing/browser/testExplorerActions',
|
|
51
51
|
'debugSelectedTests',
|
|
52
|
-
|
|
53
|
-
))
|
|
54
|
-
const LABEL_COVERAGE_TESTS =
|
|
52
|
+
"Debug Tests"
|
|
53
|
+
));
|
|
54
|
+
const LABEL_COVERAGE_TESTS = ( localize2WithPath(
|
|
55
55
|
'vs/workbench/contrib/testing/browser/testExplorerActions',
|
|
56
56
|
'coverageSelectedTests',
|
|
57
|
-
|
|
58
|
-
))
|
|
57
|
+
"Run Tests with Coverage"
|
|
58
|
+
));
|
|
59
59
|
class HideTestAction extends Action2 {
|
|
60
60
|
constructor() {
|
|
61
61
|
super({
|
|
@@ -283,19 +283,13 @@ class ContinuousRunTestAction extends Action2 {
|
|
|
283
283
|
}
|
|
284
284
|
async run(accessor, ...elements) {
|
|
285
285
|
const crService = accessor.get(ITestingContinuousRunService);
|
|
286
|
-
const profileService = accessor.get(ITestProfileService);
|
|
287
286
|
for (const element of elements) {
|
|
288
287
|
const id = element.test.item.extId;
|
|
289
288
|
if (crService.isSpecificallyEnabledFor(id)) {
|
|
290
289
|
crService.stop(id);
|
|
291
290
|
continue;
|
|
292
291
|
}
|
|
293
|
-
|
|
294
|
-
.filter(p => p.supportsContinuousRun && p.controllerId === element.test.controllerId);
|
|
295
|
-
if (!profiles.length) {
|
|
296
|
-
continue;
|
|
297
|
-
}
|
|
298
|
-
crService.start(profiles, id);
|
|
292
|
+
crService.start(2 , id);
|
|
299
293
|
}
|
|
300
294
|
}
|
|
301
295
|
}
|
|
@@ -336,11 +330,11 @@ class ConfigureTestProfilesAction extends Action2 {
|
|
|
336
330
|
constructor() {
|
|
337
331
|
super({
|
|
338
332
|
id: "testing.configureProfile" ,
|
|
339
|
-
title:
|
|
333
|
+
title: ( localize2WithPath(
|
|
340
334
|
'vs/workbench/contrib/testing/browser/testExplorerActions',
|
|
341
335
|
'testing.configureProfile',
|
|
342
|
-
|
|
343
|
-
)),
|
|
336
|
+
"Configure Test Profiles"
|
|
337
|
+
)),
|
|
344
338
|
icon: testingUpdateProfiles,
|
|
345
339
|
f1: true,
|
|
346
340
|
category,
|
|
@@ -463,11 +457,11 @@ class StartContinuousRunAction extends Action2 {
|
|
|
463
457
|
constructor() {
|
|
464
458
|
super({
|
|
465
459
|
id: "testing.startContinuousRun" ,
|
|
466
|
-
title:
|
|
460
|
+
title: ( localize2WithPath(
|
|
467
461
|
'vs/workbench/contrib/testing/browser/testExplorerActions',
|
|
468
462
|
'testing.startContinuous',
|
|
469
463
|
"Start Continuous Run"
|
|
470
|
-
)),
|
|
464
|
+
)),
|
|
471
465
|
category,
|
|
472
466
|
icon: testingTurnContinuousRunOn,
|
|
473
467
|
menu: continuousMenus(false),
|
|
@@ -489,10 +489,10 @@ class TitleLensContentWidget {
|
|
|
489
489
|
let height;
|
|
490
490
|
if (!fontSize || fontSize < 5) {
|
|
491
491
|
fontSize = (this.editor.getOption(52 ) * .9) | 0;
|
|
492
|
-
height = this.editor.getOption(
|
|
492
|
+
height = this.editor.getOption(67 );
|
|
493
493
|
}
|
|
494
494
|
else {
|
|
495
|
-
height = (fontSize * Math.max(1.3, this.editor.getOption(
|
|
495
|
+
height = (fontSize * Math.max(1.3, this.editor.getOption(67 ) / this.editor.getOption(52 ))) | 0;
|
|
496
496
|
}
|
|
497
497
|
const editorFontInfo = this.editor.getOption(50 );
|
|
498
498
|
const node = this._domNode;
|
|
@@ -368,7 +368,7 @@ let ResultSummaryView = class ResultSummaryView extends Disposable {
|
|
|
368
368
|
}
|
|
369
369
|
}));
|
|
370
370
|
const ab = this._register(( new ActionBar(this.elements.rerun, {
|
|
371
|
-
actionViewItemProvider: action => createActionViewItem(instantiationService, action),
|
|
371
|
+
actionViewItemProvider: (action, options) => createActionViewItem(instantiationService, action, options),
|
|
372
372
|
})));
|
|
373
373
|
ab.push(instantiationService.createInstance(MenuItemAction, { ...( new ReRunLastRun()).desc, icon: testingRerunIcon }, { ...( new DebugLastRun()).desc, icon: testingDebugIcon }, {}, undefined), { icon: true, label: false });
|
|
374
374
|
this.render();
|
|
@@ -826,37 +826,45 @@ let TestResultsView = class TestResultsView extends ViewPane {
|
|
|
826
826
|
constructor(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, resultService) {
|
|
827
827
|
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
|
|
828
828
|
this.resultService = resultService;
|
|
829
|
-
this.content =
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
829
|
+
this.content = ( new Lazy(
|
|
830
|
+
() => this._register(this.instantiationService.createInstance(TestResultsViewContent, undefined, {
|
|
831
|
+
historyVisible: staticObservableValue(true),
|
|
832
|
+
showRevealLocationOnMessages: true,
|
|
833
|
+
locationForProgress: "workbench.view.testing" ,
|
|
834
|
+
}))
|
|
835
|
+
));
|
|
834
836
|
}
|
|
835
837
|
get subject() {
|
|
836
|
-
return this.content.current;
|
|
838
|
+
return this.content.rawValue?.current;
|
|
837
839
|
}
|
|
838
840
|
showLatestRun(preserveFocus = false) {
|
|
839
841
|
const result = this.resultService.results.find(r => r.tasks.length);
|
|
840
842
|
if (!result) {
|
|
841
843
|
return;
|
|
842
844
|
}
|
|
843
|
-
this.content.reveal({ preserveFocus, subject: ( new TaskSubject(result, 0)) });
|
|
844
|
-
}
|
|
845
|
-
showMessage(result, test, taskIndex, messageIndex) {
|
|
846
|
-
this.content.reveal({ preserveFocus: false, subject: ( new MessageSubject(result, test, taskIndex, messageIndex)) });
|
|
845
|
+
this.content.rawValue?.reveal({ preserveFocus, subject: ( new TaskSubject(result, 0)) });
|
|
847
846
|
}
|
|
848
847
|
renderBody(container) {
|
|
849
848
|
super.renderBody(container);
|
|
850
|
-
this.
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
this.
|
|
849
|
+
if (this.isBodyVisible()) {
|
|
850
|
+
this.renderContent(container);
|
|
851
|
+
}
|
|
852
|
+
else {
|
|
853
|
+
this._register(Event.once(Event.filter(this.onDidChangeBodyVisibility, Boolean))(() => this.renderContent(container)));
|
|
855
854
|
}
|
|
856
855
|
}
|
|
857
856
|
layoutBody(height, width) {
|
|
858
857
|
super.layoutBody(height, width);
|
|
859
|
-
this.content.onLayoutBody(height, width);
|
|
858
|
+
this.content.rawValue?.onLayoutBody(height, width);
|
|
859
|
+
}
|
|
860
|
+
renderContent(container) {
|
|
861
|
+
const content = this.content.value;
|
|
862
|
+
content.fillBody(container);
|
|
863
|
+
content.onDidRequestReveal(subject => content.reveal({ preserveFocus: true, subject }));
|
|
864
|
+
const [lastResult] = this.resultService.results;
|
|
865
|
+
if (lastResult && lastResult.tasks.length) {
|
|
866
|
+
content.reveal({ preserveFocus: true, subject: ( new TaskSubject(lastResult, 0)) });
|
|
867
|
+
}
|
|
860
868
|
}
|
|
861
869
|
};
|
|
862
870
|
TestResultsView = ( __decorate([
|