Skip to content
This repository was archived by the owner on Nov 25, 2021. It is now read-only.

Commit f71c1a2

Browse files
authored
feat: document highlights (#278)
1 parent 3f9ea6e commit f71c1a2

File tree

4 files changed

+262
-8
lines changed

4 files changed

+262
-8
lines changed

src/hoverifier.test.ts

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,12 @@ import {
1616
} from './hoverifier'
1717
import { findPositionsFromEvents, SupportedMouseEvent } from './positions'
1818
import { CodeViewProps, DOM } from './testutils/dom'
19-
import { createHoverAttachment, createStubActionsProvider, createStubHoverProvider } from './testutils/fixtures'
19+
import {
20+
createHoverAttachment,
21+
createStubActionsProvider,
22+
createStubHoverProvider,
23+
createStubDocumentHighlightProvider,
24+
} from './testutils/fixtures'
2025
import { dispatchMouseEventAtPositionImpure } from './testutils/mouse'
2126
import { HoverAttachment } from './types'
2227
import { LOADING } from './loading'
@@ -53,6 +58,7 @@ describe('Hoverifier', () => {
5358
hoverOverlayElements: of(null),
5459
hoverOverlayRerenders: EMPTY,
5560
getHover: createStubHoverProvider({ range: hoverRange }, LOADER_DELAY + delayTime),
61+
getDocumentHighlights: createStubDocumentHighlightProvider(),
5662
getActions: () => of(null),
5763
pinningEnabled: true,
5864
})
@@ -115,6 +121,7 @@ describe('Hoverifier', () => {
115121
hoverOverlayElements: of(null),
116122
hoverOverlayRerenders: EMPTY,
117123
getHover: createStubHoverProvider(hover, delayTime),
124+
getDocumentHighlights: createStubDocumentHighlightProvider(),
118125
getActions: createStubActionsProvider(['foo', 'bar'], delayTime),
119126
pinningEnabled: true,
120127
})
@@ -204,6 +211,7 @@ describe('Hoverifier', () => {
204211
hoverOverlayElements: of(null),
205212
hoverOverlayRerenders: EMPTY,
206213
getHover: createStubHoverProvider(hover, delayTime),
214+
getDocumentHighlights: createStubDocumentHighlightProvider(),
207215
getActions: createStubActionsProvider(['foo', 'bar'], delayTime),
208216
pinningEnabled: false,
209217
})
@@ -284,6 +292,7 @@ describe('Hoverifier', () => {
284292
hoverOverlayElements: of(null),
285293
hoverOverlayRerenders: EMPTY,
286294
getHover: createStubHoverProvider(hover, delayTime),
295+
getDocumentHighlights: createStubDocumentHighlightProvider(),
287296
getActions: createStubActionsProvider(['foo', 'bar'], delayTime),
288297
pinningEnabled: false,
289298
})
@@ -330,6 +339,56 @@ describe('Hoverifier', () => {
330339
}
331340
})
332341

