Path: blob/main/src/vs/editor/contrib/hover/test/browser/hoverCopyButton.test.ts
5240 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';7import { DisposableStore } from '../../../../../base/common/lifecycle.js';8import { HoverCopyButton } from '../../browser/hoverCopyButton.js';9import { TestClipboardService } from '../../../../../platform/clipboard/test/common/testClipboardService.js';10import { IHoverService } from '../../../../../platform/hover/browser/hover.js';11import { NullHoverService } from '../../../../../platform/hover/test/browser/nullHoverService.js';12import { mainWindow } from '../../../../../base/browser/window.js';1314suite('Hover Copy Button', () => {15const disposables = new DisposableStore();16let clipboardService: TestClipboardService;17let hoverService: IHoverService;18let container: HTMLElement;1920setup(() => {21clipboardService = new TestClipboardService();22hoverService = NullHoverService;23container = mainWindow.document.createElement('div');24mainWindow.document.body.appendChild(container);25});2627teardown(() => {28disposables.clear();29if (container.parentElement) {30container.parentElement.removeChild(container);31}32});3334ensureNoDisposablesAreLeakedInTestSuite();3536test('should create button element in container', () => {37disposables.add(new HoverCopyButton(38container,39() => 'test content',40clipboardService,41hoverService42));4344const buttonElement = container.querySelector('.hover-copy-button');45assert.ok(buttonElement, 'Button element should be created');46assert.strictEqual(buttonElement?.getAttribute('role'), 'button');47assert.strictEqual(buttonElement?.getAttribute('tabindex'), '0');48assert.strictEqual(buttonElement?.getAttribute('aria-label'), 'Copy');49});5051test('should add hover-row-with-copy class to container', () => {52assert.ok(!container.classList.contains('hover-row-with-copy'), 'Container should not have class before button creation');5354disposables.add(new HoverCopyButton(55container,56() => 'test content',57clipboardService,58hoverService59));6061assert.ok(container.classList.contains('hover-row-with-copy'), 'Container should have hover-row-with-copy class after button creation');62});6364test('should have copy icon', () => {65disposables.add(new HoverCopyButton(66container,67() => 'test content',68clipboardService,69hoverService70));7172const icon = container.querySelector('.codicon-copy');73assert.ok(icon, 'Copy icon should be present');74});7576test('should copy content on click', async () => {77const testContent = 'test content to copy';78disposables.add(new HoverCopyButton(79container,80() => testContent,81clipboardService,82hoverService83));8485const buttonElement = container.querySelector('.hover-copy-button') as HTMLElement;86assert.ok(buttonElement);8788buttonElement.click();8990const copiedText = await clipboardService.readText();91assert.strictEqual(copiedText, testContent, 'Content should be copied to clipboard');92});9394test('should copy content on Enter key', async () => {95const testContent = 'test content for enter key';96disposables.add(new HoverCopyButton(97container,98() => testContent,99clipboardService,100hoverService101));102103const buttonElement = container.querySelector('.hover-copy-button') as HTMLElement;104assert.ok(buttonElement);105106// Simulate Enter key press - need to override keyCode for StandardKeyboardEvent107const keyEvent = new KeyboardEvent('keydown', {108key: 'Enter',109code: 'Enter',110bubbles: true111});112Object.defineProperty(keyEvent, 'keyCode', { get: () => 13 }); // Enter keyCode113buttonElement.dispatchEvent(keyEvent);114115const copiedText = await clipboardService.readText();116assert.strictEqual(copiedText, testContent, 'Content should be copied on Enter key');117});118119test('should copy content on Space key', async () => {120const testContent = 'test content for space key';121disposables.add(new HoverCopyButton(122container,123() => testContent,124clipboardService,125hoverService126));127128const buttonElement = container.querySelector('.hover-copy-button') as HTMLElement;129assert.ok(buttonElement);130131// Simulate Space key press - need to override keyCode for StandardKeyboardEvent132const keyEvent = new KeyboardEvent('keydown', {133key: ' ',134code: 'Space',135bubbles: true136});137Object.defineProperty(keyEvent, 'keyCode', { get: () => 32 }); // Space keyCode138buttonElement.dispatchEvent(keyEvent);139140const copiedText = await clipboardService.readText();141assert.strictEqual(copiedText, testContent, 'Content should be copied on Space key');142});143});144145146