Path: blob/main/src/vs/editor/contrib/hover/test/browser/hoverUtils.test.ts
5256 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 { isMousePositionWithinElement, isTriggerModifierPressed, shouldShowHover } from '../../browser/hoverUtils.js';8import { IEditorMouseEvent } from '../../../../browser/editorBrowser.js';910suite('Hover Utils', () => {1112ensureNoDisposablesAreLeakedInTestSuite();1314suite('shouldShowHover', () => {1516function createMockMouseEvent(ctrlKey: boolean, altKey: boolean, metaKey: boolean): IEditorMouseEvent {17return {18event: {19ctrlKey,20altKey,21metaKey,22shiftKey: false,23}24} as IEditorMouseEvent;25}2627test('returns true when enabled is "on"', () => {28const mouseEvent = createMockMouseEvent(false, false, false);29const result = shouldShowHover('on', 'altKey', mouseEvent);30assert.strictEqual(result, true);31});3233test('returns false when enabled is "off"', () => {34const mouseEvent = createMockMouseEvent(false, false, false);35const result = shouldShowHover('off', 'altKey', mouseEvent);36assert.strictEqual(result, false);37});3839test('returns true with ctrl pressed when multiCursorModifier is altKey', () => {40const mouseEvent = createMockMouseEvent(true, false, false);41const result = shouldShowHover('onKeyboardModifier', 'altKey', mouseEvent);42assert.strictEqual(result, true);43});4445test('returns false without ctrl pressed when multiCursorModifier is altKey', () => {46const mouseEvent = createMockMouseEvent(false, false, false);47const result = shouldShowHover('onKeyboardModifier', 'altKey', mouseEvent);48assert.strictEqual(result, false);49});5051test('returns true with metaKey pressed when multiCursorModifier is altKey', () => {52const mouseEvent = createMockMouseEvent(false, false, true);53const result = shouldShowHover('onKeyboardModifier', 'altKey', mouseEvent);54assert.strictEqual(result, true);55});5657test('returns true with alt pressed when multiCursorModifier is ctrlKey', () => {58const mouseEvent = createMockMouseEvent(false, true, false);59const result = shouldShowHover('onKeyboardModifier', 'ctrlKey', mouseEvent);60assert.strictEqual(result, true);61});6263test('returns false without alt pressed when multiCursorModifier is ctrlKey', () => {64const mouseEvent = createMockMouseEvent(false, false, false);65const result = shouldShowHover('onKeyboardModifier', 'ctrlKey', mouseEvent);66assert.strictEqual(result, false);67});6869test('returns true with alt pressed when multiCursorModifier is metaKey', () => {70const mouseEvent = createMockMouseEvent(false, true, false);71const result = shouldShowHover('onKeyboardModifier', 'metaKey', mouseEvent);72assert.strictEqual(result, true);73});7475test('ignores alt when multiCursorModifier is altKey', () => {76const mouseEvent = createMockMouseEvent(false, true, false);77const result = shouldShowHover('onKeyboardModifier', 'altKey', mouseEvent);78assert.strictEqual(result, false);79});8081test('ignores ctrl when multiCursorModifier is ctrlKey', () => {82const mouseEvent = createMockMouseEvent(true, false, false);83const result = shouldShowHover('onKeyboardModifier', 'ctrlKey', mouseEvent);84assert.strictEqual(result, false);85});86});8788suite('isMousePositionWithinElement', () => {8990function createMockElement(left: number, top: number, width: number, height: number): HTMLElement {91const element = document.createElement('div');92// Mock getDomNodePagePosition by setting up the element's bounding rect93element.getBoundingClientRect = () => ({94left,95top,96width,97height,98right: left + width,99bottom: top + height,100x: left,101y: top,102toJSON: () => { }103});104return element;105}106107test('returns true when mouse is inside element bounds', () => {108const element = createMockElement(100, 100, 200, 100);109assert.strictEqual(isMousePositionWithinElement(element, 150, 150), true);110assert.strictEqual(isMousePositionWithinElement(element, 200, 150), true);111assert.strictEqual(isMousePositionWithinElement(element, 250, 180), true);112});113114test('returns true when mouse is on element edges', () => {115const element = createMockElement(100, 100, 200, 100);116assert.strictEqual(isMousePositionWithinElement(element, 100, 100), true); // top-left corner117assert.strictEqual(isMousePositionWithinElement(element, 300, 100), true); // top-right corner118assert.strictEqual(isMousePositionWithinElement(element, 100, 200), true); // bottom-left corner119assert.strictEqual(isMousePositionWithinElement(element, 300, 200), true); // bottom-right corner120});121122test('returns false when mouse is left of element', () => {123const element = createMockElement(100, 100, 200, 100);124assert.strictEqual(isMousePositionWithinElement(element, 99, 150), false);125assert.strictEqual(isMousePositionWithinElement(element, 50, 150), false);126});127128test('returns false when mouse is right of element', () => {129const element = createMockElement(100, 100, 200, 100);130assert.strictEqual(isMousePositionWithinElement(element, 301, 150), false);131assert.strictEqual(isMousePositionWithinElement(element, 400, 150), false);132});133134test('returns false when mouse is above element', () => {135const element = createMockElement(100, 100, 200, 100);136assert.strictEqual(isMousePositionWithinElement(element, 200, 99), false);137assert.strictEqual(isMousePositionWithinElement(element, 200, 50), false);138});139140test('returns false when mouse is below element', () => {141const element = createMockElement(100, 100, 200, 100);142assert.strictEqual(isMousePositionWithinElement(element, 200, 201), false);143assert.strictEqual(isMousePositionWithinElement(element, 200, 300), false);144});145146test('handles element at origin (0,0)', () => {147const element = createMockElement(0, 0, 100, 100);148assert.strictEqual(isMousePositionWithinElement(element, 0, 0), true);149assert.strictEqual(isMousePositionWithinElement(element, 50, 50), true);150assert.strictEqual(isMousePositionWithinElement(element, 100, 100), true);151assert.strictEqual(isMousePositionWithinElement(element, 101, 101), false);152});153154test('handles small elements (1x1)', () => {155const element = createMockElement(100, 100, 1, 1);156assert.strictEqual(isMousePositionWithinElement(element, 100, 100), true);157assert.strictEqual(isMousePositionWithinElement(element, 101, 101), true);158assert.strictEqual(isMousePositionWithinElement(element, 102, 102), false);159});160});161162suite('isTriggerModifierPressed', () => {163164function createModifierEvent(ctrlKey: boolean, altKey: boolean, metaKey: boolean) {165return { ctrlKey, altKey, metaKey };166}167168test('returns true with ctrl pressed when multiCursorModifier is altKey', () => {169const event = createModifierEvent(true, false, false);170assert.strictEqual(isTriggerModifierPressed('altKey', event), true);171});172173test('returns true with metaKey pressed when multiCursorModifier is altKey', () => {174const event = createModifierEvent(false, false, true);175assert.strictEqual(isTriggerModifierPressed('altKey', event), true);176});177178test('returns true with both ctrl and metaKey pressed when multiCursorModifier is altKey', () => {179const event = createModifierEvent(true, false, true);180assert.strictEqual(isTriggerModifierPressed('altKey', event), true);181});182183test('returns false without ctrl or metaKey when multiCursorModifier is altKey', () => {184const event = createModifierEvent(false, false, false);185assert.strictEqual(isTriggerModifierPressed('altKey', event), false);186});187188test('returns false with alt pressed when multiCursorModifier is altKey', () => {189const event = createModifierEvent(false, true, false);190assert.strictEqual(isTriggerModifierPressed('altKey', event), false);191});192193test('returns true with alt pressed when multiCursorModifier is ctrlKey', () => {194const event = createModifierEvent(false, true, false);195assert.strictEqual(isTriggerModifierPressed('ctrlKey', event), true);196});197198test('returns false without alt pressed when multiCursorModifier is ctrlKey', () => {199const event = createModifierEvent(false, false, false);200assert.strictEqual(isTriggerModifierPressed('ctrlKey', event), false);201});202203test('returns false with ctrl pressed when multiCursorModifier is ctrlKey', () => {204const event = createModifierEvent(true, false, false);205assert.strictEqual(isTriggerModifierPressed('ctrlKey', event), false);206});207208test('returns true with alt pressed when multiCursorModifier is metaKey', () => {209const event = createModifierEvent(false, true, false);210assert.strictEqual(isTriggerModifierPressed('metaKey', event), true);211});212213test('returns false without alt pressed when multiCursorModifier is metaKey', () => {214const event = createModifierEvent(false, false, false);215assert.strictEqual(isTriggerModifierPressed('metaKey', event), false);216});217218test('returns false with metaKey pressed when multiCursorModifier is metaKey', () => {219const event = createModifierEvent(false, false, true);220assert.strictEqual(isTriggerModifierPressed('metaKey', event), false);221});222});223});224225226