@theia/playwright 1.45.1 → 1.46.0-next.137
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +31 -40
- package/lib/index.js.map +1 -1
- package/lib/tests/theia-application-shell.test.d.ts +2 -0
- package/lib/tests/theia-application-shell.test.d.ts.map +1 -0
- package/lib/tests/theia-application-shell.test.js +58 -0
- package/lib/tests/theia-application-shell.test.js.map +1 -0
- package/lib/tests/theia-getting-started.test.d.ts +2 -0
- package/lib/tests/theia-getting-started.test.d.ts.map +1 -0
- package/lib/tests/theia-getting-started.test.js +46 -0
- package/lib/tests/theia-getting-started.test.js.map +1 -0
- package/lib/tests/theia-main-menu.test.js +19 -0
- package/lib/tests/theia-main-menu.test.js.map +1 -1
- package/lib/theia-quick-command-palette.d.ts.map +1 -1
- package/lib/theia-quick-command-palette.js +5 -7
- package/lib/theia-quick-command-palette.js.map +1 -1
- package/lib/theia-rename-dialog.d.ts.map +1 -1
- package/lib/theia-rename-dialog.js +3 -4
- package/lib/theia-rename-dialog.js.map +1 -1
- package/lib/theia-terminal.js +1 -1
- package/lib/theia-welcome-view.d.ts +6 -0
- package/lib/theia-welcome-view.d.ts.map +1 -0
- package/lib/theia-welcome-view.js +31 -0
- package/lib/theia-welcome-view.js.map +1 -0
- package/package.json +2 -2
- package/src/tests/theia-application-shell.test.ts +67 -0
- package/src/tests/theia-getting-started.test.ts +50 -0
- package/src/tests/theia-main-menu.test.ts +21 -0
- package/src/theia-quick-command-palette.ts +5 -7
- package/src/theia-rename-dialog.ts +4 -5
- package/src/theia-terminal.ts +1 -1
- package/src/theia-welcome-view.ts +31 -0
package/lib/index.js
CHANGED
|
@@ -14,45 +14,36 @@
|
|
|
14
14
|
//
|
|
15
15
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
16
|
// *****************************************************************************
|
|
17
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
-
if (k2 === undefined) k2 = k;
|
|
19
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
20
|
-
}) : (function(o, m, k, k2) {
|
|
21
|
-
if (k2 === undefined) k2 = k;
|
|
22
|
-
o[k2] = m[k];
|
|
23
|
-
}));
|
|
24
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
25
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
26
|
-
};
|
|
27
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
-
|
|
29
|
-
__exportStar(require("./theia-
|
|
30
|
-
__exportStar(require("./theia-app
|
|
31
|
-
__exportStar(require("./theia-
|
|
32
|
-
__exportStar(require("./theia-
|
|
33
|
-
__exportStar(require("./theia-
|
|
34
|
-
__exportStar(require("./theia-
|
|
35
|
-
__exportStar(require("./theia-
|
|
36
|
-
__exportStar(require("./theia-menu
|
|
37
|
-
__exportStar(require("./theia-menu"), exports);
|
|
38
|
-
__exportStar(require("./theia-
|
|
39
|
-
__exportStar(require("./theia-notification-
|
|
40
|
-
__exportStar(require("./theia-
|
|
41
|
-
__exportStar(require("./theia-output-
|
|
42
|
-
__exportStar(require("./theia-
|
|
43
|
-
__exportStar(require("./theia-
|
|
44
|
-
__exportStar(require("./theia-
|
|
45
|
-
__exportStar(require("./theia-problem-
|
|
46
|
-
__exportStar(require("./theia-
|
|
47
|
-
__exportStar(require("./theia-
|
|
48
|
-
__exportStar(require("./theia-
|
|
49
|
-
__exportStar(require("./theia-status-
|
|
50
|
-
__exportStar(require("./theia-
|
|
51
|
-
__exportStar(require("./theia-
|
|
52
|
-
__exportStar(require("./theia-
|
|
53
|
-
__exportStar(require("./theia-toolbar
|
|
54
|
-
__exportStar(require("./theia-
|
|
55
|
-
__exportStar(require("./theia-
|
|
56
|
-
__exportStar(require("./theia-
|
|
57
|
-
__exportStar(require("./
|
|
18
|
+
const tslib_1 = require("tslib");
|
|
19
|
+
(0, tslib_1.__exportStar)(require("./theia-about-dialog"), exports);
|
|
20
|
+
(0, tslib_1.__exportStar)(require("./theia-app"), exports);
|
|
21
|
+
(0, tslib_1.__exportStar)(require("./theia-app-loader"), exports);
|
|
22
|
+
(0, tslib_1.__exportStar)(require("./theia-context-menu"), exports);
|
|
23
|
+
(0, tslib_1.__exportStar)(require("./theia-dialog"), exports);
|
|
24
|
+
(0, tslib_1.__exportStar)(require("./theia-editor"), exports);
|
|
25
|
+
(0, tslib_1.__exportStar)(require("./theia-explorer-view"), exports);
|
|
26
|
+
(0, tslib_1.__exportStar)(require("./theia-main-menu"), exports);
|
|
27
|
+
(0, tslib_1.__exportStar)(require("./theia-menu-item"), exports);
|
|
28
|
+
(0, tslib_1.__exportStar)(require("./theia-menu"), exports);
|
|
29
|
+
(0, tslib_1.__exportStar)(require("./theia-notification-indicator"), exports);
|
|
30
|
+
(0, tslib_1.__exportStar)(require("./theia-notification-overlay"), exports);
|
|
31
|
+
(0, tslib_1.__exportStar)(require("./theia-output-channel"), exports);
|
|
32
|
+
(0, tslib_1.__exportStar)(require("./theia-output-view"), exports);
|
|
33
|
+
(0, tslib_1.__exportStar)(require("./theia-page-object"), exports);
|
|
34
|
+
(0, tslib_1.__exportStar)(require("./theia-preference-view"), exports);
|
|
35
|
+
(0, tslib_1.__exportStar)(require("./theia-problem-indicator"), exports);
|
|
36
|
+
(0, tslib_1.__exportStar)(require("./theia-problem-view"), exports);
|
|
37
|
+
(0, tslib_1.__exportStar)(require("./theia-quick-command-palette"), exports);
|
|
38
|
+
(0, tslib_1.__exportStar)(require("./theia-rename-dialog"), exports);
|
|
39
|
+
(0, tslib_1.__exportStar)(require("./theia-status-bar"), exports);
|
|
40
|
+
(0, tslib_1.__exportStar)(require("./theia-status-indicator"), exports);
|
|
41
|
+
(0, tslib_1.__exportStar)(require("./theia-text-editor"), exports);
|
|
42
|
+
(0, tslib_1.__exportStar)(require("./theia-toggle-bottom-indicator"), exports);
|
|
43
|
+
(0, tslib_1.__exportStar)(require("./theia-toolbar"), exports);
|
|
44
|
+
(0, tslib_1.__exportStar)(require("./theia-toolbar-item"), exports);
|
|
45
|
+
(0, tslib_1.__exportStar)(require("./theia-tree-node"), exports);
|
|
46
|
+
(0, tslib_1.__exportStar)(require("./theia-view"), exports);
|
|
47
|
+
(0, tslib_1.__exportStar)(require("./theia-workspace"), exports);
|
|
48
|
+
(0, tslib_1.__exportStar)(require("./util"), exports);
|
|
58
49
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+CAA+C;AAC/C,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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+CAA+C;AAC/C,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,oEAAqC;AACrC,2DAA4B;AAC5B,kEAAmC;AACnC,oEAAqC;AACrC,8DAA+B;AAC/B,8DAA+B;AAC/B,qEAAsC;AACtC,iEAAkC;AAClC,iEAAkC;AAClC,4DAA6B;AAC7B,8EAA+C;AAC/C,4EAA6C;AAC7C,sEAAuC;AACvC,mEAAoC;AACpC,mEAAoC;AACpC,uEAAwC;AACxC,yEAA0C;AAC1C,oEAAqC;AACrC,6EAA8C;AAC9C,qEAAsC;AACtC,kEAAmC;AACnC,wEAAyC;AACzC,mEAAoC;AACpC,+EAAgD;AAChD,+DAAgC;AAChC,oEAAqC;AACrC,iEAAkC;AAClC,4DAA6B;AAC7B,iEAAkC;AAClC,sDAAuB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theia-application-shell.test.d.ts","sourceRoot":"","sources":["../../src/tests/theia-application-shell.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2023 Toro Cloud Pty Ltd 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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
const test_1 = require("@playwright/test");
|
|
18
|
+
const theia_app_loader_1 = require("../theia-app-loader");
|
|
19
|
+
const theia_explorer_view_1 = require("../theia-explorer-view");
|
|
20
|
+
const theia_text_editor_1 = require("../theia-text-editor");
|
|
21
|
+
const theia_welcome_view_1 = require("../theia-welcome-view");
|
|
22
|
+
const theia_workspace_1 = require("../theia-workspace");
|
|
23
|
+
test_1.test.describe('Theia Application Shell', () => {
|
|
24
|
+
test_1.test.describe.configure({
|
|
25
|
+
timeout: 120000
|
|
26
|
+
});
|
|
27
|
+
let app;
|
|
28
|
+
test_1.test.beforeAll(async ({ playwright, browser }) => {
|
|
29
|
+
const ws = new theia_workspace_1.TheiaWorkspace(['src/tests/resources/sample-files1']);
|
|
30
|
+
app = await theia_app_loader_1.TheiaAppLoader.load({ playwright, browser }, ws);
|
|
31
|
+
// The welcome view must be closed because the memory leak only occurs when there are
|
|
32
|
+
// no tabs left open.
|
|
33
|
+
const welcomeView = new theia_welcome_view_1.TheiaWelcomeView(app);
|
|
34
|
+
if (await welcomeView.isTabVisible()) {
|
|
35
|
+
await welcomeView.close();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
test_1.test.afterAll(async () => {
|
|
39
|
+
await app.page.close();
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* The aim of this test is to detect memory leaks when opening and closing editors many times.
|
|
43
|
+
* Remove the skip and run the test, check the logs for any memory leak warnings.
|
|
44
|
+
* It should take less than 2min to run, if it takes longer than that, just increase the timeout.
|
|
45
|
+
*/
|
|
46
|
+
test_1.test.skip('should open and close a text editor many times', async () => {
|
|
47
|
+
for (let i = 0; i < 200; i++) {
|
|
48
|
+
const explorer = await app.openView(theia_explorer_view_1.TheiaExplorerView);
|
|
49
|
+
const fileStatNode = await explorer.getFileStatNodeByLabel('sample.txt');
|
|
50
|
+
const contextMenu = await fileStatNode.openContextMenu();
|
|
51
|
+
await contextMenu.clickMenuItem('Open');
|
|
52
|
+
const textEditor = new theia_text_editor_1.TheiaTextEditor('sample.txt', app);
|
|
53
|
+
await textEditor.waitForVisible();
|
|
54
|
+
await textEditor.close();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=theia-application-shell.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theia-application-shell.test.js","sourceRoot":"","sources":["../../src/tests/theia-application-shell.test.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;;AAEhF,2CAAwC;AAExC,0DAAqD;AACrD,gEAA2D;AAC3D,4DAAuD;AACvD,8DAAyD;AACzD,wDAAoD;AAEpD,WAAI,CAAC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IAC1C,WAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,MAAM;KAClB,CAAC,CAAC;IAEH,IAAI,GAAa,CAAC;IAElB,WAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;QAC7C,MAAM,EAAE,GAAG,IAAI,gCAAc,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC;QACrE,GAAG,GAAG,MAAM,iCAAc,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAE7D,qFAAqF;QACrF,qBAAqB;QACrB,MAAM,WAAW,GAAG,IAAI,qCAAgB,CAAC,GAAG,CAAC,CAAC;QAE9C,IAAI,MAAM,WAAW,CAAC,YAAY,EAAE,EAAE;YAClC,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;SAC7B;IACL,CAAC,CAAC,CAAC;IAEH,WAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;QACrB,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH;;;;OAIG;IACH,WAAI,CAAC,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,uCAAiB,CAAC,CAAC;YAEvD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;YACzE,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;YACzD,MAAM,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAExC,MAAM,UAAU,GAAG,IAAI,mCAAe,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YAC1D,MAAM,UAAU,CAAC,cAAc,EAAE,CAAC;YAElC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;SAC5B;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theia-getting-started.test.d.ts","sourceRoot":"","sources":["../../src/tests/theia-getting-started.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2024 TypeFox 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
|
+
const test_1 = require("@playwright/test");
|
|
19
|
+
const theia_app_loader_1 = require("../theia-app-loader");
|
|
20
|
+
const theia_explorer_view_1 = require("../theia-explorer-view");
|
|
21
|
+
/**
|
|
22
|
+
* Test the Theia welcome page from the getting-started package.
|
|
23
|
+
*/
|
|
24
|
+
test_1.test.describe('Theia Welcome Page', () => {
|
|
25
|
+
let app;
|
|
26
|
+
test_1.test.beforeAll(async ({ playwright, browser }) => {
|
|
27
|
+
app = await theia_app_loader_1.TheiaAppLoader.load({ playwright, browser });
|
|
28
|
+
await app.isMainContentPanelVisible();
|
|
29
|
+
});
|
|
30
|
+
test_1.test.afterAll(async () => {
|
|
31
|
+
await app.page.close();
|
|
32
|
+
});
|
|
33
|
+
(0, test_1.test)('New File... entry should create a new file.', async () => {
|
|
34
|
+
await app.page.getByRole('button', { name: 'New File...' }).click();
|
|
35
|
+
const quickPicker = app.page.getByPlaceholder('Select File Type or Enter');
|
|
36
|
+
await quickPicker.fill('testfile.txt');
|
|
37
|
+
await quickPicker.press('Enter');
|
|
38
|
+
await app.page.getByRole('button', { name: 'Create File' }).click();
|
|
39
|
+
// check file in workspace exists
|
|
40
|
+
const explorer = await app.openView(theia_explorer_view_1.TheiaExplorerView);
|
|
41
|
+
await explorer.refresh();
|
|
42
|
+
await explorer.waitForVisibleFileNodes();
|
|
43
|
+
(0, test_1.expect)(await explorer.existsFileNode('testfile.txt')).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=theia-getting-started.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theia-getting-started.test.js","sourceRoot":"","sources":["../../src/tests/theia-getting-started.test.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,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,2CAAgD;AAEhD,0DAAqD;AACrD,gEAA2D;AAE3D;;GAEG;AACH,WAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACrC,IAAI,GAAa,CAAC;IAElB,WAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;QAC7C,GAAG,GAAG,MAAM,iCAAc,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,MAAM,GAAG,CAAC,yBAAyB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,WAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;QACrB,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACpE,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;QAC3E,MAAM,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACvC,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAEpE,iCAAiC;QACjC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,uCAAiB,CAAC,CAAC;QACvD,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,QAAQ,CAAC,uBAAuB,EAAE,CAAC;QACzC,IAAA,aAAM,EAAC,MAAM,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -19,6 +19,7 @@ const test_1 = require("@playwright/test");
|
|
|
19
19
|
const theia_app_loader_1 = require("../theia-app-loader");
|
|
20
20
|
const theia_about_dialog_1 = require("../theia-about-dialog");
|
|
21
21
|
const util_1 = require("../util");
|
|
22
|
+
const theia_explorer_view_1 = require("../theia-explorer-view");
|
|
22
23
|
test_1.test.describe('Theia Main Menu', () => {
|
|
23
24
|
let app;
|
|
24
25
|
let menuBar;
|
|
@@ -89,5 +90,23 @@ test_1.test.describe('Theia Main Menu', () => {
|
|
|
89
90
|
await app.page.locator('#theia-dialog-shell').getByRole('button', { name: 'Cancel' }).click();
|
|
90
91
|
(0, test_1.expect)(await fileDialog.isVisible()).toBe(false);
|
|
91
92
|
});
|
|
93
|
+
(0, test_1.test)('Create file via New File menu and cancel', async () => {
|
|
94
|
+
const openFileEntry = 'New File...';
|
|
95
|
+
await (await menuBar.openMenu('File')).clickMenuItem(openFileEntry);
|
|
96
|
+
const quickPick = app.page.getByPlaceholder('Select File Type or Enter');
|
|
97
|
+
// type file name and press enter
|
|
98
|
+
await quickPick.fill('test.txt');
|
|
99
|
+
await quickPick.press('Enter');
|
|
100
|
+
// check file dialog is opened and accept with "Create File" button
|
|
101
|
+
const fileDialog = await app.page.waitForSelector('div[class="dialogBlock"]');
|
|
102
|
+
(0, test_1.expect)(await fileDialog.isVisible()).toBe(true);
|
|
103
|
+
await app.page.locator('#theia-dialog-shell').getByRole('button', { name: 'Create File' }).click();
|
|
104
|
+
(0, test_1.expect)(await fileDialog.isVisible()).toBe(false);
|
|
105
|
+
// check file in workspace exists
|
|
106
|
+
const explorer = await app.openView(theia_explorer_view_1.TheiaExplorerView);
|
|
107
|
+
await explorer.refresh();
|
|
108
|
+
await explorer.waitForVisibleFileNodes();
|
|
109
|
+
(0, test_1.expect)(await explorer.existsFileNode('test.txt')).toBe(true);
|
|
110
|
+
});
|
|
92
111
|
});
|
|
93
112
|
//# sourceMappingURL=theia-main-menu.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theia-main-menu.test.js","sourceRoot":"","sources":["../../src/tests/theia-main-menu.test.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+DAA+D;AAC/D,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,2CAAgD;AAEhD,0DAAqD;AACrD,8DAAyD;AAEzD,kCAAiC;
|
|
1
|
+
{"version":3,"file":"theia-main-menu.test.js","sourceRoot":"","sources":["../../src/tests/theia-main-menu.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theia-quick-command-palette.d.ts","sourceRoot":"","sources":["../src/theia-quick-command-palette.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,qBAAa,wBAAyB,SAAQ,eAAe;IAEzD,QAAQ,SAAyB;IAE3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAS1B,OAAO,CAAC,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;cAMtC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"theia-quick-command-palette.d.ts","sourceRoot":"","sources":["../src/theia-quick-command-palette.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,qBAAa,wBAAyB,SAAQ,eAAe;IAEzD,QAAQ,SAAyB;IAE3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAS1B,OAAO,CAAC,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;cAMtC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;cAYzC,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC;CAO7F"}
|
|
@@ -60,13 +60,11 @@ class TheiaQuickCommandPalette extends theia_page_object_1.TheiaPageObject {
|
|
|
60
60
|
if (!await this.isOpen()) {
|
|
61
61
|
this.open();
|
|
62
62
|
}
|
|
63
|
-
const input =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
await this.page.keyboard.press('Enter');
|
|
69
|
-
}
|
|
63
|
+
const input = this.page.locator(`${this.selector} .monaco-inputbox .input`);
|
|
64
|
+
await input.focus();
|
|
65
|
+
await input.pressSequentially(value, { delay: util_1.USER_KEY_TYPING_DELAY });
|
|
66
|
+
if (confirm) {
|
|
67
|
+
await this.page.keyboard.press('Enter');
|
|
70
68
|
}
|
|
71
69
|
}
|
|
72
70
|
async selectedCommand() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theia-quick-command-palette.js","sourceRoot":"","sources":["../src/theia-quick-command-palette.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+DAA+D;AAC/D,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;;;AAGhF,2DAAsD;AACtD,iCAAuD;AAEvD,MAAa,wBAAyB,SAAQ,mCAAe;IAA7D;;QAEI,aAAQ,GAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"theia-quick-command-palette.js","sourceRoot":"","sources":["../src/theia-quick-command-palette.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theia-rename-dialog.d.ts","sourceRoot":"","sources":["../src/theia-rename-dialog.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,qBAAa,iBAAkB,SAAQ,WAAW;IAExC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"theia-rename-dialog.d.ts","sourceRoot":"","sources":["../src/theia-rename-dialog.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,qBAAa,iBAAkB,SAAQ,WAAW;IAExC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAOjC"}
|
|
@@ -20,10 +20,9 @@ const theia_dialog_1 = require("./theia-dialog");
|
|
|
20
20
|
const util_1 = require("./util");
|
|
21
21
|
class TheiaRenameDialog extends theia_dialog_1.TheiaDialog {
|
|
22
22
|
async enterNewName(newName) {
|
|
23
|
-
const inputField =
|
|
24
|
-
await inputField.
|
|
25
|
-
await inputField.
|
|
26
|
-
await this.page.waitForTimeout(util_1.USER_KEY_TYPING_DELAY);
|
|
23
|
+
const inputField = this.page.locator(`${this.blockSelector} .theia-input`);
|
|
24
|
+
await inputField.selectText();
|
|
25
|
+
await inputField.pressSequentially(newName, { delay: util_1.USER_KEY_TYPING_DELAY });
|
|
27
26
|
}
|
|
28
27
|
async confirm() {
|
|
29
28
|
if (!await this.validationResult()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theia-rename-dialog.js","sourceRoot":"","sources":["../src/theia-rename-dialog.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+DAA+D;AAC/D,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,iDAA6C;AAC7C,
|
|
1
|
+
{"version":3,"file":"theia-rename-dialog.js","sourceRoot":"","sources":["../src/theia-rename-dialog.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+DAA+D;AAC/D,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,iDAA6C;AAC7C,iCAA+C;AAE/C,MAAa,iBAAkB,SAAQ,0BAAW;IAE9C,KAAK,CAAC,YAAY,CAAC,OAAe;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,eAAe,CAAC,CAAC;QAC3E,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;QAC9B,MAAM,UAAU,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,4BAAqB,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,OAAO;QACT,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,sDAAsD,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;SAC3G;QACD,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IACjC,CAAC;CAEJ;AAfD,8CAeC"}
|
package/lib/theia-terminal.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theia-welcome-view.d.ts","sourceRoot":"","sources":["../src/theia-welcome-view.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzC,qBAAa,gBAAiB,SAAQ,SAAS;gBAE/B,GAAG,EAAE,QAAQ;CAG5B"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2023 Toro Cloud Pty Ltd 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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.TheiaWelcomeView = void 0;
|
|
18
|
+
const theia_view_1 = require("./theia-view");
|
|
19
|
+
const util_1 = require("./util");
|
|
20
|
+
const TheiaWelcomeViewData = {
|
|
21
|
+
tabSelector: (0, util_1.normalizeId)('#shell-tab-getting.started.widget'),
|
|
22
|
+
viewSelector: (0, util_1.normalizeId)('#getting.started.widget'),
|
|
23
|
+
viewName: 'Welcome'
|
|
24
|
+
};
|
|
25
|
+
class TheiaWelcomeView extends theia_view_1.TheiaView {
|
|
26
|
+
constructor(app) {
|
|
27
|
+
super(TheiaWelcomeViewData, app);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.TheiaWelcomeView = TheiaWelcomeView;
|
|
31
|
+
//# sourceMappingURL=theia-welcome-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theia-welcome-view.js","sourceRoot":"","sources":["../src/theia-welcome-view.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;;;AAGhF,6CAAyC;AACzC,iCAAqC;AAErC,MAAM,oBAAoB,GAAG;IACzB,WAAW,EAAE,IAAA,kBAAW,EAAC,mCAAmC,CAAC;IAC7D,YAAY,EAAE,IAAA,kBAAW,EAAC,yBAAyB,CAAC;IACpD,QAAQ,EAAE,SAAS;CACtB,CAAC;AAEF,MAAa,gBAAiB,SAAQ,sBAAS;IAE3C,YAAY,GAAa;QACrB,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;CACJ;AALD,4CAKC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/playwright",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.46.0-next.137+bce99c299",
|
|
4
4
|
"description": "System tests for Theia",
|
|
5
5
|
"license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -45,5 +45,5 @@
|
|
|
45
45
|
"access": "public"
|
|
46
46
|
},
|
|
47
47
|
"main": "lib/index",
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "bce99c299d7a01573330482ce26563eb6b00a6e9"
|
|
49
49
|
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2023 Toro Cloud Pty Ltd and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
|
|
16
|
+
import { test } from '@playwright/test';
|
|
17
|
+
import { TheiaApp } from '../theia-app';
|
|
18
|
+
import { TheiaAppLoader } from '../theia-app-loader';
|
|
19
|
+
import { TheiaExplorerView } from '../theia-explorer-view';
|
|
20
|
+
import { TheiaTextEditor } from '../theia-text-editor';
|
|
21
|
+
import { TheiaWelcomeView } from '../theia-welcome-view';
|
|
22
|
+
import { TheiaWorkspace } from '../theia-workspace';
|
|
23
|
+
|
|
24
|
+
test.describe('Theia Application Shell', () => {
|
|
25
|
+
test.describe.configure({
|
|
26
|
+
timeout: 120000
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
let app: TheiaApp;
|
|
30
|
+
|
|
31
|
+
test.beforeAll(async ({ playwright, browser }) => {
|
|
32
|
+
const ws = new TheiaWorkspace(['src/tests/resources/sample-files1']);
|
|
33
|
+
app = await TheiaAppLoader.load({ playwright, browser }, ws);
|
|
34
|
+
|
|
35
|
+
// The welcome view must be closed because the memory leak only occurs when there are
|
|
36
|
+
// no tabs left open.
|
|
37
|
+
const welcomeView = new TheiaWelcomeView(app);
|
|
38
|
+
|
|
39
|
+
if (await welcomeView.isTabVisible()) {
|
|
40
|
+
await welcomeView.close();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test.afterAll(async () => {
|
|
45
|
+
await app.page.close();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The aim of this test is to detect memory leaks when opening and closing editors many times.
|
|
50
|
+
* Remove the skip and run the test, check the logs for any memory leak warnings.
|
|
51
|
+
* It should take less than 2min to run, if it takes longer than that, just increase the timeout.
|
|
52
|
+
*/
|
|
53
|
+
test.skip('should open and close a text editor many times', async () => {
|
|
54
|
+
for (let i = 0; i < 200; i++) {
|
|
55
|
+
const explorer = await app.openView(TheiaExplorerView);
|
|
56
|
+
|
|
57
|
+
const fileStatNode = await explorer.getFileStatNodeByLabel('sample.txt');
|
|
58
|
+
const contextMenu = await fileStatNode.openContextMenu();
|
|
59
|
+
await contextMenu.clickMenuItem('Open');
|
|
60
|
+
|
|
61
|
+
const textEditor = new TheiaTextEditor('sample.txt', app);
|
|
62
|
+
await textEditor.waitForVisible();
|
|
63
|
+
|
|
64
|
+
await textEditor.close();
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2024 TypeFox and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { expect, test } from '@playwright/test';
|
|
18
|
+
import { TheiaApp } from '../theia-app';
|
|
19
|
+
import { TheiaAppLoader } from '../theia-app-loader';
|
|
20
|
+
import { TheiaExplorerView } from '../theia-explorer-view';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Test the Theia welcome page from the getting-started package.
|
|
24
|
+
*/
|
|
25
|
+
test.describe('Theia Welcome Page', () => {
|
|
26
|
+
let app: TheiaApp;
|
|
27
|
+
|
|
28
|
+
test.beforeAll(async ({ playwright, browser }) => {
|
|
29
|
+
app = await TheiaAppLoader.load({ playwright, browser });
|
|
30
|
+
await app.isMainContentPanelVisible();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test.afterAll(async () => {
|
|
34
|
+
await app.page.close();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('New File... entry should create a new file.', async () => {
|
|
38
|
+
await app.page.getByRole('button', { name: 'New File...' }).click();
|
|
39
|
+
const quickPicker = app.page.getByPlaceholder('Select File Type or Enter');
|
|
40
|
+
await quickPicker.fill('testfile.txt');
|
|
41
|
+
await quickPicker.press('Enter');
|
|
42
|
+
await app.page.getByRole('button', { name: 'Create File' }).click();
|
|
43
|
+
|
|
44
|
+
// check file in workspace exists
|
|
45
|
+
const explorer = await app.openView(TheiaExplorerView);
|
|
46
|
+
await explorer.refresh();
|
|
47
|
+
await explorer.waitForVisibleFileNodes();
|
|
48
|
+
expect(await explorer.existsFileNode('testfile.txt')).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -20,6 +20,7 @@ import { TheiaAppLoader } from '../theia-app-loader';
|
|
|
20
20
|
import { TheiaAboutDialog } from '../theia-about-dialog';
|
|
21
21
|
import { TheiaMenuBar } from '../theia-main-menu';
|
|
22
22
|
import { OSUtil } from '../util';
|
|
23
|
+
import { TheiaExplorerView } from '../theia-explorer-view';
|
|
23
24
|
|
|
24
25
|
test.describe('Theia Main Menu', () => {
|
|
25
26
|
|
|
@@ -109,4 +110,24 @@ test.describe('Theia Main Menu', () => {
|
|
|
109
110
|
expect(await fileDialog.isVisible()).toBe(false);
|
|
110
111
|
});
|
|
111
112
|
|
|
113
|
+
test('Create file via New File menu and cancel', async () => {
|
|
114
|
+
const openFileEntry = 'New File...';
|
|
115
|
+
await (await menuBar.openMenu('File')).clickMenuItem(openFileEntry);
|
|
116
|
+
const quickPick = app.page.getByPlaceholder('Select File Type or Enter');
|
|
117
|
+
// type file name and press enter
|
|
118
|
+
await quickPick.fill('test.txt');
|
|
119
|
+
await quickPick.press('Enter');
|
|
120
|
+
|
|
121
|
+
// check file dialog is opened and accept with "Create File" button
|
|
122
|
+
const fileDialog = await app.page.waitForSelector('div[class="dialogBlock"]');
|
|
123
|
+
expect(await fileDialog.isVisible()).toBe(true);
|
|
124
|
+
await app.page.locator('#theia-dialog-shell').getByRole('button', { name: 'Create File' }).click();
|
|
125
|
+
expect(await fileDialog.isVisible()).toBe(false);
|
|
126
|
+
|
|
127
|
+
// check file in workspace exists
|
|
128
|
+
const explorer = await app.openView(TheiaExplorerView);
|
|
129
|
+
await explorer.refresh();
|
|
130
|
+
await explorer.waitForVisibleFileNodes();
|
|
131
|
+
expect(await explorer.existsFileNode('test.txt')).toBe(true);
|
|
132
|
+
});
|
|
112
133
|
});
|
|
@@ -63,13 +63,11 @@ export class TheiaQuickCommandPalette extends TheiaPageObject {
|
|
|
63
63
|
if (!await this.isOpen()) {
|
|
64
64
|
this.open();
|
|
65
65
|
}
|
|
66
|
-
const input =
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
await this.page.keyboard.press('Enter');
|
|
72
|
-
}
|
|
66
|
+
const input = this.page.locator(`${this.selector} .monaco-inputbox .input`);
|
|
67
|
+
await input.focus();
|
|
68
|
+
await input.pressSequentially(value, { delay: USER_KEY_TYPING_DELAY });
|
|
69
|
+
if (confirm) {
|
|
70
|
+
await this.page.keyboard.press('Enter');
|
|
73
71
|
}
|
|
74
72
|
}
|
|
75
73
|
|
|
@@ -15,15 +15,14 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { TheiaDialog } from './theia-dialog';
|
|
18
|
-
import {
|
|
18
|
+
import { USER_KEY_TYPING_DELAY } from './util';
|
|
19
19
|
|
|
20
20
|
export class TheiaRenameDialog extends TheiaDialog {
|
|
21
21
|
|
|
22
22
|
async enterNewName(newName: string): Promise<void> {
|
|
23
|
-
const inputField =
|
|
24
|
-
await inputField.
|
|
25
|
-
await inputField.
|
|
26
|
-
await this.page.waitForTimeout(USER_KEY_TYPING_DELAY);
|
|
23
|
+
const inputField = this.page.locator(`${this.blockSelector} .theia-input`);
|
|
24
|
+
await inputField.selectText();
|
|
25
|
+
await inputField.pressSequentially(newName, { delay: USER_KEY_TYPING_DELAY });
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
async confirm(): Promise<void> {
|
package/src/theia-terminal.ts
CHANGED
|
@@ -38,7 +38,7 @@ export class TheiaTerminal extends TheiaView {
|
|
|
38
38
|
async write(text: string): Promise<void> {
|
|
39
39
|
await this.activate();
|
|
40
40
|
const input = await this.waitForInputArea();
|
|
41
|
-
await input.
|
|
41
|
+
await input.fill(text);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
async contents(): Promise<string> {
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2023 Toro Cloud Pty Ltd and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
|
|
16
|
+
import { TheiaApp } from './theia-app';
|
|
17
|
+
import { TheiaView } from './theia-view';
|
|
18
|
+
import { normalizeId } from './util';
|
|
19
|
+
|
|
20
|
+
const TheiaWelcomeViewData = {
|
|
21
|
+
tabSelector: normalizeId('#shell-tab-getting.started.widget'),
|
|
22
|
+
viewSelector: normalizeId('#getting.started.widget'),
|
|
23
|
+
viewName: 'Welcome'
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export class TheiaWelcomeView extends TheiaView {
|
|
27
|
+
|
|
28
|
+
constructor(app: TheiaApp) {
|
|
29
|
+
super(TheiaWelcomeViewData, app);
|
|
30
|
+
}
|
|
31
|
+
}
|