@codingame/monaco-vscode-testing-service-override 3.2.2 → 4.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.
Files changed (21) hide show
  1. package/package.json +8 -8
  2. package/testing.js +1 -0
  3. package/vscode/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.js +48 -24
  4. package/vscode/src/vs/workbench/contrib/testing/browser/explorerProjections/treeProjection.js +8 -9
  5. package/vscode/src/vs/workbench/contrib/testing/browser/icons.js +11 -1
  6. package/vscode/src/vs/workbench/contrib/testing/browser/media/testMessageColorizer.css.js +6 -0
  7. package/vscode/src/vs/workbench/contrib/testing/browser/media/testing.css.js +1 -1
  8. package/vscode/src/vs/workbench/contrib/testing/browser/testCoverageBars.js +18 -5
  9. package/vscode/src/vs/workbench/contrib/testing/browser/testCoverageView.js +21 -2
  10. package/vscode/src/vs/workbench/contrib/testing/browser/testExplorerActions.js +23 -12
  11. package/vscode/src/vs/workbench/contrib/testing/browser/testMessageColorizer.js +73 -0
  12. package/vscode/src/vs/workbench/contrib/testing/browser/testing.contribution.js +6 -0
  13. package/vscode/src/vs/workbench/contrib/testing/browser/testingConfigurationUi.js +120 -0
  14. package/vscode/src/vs/workbench/contrib/testing/browser/testingDecorations.js +2 -2
  15. package/vscode/src/vs/workbench/contrib/testing/browser/testingExplorerFilter.js +10 -10
  16. package/vscode/src/vs/workbench/contrib/testing/browser/testingExplorerView.js +33 -19
  17. package/vscode/src/vs/workbench/contrib/testing/browser/testingOutputPeek.js +50 -31
  18. package/vscode/src/vs/workbench/contrib/testing/browser/theme.js +80 -2
  19. package/vscode/src/vs/workbench/contrib/testing/common/configuration.js +4 -1
  20. package/vscode/src/vs/workbench/contrib/testing/common/observableUtils.js +20 -0
  21. package/vscode/src/vs/workbench/contrib/testing/common/testingContentProvider.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codingame/monaco-vscode-testing-service-override",
3
- "version": "3.2.2",
3
+ "version": "4.0.0",
4
4
  "keywords": [],
5
5
  "author": {
6
6
  "name": "CodinGame",
@@ -18,12 +18,12 @@
18
18
  "module": "index.js",
19
19
  "types": "index.d.ts",
20
20
  "dependencies": {
21
- "vscode": "npm:@codingame/monaco-vscode-api@3.2.2",
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"
21
+ "vscode": "npm:@codingame/monaco-vscode-api@4.0.0",
22
+ "@xterm/addon-canvas": "0.7.0-beta.12",
23
+ "@xterm/addon-image": "0.8.0-beta.12",
24
+ "@xterm/addon-search": "0.15.0-beta.12",
25
+ "@xterm/addon-serialize": "0.13.0-beta.12",
26
+ "@xterm/addon-unicode11": "0.8.0-beta.12",
27
+ "@xterm/addon-webgl": "0.18.0-beta.12"
28
28
  }
29
29
  }
package/testing.js CHANGED
@@ -12,6 +12,7 @@ import { ITestExplorerFilterState, TestExplorerFilterState } from 'vscode/vscode
12
12
  import { TestingPeekOpener } from './vscode/src/vs/workbench/contrib/testing/browser/testingOutputPeek.js';
13
13
  import { ITestCoverageService, TestCoverageService } from 'vscode/vscode/vs/workbench/contrib/testing/common/testCoverageService';
14
14
  import './vscode/src/vs/workbench/contrib/testing/browser/testing.contribution.js';
15
+ import './vscode/src/vs/workbench/contrib/testing/browser/testingConfigurationUi.js';
15
16
 
