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