Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/hover/test/browser/hoverCopyButton.test.ts
5240 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
8
import { DisposableStore } from '../../../../../base/common/lifecycle.js';
9
import { HoverCopyButton } from '../../browser/hoverCopyButton.js';
10
import { TestClipboardService } from '../../../../../platform/clipboard/test/common/testClipboardService.js';
11
import { IHoverService } from '../../../../../platform/hover/browser/hover.js';
12
import { NullHoverService } from '../../../../../platform/hover/test/browser/nullHoverService.js';
13
import { mainWindow } from '../../../../../base/browser/window.js';
14
15
suite('Hover Copy Button', () => {
16
const disposables = new DisposableStore();
17
let clipboardService: TestClipboardService;
18
let hoverService: IHoverService;
19
let container: HTMLElement;
20
21
setup(() => {
22
clipboardService = new TestClipboardService();
23
hoverService = NullHoverService;
24
container = mainWindow.document.createElement('div');
25
mainWindow.document.body.appendChild(container);
26
});
27
28
teardown(() => {
29
disposables.clear();
30
if (container.parentElement) {
31
container.parentElement.removeChild(container);
32
}
33
});
34
35
ensureNoDisposablesAreLeakedInTestSuite();
36
37
test('should create button element in container', () => {
38
disposables.add(new HoverCopyButton(
39
container,
40
() => 'test content',
41
clipboardService,
42
hoverService
43
));
44
45
const buttonElement = container.querySelector('.hover-copy-button');
46
assert.ok(buttonElement, 'Button element should be created');
47
assert.strictEqual(buttonElement?.getAttribute('role'), 'button');
48
assert.strictEqual(buttonElement?.getAttribute('tabindex'), '0');
49
assert.strictEqual(buttonElement?.getAttribute('aria-label'), 'Copy');
50
});
51
52
test('should add hover-row-with-copy class to container', () => {
53
assert.ok(!container.classList.contains('hover-row-with-copy'), 'Container should not have class before button creation');
54
55
disposables.add(new HoverCopyButton(
56
container,
57
() => 'test content',
58
clipboardService,
59
hoverService
60
));
61
62
assert.ok(container.classList.contains('hover-row-with-copy'), 'Container should have hover-row-with-copy class after button creation');
63
});
64
65
test('should have copy icon', () => {
66
disposables.add(new HoverCopyButton(
67
container,
68
() => 'test content',
69
clipboardService,
70
hoverService
71
));
72
73
const icon = container.querySelector('.codicon-copy');
74
assert.ok(icon, 'Copy icon should be present');
75
});
76
77
test('should copy content on click', async () => {
78
const testContent = 'test content to copy';
79
disposables.add(new HoverCopyButton(
80
container,
81
() => testContent,
82
clipboardService,
83
hoverService
84
));
85
86
const buttonElement = container.querySelector('.hover-copy-button') as HTMLElement;
87
assert.ok(buttonElement);
88
89
buttonElement.click();
90
91
const copiedText = await clipboardService.readText();
92
assert.strictEqual(copiedText, testContent, 'Content should be copied to clipboard');
93
});
94
95
test('should copy content on Enter key', async () => {
96
const testContent = 'test content for enter key';
97
disposables.add(new HoverCopyButton(
98
container,
99
() => testContent,
100
clipboardService,
101
hoverService
102
));
103
104
const buttonElement = container.querySelector('.hover-copy-button') as HTMLElement;
105
assert.ok(buttonElement);
106
107
// Simulate Enter key press - need to override keyCode for StandardKeyboardEvent
108
const keyEvent = new KeyboardEvent('keydown', {
109
key: 'Enter',
110
code: 'Enter',
111
bubbles: true
112
});
113
Object.defineProperty(keyEvent, 'keyCode', { get: () => 13 }); // Enter keyCode
114
buttonElement.dispatchEvent(keyEvent);
115
116
const copiedText = await clipboardService.readText();
117
assert.strictEqual(copiedText, testContent, 'Content should be copied on Enter key');
118
});
119
120
test('should copy content on Space key', async () => {
121
const testContent = 'test content for space key';
122
disposables.add(new HoverCopyButton(
123
container,
124
() => testContent,
125
clipboardService,
126
hoverService
127
));
128
129
const buttonElement = container.querySelector('.hover-copy-button') as HTMLElement;
130
assert.ok(buttonElement);
131
132
// Simulate Space key press - need to override keyCode for StandardKeyboardEvent
133
const keyEvent = new KeyboardEvent('keydown', {
134
key: ' ',
135
code: 'Space',
136
bubbles: true
137
});
138
Object.defineProperty(keyEvent, 'keyCode', { get: () => 32 }); // Space keyCode
139
buttonElement.dispatchEvent(keyEvent);
140
141
const copiedText = await clipboardService.readText();
142
assert.strictEqual(copiedText, testContent, 'Content should be copied on Space key');
143
});
144
});
145
146