16
17
  function getServiceOverride() {
17
18
  return {
@@ -2,11 +2,16 @@ import { __decorate, __param } from '../../../../../../../external/tslib/tslib.e
2
2
  import { $, append, clearNode } from 'vscode/vscode/vs/base/browser/dom';
3
3
  import { HoverWidget } from 'vscode/vscode/vs/base/browser/ui/hover/hoverWidget';
4
4
  import { mapFindFirst } from 'vscode/vscode/vs/base/common/arraysFind';
5
+ import { assertNever } from 'vscode/vscode/vs/base/common/assert';
5
6
  import { CancellationTokenSource } from 'vscode/vscode/vs/base/common/cancellation';
6
7
  import { MarkdownString } from 'vscode/vscode/vs/base/common/htmlContent';
7
8
  import { KeyChord } from 'vscode/vscode/vs/base/common/keyCodes';
8
9
  import { Lazy } from 'vscode/vscode/vs/base/common/lazy';
9
10
  import { Disposable, DisposableStore, toDisposable } from 'vscode/vscode/vs/base/common/lifecycle';
11
+ import { observableValue } from 'vscode/vscode/vs/base/common/observableInternal/base';
12
+ import { derived } from 'vscode/vscode/vs/base/common/observableInternal/derived';
13
+ import { autorun } from 'vscode/vscode/vs/base/common/observableInternal/autorun';
14
+ import { observableFromEvent } from 'vscode/vscode/vs/base/common/observableInternal/utils';
10
15
  import { ThemeIcon } from 'vscode/vscode/vs/base/common/themables';
11
16
  import { MarkdownRenderer } from 'vscode/vscode/vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer';
12
17
  import { Position } from 'vscode/vscode/vs/editor/common/core/position';
@@ -22,10 +27,6 @@ import { ILogService } from 'vscode/vscode/vs/platform/log/common/log';
22
27
  import { testingCoverageMissingBranch } from './icons.js';
23
28
  import { ITestCoverageService } from 'vscode/vscode/vs/workbench/contrib/testing/common/testCoverageService';
24
29
  import { TestingContextKeys } from 'vscode/vscode/vs/workbench/contrib/testing/common/testingContextKeys';
25
- import { observableValue } from 'vscode/vscode/vs/base/common/observableInternal/base';
26
- import { observableFromEvent } from 'vscode/vscode/vs/base/common/observableInternal/utils';
27
- import { derived } from 'vscode/vscode/vs/base/common/observableInternal/derived';
28
- import { autorun } from 'vscode/vscode/vs/base/common/observableInternal/autorun';
29
30
 
30
31
  var CodeCoverageDecorations_1, LineHoverWidget_1;
31
32
  const MAX_HOVERED_LINES = 30;
@@ -63,7 +64,12 @@ let CodeCoverageDecorations = class CodeCoverageDecorations extends Disposable {
63
64
  if (!model) {
64
65
  return;
65
66
  }
66
- return report.getUri(model.uri);
67
+ const file = report.getUri(model.uri);
68
+ if (file) {
69
+ return file;
70
+ }
71
+ report.didAddCoverage.read(reader);
72
+ return undefined;
67
73
  });
68
74
  this._register(autorun(reader => {
69
75
  const c = fileCoverage.read(reader);
@@ -372,20 +378,13 @@ class CoverageDetailsModel {
372
378
  }
373
379
  describe(detail, model) {
374
380
  if (detail.type === 0 ) {
375
- return ( new MarkdownString()).appendMarkdown(( localizeWithPath(
376
- 'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
377
- 'coverage.declExecutedCount',
378
- '`{0}` was executed {1} time(s).',
379
- detail.name,
380
- detail.count
381
- )));
381
+ return namedDetailLabel(detail.name, detail);
382
382
  }
383
383
  else if (detail.type === 1 ) {
384
384
  const text = wrapName(model.getValueInRange(tidyLocation(detail.location)).trim() || `<empty statement>`);
385
- const str = ( new MarkdownString());
386
385
  if (detail.branches?.length) {
387
386
  const covered = detail.branches.filter(b => !!b.count).length;
388
- str.appendMarkdown(( localizeWithPath(
387
+ return ( new MarkdownString()).appendMarkdown(( localizeWithPath(
389
388
  'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
390
389
  'coverage.branches',
391
390
  '{0} of {1} of branches in {2} were covered.',
@@ -395,21 +394,14 @@ class CoverageDetailsModel {
395
394
  )));
396
395
  }
397
396
  else {
398
- str.appendMarkdown(( localizeWithPath(
399
- 'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
400
- 'coverage.codeExecutedCount',
401
- '{0} was executed {1} time(s).',
402
- text,
403
- detail.count
404
- )));
397
+ return namedDetailLabel(text, detail);
405
398
  }
406
- return str;
407
399
  }
408
400
  else if (detail.type === 2 ) {
409
401
  const text = wrapName(model.getValueInRange(tidyLocation(detail.detail.location)).trim() || `<empty statement>`);
410
402
  const { count, label } = detail.detail.branches[detail.branch];
411
403
  const label2 = label ? wrapInBackticks(label) : `#${detail.branch + 1}`;
412
- if (count === 0) {
404
+ if (!count) {
413
405
  return ( new MarkdownString()).appendMarkdown(( localizeWithPath(
414
406
  'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
415
407
  'coverage.branchNotCovered',
@@ -418,6 +410,15 @@ class CoverageDetailsModel {
418
410
  text
419
411
  )));
420
412
  }
413
+ else if (count === true) {
414
+ return ( new MarkdownString()).appendMarkdown(( localizeWithPath(
415
+ 'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
416
+ 'coverage.branchCoveredYes',
417
+ 'Branch {0} in {1} was executed.',
418
+ label2,
419
+ text
420
+ )));
421
+ }
421
422
  else {
422
423
  return ( new MarkdownString()).appendMarkdown(( localizeWithPath(
423
424
  'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
@@ -429,9 +430,32 @@ class CoverageDetailsModel {
429
430
  )));
430
431
  }
431
432
  }
432
- return undefined;
433
+ assertNever();
433
434
  }
434
435
  }
436
+ function namedDetailLabel(name, detail) {
437
+ return ( new MarkdownString()).appendMarkdown(!detail.count
438
+ ? ( localizeWithPath(
439
+ 'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
440
+ 'coverage.declExecutedNo',
441
+ '`{0}` was not executed.',
442
+ name
443
+ ))
444
+ : typeof detail.count === 'number'
445
+ ? ( localizeWithPath(
446
+ 'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
447
+ 'coverage.declExecutedCount',
448
+ '`{0}` was executed {1} time(s).',
449
+ name,
450
+ detail.count
451
+ ))
452
+ : ( localizeWithPath(
453
+ 'vs/workbench/contrib/testing/browser/codeCoverageDecorations',
454
+ 'coverage.declExecutedYes',
455
+ '`{0}` was executed.',
456
+ name
457
+ )));
458
+ }
435
459
  function tidyLocation(location) {
436
460
  if (location instanceof Position) {
437
461
  return Range.fromPositions(location, ( new Position(location.lineNumber, 0x7FFFFFFF)));
@@ -162,19 +162,18 @@ let TreeProjection = class TreeProjection extends Disposable {
162
162
  }
163
163
  }
164
164
  applyTo(tree) {
165
- for (const s of [this.changedParents, this.resortedParents]) {
166
- for (const element of s) {
167
- if (element && !tree.hasElement(element)) {
168
- s.delete(element);
169
- }
170
- }
171
- }
172
165
  for (const parent of this.changedParents) {
173
- tree.setChildren(parent, getChildrenForParent(this.lastState, this.rootsWithChildren, parent), { diffIdentityProvider: testIdentityProvider });
166
+ if (!parent || tree.hasElement(parent)) {
167
+ tree.setChildren(parent, getChildrenForParent(this.lastState, this.rootsWithChildren, parent), { diffIdentityProvider: testIdentityProvider });
168
+ }
174
169
  }
175
170
  for (const parent of this.resortedParents) {
176
- tree.resort(parent, false);
171
+ if (!parent || tree.hasElement(parent)) {
172
+ tree.resort(parent, false);
173
+ }
177
174
  }
175
+ this.changedParents.clear();
176
+ this.resortedParents.clear();
178
177
  }
179
178
  expandElement(element, depth) {
180
179
  if (!(element instanceof TreeTestItemElement)) {
@@ -3,7 +3,7 @@ import { localizeWithPath } from 'vscode/vscode/vs/nls';
3
3
  import { registerIcon, spinningLoading } from 'vscode/vscode/vs/platform/theme/common/iconRegistry';
4
4
  import { registerThemingParticipant } from 'vscode/vscode/vs/platform/theme/common/themeService';
5
5
  import { ThemeIcon } from 'vscode/vscode/vs/base/common/themables';
6
- import { testingColorRunAction, testStatesToIconColors } from './theme.js';
6
+ import { testingColorRunAction, testStatesToIconColors, testStatesToRetiredIconColors } from './theme.js';
7
7
 
8
8
  const testingViewIcon = registerIcon('test-view-icon', Codicon.beaker, ( localizeWithPath(
9
9
  'vs/workbench/contrib/testing/browser/icons',
@@ -156,12 +156,22 @@ const testingStatesToIcons = ( new Map([
156
156
  registerThemingParticipant((theme, collector) => {
157
157
  for (const [state, icon] of testingStatesToIcons.entries()) {
158
158
  const color = testStatesToIconColors[state];
159
+ const retiredColor = testStatesToRetiredIconColors[state];
159
160
  if (!color) {
160
161
  continue;
161
162
  }
162
163
  collector.addRule(`.monaco-workbench ${ThemeIcon.asCSSSelector(icon)} {
163
164
  color: ${theme.getColor(color)} !important;
164
165
  }`);
166
+ if (!retiredColor) {
167
+ continue;
168
+ }
169
+ collector.addRule(`
170
+ .test-explorer .computed-state.retired${ThemeIcon.asCSSSelector(icon)},
171
+ .testing-run-glyph.retired${ThemeIcon.asCSSSelector(icon)}{
172
+ color: ${theme.getColor(retiredColor)} !important;
173
+ }
174
+ `);
165
175
  }
166
176
  collector.addRule(`
167
177
  .monaco-editor ${ThemeIcon.asCSSSelector(testingRunIcon)},
@@ -0,0 +1,6 @@
1
+ import n from '../../../../../../../../external/rollup-plugin-styles/dist/runtime/inject-css.js';
2
+
3
+ var css = ".test-output-peek-message-container{.tstm-ansidec-1{font-weight:700}.tstm-ansidec-2{opacity:.7}.tstm-ansidec-3{font-style:italic}.tstm-ansidec-4{text-decoration:underline}.tstm-ansidec-fg30{color:var(--vscode-terminal-ansiBlack)}.tstm-ansidec-fg31{color:var(--vscode-terminal-ansiRed)}.tstm-ansidec-fg32{color:var(--vscode-terminal-ansiGreen)}.tstm-ansidec-fg33{color:var(--vscode-terminal-ansiYellow)}.tstm-ansidec-fg34{color:var(--vscode-terminal-ansiBlue)}.tstm-ansidec-fg35{color:var(--vscode-terminal-ansiMagenta)}.tstm-ansidec-fg36{color:var(--vscode-terminal-ansiCyan)}.tstm-ansidec-fg37{color:var(--vscode-terminal-ansiWhite)}.tstm-ansidec-fg90{color:var(--vscode-terminal-ansiBrightBlack)}.tstm-ansidec-fg91{color:var(--vscode-terminal-ansiBrightRed)}.tstm-ansidec-fg92{color:var(--vscode-terminal-ansiBrightGreen)}.tstm-ansidec-fg93{color:var(--vscode-terminal-ansiBrightYellow)}.tstm-ansidec-fg94{color:var(--vscode-terminal-ansiBrightBlue)}.tstm-ansidec-fg95{color:var(--vscode-terminal-ansiBrightMagenta)}.tstm-ansidec-fg96{color:var(--vscode-terminal-ansiBrightCyan)}.tstm-ansidec-fg97{color:var(--vscode-terminal-ansiBrightWhite)}.tstm-ansidec-bg30{background-color:var(--vscode-terminal-ansiBlack)}.tstm-ansidec-bg31{background-color:var(--vscode-terminal-ansiRed)}.tstm-ansidec-bg32{background-color:var(--vscode-terminal-ansiGreen)}.tstm-ansidec-bg33{background-color:var(--vscode-terminal-ansiYellow)}.tstm-ansidec-bg34{background-color:var(--vscode-terminal-ansiBlue)}.tstm-ansidec-bg35{background-color:var(--vscode-terminal-ansiMagenta)}.tstm-ansidec-bg36{background-color:var(--vscode-terminal-ansiCyan)}.tstm-ansidec-bg37{background-color:var(--vscode-terminal-ansiWhite)}.tstm-ansidec-bg100{background-color:var(--vscode-terminal-ansiBrightBlack)}.tstm-ansidec-bg101{background-color:var(--vscode-terminal-ansiBrightRed)}.tstm-ansidec-bg102{background-color:var(--vscode-terminal-ansiBrightGreen)}.tstm-ansidec-bg103{background-color:var(--vscode-terminal-ansiBrightYellow)}.tstm-ansidec-bg104{background-color:var(--vscode-terminal-ansiBrightBlue)}.tstm-ansidec-bg105{background-color:var(--vscode-terminal-ansiBrightMagenta)}.tstm-ansidec-bg106{background-color:var(--vscode-terminal-ansiBrightCyan)}.tstm-ansidec-bg107{background-color:var(--vscode-terminal-ansiBrightWhite)}}";
4
+ n(css,{});
5
+
6
+ export { css, css as default };
@@ -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)}.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}";
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 .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,21 +1,34 @@
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
+ import { getDefaultHoverDelegate } from 'vscode/vscode/vs/base/browser/ui/hover/hoverDelegateFactory';
4
+ import { setupCustomHover } from 'vscode/vscode/vs/base/browser/ui/hover/updatableHoverWidget';
5
5
  import { assertNever } from 'vscode/vscode/vs/base/common/assert';
6
6
  import { MarkdownString } from 'vscode/vscode/vs/base/common/htmlContent';
7
7
  import { Lazy } from 'vscode/vscode/vs/base/common/lazy';
8
8
  import { Disposable, DisposableStore, toDisposable } from 'vscode/vscode/vs/base/common/lifecycle';
9
9
  import { clamp } from 'vscode/vscode/vs/base/common/numbers';
10
+ import { observableValue } from 'vscode/vscode/vs/base/common/observableInternal/base';
11
+ import 'vscode/vscode/vs/base/common/observableInternal/derived';
12
+ import { autorun } from 'vscode/vscode/vs/base/common/observableInternal/autorun';
13
+ import 'vscode/vscode/vs/base/common/observableInternal/utils';
14
+ import 'vscode/vscode/vs/base/common/cancellation';
10
15
  import { isDefined } from 'vscode/vscode/vs/base/common/types';
11
16
  import { localizeWithPath } from 'vscode/vscode/vs/nls';
12
17
  import { IConfigurationService } from 'vscode/vscode/vs/platform/configuration/common/configuration';
13
- import { asCssVariableName, chartsRed, chartsYellow, chartsGreen } from 'vscode/vscode/vs/platform/theme/common/colorRegistry';
18
+ import { asCssVariableName } from 'vscode/vscode/vs/platform/theme/common/colorUtils';
19
+ import 'vscode/vscode/vs/platform/theme/common/colors/baseColors';
20
+ import { chartsRed, chartsYellow, chartsGreen } from 'vscode/vscode/vs/platform/theme/common/colors/chartsColors';
21
+ import 'vscode/vscode/vs/platform/theme/common/colors/editorColors';
22
+ import 'vscode/vscode/vs/platform/theme/common/colors/inputColors';
23
+ import 'vscode/vscode/vs/platform/theme/common/colors/listColors';
24
+ import 'vscode/vscode/vs/platform/theme/common/colors/menuColors';
25
+ import 'vscode/vscode/vs/platform/theme/common/colors/minimapColors';
26
+ import 'vscode/vscode/vs/platform/theme/common/colors/miscColors';
27
+ import 'vscode/vscode/vs/platform/theme/common/colors/quickpickColors';
28
+ import 'vscode/vscode/vs/platform/theme/common/colors/searchColors';
14
29
  import { getTestingConfiguration, observeTestingConfiguration } from '../common/configuration.js';
15
30
  import { getTotalCoveragePercent } from 'vscode/vscode/vs/workbench/contrib/testing/common/testCoverage';
16
31
  import { ITestCoverageService } from 'vscode/vscode/vs/workbench/contrib/testing/common/testCoverageService';
17
- import { observableValue } from 'vscode/vscode/vs/base/common/observableInternal/base';
18
- import { autorun } from 'vscode/vscode/vs/base/common/observableInternal/autorun';
19
32
 
20
33
  let ManagedTestCoverageBars = class ManagedTestCoverageBars extends Disposable {
21
34
  get visible() {
@@ -1,11 +1,17 @@
1
1
  import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
2
2
  import { append, $ } from 'vscode/vscode/vs/base/browser/dom';
3
+ import { findLast } from 'vscode/vscode/vs/base/common/arraysFind';
3
4
  import { assertNever } from 'vscode/vscode/vs/base/common/assert';
4
5
  import { Codicon } from 'vscode/vscode/vs/base/common/codicons';
5
6
  import { memoize } from 'vscode/vscode/vs/base/common/decorators';
6
7
  import { createMatches } from 'vscode/vscode/vs/base/common/filters';
7
8
  import { Iterable } from 'vscode/vscode/vs/base/common/iterator';
8
9
  import { DisposableStore, MutableDisposable, Disposable } from 'vscode/vscode/vs/base/common/lifecycle';
10
+ import { observableValue } from 'vscode/vscode/vs/base/common/observableInternal/base';
11
+ import 'vscode/vscode/vs/base/common/observableInternal/derived';
12
+ import { autorun } from 'vscode/vscode/vs/base/common/observableInternal/autorun';
13
+ import 'vscode/vscode/vs/base/common/observableInternal/utils';
14
+ import 'vscode/vscode/vs/base/common/cancellation';
9
15
  import { basenameOrAuthority } from 'vscode/vscode/vs/base/common/resources';
10
16
  import { ThemeIcon } from 'vscode/vscode/vs/base/common/themables';
11
17
  import { Position } from 'vscode/vscode/vs/editor/common/core/position';
@@ -30,11 +36,10 @@ import { ViewAction, ViewPane } from 'vscode/vscode/vs/workbench/browser/parts/v
30
36
  import { IViewDescriptorService } from 'vscode/vscode/vs/workbench/common/views';
31
37
  import { testingWasCovered, testingStatesToIcons } from './icons.js';
32
38
  import { ManagedTestCoverageBars } from './testCoverageBars.js';
39
+ import { onObservableChange } from '../common/observableUtils.js';
33
40
  import { FileCoverage, getTotalCoveragePercent } from 'vscode/vscode/vs/workbench/contrib/testing/common/testCoverage';
34
41
  import { ITestCoverageService } from 'vscode/vscode/vs/workbench/contrib/testing/common/testCoverageService';
35
42
  import { SIDE_GROUP, ACTIVE_GROUP, IEditorService } from 'vscode/vscode/vs/workbench/services/editor/common/editorService';
36
- import { observableValue } from 'vscode/vscode/vs/base/common/observableInternal/base';
37
- import { autorun } from 'vscode/vscode/vs/base/common/observableInternal/autorun';
38
43
 
39
44
  var FileCoverageRenderer_1, DeclarationCoverageRenderer_1;
40
45
  let TestCoverageView = class TestCoverageView extends ViewPane {
@@ -164,6 +169,7 @@ const shouldShowDeclDetailsOnExpand = (c) => isFileCoverage(c) && c.value instan
164
169
  let TestCoverageTree = class TestCoverageTree extends Disposable {
165
170
  constructor(container, labels, sortOrder, instantiationService, editorService) {
166
171
  super();
172
+ this.inputDisposables = this._register(( new DisposableStore()));
167
173
  this.tree = instantiationService.createInstance(WorkbenchCompressibleObjectTree, 'TestCoverageView', container, ( new TestCoverageTreeListDelegate()), [
168
174
  instantiationService.createInstance(FileCoverageRenderer, labels),
169
175
  instantiationService.createInstance(DeclarationCoverageRenderer),
@@ -250,6 +256,7 @@ let TestCoverageTree = class TestCoverageTree extends Disposable {
250
256
  }));
251
257
  }
252
258
  setInput(coverage) {
259
+ this.inputDisposables.clear();
253
260
  const files = [];
254
261
  for (let node of coverage.tree.nodes) {
255
262
  while (!(node.value instanceof FileCoverage) && node.children?.size === 1) {
@@ -267,6 +274,12 @@ let TestCoverageTree = class TestCoverageTree extends Disposable {
267
274
  children: file.children && ( Iterable.map(file.children?.values(), toChild))
268
275
  };
269
276
  };
277
+ this.inputDisposables.add(onObservableChange(coverage.didAddCoverage, nodes => {
278
+ const toRender = findLast(nodes, n => this.tree.hasElement(n));
279
+ if (toRender) {
280
+ this.tree.setChildren(toRender, ( Iterable.map(toRender.children?.values() || [], toChild)), { diffIdentityProvider: { getId: el => el.value.id } });
281
+ }
282
+ }));
270
283
  this.tree.setChildren(null, ( Iterable.map(files, toChild)));
271
284
  }
272
285
  layout(height, width) {
@@ -377,6 +390,7 @@ let FileCoverageRenderer = class FileCoverageRenderer {
377
390
  label: templateDisposables.add(this.labels.create(container, {
378
391
  supportHighlights: true,
379
392
  })),
393
+ elementsDisposables: templateDisposables.add(( new DisposableStore())),
380
394
  templateDisposables,
381
395
  };
382
396
  }
@@ -390,9 +404,14 @@ let FileCoverageRenderer = class FileCoverageRenderer {
390
404
  templateData.templateDisposables.dispose();
391
405
  }
392
406
  doRender(element, templateData, filterData) {
407
+ templateData.elementsDisposables.clear();
393
408
  const stat = (element instanceof Array ? element[element.length - 1] : element);
394
409
  const file = stat.value;
395
410
  const name = element instanceof Array ? ( element.map(e => basenameOrAuthority(e.value.uri))) : basenameOrAuthority(file.uri);
411
+ templateData.elementsDisposables.add(autorun(reader => {
412
+ stat.value?.didChange.read(reader);
413
+ templateData.bars.setCoverageInfo(file);
414
+ }));
396
415
  templateData.bars.setCoverageInfo(file);
397
416
  templateData.label.setResource({ resource: file.uri, name }, {
398
417
  fileKind: stat.children?.size ? FileKind.FOLDER : FileKind.FILE,
@@ -3,7 +3,8 @@ import { Codicon } from 'vscode/vscode/vs/base/common/codicons';
3
3
  import { Iterable } from 'vscode/vscode/vs/base/common/iterator';
4
4
  import { KeyChord } from 'vscode/vscode/vs/base/common/keyCodes';
5
5
  import { isDefined } from 'vscode/vscode/vs/base/common/types';
6
- import { isCodeEditor } from 'vscode/vscode/vs/editor/browser/editorBrowser';
6
+ import { ICodeEditorService } from 'vscode/vscode/vs/editor/browser/services/codeEditorService';
7
+ import { EmbeddedCodeEditorWidget } from 'vscode/vscode/vs/editor/browser/widget/codeEditor/embeddedCodeEditorWidget';
7
8
  import { Position } from 'vscode/vscode/vs/editor/common/core/position';
8
9
  import { Range } from 'vscode/vscode/vs/editor/common/core/range';
9
10
  import { EditorContextKeys } from 'vscode/vscode/vs/editor/common/editorContextKeys';
@@ -946,14 +947,18 @@ class ExecuteTestAtCursor extends Action2 {
946
947
  this.group = group;
947
948
  }
948
949
  async run(accessor) {
950
+ const codeEditorService = accessor.get(ICodeEditorService);
949
951
  const editorService = accessor.get(IEditorService);
950
952
  const activeEditorPane = editorService.activeEditorPane;
951
- const activeControl = editorService.activeTextEditorControl;
952
- if (!activeEditorPane || !activeControl) {
953
+ let editor = codeEditorService.getActiveCodeEditor();
954
+ if (!activeEditorPane || !editor) {
953
955
  return;
954
956
  }
955
- const position = activeControl?.getPosition();
956
- const model = activeControl?.getModel();
957
+ if (editor instanceof EmbeddedCodeEditorWidget) {
958
+ editor = editor.getParentEditor();
959
+ }
960
+ const position = editor?.getPosition();
961
+ const model = editor?.getModel();
957
962
  if (!position || !model || !('uri' in model)) {
958
963
  return;
959
964
  }
@@ -1006,8 +1011,8 @@ class ExecuteTestAtCursor extends Action2 {
1006
1011
  tests: bestNodes.length ? bestNodes : bestNodesBefore,
1007
1012
  });
1008
1013
  }
1009
- else if (isCodeEditor(activeControl)) {
1010
- MessageController.get(activeControl)?.showMessage(( localizeWithPath(
1014
+ else if (editor) {
1015
+ MessageController.get(editor)?.showMessage(( localizeWithPath(
1011
1016
  'vs/workbench/contrib/testing/browser/testExplorerActions',
1012
1017
  'noTestsAtCursor',
1013
1018
  "No tests found here"
@@ -1144,9 +1149,15 @@ class ExecuteTestsInCurrentFile extends Action2 {
1144
1149
  this.group = group;
1145
1150
  }
1146
1151
  run(accessor) {
1147
- const control = accessor.get(IEditorService).activeTextEditorControl;
1148
- const position = control?.getPosition();
1149
- const model = control?.getModel();
1152
+ let editor = accessor.get(ICodeEditorService).getActiveCodeEditor();
1153
+ if (!editor) {
1154
+ return;
1155
+ }
1156
+ if (editor instanceof EmbeddedCodeEditorWidget) {
1157
+ editor = editor.getParentEditor();
1158
+ }
1159
+ const position = editor?.getPosition();
1160
+ const model = editor?.getModel();
1150
1161
  if (!position || !model || !('uri' in model)) {
1151
1162
  return;
1152
1163
  }
@@ -1171,8 +1182,8 @@ class ExecuteTestsInCurrentFile extends Action2 {
1171
1182
  group: this.group,
1172
1183
  });
1173
1184
  }
1174
- if (isCodeEditor(control)) {
1175
- MessageController.get(control)?.showMessage(( localizeWithPath(
1185
+ if (editor) {
1186
+ MessageController.get(editor)?.showMessage(( localizeWithPath(
1176
1187
  'vs/workbench/contrib/testing/browser/testExplorerActions',
1177
1188
  'noTestsInFile',
1178
1189
  "No tests found in this file"
@@ -0,0 +1,73 @@
1
+ import { renderStringAsPlaintext } from 'vscode/vscode/vs/base/browser/markdownRenderer';
2
+ import { toDisposable } from 'vscode/vscode/vs/base/common/lifecycle';
3
+ import { removeAnsiEscapeCodes, forAnsiStringParts, GraphemeIterator } from 'vscode/vscode/vs/base/common/strings';
4
+ import './media/testMessageColorizer.css.js';
5
+ import { Position } from 'vscode/vscode/vs/editor/common/core/position';
6
+ import { Range } from 'vscode/vscode/vs/editor/common/core/range';
7
+
8
+ const colorAttrRe = /^\x1b\[([0-9]+)m$/;
9
+ const renderTestMessageAsText = (tm) => typeof tm === 'string' ? removeAnsiEscapeCodes(tm) : renderStringAsPlaintext(tm);
10
+ const colorizeTestMessageInEditor = (message, editor) => {
11
+ const decos = [];
12
+ editor.changeDecorations(changeAccessor => {
13
+ let start = ( new Position(1, 1));
14
+ let cls = [];
15
+ for (const part of forAnsiStringParts(message)) {
16
+ if (part.isCode) {
17
+ const colorAttr = colorAttrRe.exec(part.str)?.[1];
18
+ if (!colorAttr) {
19
+ continue;
20
+ }
21
+ const n = Number(colorAttr);
22
+ if (n === 0) {
23
+ cls.length = 0;
24
+ }
25
+ else if (n === 22) {
26
+ cls = cls.filter(c => c !== "tstm-ansidec-1" && c !== "tstm-ansidec-3" );
27
+ }
28
+ else if (n === 23) {
29
+ cls = cls.filter(c => c !== "tstm-ansidec-3" );
30
+ }
31
+ else if (n === 24) {
32
+ cls = cls.filter(c => c !== "tstm-ansidec-4" );
33
+ }
34
+ else if ((n >= 30 && n <= 39) || (n >= 90 && n <= 99)) {
35
+ cls = cls.filter(c => !c.startsWith("tstm-ansidec-fg" ));
36
+ cls.push("tstm-ansidec-fg" + colorAttr);
37
+ }
38
+ else if ((n >= 40 && n <= 49) || (n >= 100 && n <= 109)) {
39
+ cls = cls.filter(c => !c.startsWith("tstm-ansidec-bg" ));
40
+ cls.push("tstm-ansidec-bg" + colorAttr);
41
+ }
42
+ else {
43
+ cls.push("tstm-ansidec-" + colorAttr);
44
+ }
45
+ }
46
+ else {
47
+ let line = start.lineNumber;
48
+ let col = start.column;
49
+ const graphemes = ( new GraphemeIterator(part.str));
50
+ for (let i = 0; !graphemes.eol(); i += graphemes.nextGraphemeLength()) {
51
+ if (part.str[i] === '\n') {
52
+ line++;
53
+ col = 1;
54
+ }
55
+ else {
56
+ col++;
57
+ }
58
+ }
59
+ const end = ( new Position(line, col));
60
+ if (cls.length) {
61
+ decos.push(changeAccessor.addDecoration(Range.fromPositions(start, end), {
62
+ inlineClassName: cls.join(' '),
63
+ description: 'test-message-colorized',
64
+ }));
65
+ }
66
+ start = end;
67
+ }
68
+ }
69
+ });
70
+ return toDisposable(() => editor.removeDecorations(decos));
71
+ };
72
+
73
+ export { colorizeTestMessageInEditor, renderTestMessageAsText };
@@ -23,16 +23,22 @@ import { TestResultsView, OpenMessageInEditorAction, GoToPreviousMessageAction,
23
23
  import { TestingProgressTrigger } from './testingProgressUiService.js';
24
24
  import { TestingViewPaneContainer } from './testingViewPaneContainer.js';
25
25
  import { testingConfiguration } from '../common/configuration.js';
26
+ import 'vscode/vscode/vs/workbench/contrib/testing/common/testCoverageService';
26
27
  import { ITestExplorerFilterState } from 'vscode/vscode/vs/workbench/contrib/testing/common/testExplorerFilterState';
27
28
  import { TestId } from 'vscode/vscode/vs/workbench/contrib/testing/common/testId';
29
+ import 'vscode/vscode/vs/workbench/contrib/testing/common/testProfileService';
28
30
  import { ITestResultService } from 'vscode/vscode/vs/workbench/contrib/testing/common/testResultService';
31
+ import 'vscode/vscode/vs/workbench/contrib/testing/common/testResultStorage';
29
32
  import { ITestService } from 'vscode/vscode/vs/workbench/contrib/testing/common/testService';
33
+ import '../common/testServiceImpl.js';
30
34
  import { TestingContentProvider } from '../common/testingContentProvider.js';
31
35
  import { TestingContextKeys } from 'vscode/vscode/vs/workbench/contrib/testing/common/testingContextKeys';
36
+ import 'vscode/vscode/vs/workbench/contrib/testing/common/testingContinuousRunService';
32
37
  import { ITestingDecorationsService } from 'vscode/vscode/vs/workbench/contrib/testing/common/testingDecorations';
33
38
  import { ITestingPeekOpener } from 'vscode/vscode/vs/workbench/contrib/testing/common/testingPeekOpener';
34
39
  import { IViewsService } from 'vscode/vscode/vs/workbench/services/views/common/viewsService';
35
40
  import { allTestActions, discoverAndRunTests } from './testExplorerActions.js';
41
+ import './testingConfigurationUi.js';
36
42
 
37
43
  const viewContainer = ( Registry.as(Extensions.ViewContainersRegistry)).registerViewContainer({
38
44
  id: "workbench.view.extension.test" ,