import { GenericSearchProvider, IGenericSearchMatch, FOUND_CLASSES } 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) { 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/); console.log(match.spanElement); 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`
);
});
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`
);
});
});
});
});