342+
it('highlights document highlights', async () => {
343+
for (const codeViewProps of testcases) {
344+
const hoverifier = createHoverifier({
345+
closeButtonClicks: NEVER,
346+
hoverOverlayElements: of(null),
347+
hoverOverlayRerenders: EMPTY,
348+
getHover: createStubHoverProvider(),
349+
getDocumentHighlights: createStubDocumentHighlightProvider([
350+
{ range: { start: { line: 24, character: 9 }, end: { line: 4, character: 15 } } },
351+
{ range: { start: { line: 45, character: 5 }, end: { line: 45, character: 11 } } },
352+
{ range: { start: { line: 120, character: 9 }, end: { line: 120, character: 15 } } },
353+
]),
354+
getActions: () => of(null),
355+
pinningEnabled: true,
356+
documentHighlightClassName: 'test-highlight',
357+
})
358+
const positionJumps = new Subject<PositionJump>()
359+
const positionEvents = of(codeViewProps.codeView).pipe(
360+
findPositionsFromEvents({ domFunctions: codeViewProps })
361+
)
362+
363+
hoverifier.hoverify({
364+
dom: codeViewProps,
365+
positionEvents,
366+
positionJumps,
367+
resolveContext: () => codeViewProps.revSpec,
368+
})
369+
370+
dispatchMouseEventAtPositionImpure('mouseover', codeViewProps, {
371+
line: 24,
372+
character: 6,
373+
})
374+
375+
await hoverifier.hoverStateUpdates
376+
.pipe(
377+
filter(state => !!state.hoverOverlayProps),
378+
first()
379+
)
380+
.toPromise()
381+
382+
await of(null).pipe(delay(200)).toPromise()
383+
384+
const selected = codeViewProps.codeView.querySelectorAll('.test-highlight')
385+
assert.equal(selected.length, 3)
386+
for (const e of selected) {
387+
assert.equal(e.textContent, 'Router')
388+
}
389+
}
390+
})
391+
333392
it('hides the hover overlay when the hovered token intersects with a scrollBoundary', async () => {
334393
const gitHubCodeView = testcases[1]
335394
const hoverifier = createHoverifier({
@@ -342,6 +401,7 @@ describe('Hoverifier', () => {
342401
end: { line: 4, character: 9 },
343402
},
344403
}),
404+
getDocumentHighlights: createStubDocumentHighlightProvider(),
345405
getActions: createStubActionsProvider(['foo', 'bar']),
346406
pinningEnabled: true,
347407
})
@@ -396,6 +456,7 @@ describe('Hoverifier', () => {
396456
position.line === 24
397457
? createStubHoverProvider({}, delayTime)(position)
398458
: of({ isLoading: false, result: null }),
459+
getDocumentHighlights: createStubDocumentHighlightProvider(),
399460
getActions: position =>
400461
position.line === 24
401462
? createStubActionsProvider(['foo', 'bar'], delayTime)(position)
@@ -473,6 +534,7 @@ describe('Hoverifier', () => {
473534
position.line === 24
474535
? createStubHoverProvider({})(position)
475536
: of({ isLoading: false, result: null }),
537+
getDocumentHighlights: createStubDocumentHighlightProvider(),
476538
getActions: position =>
477539
position.line === 24 ? createStubActionsProvider(['foo', 'bar'])(position) : of(null),
478540
pinningEnabled: true,
@@ -555,6 +617,7 @@ describe('Hoverifier', () => {
555617
hoverOverlayElements: of(null),
556618
hoverOverlayRerenders: EMPTY,
557619
getHover: createStubHoverProvider(hover, LOADER_DELAY + hoverDelayTime),
620+
getDocumentHighlights: createStubDocumentHighlightProvider(),
558621
getActions: createStubActionsProvider(actions, LOADER_DELAY + actionsDelayTime),
559622
pinningEnabled: true,
560623
})
@@ -627,6 +690,7 @@ describe('Hoverifier', () => {
627690
hoverOverlayElements: of(null),
628691
hoverOverlayRerenders: EMPTY,
629692
getHover: createStubHoverProvider(hover),
693+
getDocumentHighlights: createStubDocumentHighlightProvider(),
630694
getActions: () => of(null),
631695
pinningEnabled: true,
632696
})
@@ -689,6 +753,7 @@ describe('Hoverifier', () => {
689753
hoverOverlayElements: of(null),
690754
hoverOverlayRerenders: EMPTY,
691755
getHover: createStubHoverProvider(hover),
756+
getDocumentHighlights: createStubDocumentHighlightProvider(),
692757
getActions: () => of(null),
693758
pinningEnabled: true,
694759
})
@@ -762,6 +827,7 @@ describe('Hoverifier', () => {
762827
const adjustmentDirections = new Subject<AdjustmentDirection>()
763828

764829
const getHover = createStubHoverProvider({})
830+
const getDocumentHighlights = createStubDocumentHighlightProvider()
765831
const getActions = createStubActionsProvider(['foo', 'bar'])
766832

767833
const adjustPosition: PositionAdjuster<{}> = ({ direction, position }) => {
@@ -775,6 +841,7 @@ describe('Hoverifier', () => {
775841
hoverOverlayElements: of(null),
776842
hoverOverlayRerenders: EMPTY,
777843
getHover,
844+
getDocumentHighlights,
778845
getActions,
779846
pinningEnabled: true,
780847
})
@@ -831,6 +898,7 @@ describe('Hoverifier', () => {
831898
hoverOverlayRerenders: EMPTY,
832899
// It's important that getHover() and getActions() emit something
833900
getHover: createStubHoverProvider({}),
901+
getDocumentHighlights: createStubDocumentHighlightProvider(),
834902
getActions: () => of([{}]).pipe(delay(50)),
835903
pinningEnabled: true,
836904
})
@@ -870,6 +938,7 @@ describe('Hoverifier', () => {
870938
hoverOverlayElements: of(null),
871939
hoverOverlayRerenders: EMPTY,
872940
getHover: createStubHoverProvider(),
941+
getDocumentHighlights: createStubDocumentHighlightProvider(),
873942
getActions: () => of(null),
874943
pinningEnabled: true,
875944
})

0 commit comments

Comments
 (0)