@theia/playwright 1.45.0 → 1.46.0-next.72

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 (164) hide show
  1. package/README.md +54 -54
  2. package/lib/index.d.ts +30 -30
  3. package/lib/index.js +57 -57
  4. package/lib/tests/fixtures/theia-fixture.d.ts +4 -0
  5. package/lib/tests/fixtures/theia-fixture.d.ts.map +1 -0
  6. package/lib/tests/fixtures/theia-fixture.js +24 -0
  7. package/lib/tests/fixtures/theia-fixture.js.map +1 -0
  8. package/lib/tests/theia-app.test.d.ts +1 -1
  9. package/lib/tests/theia-app.test.js +29 -29
  10. package/lib/tests/theia-application-shell.test.d.ts +2 -0
  11. package/lib/tests/theia-application-shell.test.d.ts.map +1 -0
  12. package/lib/tests/theia-application-shell.test.js +58 -0
  13. package/lib/tests/theia-application-shell.test.js.map +1 -0
  14. package/lib/tests/theia-explorer-view.test.d.ts +1 -1
  15. package/lib/tests/theia-explorer-view.test.js +183 -183
  16. package/lib/tests/theia-main-menu.test.d.ts +1 -1
  17. package/lib/tests/theia-main-menu.test.js +92 -92
  18. package/lib/tests/theia-output-view.test.d.ts +1 -1
  19. package/lib/tests/theia-output-view.test.js +78 -78
  20. package/lib/tests/theia-preference-view.test.d.ts +1 -1
  21. package/lib/tests/theia-preference-view.test.js +101 -101
  22. package/lib/tests/theia-problems-view.test.d.ts +1 -1
  23. package/lib/tests/theia-problems-view.test.js +54 -54
  24. package/lib/tests/theia-quick-command.test.d.ts +1 -1
  25. package/lib/tests/theia-quick-command.test.js +69 -69
  26. package/lib/tests/theia-sample-app.test.d.ts +1 -1
  27. package/lib/tests/theia-sample-app.test.js +57 -57
  28. package/lib/tests/theia-status-bar.test.d.ts +1 -1
  29. package/lib/tests/theia-status-bar.test.js +44 -44
  30. package/lib/tests/theia-terminal-view.test.d.ts +1 -1
  31. package/lib/tests/theia-terminal-view.test.js +78 -78
  32. package/lib/tests/theia-text-editor.test.d.ts +1 -1
  33. package/lib/tests/theia-text-editor.test.js +155 -155
  34. package/lib/tests/theia-toolbar.test.d.ts +1 -1
  35. package/lib/tests/theia-toolbar.test.js +61 -61
  36. package/lib/tests/theia-workspace.test.d.ts +1 -1
  37. package/lib/tests/theia-workspace.test.js +72 -72
  38. package/lib/theia-about-dialog.d.ts +4 -4
  39. package/lib/theia-about-dialog.js +26 -26
  40. package/lib/theia-app-loader.d.ts +19 -19
  41. package/lib/theia-app-loader.js +129 -129
  42. package/lib/theia-app.d.ts +50 -50
  43. package/lib/theia-app.js +153 -153
  44. package/lib/theia-context-menu.d.ts +8 -8
  45. package/lib/theia-context-menu.js +37 -37
  46. package/lib/theia-dialog.d.ts +28 -28
  47. package/lib/theia-dialog.js +99 -99
  48. package/lib/theia-editor.d.ts +9 -9
  49. package/lib/theia-editor.js +68 -68
  50. package/lib/theia-explorer-view.d.ts +47 -47
  51. package/lib/theia-explorer-view.js +273 -273
  52. package/lib/theia-main-menu.d.ts +12 -12
  53. package/lib/theia-main-menu.js +53 -53
  54. package/lib/theia-menu-item.d.ts +14 -14
  55. package/lib/theia-menu-item.js +66 -66
  56. package/lib/theia-menu.d.ts +16 -16
  57. package/lib/theia-menu.js +86 -86
  58. package/lib/theia-monaco-editor.d.ts +15 -15
  59. package/lib/theia-monaco-editor.js +75 -75
  60. package/lib/theia-notification-indicator.d.ts +7 -7
  61. package/lib/theia-notification-indicator.js +44 -44
  62. package/lib/theia-notification-overlay.d.ts +22 -22
  63. package/lib/theia-notification-overlay.js +79 -79
  64. package/lib/theia-output-channel.d.ts +24 -24
  65. package/lib/theia-output-channel.js +71 -71
  66. package/lib/theia-output-view.d.ts +9 -9
  67. package/lib/theia-output-view.js +81 -81
  68. package/lib/theia-page-object.d.ts +7 -7
  69. package/lib/theia-page-object.js +27 -27
  70. package/lib/theia-preference-view.d.ts +84 -84
  71. package/lib/theia-preference-view.js +209 -209
  72. package/lib/theia-problem-indicator.d.ts +8 -8
  73. package/lib/theia-problem-indicator.js +38 -38
  74. package/lib/theia-problem-view.d.ts +5 -5
  75. package/lib/theia-problem-view.js +30 -30
  76. package/lib/theia-quick-command-palette.d.ts +12 -12
  77. package/lib/theia-quick-command-palette.js +80 -80
  78. package/lib/theia-rename-dialog.d.ts +5 -5
  79. package/lib/theia-rename-dialog.js +35 -35
  80. package/lib/theia-status-bar.d.ts +13 -13
  81. package/lib/theia-status-bar.js +39 -39
  82. package/lib/theia-status-indicator.d.ts +10 -10
  83. package/lib/theia-status-indicator.js +48 -48
  84. package/lib/theia-terminal.d.ts +13 -13
  85. package/lib/theia-terminal.js +59 -59
  86. package/lib/theia-text-editor.d.ts +26 -26
  87. package/lib/theia-text-editor.js +120 -120
  88. package/lib/theia-toggle-bottom-indicator.d.ts +4 -4
  89. package/lib/theia-toggle-bottom-indicator.js +26 -26
  90. package/lib/theia-toolbar-item.d.ts +10 -10
  91. package/lib/theia-toolbar-item.js +39 -39
  92. package/lib/theia-toolbar.d.ts +19 -19
  93. package/lib/theia-toolbar.js +90 -90
  94. package/lib/theia-tree-node.d.ts +19 -19
  95. package/lib/theia-tree-node.js +72 -72
  96. package/lib/theia-view.d.ts +32 -32
  97. package/lib/theia-view.js +149 -149
  98. package/lib/theia-welcome-view.d.ts +6 -0
  99. package/lib/theia-welcome-view.d.ts.map +1 -0
  100. package/lib/theia-welcome-view.js +31 -0
  101. package/lib/theia-welcome-view.js.map +1 -0
  102. package/lib/theia-workspace.d.ts +18 -18
  103. package/lib/theia-workspace.js +69 -69
  104. package/lib/util.d.ts +19 -19
  105. package/lib/util.js +93 -93
  106. package/package.json +2 -2
  107. package/src/index.ts +46 -46
  108. package/src/tests/resources/sample-files1/sample.txt +4 -4
  109. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-1.txt +1 -1
  110. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-2.txt +1 -1
  111. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-1.txt +1 -1
  112. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-2.txt +1 -1
  113. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-1.txt +1 -1
  114. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-2.txt +1 -1
  115. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-1.txt +1 -1
  116. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-2.txt +1 -1
  117. package/src/tests/resources/sample-files2/another-sample.txt +1 -1
  118. package/src/tests/theia-app.test.ts +33 -33
  119. package/src/tests/theia-application-shell.test.ts +67 -0
  120. package/src/tests/theia-explorer-view.test.ts +211 -211
  121. package/src/tests/theia-main-menu.test.ts +112 -112
  122. package/src/tests/theia-output-view.test.ts +85 -85
  123. package/src/tests/theia-preference-view.test.ts +122 -122
  124. package/src/tests/theia-problems-view.test.ts +64 -64
  125. package/src/tests/theia-quick-command.test.ts +80 -80
  126. package/src/tests/theia-sample-app.test.ts +66 -66
  127. package/src/tests/theia-status-bar.test.ts +52 -52
  128. package/src/tests/theia-terminal-view.test.ts +90 -90
  129. package/src/tests/theia-text-editor.test.ts +187 -187
  130. package/src/tests/theia-toolbar.test.ts +69 -69
  131. package/src/tests/theia-workspace.test.ts +80 -80
  132. package/src/theia-about-dialog.ts +26 -26
  133. package/src/theia-app-loader.ts +167 -167
  134. package/src/theia-app.ts +188 -188
  135. package/src/theia-context-menu.ts +42 -42
  136. package/src/theia-dialog.ts +114 -114
  137. package/src/theia-editor.ts +73 -73
  138. package/src/theia-explorer-view.ts +311 -311
  139. package/src/theia-main-menu.ts +54 -54
  140. package/src/theia-menu-item.ts +75 -75
  141. package/src/theia-menu.ts +96 -96
  142. package/src/theia-monaco-editor.ts +83 -83
  143. package/src/theia-notification-indicator.ts +44 -44
  144. package/src/theia-notification-overlay.ts +94 -94
  145. package/src/theia-output-channel.ts +88 -88
  146. package/src/theia-output-view.ts +87 -87
  147. package/src/theia-page-object.ts +29 -29
  148. package/src/theia-preference-view.ts +240 -240
  149. package/src/theia-problem-indicator.ts +37 -37
  150. package/src/theia-problem-view.ts +30 -30
  151. package/src/theia-quick-command-palette.ts +83 -83
  152. package/src/theia-rename-dialog.ts +36 -36
  153. package/src/theia-status-bar.ts +44 -44
  154. package/src/theia-status-indicator.ts +50 -50
  155. package/src/theia-terminal.ts +69 -69
  156. package/src/theia-text-editor.ts +141 -141
  157. package/src/theia-toggle-bottom-indicator.ts +21 -21
  158. package/src/theia-toolbar-item.ts +41 -41
  159. package/src/theia-toolbar.ts +99 -99
  160. package/src/theia-tree-node.ts +81 -81
  161. package/src/theia-view.ts +177 -177
  162. package/src/theia-welcome-view.ts +31 -0
  163. package/src/theia-workspace.ts +76 -76
  164. package/src/util.ts +91 -91
