@theia/test 1.67.0-next.56 → 1.67.0-next.59

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 (81) hide show
  1. package/lib/browser/constants.d.ts +46 -0
  2. package/lib/browser/constants.d.ts.map +1 -0
  3. package/lib/browser/constants.js +18 -0
  4. package/lib/browser/constants.js.map +1 -0
  5. package/lib/browser/test-execution-progress-service.d.ts +16 -0
  6. package/lib/browser/test-execution-progress-service.d.ts.map +1 -0
  7. package/lib/browser/test-execution-progress-service.js +54 -0
  8. package/lib/browser/test-execution-progress-service.js.map +1 -0
  9. package/lib/browser/test-service.d.ts +168 -0
  10. package/lib/browser/test-service.d.ts.map +1 -0
  11. package/lib/browser/test-service.js +283 -0
  12. package/lib/browser/test-service.js.map +1 -0
  13. package/lib/browser/view/test-context-key-service.d.ts +8 -0
  14. package/lib/browser/view/test-context-key-service.d.ts.map +1 -0
  15. package/lib/browser/view/test-context-key-service.js +44 -0
  16. package/lib/browser/view/test-context-key-service.js.map +1 -0
  17. package/lib/browser/view/test-execution-state-manager.d.ts +14 -0
  18. package/lib/browser/view/test-execution-state-manager.d.ts.map +1 -0
  19. package/lib/browser/view/test-execution-state-manager.js +166 -0
  20. package/lib/browser/view/test-execution-state-manager.js.map +1 -0
  21. package/lib/browser/view/test-output-ui-model.d.ts +48 -0
  22. package/lib/browser/view/test-output-ui-model.d.ts.map +1 -0
  23. package/lib/browser/view/test-output-ui-model.js +144 -0
  24. package/lib/browser/view/test-output-ui-model.js.map +1 -0
  25. package/lib/browser/view/test-output-view-contribution.d.ts +6 -0
  26. package/lib/browser/view/test-output-view-contribution.d.ts.map +1 -0
  27. package/lib/browser/view/test-output-view-contribution.js +40 -0
  28. package/lib/browser/view/test-output-view-contribution.js.map +1 -0
  29. package/lib/browser/view/test-output-widget.d.ts +24 -0
  30. package/lib/browser/view/test-output-widget.d.ts.map +1 -0
  31. package/lib/browser/view/test-output-widget.js +146 -0
  32. package/lib/browser/view/test-output-widget.js.map +1 -0
  33. package/lib/browser/view/test-result-view-contribution.d.ts +6 -0
  34. package/lib/browser/view/test-result-view-contribution.d.ts.map +1 -0
  35. package/lib/browser/view/test-result-view-contribution.js +40 -0
  36. package/lib/browser/view/test-result-view-contribution.js.map +1 -0
  37. package/lib/browser/view/test-result-widget.d.ts +31 -0
  38. package/lib/browser/view/test-result-widget.d.ts.map +1 -0
  39. package/lib/browser/view/test-result-widget.js +160 -0
  40. package/lib/browser/view/test-result-widget.js.map +1 -0
  41. package/lib/browser/view/test-run-view-contribution.d.ts +18 -0
  42. package/lib/browser/view/test-run-view-contribution.d.ts.map +1 -0
  43. package/lib/browser/view/test-run-view-contribution.js +93 -0
  44. package/lib/browser/view/test-run-view-contribution.js.map +1 -0
  45. package/lib/browser/view/test-run-widget.d.ts +59 -0
  46. package/lib/browser/view/test-run-widget.d.ts.map +1 -0
  47. package/lib/browser/view/test-run-widget.js +300 -0
  48. package/lib/browser/view/test-run-widget.js.map +1 -0
  49. package/lib/browser/view/test-tree-widget.d.ts +68 -0
  50. package/lib/browser/view/test-tree-widget.d.ts.map +1 -0
  51. package/lib/browser/view/test-tree-widget.js +376 -0
  52. package/lib/browser/view/test-tree-widget.js.map +1 -0
  53. package/lib/browser/view/test-view-contribution.d.ts +48 -0
  54. package/lib/browser/view/test-view-contribution.d.ts.map +1 -0
  55. package/lib/browser/view/test-view-contribution.js +316 -0
  56. package/lib/browser/view/test-view-contribution.js.map +1 -0
  57. package/lib/browser/view/test-view-frontend-module.d.ts +7 -0
  58. package/lib/browser/view/test-view-frontend-module.d.ts.map +1 -0
  59. package/lib/browser/view/test-view-frontend-module.js +126 -0
  60. package/lib/browser/view/test-view-frontend-module.js.map +1 -0
  61. package/lib/common/collections.d.ts +47 -0
  62. package/lib/common/collections.d.ts.map +1 -0
  63. package/lib/common/collections.js +211 -0
  64. package/lib/common/collections.js.map +1 -0
  65. package/lib/common/test-preferences.d.ts +14 -0
  66. package/lib/common/test-preferences.d.ts.map +1 -0
  67. package/lib/common/test-preferences.js +55 -0
  68. package/lib/common/test-preferences.js.map +1 -0
  69. package/lib/common/tree-delta.d.ts +52 -0
  70. package/lib/common/tree-delta.d.ts.map +1 -0
  71. package/lib/common/tree-delta.js +241 -0
  72. package/lib/common/tree-delta.js.map +1 -0
  73. package/lib/common/tree-delta.spec.d.ts +2 -0
  74. package/lib/common/tree-delta.spec.d.ts.map +1 -0
  75. package/lib/common/tree-delta.spec.js +140 -0
  76. package/lib/common/tree-delta.spec.js.map +1 -0
  77. package/lib/node/test-backend-module.d.ts +4 -0
  78. package/lib/node/test-backend-module.d.ts.map +1 -0
  79. package/lib/node/test-backend-module.js +23 -0
  80. package/lib/node/test-backend-module.js.map +1 -0
  81. package/package.json +7 -7
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var TestOutputWidget_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.TestOutputWidget = void 0;
5
+ const tslib_1 = require("tslib");
6
+ // *****************************************************************************
7
+ // Copyright (C) 2023 STMicroelectronics and others.
8
+ //
9
+ // This program and the accompanying materials are made available under the
10
+ // terms of the Eclipse Public License v. 2.0 which is available at
11
+ // http://www.eclipse.org/legal/epl-2.0.
12
+ //
13
+ // This Source Code may also be made available under the following Secondary
14
+ // Licenses when the conditions for such availability set forth in the Eclipse
15
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
16
+ // with the GNU Classpath Exception which is available at
17
+ // https://www.gnu.org/software/classpath/license.html.
18
+ //
19
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
20
+ // *****************************************************************************
21
+ const xterm_1 = require("xterm");
22
+ const xterm_addon_fit_1 = require("xterm-addon-fit");
23
+ const browser_1 = require("@theia/core/lib/browser");
24
+ const inversify_1 = require("@theia/core/shared/inversify");
25
+ const core_1 = require("@theia/core");
26
+ const terminal_preferences_1 = require("@theia/terminal/lib/common/terminal-preferences");
27
+ const terminal_theme_service_1 = require("@theia/terminal/lib/browser/terminal-theme-service");
28
+ const test_output_ui_model_1 = require("./test-output-ui-model");
29
+ const debounce = require("p-debounce");
30
+ let TestOutputWidget = TestOutputWidget_1 = class TestOutputWidget extends browser_1.BaseWidget {
31
+ constructor() {
32
+ super();
33
+ this.disposeOnSetInput = new core_1.DisposableCollection();
34
+ this.resizeTerminal = debounce(() => this.doResizeTerminal(), 50);
35
+ this.id = TestOutputWidget_1.ID;
36
+ this.title.label = 'Test Output';
37
+ this.title.caption = 'Test Output';
38
+ this.title.iconClass = (0, browser_1.codicon)('symbol-keyword');
39
+ this.title.closable = true;
40
+ }
41
+ init() {
42
+ this.term = new xterm_1.Terminal({
43
+ disableStdin: true,
44
+ cursorStyle: 'bar',
45
+ fontFamily: this.preferences['terminal.integrated.fontFamily'],
46
+ fontSize: this.preferences['terminal.integrated.fontSize'],
47
+ fontWeight: this.preferences['terminal.integrated.fontWeight'],
48
+ fontWeightBold: this.preferences['terminal.integrated.fontWeightBold'],
49
+ drawBoldTextInBrightColors: this.preferences['terminal.integrated.drawBoldTextInBrightColors'],
50
+ letterSpacing: this.preferences['terminal.integrated.letterSpacing'],
51
+ lineHeight: this.preferences['terminal.integrated.lineHeight'],
52
+ scrollback: this.preferences['terminal.integrated.scrollback'],
53
+ fastScrollSensitivity: this.preferences['terminal.integrated.fastScrollSensitivity'],
54
+ theme: this.themeService.theme
55
+ });
56
+ this.fitAddon = new xterm_addon_fit_1.FitAddon();
57
+ this.term.loadAddon(this.fitAddon);
58
+ this.setInput(this.uiModel.selectedOutputSource);
59
+ this.uiModel.onDidChangeSelectedOutputSource(source => this.setInput(source));
60
+ this.toDispose.push(core_1.Disposable.create(() => this.term.dispose()));
61
+ }
62
+ setInput(selectedOutputSource) {
63
+ this.disposeOnSetInput.dispose();
64
+ this.disposeOnSetInput = new core_1.DisposableCollection();
65
+ this.term.clear();
66
+ if (selectedOutputSource) {
67
+ selectedOutputSource.output.forEach(item => this.term.writeln(item.output));
68
+ this.disposeOnSetInput.push(selectedOutputSource.onDidAddTestOutput(items => {
69
+ items.forEach(item => this.term.writeln(item.output));
70
+ }));
71
+ this.term.scrollToBottom();
72
+ }
73
+ }
74
+ onAfterAttach(msg) {
75
+ super.onAfterAttach(msg);
76
+ this.term.open(this.node);
77
+ if (browser_1.isFirefox) {
78
+ // monkey patching intersection observer handling for secondary window support
79
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
80
+ const renderService = this.term._core._renderService;
81
+ const originalFunc = renderService._onIntersectionChange.bind(renderService);
82
+ const replacement = function (entry) {
83
+ if (entry.target.ownerDocument !== document) {
84
+ // in Firefox, the intersection observer always reports the widget as non-intersecting if the dom element
85
+ // is in a different document from when the IntersectionObserver started observing. Since we know
86
+ // that the widget is always "visible" when in a secondary window, so we mark the entry as "intersecting"
87
+ const patchedEvent = {
88
+ ...entry,
89
+ isIntersecting: true,
90
+ };
91
+ originalFunc(patchedEvent);
92
+ }
93
+ else {
94
+ originalFunc(entry);
95
+ }
96
+ };
97
+ renderService._onIntersectionChange = replacement;
98
+ }
99
+ if (browser_1.isFirefox) {
100
+ // The software scrollbars don't work with xterm.js, so we disable the scrollbar if we are on firefox.
101
+ if (this.term.element) {
102
+ this.term.element.children.item(0).style.overflow = 'hidden';
103
+ }
104
+ }
105
+ }
106
+ onResize(msg) {
107
+ super.onResize(msg);
108
+ this.resizeTerminal();
109
+ }
110
+ doResizeTerminal() {
111
+ if (this.isDisposed) {
112
+ return;
113
+ }
114
+ const geo = this.fitAddon.proposeDimensions();
115
+ if (geo) {
116
+ const cols = geo.cols;
117
+ const rows = geo.rows - 1; // subtract one row for margin
118
+ this.term.resize(cols, rows);
119
+ }
120
+ }
121
+ };
122
+ exports.TestOutputWidget = TestOutputWidget;
123
+ TestOutputWidget.ID = 'test-output-view';
124
+ tslib_1.__decorate([
125
+ (0, inversify_1.inject)(terminal_preferences_1.TerminalPreferences),
126
+ tslib_1.__metadata("design:type", Object)
127
+ ], TestOutputWidget.prototype, "preferences", void 0);
128
+ tslib_1.__decorate([
129
+ (0, inversify_1.inject)(terminal_theme_service_1.TerminalThemeService),
130
+ tslib_1.__metadata("design:type", terminal_theme_service_1.TerminalThemeService)
131
+ ], TestOutputWidget.prototype, "themeService", void 0);
132
+ tslib_1.__decorate([
133
+ (0, inversify_1.inject)(test_output_ui_model_1.TestOutputUIModel),
134
+ tslib_1.__metadata("design:type", test_output_ui_model_1.TestOutputUIModel)
135
+ ], TestOutputWidget.prototype, "uiModel", void 0);
136
+ tslib_1.__decorate([
137
+ (0, inversify_1.postConstruct)(),
138
+ tslib_1.__metadata("design:type", Function),
139
+ tslib_1.__metadata("design:paramtypes", []),
140
+ tslib_1.__metadata("design:returntype", void 0)
141
+ ], TestOutputWidget.prototype, "init", null);
142
+ exports.TestOutputWidget = TestOutputWidget = TestOutputWidget_1 = tslib_1.__decorate([
143
+ (0, inversify_1.injectable)(),
144
+ tslib_1.__metadata("design:paramtypes", [])
145
+ ], TestOutputWidget);
146
+ //# sourceMappingURL=test-output-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-output-widget.js","sourceRoot":"","sources":["../../../src/browser/view/test-output-widget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { AbstractViewContribution } from '@theia/core/lib/browser';
2
+ import { TestResultWidget } from './test-result-widget';
3
+ export declare class TestResultViewContribution extends AbstractViewContribution<TestResultWidget> {
4
+ constructor();
5
+ }
6
+ //# sourceMappingURL=test-result-view-contribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-result-view-contribution.d.ts","sourceRoot":"","sources":["../../../src/browser/view/test-result-view-contribution.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,qBACa,0BAA2B,SAAQ,wBAAwB,CAAC,gBAAgB,CAAC;;CAWzF"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2023 STMicroelectronics and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.TestResultViewContribution = void 0;
19
+ const tslib_1 = require("tslib");
20
+ const browser_1 = require("@theia/core/lib/browser");
21
+ const inversify_1 = require("@theia/core/shared/inversify");
22
+ const test_result_widget_1 = require("./test-result-widget");
23
+ const core_1 = require("@theia/core");
24
+ let TestResultViewContribution = class TestResultViewContribution extends browser_1.AbstractViewContribution {
25
+ constructor() {
26
+ super({
27
+ widgetId: test_result_widget_1.TestResultWidget.ID,
28
+ widgetName: core_1.nls.localizeByDefault('Test Results'),
29
+ defaultWidgetOptions: {
30
+ area: 'bottom'
31
+ }
32
+ });
33
+ }
34
+ };
35
+ exports.TestResultViewContribution = TestResultViewContribution;
36
+ exports.TestResultViewContribution = TestResultViewContribution = tslib_1.__decorate([
37
+ (0, inversify_1.injectable)(),
38
+ tslib_1.__metadata("design:paramtypes", [])
39
+ ], TestResultViewContribution);
40
+ //# sourceMappingURL=test-result-view-contribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-result-view-contribution.js","sourceRoot":"","sources":["../../../src/browser/view/test-result-view-contribution.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,qDAAmE;AACnE,4DAA0D;AAC1D,6DAAwD;AACxD,sCAAkC;AAG3B,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,kCAA0C;IACtF;QACI,KAAK,CAAC;YACF,QAAQ,EAAE,qCAAgB,CAAC,EAAE;YAC7B,UAAU,EAAE,UAAG,CAAC,iBAAiB,CAAC,cAAc,CAAC;YACjD,oBAAoB,EAAE;gBAClB,IAAI,EAAE,QAAQ;aACjB;SACJ,CAAC,CAAC;IAEP,CAAC;CACJ,CAAA;AAXY,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,sBAAU,GAAE;;GACA,0BAA0B,CAWtC"}
@@ -0,0 +1,31 @@
1
+ import { BaseWidget, LabelProvider, Message, OpenerService } from '@theia/core/lib/browser';
2
+ import { TestOutputUIModel } from './test-output-ui-model';
3
+ import { DisposableCollection } from '@theia/core';
4
+ import { TestMessage, TestMessageStackFrame } from '../test-service';
5
+ import { MarkdownRenderer } from '@theia/core/lib/browser/markdown-rendering/markdown-renderer';
6
+ import { URI } from '@theia/core/lib/common/uri';
7
+ import { FileService } from '@theia/filesystem/lib/browser/file-service';
8
+ import { NavigationLocationService } from '@theia/editor/lib/browser/navigation/navigation-location-service';
9
+ import { Position } from '@theia/editor/lib/browser/navigation/navigation-location';
10
+ export declare class TestResultWidget extends BaseWidget {
11
+ static readonly ID = "test-result-widget";
12
+ uiModel: TestOutputUIModel;
13
+ markdownRenderer: MarkdownRenderer;
14
+ openerService: OpenerService;
15
+ fileService: FileService;
16
+ navigationService: NavigationLocationService;
17
+ protected readonly labelProvider: LabelProvider;
18
+ protected toDisposeOnRender: DisposableCollection;
19
+ protected input: TestMessage[];
20
+ protected content: HTMLDivElement;
21
+ constructor();
22
+ init(): void;
23
+ protected onAfterAttach(msg: Message): void;
24
+ setInput(messages: TestMessage[]): void;
25
+ protected onUpdateRequest(msg: Message): void;
26
+ render(): void;
27
+ renderFrame(stackFrame: TestMessageStackFrame, stackTraceElement: HTMLElement): void;
28
+ openUriInWorkspace(uri: URI, position?: Position): Promise<void>;
29
+ dispose(): void;
30
+ }
31
+ //# sourceMappingURL=test-result-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-result-widget.d.ts","sourceRoot":"","sources":["../../../src/browser/view/test-result-widget.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAW,MAAM,yBAAyB,CAAC;AAErG,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAO,MAAM,aAAa,CAAC;AACxD,OAAO,EAAe,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AAEhG,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kEAAkE,CAAC;AAC7G,OAAO,EAAsB,QAAQ,EAAE,MAAM,0DAA0D,CAAC;AACxG,qBACa,gBAAiB,SAAQ,UAAU;IAE5C,MAAM,CAAC,QAAQ,CAAC,EAAE,wBAAwB;IAEf,OAAO,EAAE,iBAAiB,CAAC;IAC5B,gBAAgB,EAAE,gBAAgB,CAAC;IACtC,aAAa,EAAE,aAAa,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACX,iBAAiB,EAAE,yBAAyB,CAAC;IACzD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAEvE,SAAS,CAAC,iBAAiB,uBAA8B;IACzD,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,CAAM;IACpC,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC;;IAgBlC,IAAI,IAAI,IAAI;cAQO,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAMpD,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI;cAKpB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAKtD,MAAM,IAAI,IAAI;IAoBd,WAAW,CAAC,UAAU,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,WAAW,GAAG,IAAI;IA6B9E,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7D,OAAO,IAAI,IAAI;CAG3B"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2023 STMicroelectronics and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ var TestResultWidget_1;
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.TestResultWidget = void 0;
20
+ const tslib_1 = require("tslib");
21
+ const browser_1 = require("@theia/core/lib/browser");
22
+ const inversify_1 = require("@theia/core/shared/inversify");
23
+ const test_output_ui_model_1 = require("./test-output-ui-model");
24
+ const core_1 = require("@theia/core");
25
+ const test_service_1 = require("../test-service");
26
+ const markdown_renderer_1 = require("@theia/core/lib/browser/markdown-rendering/markdown-renderer");
27
+ const markdown_rendering_1 = require("@theia/core/lib/common/markdown-rendering");
28
+ const uri_1 = require("@theia/core/lib/common/uri");
29
+ const file_service_1 = require("@theia/filesystem/lib/browser/file-service");
30
+ const navigation_location_service_1 = require("@theia/editor/lib/browser/navigation/navigation-location-service");
31
+ const navigation_location_1 = require("@theia/editor/lib/browser/navigation/navigation-location");
32
+ let TestResultWidget = TestResultWidget_1 = class TestResultWidget extends browser_1.BaseWidget {
33
+ constructor() {
34
+ super();
35
+ this.toDisposeOnRender = new core_1.DisposableCollection();
36
+ this.input = [];
37
+ this.addClass('theia-test-result-view');
38
+ this.id = TestResultWidget_1.ID;
39
+ this.title.label = core_1.nls.localizeByDefault('Test Results');
40
+ this.title.caption = core_1.nls.localizeByDefault('Test Results');
41
+ this.title.iconClass = (0, browser_1.codicon)('checklist');
42
+ this.title.closable = true;
43
+ this.scrollOptions = {
44
+ minScrollbarLength: 35,
45
+ };
46
+ }
47
+ init() {
48
+ this.uiModel.onDidChangeSelectedTestState(e => {
49
+ if (test_service_1.TestFailure.is(e)) {
50
+ this.setInput(e.messages);
51
+ }
52
+ });
53
+ }
54
+ onAfterAttach(msg) {
55
+ super.onAfterAttach(msg);
56
+ this.content = this.node.ownerDocument.createElement('div');
57
+ this.node.append(this.content);
58
+ }
59
+ setInput(messages) {
60
+ this.input = messages;
61
+ this.update();
62
+ }
63
+ onUpdateRequest(msg) {
64
+ this.render();
65
+ super.onUpdateRequest(msg);
66
+ }
67
+ render() {
68
+ this.toDisposeOnRender.dispose();
69
+ this.toDisposeOnRender = new core_1.DisposableCollection();
70
+ this.content.innerHTML = '';
71
+ this.input.forEach(message => {
72
+ if (markdown_rendering_1.MarkdownString.is(message.message)) {
73
+ const line = this.markdownRenderer.render(message.message);
74
+ this.content.append(line.element);
75
+ this.toDisposeOnRender.push(line);
76
+ }
77
+ else {
78
+ this.content.append(this.node.ownerDocument.createTextNode(message.message));
79
+ }
80
+ if (message.stackTrace) {
81
+ const stackTraceElement = this.node.ownerDocument.createElement('div');
82
+ message.stackTrace.map(frame => this.renderFrame(frame, stackTraceElement));
83
+ this.content.append(stackTraceElement);
84
+ }
85
+ });
86
+ }
87
+ renderFrame(stackFrame, stackTraceElement) {
88
+ const frameElement = stackTraceElement.ownerDocument.createElement('div');
89
+ frameElement.classList.add('debug-frame');
90
+ frameElement.append(` ${core_1.nls.localize('theia/test/stackFrameAt', 'at')} ${stackFrame.label}`);
91
+ // Add URI information as clickable links
92
+ if (stackFrame.uri) {
93
+ frameElement.append(' (');
94
+ const uri = new uri_1.URI(stackFrame.uri);
95
+ const link = this.node.ownerDocument.createElement('a');
96
+ let content = `${this.labelProvider.getName(uri)}`;
97
+ if (stackFrame.position) {
98
+ // Display Position as a 1-based position, similar to Monaco ones.
99
+ const monacoPosition = {
100
+ lineNumber: stackFrame.position.line + 1,
101
+ column: stackFrame.position.character + 1
102
+ };
103
+ content += `:${monacoPosition.lineNumber}:${monacoPosition.column}`;
104
+ }
105
+ link.textContent = content;
106
+ link.href = `${uri}`;
107
+ link.onclick = () => this.openUriInWorkspace(uri, stackFrame.position);
108
+ frameElement.append(link);
109
+ frameElement.append(')');
110
+ }
111
+ stackTraceElement.append(frameElement);
112
+ }
113
+ async openUriInWorkspace(uri, position) {
114
+ this.fileService.resolve(uri).then(stat => {
115
+ if (stat.isFile) {
116
+ this.navigationService.reveal(navigation_location_1.NavigationLocation.create(uri, position !== null && position !== void 0 ? position : { line: 0, character: 0 }));
117
+ }
118
+ });
119
+ }
120
+ dispose() {
121
+ this.toDisposeOnRender.dispose();
122
+ }
123
+ };
124
+ exports.TestResultWidget = TestResultWidget;
125
+ TestResultWidget.ID = 'test-result-widget';
126
+ tslib_1.__decorate([
127
+ (0, inversify_1.inject)(test_output_ui_model_1.TestOutputUIModel),
128
+ tslib_1.__metadata("design:type", test_output_ui_model_1.TestOutputUIModel)
129
+ ], TestResultWidget.prototype, "uiModel", void 0);
130
+ tslib_1.__decorate([
131
+ (0, inversify_1.inject)(markdown_renderer_1.MarkdownRenderer),
132
+ tslib_1.__metadata("design:type", Object)
133
+ ], TestResultWidget.prototype, "markdownRenderer", void 0);
134
+ tslib_1.__decorate([
135
+ (0, inversify_1.inject)(browser_1.OpenerService),
136
+ tslib_1.__metadata("design:type", Object)
137
+ ], TestResultWidget.prototype, "openerService", void 0);
138
+ tslib_1.__decorate([
139
+ (0, inversify_1.inject)(file_service_1.FileService),
140
+ tslib_1.__metadata("design:type", file_service_1.FileService)
141
+ ], TestResultWidget.prototype, "fileService", void 0);
142
+ tslib_1.__decorate([
143
+ (0, inversify_1.inject)(navigation_location_service_1.NavigationLocationService),
144
+ tslib_1.__metadata("design:type", navigation_location_service_1.NavigationLocationService)
145
+ ], TestResultWidget.prototype, "navigationService", void 0);
146
+ tslib_1.__decorate([
147
+ (0, inversify_1.inject)(browser_1.LabelProvider),
148
+ tslib_1.__metadata("design:type", browser_1.LabelProvider)
149
+ ], TestResultWidget.prototype, "labelProvider", void 0);
150
+ tslib_1.__decorate([
151
+ (0, inversify_1.postConstruct)(),
152
+ tslib_1.__metadata("design:type", Function),
153
+ tslib_1.__metadata("design:paramtypes", []),
154
+ tslib_1.__metadata("design:returntype", void 0)
155
+ ], TestResultWidget.prototype, "init", null);
156
+ exports.TestResultWidget = TestResultWidget = TestResultWidget_1 = tslib_1.__decorate([
157
+ (0, inversify_1.injectable)(),
158
+ tslib_1.__metadata("design:paramtypes", [])
159
+ ], TestResultWidget);
160
+ //# sourceMappingURL=test-result-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-result-widget.js","sourceRoot":"","sources":["../../../src/browser/view/test-result-widget.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;;AAEhF,qDAAqG;AACrG,4DAAiF;AACjF,iEAA2D;AAC3D,sCAAwD;AACxD,kDAAkF;AAClF,oGAAgG;AAChG,kFAA2E;AAC3E,oDAAiD;AACjD,6EAAyE;AACzE,kHAA6G;AAC7G,kGAAwG;AAEjG,IAAM,gBAAgB,wBAAtB,MAAM,gBAAiB,SAAQ,oBAAU;IAe5C;QACI,KAAK,EAAE,CAAC;QALF,sBAAiB,GAAG,IAAI,2BAAoB,EAAE,CAAC;QAC/C,UAAK,GAAkB,EAAE,CAAC;QAKhC,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,GAAG,kBAAgB,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAG,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAG,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAA,iBAAO,EAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG;YACjB,kBAAkB,EAAE,EAAE;SACzB,CAAC;IACN,CAAC;IAGD,IAAI;QACA,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE;YAC1C,IAAI,0BAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEkB,aAAa,CAAC,GAAY;QACzC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,QAAQ,CAAC,QAAuB;QAC5B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAEkB,eAAe,CAAC,GAAY;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM;QACF,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,IAAI,2BAAoB,EAAE,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,IAAI,mCAAc,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC3D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAClC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YACjF,CAAC;YACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC;gBAC5E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC3C,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,WAAW,CAAC,UAAiC,EAAE,iBAA8B;QACzE,MAAM,YAAY,GAAG,iBAAiB,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1E,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC1C,YAAY,CAAC,MAAM,CAAC,OAAO,UAAG,CAAC,QAAQ,CAAC,yBAAyB,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QAEhG,yCAAyC;QACzC,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;YACjB,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAI,SAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACxD,IAAI,OAAO,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;gBACtB,kEAAkE;gBAClE,MAAM,cAAc,GAAG;oBACnB,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;oBACxC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC;iBAC5C,CAAC;gBACF,OAAO,IAAI,IAAI,cAAc,CAAC,UAAU,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;YACxE,CAAC;YACD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;YAC3B,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,GAAQ,EAAE,QAAmB;QAClD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACd,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,wCAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACzG,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEQ,OAAO;QACZ,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;;AAhHQ,4CAAgB;AAET,mBAAE,GAAG,oBAAoB,AAAvB,CAAwB;AAEf;IAA1B,IAAA,kBAAM,EAAC,wCAAiB,CAAC;sCAAU,wCAAiB;iDAAC;AAC5B;IAAzB,IAAA,kBAAM,EAAC,oCAAgB,CAAC;;0DAAoC;AACtC;IAAtB,IAAA,kBAAM,EAAC,uBAAa,CAAC;;uDAA8B;AAC/B;IAApB,IAAA,kBAAM,EAAC,0BAAW,CAAC;sCAAc,0BAAW;qDAAC;AACX;IAAlC,IAAA,kBAAM,EAAC,uDAAyB,CAAC;sCAAoB,uDAAyB;2DAAC;AACtC;IAAzC,IAAA,kBAAM,EAAC,uBAAa,CAAC;sCAAmC,uBAAa;uDAAC;AAoBvE;IADC,IAAA,yBAAa,GAAE;;;;4CAOf;2BAnCQ,gBAAgB;IAD5B,IAAA,sBAAU,GAAE;;GACA,gBAAgB,CAiH5B"}
@@ -0,0 +1,18 @@
1
+ import { AbstractViewContribution, Widget } from '@theia/core/lib/browser';
2
+ import { TestService } from '../test-service';
3
+ import { ContextKeyService } from '@theia/core/lib/browser/context-key-service';
4
+ import { TestRunTreeWidget } from './test-run-widget';
5
+ import { CommandRegistry, MenuModelRegistry } from '@theia/core';
6
+ import { TabBarToolbarContribution, TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
7
+ export declare const TEST_RUNS_CONTEXT_MENU: string[];
8
+ export declare const TEST_RUNS_INLINE_MENU: string[];
9
+ export declare class TestRunViewContribution extends AbstractViewContribution<TestRunTreeWidget> implements TabBarToolbarContribution {
10
+ protected readonly testService: TestService;
11
+ protected readonly contextKeys: ContextKeyService;
12
+ constructor();
13
+ registerToolbarItems(registry: TabBarToolbarRegistry): void;
14
+ registerMenus(menus: MenuModelRegistry): void;
15
+ registerCommands(commands: CommandRegistry): void;
16
+ protected withWidget<T>(widget: Widget | undefined, cb: (widget: TestRunTreeWidget) => T): T | false;
17
+ }
18
+ //# sourceMappingURL=test-run-view-contribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-run-view-contribution.d.ts","sourceRoot":"","sources":["../../../src/browser/view/test-run-view-contribution.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAE3E,OAAO,EAAW,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAO,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AAEjH,eAAO,MAAM,sBAAsB,UAA6B,CAAC;AACjE,eAAO,MAAM,qBAAqB,UAAwC,CAAC;AAE3E,qBACa,uBAAwB,SAAQ,wBAAwB,CAAC,iBAAiB,CAAE,YAAW,yBAAyB;IAEpG,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;;IAc7E,oBAAoB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAQlD,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAO7C,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAqB1D,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,oBAA0C,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK;CAM7H"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2023 STMicroelectronics and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.TestRunViewContribution = exports.TEST_RUNS_INLINE_MENU = exports.TEST_RUNS_CONTEXT_MENU = void 0;
19
+ const tslib_1 = require("tslib");
20
+ const browser_1 = require("@theia/core/lib/browser");
21
+ const inversify_1 = require("@theia/core/shared/inversify");
22
+ const test_service_1 = require("../test-service");
23
+ const context_key_service_1 = require("@theia/core/lib/browser/context-key-service");
24
+ const test_run_widget_1 = require("./test-run-widget");
25
+ const test_view_contribution_1 = require("./test-view-contribution");
26
+ const core_1 = require("@theia/core");
27
+ exports.TEST_RUNS_CONTEXT_MENU = ['test-runs-context-menu'];
28
+ exports.TEST_RUNS_INLINE_MENU = [...exports.TEST_RUNS_CONTEXT_MENU, 'inline'];
29
+ let TestRunViewContribution = class TestRunViewContribution extends browser_1.AbstractViewContribution {
30
+ constructor() {
31
+ super({
32
+ viewContainerId: test_view_contribution_1.TEST_VIEW_CONTAINER_ID,
33
+ widgetId: test_run_widget_1.TestRunTreeWidget.ID,
34
+ widgetName: core_1.nls.localize('theia/test/testRuns', 'Test Runs'),
35
+ defaultWidgetOptions: {
36
+ area: 'left',
37
+ rank: 200,
38
+ }
39
+ });
40
+ }
41
+ registerToolbarItems(registry) {
42
+ registry.registerItem({
43
+ id: test_view_contribution_1.TestViewCommands.CLEAR_ALL_RESULTS.id,
44
+ command: test_view_contribution_1.TestViewCommands.CLEAR_ALL_RESULTS.id,
45
+ priority: 1
46
+ });
47
+ }
48
+ registerMenus(menus) {
49
+ super.registerMenus(menus);
50
+ menus.registerMenuAction(exports.TEST_RUNS_CONTEXT_MENU, {
51
+ commandId: test_view_contribution_1.TestViewCommands.CANCEL_RUN.id
52
+ });
53
+ }
54
+ registerCommands(commands) {
55
+ super.registerCommands(commands);
56
+ commands.registerCommand(test_view_contribution_1.TestViewCommands.CANCEL_RUN, {
57
+ isEnabled: t => test_service_1.TestRun.is(t) && t.isRunning,
58
+ isVisible: t => test_service_1.TestRun.is(t),
59
+ execute: t => {
60
+ if (test_service_1.TestRun.is(t)) {
61
+ t.cancel();
62
+ }
63
+ }
64
+ });
65
+ commands.registerCommand(test_view_contribution_1.TestViewCommands.CLEAR_ALL_RESULTS, {
66
+ isEnabled: w => this.withWidget(w, () => true),
67
+ isVisible: w => this.withWidget(w, () => true),
68
+ execute: () => {
69
+ this.testService.clearResults();
70
+ }
71
+ });
72
+ }
73
+ withWidget(widget = this.tryGetWidget(), cb) {
74
+ if (widget instanceof test_run_widget_1.TestRunTreeWidget && widget.id === test_run_widget_1.TestRunTreeWidget.ID) {
75
+ return cb(widget);
76
+ }
77
+ return false;
78
+ }
79
+ };
80
+ exports.TestRunViewContribution = TestRunViewContribution;
81
+ tslib_1.__decorate([
82
+ (0, inversify_1.inject)(test_service_1.TestService),
83
+ tslib_1.__metadata("design:type", Object)
84
+ ], TestRunViewContribution.prototype, "testService", void 0);
85
+ tslib_1.__decorate([
86
+ (0, inversify_1.inject)(context_key_service_1.ContextKeyService),
87
+ tslib_1.__metadata("design:type", Object)
88
+ ], TestRunViewContribution.prototype, "contextKeys", void 0);
89
+ exports.TestRunViewContribution = TestRunViewContribution = tslib_1.__decorate([
90
+ (0, inversify_1.injectable)(),
91
+ tslib_1.__metadata("design:paramtypes", [])
92
+ ], TestRunViewContribution);
93
+ //# sourceMappingURL=test-run-view-contribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-run-view-contribution.js","sourceRoot":"","sources":["../../../src/browser/view/test-run-view-contribution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /// <reference types="react" />
2
+ import { TreeWidget, TreeModel, TreeProps, CompositeTreeNode, TreeNode, TreeImpl, NodeProps, SelectableTreeNode } from '@theia/core/lib/browser/tree';
3
+ import { ContextMenuRenderer } from '@theia/core/lib/browser';
4
+ import { IconThemeService } from '@theia/core/lib/browser/icon-theme-service';
5
+ import { ThemeService } from '@theia/core/lib/browser/theming';
6
+ import { ContextKeyService } from '@theia/core/lib/browser/context-key-service';
7
+ import { TestExecutionState, TestItem, TestMessage, TestRun, TestService } from '../test-service';
8
+ import * as React from '@theia/core/shared/react';
9
+ import { TestExecutionStateManager } from './test-execution-state-manager';
10
+ import { TestOutputUIModel } from './test-output-ui-model';
11
+ declare class TestRunNode implements TreeNode, SelectableTreeNode {
12
+ readonly counter: number;
13
+ readonly id: string;
14
+ readonly run: TestRun;
15
+ readonly parent: CompositeTreeNode;
16
+ constructor(counter: number, id: string, run: TestRun, parent: CompositeTreeNode);
17
+ get name(): string;
18
+ expanded?: boolean;
19
+ selected: boolean;
20
+ children: TestItemNode[];
21
+ }
22
+ declare class TestItemNode implements TreeNode, SelectableTreeNode {
23
+ readonly id: string;
24
+ readonly item: TestItem;
25
+ readonly parent: TestRunNode;
26
+ constructor(id: string, item: TestItem, parent: TestRunNode);
27
+ selected: boolean;
28
+ get name(): string;
29
+ }
30
+ export declare class TestRunTree extends TreeImpl {
31
+ private ROOT;
32
+ protected readonly testService: TestService;
33
+ private controllerListeners;
34
+ private runs;
35
+ private nextId;
36
+ init(): void;
37
+ private addController;
38
+ private addRun;
39
+ protected createRunNode(run: TestRun): TestRunNode;
40
+ createTestItemNode(parent: TestRunNode, item: TestItem): TestItemNode;
41
+ protected resolveChildren(parent: CompositeTreeNode): Promise<TreeNode[]>;
42
+ }
43
+ export declare class TestRunTreeWidget extends TreeWidget {
44
+ static ID: string;
45
+ protected readonly iconThemeService: IconThemeService;
46
+ protected readonly contextKeys: ContextKeyService;
47
+ protected readonly themeService: ThemeService;
48
+ protected readonly stateManager: TestExecutionStateManager;
49
+ protected readonly uiModel: TestOutputUIModel;
50
+ constructor(props: TreeProps, model: TreeModel, contextMenuRenderer: ContextMenuRenderer);
51
+ protected init(): void;
52
+ protected renderTree(model: TreeModel): React.ReactNode;
53
+ protected getTestStateClass(state: TestExecutionState | undefined): string;
54
+ protected renderIcon(node: TreeNode, props: NodeProps): React.ReactNode;
55
+ protected toContextMenuArgs(node: SelectableTreeNode): (TestRun | TestItem | TestMessage[])[];
56
+ storeState(): object;
57
+ }
58
+ export {};
59
+ //# sourceMappingURL=test-run-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-run-widget.d.ts","sourceRoot":"","sources":["../../../src/browser/view/test-run-widget.tsx"],"names":[],"mappings":"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"}