// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { FOUND_CLASSES, GenericSearchProvider, IGenericSearchMatch } from '@jupyterlab/documentsearch'; import { Widget } from '@lumino/widgets'; const MATCH_CLASSES = FOUND_CLASSES.join(' '); describe('documentsearch/genericsearchprovider', () => { describe('GenericSearchProvider', () => { let provider: GenericSearchProvider; let widget: Widget; let match: IGenericSearchMatch; beforeEach(() => { provider = new GenericSearchProvider(); widget = new Widget(); }); afterEach(async () => { await provider.endSearch(); widget.dispose(); }); function getHTMLForMatch(match: IGenericSearchMatch): string | undefined { return match.spanElement?.closest('pre')?.innerHTML; } async function queryOne(query: RegExp): Promise { let matches = (await provider.startQuery( query, widget )) as IGenericSearchMatch[]; expect(matches).toHaveLength(1); return matches[0]; } describe('#startQuery()', () => { it('should highlight text fragment nested in a node', async () => { widget.node.innerHTML = '
xyz
'; match = await queryOne(/x/); expect(getHTMLForMatch(match)).toBe( `xyz` ); match = await queryOne(/y/); expect(getHTMLForMatch(match)).toBe( `xyz` ); match = await queryOne(/z/); expect(getHTMLForMatch(match)).toBe( `xyz` ); }); it('should highlight in presence of nested spans adjacent to text nodes', async () => { widget.node.innerHTML = '
xyz
'; match = await queryOne(/x/); expect(getHTMLForMatch(match)).toBe( `xyz` ); match = await queryOne(/y/); expect(getHTMLForMatch(match)).toBe( `xyz` ); match = await queryOne(/z/); expect(getHTMLForMatch(match)).toBe( `xyz` ); widget.node.innerHTML = '
xyz
'; match = await queryOne(/x/); expect(getHTMLForMatch(match)).toBe( `xyz` ); match = await queryOne(/y/); expect(getHTMLForMatch(match)).toBe( `xyz` ); match = await queryOne(/z/); expect(getHTMLForMatch(match)).toBe( `xyz` ); widget.node.innerHTML = '
xyz
'; match = await queryOne(/x/); expect(getHTMLForMatch(match)).toBe( `xyz` ); match = await queryOne(/y/); expect(getHTMLForMatch(match)).toBe( `xyz` ); match = await queryOne(/z/); expect(getHTMLForMatch(match)).toBe( `xyz` ); }); it('should slice out the match correctly in nested nodes', async () => { widget.node.innerHTML = '
xyz
'; match = await queryOne(/x/); expect(getHTMLForMatch(match)).toBe( `xyz` ); match = await queryOne(/y/); expect(getHTMLForMatch(match)).toBe( `xyz` ); }); }); }); });