@@ -1,54 +1,54 @@
1
- // *****************************************************************************
2
- // Copyright (C) 2021 logi.cals GmbH, EclipseSource 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 { ElementHandle } from '@playwright/test';
18
-
19
- import { TheiaMenu } from './theia-menu';
20
- import { TheiaPageObject } from './theia-page-object';
21
- import { normalizeId, toTextContentArray } from './util';
22
-
23
- export class TheiaMainMenu extends TheiaMenu {
24
- override selector = '.p-Menu.p-MenuBar-menu';
25
- }
26
-
27
- export class TheiaMenuBar extends TheiaPageObject {
28
-
29
- async openMenu(menuName: string): Promise<TheiaMainMenu> {
30
- const menuBarItem = await this.menuBarItem(menuName);
31
- const mainMenu = new TheiaMainMenu(this.app);
32
- if (await mainMenu.isOpen()) {
33
- await menuBarItem?.hover();
34
- } else {
35
- await menuBarItem?.click();
36
- }
37
- mainMenu.waitForVisible();
38
- return mainMenu;
39
- }
40
-
41
- async visibleMenuBarItems(): Promise<string[]> {
42
- const items = await this.page.$$(this.menuBarItemSelector());
43
- return toTextContentArray(items);
44
- }
45
-
46
- protected menuBarItem(label = ''): Promise<ElementHandle<SVGElement | HTMLElement> | null> {
47
- return this.page.waitForSelector(this.menuBarItemSelector(label));
48
- }
49
-
50
- protected menuBarItemSelector(label = ''): string {
51
- return `${normalizeId('#theia:menubar')} .p-MenuBar-itemLabel >> text=${label}`;
52
- }
53
-
54
- }
1
+ // *****************************************************************************
2
+ // Copyright (C) 2021 logi.cals GmbH, EclipseSource 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 { ElementHandle } from '@playwright/test';
18
+
19
+ import { TheiaMenu } from './theia-menu';
20
+ import { TheiaPageObject } from './theia-page-object';
21
+ import { normalizeId, toTextContentArray } from './util';
22
+
23
+ export class TheiaMainMenu extends TheiaMenu {
24
+ override selector = '.p-Menu.p-MenuBar-menu';
25
+ }
26
+
27
+ export class TheiaMenuBar extends TheiaPageObject {
28
+
29
+ async openMenu(menuName: string): Promise<TheiaMainMenu> {
30
+ const menuBarItem = await this.menuBarItem(menuName);
31
+ const mainMenu = new TheiaMainMenu(this.app);
32
+ if (await mainMenu.isOpen()) {
33
+ await menuBarItem?.hover();
34
+ } else {
35
+ await menuBarItem?.click();
36
+ }
37
+ mainMenu.waitForVisible();
38
+ return mainMenu;
39
+ }
40
+
41
+ async visibleMenuBarItems(): Promise<string[]> {
42
+ const items = await this.page.$$(this.menuBarItemSelector());
43
+ return toTextContentArray(items);
44
+ }
45
+
46
+ protected menuBarItem(label = ''): Promise<ElementHandle<SVGElement | HTMLElement> | null> {
47
+ return this.page.waitForSelector(this.menuBarItemSelector(label));
48
+ }
49
+
50
+ protected menuBarItemSelector(label = ''): string {
51
+ return `${normalizeId('#theia:menubar')} .p-MenuBar-itemLabel >> text=${label}`;
52
+ }
53
+
54
+ }
@@ -1,75 +1,75 @@
1
- // *****************************************************************************
2
- // Copyright (C) 2021 logi.cals GmbH, EclipseSource 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 { ElementHandle } from '@playwright/test';
18
-
19
- import { elementContainsClass, textContent } from './util';
20
-
21
- export class TheiaMenuItem {
22
-
23
- constructor(protected element: ElementHandle<SVGElement | HTMLElement>) { }
24
-
25
- protected labelElementHandle(): Promise<ElementHandle<SVGElement | HTMLElement>> {
26
- return this.element.waitForSelector('.p-Menu-itemLabel');
27
- }
28
-
29
- protected shortCutElementHandle(): Promise<ElementHandle<SVGElement | HTMLElement>> {
30
- return this.element.waitForSelector('.p-Menu-itemShortcut');
31
- }
32
-
33
- protected isHidden(): Promise<boolean> {
34
- return elementContainsClass(this.element, 'p-mod-collapsed');
35
- }
36
-
37
- async label(): Promise<string | undefined> {
38
- if (await this.isHidden()) {
39
- return undefined;
40
- }
41
- return textContent(this.labelElementHandle());
42
- }
43
-
44
- async shortCut(): Promise<string | undefined> {
45
- if (await this.isHidden()) {
46
- return undefined;
47
- }
48
- return textContent(this.shortCutElementHandle());
49
- }
50
-
51
- async hasSubmenu(): Promise<boolean> {
52
- if (await this.isHidden()) {
53
- return false;
54
- }
55
- return (await this.element.getAttribute('data-type')) === 'submenu';
56
- }
57
-
58
- async isEnabled(): Promise<boolean> {
59
- const classAttribute = (await this.element.getAttribute('class'));
60
- if (classAttribute === undefined || classAttribute === null) {
61
- return false;
62
- }
63
- return !classAttribute.includes('p-mod-disabled') && !classAttribute.includes('p-mod-collapsed');
64
- }
65
-
66
- async click(): Promise<void> {
67
- return this.element.waitForSelector('.p-Menu-itemLabel')
68
- .then(labelElement => labelElement.click({ position: { x: 10, y: 10 } }));
69
- }
70
-
71
- async hover(): Promise<void> {
72
- return this.element.hover();
73
- }
74
-
75
- }
1
+ // *****************************************************************************
2
+ // Copyright (C) 2021 logi.cals GmbH, EclipseSource 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 { ElementHandle } from '@playwright/test';
18
+
19
+ import { elementContainsClass, textContent } from './util';
20
+
21
+ export class TheiaMenuItem {
22
+
23
+ constructor(protected element: ElementHandle<SVGElement | HTMLElement>) { }
24
+
25
+ protected labelElementHandle(): Promise<ElementHandle<SVGElement | HTMLElement>> {
26
+ return this.element.waitForSelector('.p-Menu-itemLabel');
27
+ }
28
+
29
+ protected shortCutElementHandle(): Promise<ElementHandle<SVGElement | HTMLElement>> {
30
+ return this.element.waitForSelector('.p-Menu-itemShortcut');
31
+ }
32
+
33
+ protected isHidden(): Promise<boolean> {
34
+ return elementContainsClass(this.element, 'p-mod-collapsed');
35
+ }
36
+
37
+ async label(): Promise<string | undefined> {
38
+ if (await this.isHidden()) {
39
+ return undefined;
40
+ }
41
+ return textContent(this.labelElementHandle());
42
+ }
43
+
44
+ async shortCut(): Promise<string | undefined> {
45
+ if (await this.isHidden()) {
46
+ return undefined;
47
+ }
48
+ return textContent(this.shortCutElementHandle());
49
+ }
50
+
51
+ async hasSubmenu(): Promise<boolean> {
52
+ if (await this.isHidden()) {
53
+ return false;
54
+ }
55
+ return (await this.element.getAttribute('data-type')) === 'submenu';
56
+ }
57
+
58
+ async isEnabled(): Promise<boolean> {
59
+ const classAttribute = (await this.element.getAttribute('class'));
60
+ if (classAttribute === undefined || classAttribute === null) {
61
+ return false;
62
+ }
63
+ return !classAttribute.includes('p-mod-disabled') && !classAttribute.includes('p-mod-collapsed');
64
+ }
65
+
66
+ async click(): Promise<void> {
67
+ return this.element.waitForSelector('.p-Menu-itemLabel')
68
+ .then(labelElement => labelElement.click({ position: { x: 10, y: 10 } }));
69
+ }
70
+
71
+ async hover(): Promise<void> {
72
+ return this.element.hover();
73
+ }
74
+
75
+ }
package/src/theia-menu.ts CHANGED
@@ -1,96 +1,96 @@
1
- // *****************************************************************************
2
- // Copyright (C) 2021 logi.cals GmbH, EclipseSource 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 { ElementHandle } from '@playwright/test';
18
-
19
- import { TheiaMenuItem } from './theia-menu-item';
20
- import { TheiaPageObject } from './theia-page-object';
21
- import { isDefined } from './util';
22
-
23
- export class TheiaMenu extends TheiaPageObject {
24
-
25
- selector = '.p-Menu';
26
-
27
- protected async menuElementHandle(): Promise<ElementHandle<SVGElement | HTMLElement> | null> {
28
- return this.page.$(this.selector);
29
- }
30
-
31
- async waitForVisible(): Promise<void> {
32
- await this.page.waitForSelector(this.selector, { state: 'visible' });
33
- }
34
-
35
- async isOpen(): Promise<boolean> {
36
- const menu = await this.menuElementHandle();
37
- return !!menu && menu.isVisible();
38
- }
39
-
40
- async close(): Promise<void> {
41
- if (!await this.isOpen()) {
42
- return;
43
- }
44
- await this.page.mouse.click(0, 0);
45
- await this.page.waitForSelector(this.selector, { state: 'detached' });
46
- }
47
-
48
- async menuItems(): Promise<TheiaMenuItem[]> {
49
- const menuHandle = await this.menuElementHandle();
50
- if (!menuHandle) {
51
- return [];
52
- }
53
- const items = await menuHandle.$$('.p-Menu-content .p-Menu-item');
54
- return items.map(element => new TheiaMenuItem(element));
55
- }
56
-
57
- async clickMenuItem(name: string): Promise<void> {
58
- return (await this.page.waitForSelector(this.menuItemSelector(name))).click();
59
- }
60
-
61
- async menuItemByName(name: string): Promise<TheiaMenuItem | undefined> {
62
- const menuItems = await this.menuItems();
63
- for (const item of menuItems) {
64
- const label = await item.label();
65
- if (label === name) {
66
- return item;
67
- }
68
- }
69
- return undefined;
70
- }
71
-
72
- async menuItemByNamePath(...names: string[]): Promise<TheiaMenuItem | undefined> {
73
- let item;
74
- for (let index = 0; index < names.length; index++) {
75
- item = await this.page.waitForSelector(this.menuItemSelector(names[index]), { state: 'visible' });
76
- await item.hover();
77
- }
78
-
79
- const menuItemHandle = await item?.$('xpath=..');
80
- if (menuItemHandle) {
81
- return new TheiaMenuItem(menuItemHandle);
82
- }
83
- return undefined;
84
- }
85
-
86
- protected menuItemSelector(label = ''): string {
87
- return `.p-Menu-content .p-Menu-itemLabel >> text=${label}`;
88
- }
89
-
90
- async visibleMenuItems(): Promise<string[]> {
91
- const menuItems = await this.menuItems();
92
- const labels = await Promise.all(menuItems.map(item => item.label()));
93
- return labels.filter(isDefined);
94
- }
95
-
96
- }
1
+ // *****************************************************************************
2
+ // Copyright (C) 2021 logi.cals GmbH, EclipseSource 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 { ElementHandle } from '@playwright/test';
18
+
19
+ import { TheiaMenuItem } from './theia-menu-item';
20
+ import { TheiaPageObject } from './theia-page-object';
21
+ import { isDefined } from './util';
22
+
23
+ export class TheiaMenu extends TheiaPageObject {
24
+
25
+ selector = '.p-Menu';
26
+
27
+ protected async menuElementHandle(): Promise<ElementHandle<SVGElement | HTMLElement> | null> {
28
+ return this.page.$(this.selector);
29
+ }
30
+
31
+ async waitForVisible(): Promise<void> {
32
+ await this.page.waitForSelector(this.selector, { state: 'visible' });
33
+ }
34
+
35
+ async isOpen(): Promise<boolean> {
36
+ const menu = await this.menuElementHandle();
37
+ return !!menu && menu.isVisible();
38
+ }
39
+
40
+ async close(): Promise<void> {
41
+ if (!await this.isOpen()) {
42
+ return;
43
+ }
44
+ await this.page.mouse.click(0, 0);
45
+ await this.page.waitForSelector(this.selector, { state: 'detached' });
46
+ }
47
+
48
+ async menuItems(): Promise<TheiaMenuItem[]> {
49
+ const menuHandle = await this.menuElementHandle();
50
+ if (!menuHandle) {
51
+ return [];
52
+ }
53
+ const items = await menuHandle.$$('.p-Menu-content .p-Menu-item');
54
+ return items.map(element => new TheiaMenuItem(element));
55
+ }
56
+
57
+ async clickMenuItem(name: string): Promise<void> {
58
+ return (await this.page.waitForSelector(this.menuItemSelector(name))).click();
59
+ }
60
+
61
+ async menuItemByName(name: string): Promise<TheiaMenuItem | undefined> {
62
+ const menuItems = await this.menuItems();
63
+ for (const item of menuItems) {
64
+ const label = await item.label();
65
+ if (label === name) {
66
+ return item;
67
+ }
68
+ }
69
+ return undefined;
70
+ }
71
+
72
+ async menuItemByNamePath(...names: string[]): Promise<TheiaMenuItem | undefined> {
73
+ let item;
74
+ for (let index = 0; index < names.length; index++) {
75
+ item = await this.page.waitForSelector(this.menuItemSelector(names[index]), { state: 'visible' });
76
+ await item.hover();
77
+ }
78
+
79
+ const menuItemHandle = await item?.$('xpath=..');
80
+ if (menuItemHandle) {
81
+ return new TheiaMenuItem(menuItemHandle);
82
+ }
83
+ return undefined;
84
+ }
85
+
86
+ protected menuItemSelector(label = ''): string {
87
+ return `.p-Menu-content .p-Menu-itemLabel >> text=${label}`;
88
+ }
89
+
90
+ async visibleMenuItems(): Promise<string[]> {
91
+ const menuItems = await this.menuItems();
92
+ const labels = await Promise.all(menuItems.map(item => item.label()));
93
+ return labels.filter(isDefined);
94
+ }
95
+
96
+ }
@@ -1,83 +1,83 @@
1
- // *****************************************************************************
2
- // Copyright (C) 2023 EclipseSource 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 { ElementHandle } from '@playwright/test';
18
- import { TheiaPageObject } from './theia-page-object';
19
- import { TheiaApp } from './theia-app';
20
-
21
- export class TheiaMonacoEditor extends TheiaPageObject {
22
- constructor(protected readonly selector: string, app: TheiaApp) {
23
- super(app);
24
- }
25
-
26
- async waitForVisible(): Promise<void> {
27
- await this.page.waitForSelector(this.selector, { state: 'visible' });
28
- }
29
-
30
- protected viewElement(): Promise<ElementHandle<SVGElement | HTMLElement> | null> {
31
- return this.page.$(this.selector);
32
- }
33
-
34
- async numberOfLines(): Promise<number | undefined> {
35
- await this.waitForVisible();
36
- const viewElement = await this.viewElement();
37
- const lineElements = await viewElement?.$$('.view-lines .view-line');
38
- return lineElements?.length;
39
- }
40
-
41
- async textContentOfLineByLineNumber(lineNumber: number): Promise<string | undefined> {
42
- await this.waitForVisible();
43
- const lineElement = await this.lineByLineNumber(lineNumber);
44
- const content = await lineElement?.textContent();
45
- return content ? this.replaceEditorSymbolsWithSpace(content) : undefined;
46
- }
47
-
48
- async lineByLineNumber(lineNumber: number): Promise<ElementHandle<SVGElement | HTMLElement> | undefined> {
49
- await this.waitForVisible();
50
- const viewElement = await this.viewElement();
51
- const lines = await viewElement?.$$('.view-lines > .view-line');
52
- if (!lines) {
53
- throw new Error('Couldn\'t retrieve lines of monaco editor');
54
- }
55
-
56
- const linesWithXCoordinates = [];
57
- for (const lineElement of lines) {
58
- const box = await lineElement.boundingBox();
59
- linesWithXCoordinates.push({ x: box ? box.x : Number.MAX_VALUE, lineElement });
60
- }
61
- linesWithXCoordinates.sort((a, b) => a.x.toString().localeCompare(b.x.toString()));
62
- return linesWithXCoordinates[lineNumber - 1].lineElement;
63
- }
64
-
65
- async textContentOfLineContainingText(text: string): Promise<string | undefined> {
66
- await this.waitForVisible();
67
- const lineElement = await this.lineContainingText(text);
68
- const content = await lineElement?.textContent();
69
- return content ? this.replaceEditorSymbolsWithSpace(content) : undefined;
70
- }
71
-
72
- async lineContainingText(text: string): Promise<ElementHandle<SVGElement | HTMLElement> | undefined> {
73
- const viewElement = await this.viewElement();
74
- return viewElement?.waitForSelector(`.view-lines .view-line:has-text("${text}")`);
75
- }
76
-
77
- protected replaceEditorSymbolsWithSpace(content: string): string | Promise<string | undefined> {
78
- // [ ] &nbsp; => \u00a0 -- NO-BREAK SPACE
79
- // [·] &middot; => \u00b7 -- MIDDLE DOT
80
- // [] &zwnj; => \u200c -- ZERO WIDTH NON-JOINER
81
- return content.replace(/[\u00a0\u00b7]/g, ' ').replace(/[\u200c]/g, '');
82
- }
83
- }
1
+ // *****************************************************************************
2
+ // Copyright (C) 2023 EclipseSource 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 { ElementHandle } from '@playwright/test';
18
+ import { TheiaPageObject } from './theia-page-object';
19
+ import { TheiaApp } from './theia-app';
20
+
21
+ export class TheiaMonacoEditor extends TheiaPageObject {
22
+ constructor(protected readonly selector: string, app: TheiaApp) {
23
+ super(app);
24
+ }
25
+
26
+ async waitForVisible(): Promise<void> {
27
+ await this.page.waitForSelector(this.selector, { state: 'visible' });
28
+ }
29
+
30
+ protected viewElement(): Promise<ElementHandle<SVGElement | HTMLElement> | null> {
31
+ return this.page.$(this.selector);
32
+ }
33
+
34
+ async numberOfLines(): Promise<number | undefined> {
35
+ await this.waitForVisible();
36
+ const viewElement = await this.viewElement();
37
+ const lineElements = await viewElement?.$$('.view-lines .view-line');
38
+ return lineElements?.length;
39
+ }
40
+
41
+ async textContentOfLineByLineNumber(lineNumber: number): Promise<string | undefined> {
42
+ await this.waitForVisible();
43
+ const lineElement = await this.lineByLineNumber(lineNumber);
44
+ const content = await lineElement?.textContent();
45
+ return content ? this.replaceEditorSymbolsWithSpace(content) : undefined;
46
+ }
47
+
48
+ async lineByLineNumber(lineNumber: number): Promise<ElementHandle<SVGElement | HTMLElement> | undefined> {
49
+ await this.waitForVisible();
50
+ const viewElement = await this.viewElement();
51
+ const lines = await viewElement?.$$('.view-lines > .view-line');
52
+ if (!lines) {
53
+ throw new Error('Couldn\'t retrieve lines of monaco editor');
54
+ }
55
+
56
+ const linesWithXCoordinates = [];
57
+ for (const lineElement of lines) {
58
+ const box = await lineElement.boundingBox();
59
+ linesWithXCoordinates.push({ x: box ? box.x : Number.MAX_VALUE, lineElement });
60
+ }
61
+ linesWithXCoordinates.sort((a, b) => a.x.toString().localeCompare(b.x.toString()));
62
+ return linesWithXCoordinates[lineNumber - 1].lineElement;
63
+ }
64
+
65
+ async textContentOfLineContainingText(text: string): Promise<string | undefined> {
66
+ await this.waitForVisible();
67
+ const lineElement = await this.lineContainingText(text);
68
+ const content = await lineElement?.textContent();
69
+ return content ? this.replaceEditorSymbolsWithSpace(content) : undefined;
70
+ }
71
+
72
+ async lineContainingText(text: string): Promise<ElementHandle<SVGElement | HTMLElement> | undefined> {
73
+ const viewElement = await this.viewElement();
74
+ return viewElement?.waitForSelector(`.view-lines .view-line:has-text("${text}")`);
75
+ }
76
+
77
+ protected replaceEditorSymbolsWithSpace(content: string): string | Promise<string | undefined> {
78
+ // [ ] &nbsp; => \u00a0 -- NO-BREAK SPACE
79
+ // [·] &middot; => \u00b7 -- MIDDLE DOT
80
+ // [] &zwnj; => \u200c -- ZERO WIDTH NON-JOINER
81
+ return content.replace(/[\u00a0\u00b7]/g, ' ').replace(/[\u200c]/g, '');
82
+ }
83
+ }