Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/hover/test/browser/hoverUtils.test.ts
5256 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 { isMousePositionWithinElement, isTriggerModifierPressed, shouldShowHover } from '../../browser/hoverUtils.js';
9
import { IEditorMouseEvent } from '../../../../browser/editorBrowser.js';
10
11
suite('Hover Utils', () => {
12
13
ensureNoDisposablesAreLeakedInTestSuite();
14
15
suite('shouldShowHover', () => {
16
17
function createMockMouseEvent(ctrlKey: boolean, altKey: boolean, metaKey: boolean): IEditorMouseEvent {
18
return {
19
event: {
20
ctrlKey,
21
altKey,
22
metaKey,
23
shiftKey: false,
24
}
25
} as IEditorMouseEvent;
26
}
27
28
test('returns true when enabled is "on"', () => {
29
const mouseEvent = createMockMouseEvent(false, false, false);
30
const result = shouldShowHover('on', 'altKey', mouseEvent);
31
assert.strictEqual(result, true);
32
});
33
34
test('returns false when enabled is "off"', () => {
35
const mouseEvent = createMockMouseEvent(false, false, false);
36
const result = shouldShowHover('off', 'altKey', mouseEvent);
37
assert.strictEqual(result, false);
38
});
39
40
test('returns true with ctrl pressed when multiCursorModifier is altKey', () => {
41
const mouseEvent = createMockMouseEvent(true, false, false);
42
const result = shouldShowHover('onKeyboardModifier', 'altKey', mouseEvent);
43
assert.strictEqual(result, true);
44
});
45
46
test('returns false without ctrl pressed when multiCursorModifier is altKey', () => {
47
const mouseEvent = createMockMouseEvent(false, false, false);
48
const result = shouldShowHover('onKeyboardModifier', 'altKey', mouseEvent);
49
assert.strictEqual(result, false);
50
});
51
52
test('returns true with metaKey pressed when multiCursorModifier is altKey', () => {
53
const mouseEvent = createMockMouseEvent(false, false, true);
54
const result = shouldShowHover('onKeyboardModifier', 'altKey', mouseEvent);
55
assert.strictEqual(result, true);
56
});
57
58
test('returns true with alt pressed when multiCursorModifier is ctrlKey', () => {
59
const mouseEvent = createMockMouseEvent(false, true, false);
60
const result = shouldShowHover('onKeyboardModifier', 'ctrlKey', mouseEvent);
61
assert.strictEqual(result, true);
62
});
63
64
test('returns false without alt pressed when multiCursorModifier is ctrlKey', () => {
65
const mouseEvent = createMockMouseEvent(false, false, false);
66
const result = shouldShowHover('onKeyboardModifier', 'ctrlKey', mouseEvent);
67
assert.strictEqual(result, false);
68
});
69
70
test('returns true with alt pressed when multiCursorModifier is metaKey', () => {
71
const mouseEvent = createMockMouseEvent(false, true, false);
72
const result = shouldShowHover('onKeyboardModifier', 'metaKey', mouseEvent);
73
assert.strictEqual(result, true);
74
});
75
76
test('ignores alt when multiCursorModifier is altKey', () => {
77
const mouseEvent = createMockMouseEvent(false, true, false);
78
const result = shouldShowHover('onKeyboardModifier', 'altKey', mouseEvent);
79
assert.strictEqual(result, false);
80
});
81
82
test('ignores ctrl when multiCursorModifier is ctrlKey', () => {
83
const mouseEvent = createMockMouseEvent(true, false, false);
84
const result = shouldShowHover('onKeyboardModifier', 'ctrlKey', mouseEvent);
85
assert.strictEqual(result, false);
86
});
87
});
88
89
suite('isMousePositionWithinElement', () => {
90
91
function createMockElement(left: number, top: number, width: number, height: number): HTMLElement {
92
const element = document.createElement('div');
93
// Mock getDomNodePagePosition by setting up the element's bounding rect
94
element.getBoundingClientRect = () => ({
95
left,
96
top,
97
width,
98
height,
99
right: left + width,
100
bottom: top + height,
101
x: left,
102
y: top,
103
toJSON: () => { }
104
});
105
return element;
106
}
107
108
test('returns true when mouse is inside element bounds', () => {
109
const element = createMockElement(100, 100, 200, 100);
110
assert.strictEqual(isMousePositionWithinElement(element, 150, 150), true);
111
assert.strictEqual(isMousePositionWithinElement(element, 200, 150), true);
112
assert.strictEqual(isMousePositionWithinElement(element, 250, 180), true);
113
});
114
115
test('returns true when mouse is on element edges', () => {
116
const element = createMockElement(100, 100, 200, 100);
117
assert.strictEqual(isMousePositionWithinElement(element, 100, 100), true); // top-left corner
118
assert.strictEqual(isMousePositionWithinElement(element, 300, 100), true); // top-right corner
119
assert.strictEqual(isMousePositionWithinElement(element, 100, 200), true); // bottom-left corner
120
assert.strictEqual(isMousePositionWithinElement(element, 300, 200), true); // bottom-right corner
121
});
122
123
test('returns false when mouse is left of element', () => {
124
const element = createMockElement(100, 100, 200, 100);
125
assert.strictEqual(isMousePositionWithinElement(element, 99, 150), false);
126
assert.strictEqual(isMousePositionWithinElement(element, 50, 150), false);
127
});
128
129
test('returns false when mouse is right of element', () => {
130
const element = createMockElement(100, 100, 200, 100);
131
assert.strictEqual(isMousePositionWithinElement(element, 301, 150), false);
132
assert.strictEqual(isMousePositionWithinElement(element, 400, 150), false);
133
});
134
135
test('returns false when mouse is above element', () => {
136
const element = createMockElement(100, 100, 200, 100);
137
assert.strictEqual(isMousePositionWithinElement(element, 200, 99), false);
138
assert.strictEqual(isMousePositionWithinElement(element, 200, 50), false);
139
});
140
141
test('returns false when mouse is below element', () => {
142
const element = createMockElement(100, 100, 200, 100);
143
assert.strictEqual(isMousePositionWithinElement(element, 200, 201), false);
144
assert.strictEqual(isMousePositionWithinElement(element, 200, 300), false);
145
});
146
147
test('handles element at origin (0,0)', () => {
148
const element = createMockElement(0, 0, 100, 100);
149
assert.strictEqual(isMousePositionWithinElement(element, 0, 0), true);
150
assert.strictEqual(isMousePositionWithinElement(element, 50, 50), true);
151
assert.strictEqual(isMousePositionWithinElement(element, 100, 100), true);
152
assert.strictEqual(isMousePositionWithinElement(element, 101, 101), false);
153
});
154
155
test('handles small elements (1x1)', () => {
156
const element = createMockElement(100, 100, 1, 1);
157
assert.strictEqual(isMousePositionWithinElement(element, 100, 100), true);
158
assert.strictEqual(isMousePositionWithinElement(element, 101, 101), true);
159
assert.strictEqual(isMousePositionWithinElement(element, 102, 102), false);
160
});
161
});
162
163
suite('isTriggerModifierPressed', () => {
164
165
function createModifierEvent(ctrlKey: boolean, altKey: boolean, metaKey: boolean) {
166
return { ctrlKey, altKey, metaKey };
167
}
168
169
test('returns true with ctrl pressed when multiCursorModifier is altKey', () => {
170
const event = createModifierEvent(true, false, false);
171
assert.strictEqual(isTriggerModifierPressed('altKey', event), true);
172
});
173
174
test('returns true with metaKey pressed when multiCursorModifier is altKey', () => {
175
const event = createModifierEvent(false, false, true);
176
assert.strictEqual(isTriggerModifierPressed('altKey', event), true);
177
});
178
179
test('returns true with both ctrl and metaKey pressed when multiCursorModifier is altKey', () => {
180
const event = createModifierEvent(true, false, true);
181
assert.strictEqual(isTriggerModifierPressed('altKey', event), true);
182
});
183
184
test('returns false without ctrl or metaKey when multiCursorModifier is altKey', () => {
185
const event = createModifierEvent(false, false, false);
186
assert.strictEqual(isTriggerModifierPressed('altKey', event), false);
187
});
188
189
test('returns false with alt pressed when multiCursorModifier is altKey', () => {
190
const event = createModifierEvent(false, true, false);
191
assert.strictEqual(isTriggerModifierPressed('altKey', event), false);
192
});
193
194
test('returns true with alt pressed when multiCursorModifier is ctrlKey', () => {
195
const event = createModifierEvent(false, true, false);
196
assert.strictEqual(isTriggerModifierPressed('ctrlKey', event), true);
197
});
198
199
test('returns false without alt pressed when multiCursorModifier is ctrlKey', () => {
200
const event = createModifierEvent(false, false, false);
201
assert.strictEqual(isTriggerModifierPressed('ctrlKey', event), false);
202
});
203
204
test('returns false with ctrl pressed when multiCursorModifier is ctrlKey', () => {
205
const event = createModifierEvent(true, false, false);
206
assert.strictEqual(isTriggerModifierPressed('ctrlKey', event), false);
207
});
208
209
test('returns true with alt pressed when multiCursorModifier is metaKey', () => {
210
const event = createModifierEvent(false, true, false);
211
assert.strictEqual(isTriggerModifierPressed('metaKey', event), true);
212
});
213
214
test('returns false without alt pressed when multiCursorModifier is metaKey', () => {
215
const event = createModifierEvent(false, false, false);
216
assert.strictEqual(isTriggerModifierPressed('metaKey', event), false);
217
});
218
219
test('returns false with metaKey pressed when multiCursorModifier is metaKey', () => {
220
const event = createModifierEvent(false, false, true);
221
assert.strictEqual(isTriggerModifierPressed('metaKey', event), false);
222
});
223
});
224
});
225
226