Path: blob/main/src/vs/editor/contrib/hover/test/browser/hoverCopyButton.test.ts
4780 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*--------------------------------------------------------------------------------------------*/45/* eslint-disable no-restricted-syntax */67import assert from 'assert';8import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';9import { DisposableStore } from '../../../../../base/common/lifecycle.js';10import { HoverCopyButton } from '../../browser/hoverCopyButton.js';11import { TestClipboardService } from '../../../../../platform/clipboard/test/common/testClipboardService.js';12import { IHoverService } from '../../../../../platform/hover/browser/hover.js';13import { NullHoverService } from '../../../../../platform/hover/test/browser/nullHoverService.js';14import { mainWindow } from '../../../../../base/browser/window.js';1516suite('Hover Copy Button', () => {17const disposables = new DisposableStore();18let clipboardService: TestClipboardService;19let hoverService: IHoverService;20let container: HTMLElement;2122setup(() => {23clipboardService = new TestClipboardService();24hoverService = NullHoverService;25container = mainWindow.document.createElement('div');26mainWindow.document.body.appendChild(container);27});2829teardown(() => {30disposables.clear();31if (container.parentElement) {32container.parentElement.removeChild(container);33}34});3536ensureNoDisposablesAreLeakedInTestSuite();3738test('should create button element in container', () => {39disposables.add(new HoverCopyButton(40container,41() => 'test content',42clipboardService,43hoverService44));4546const buttonElement = container.querySelector('.hover-copy-button');47assert.ok(buttonElement, 'Button element should be created');48assert.strictEqual(buttonElement?.getAttribute('role'), 'button');49assert.strictEqual(buttonElement?.getAttribute('tabindex'), '0');50assert.strictEqual(buttonElement?.getAttribute('aria-label'), 'Copy');51});5253test('should add hover-row-with-copy class to container', () => {54assert.ok(!container.classList.contains('hover-row-with-copy'), 'Container should not have class before button creation');5556disposables.add(new HoverCopyButton(57container,58() => 'test content',59clipboardService,60hoverService61));6263assert.ok(container.classList.contains('hover-row-with-copy'), 'Container should have hover-row-with-copy class after button creation');64});6566test('should have copy icon', () => {67disposables.add(new HoverCopyButton(68container,69() => 'test content',70clipboardService,71hoverService72));7374const icon = container.querySelector('.codicon-copy');75assert.ok(icon, 'Copy icon should be present');76});7778test('should copy content on click', async () => {79const testContent = 'test content to copy';80disposables.add(new HoverCopyButton(81container,82() => testContent,83clipboardService,84hoverService85));8687const buttonElement = container.querySelector('.hover-copy-button') as HTMLElement;88assert.ok(buttonElement);8990buttonElement.click();9192const copiedText = await clipboardService.readText();93assert.strictEqual(copiedText, testContent, 'Content should be copied to clipboard');94});9596test('should copy content on Enter key', async () => {97const testContent = 'test content for enter key';98disposables.add(new HoverCopyButton(99container,100() => testContent,101clipboardService,102hoverService103));104105const buttonElement = container.querySelector('.hover-copy-button') as HTMLElement;106assert.ok(buttonElement);107108// Simulate Enter key press - need to override keyCode for StandardKeyboardEvent109const keyEvent = new KeyboardEvent('keydown', {110key: 'Enter',111code: 'Enter',112bubbles: true113});114Object.defineProperty(keyEvent, 'keyCode', { get: () => 13 }); // Enter keyCode115buttonElement.dispatchEvent(keyEvent);116117const copiedText = await clipboardService.readText();118assert.strictEqual(copiedText, testContent, 'Content should be copied on Enter key');119});120121test('should copy content on Space key', async () => {122const testContent = 'test content for space key';123disposables.add(new HoverCopyButton(124container,125() => testContent,126clipboardService,127hoverService128));129130const buttonElement = container.querySelector('.hover-copy-button') as HTMLElement;131assert.ok(buttonElement);132133// Simulate Space key press - need to override keyCode for StandardKeyboardEvent134const keyEvent = new KeyboardEvent('keydown', {135key: ' ',136code: 'Space',137bubbles: true138});139Object.defineProperty(keyEvent, 'keyCode', { get: () => 32 }); // Space keyCode140buttonElement.dispatchEvent(keyEvent);141142const copiedText = await clipboardService.readText();143assert.strictEqual(copiedText, testContent, 'Content should be copied on Space key');144});145});146147148