documentsearchprovider.spec.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import {
  2. GenericSearchProvider,
  3. IGenericSearchMatch,
  4. FOUND_CLASSES
  5. } from '@jupyterlab/documentsearch';
  6. import { Widget } from '@lumino/widgets';
  7. const MATCH_CLASSES = FOUND_CLASSES.join(' ');
  8. describe('documentsearch/genericsearchprovider', () => {
  9. describe('GenericSearchProvider', () => {
  10. let provider: GenericSearchProvider;
  11. let widget: Widget;
  12. let match: IGenericSearchMatch;
  13. beforeEach(() => {
  14. provider = new GenericSearchProvider();
  15. widget = new Widget();
  16. });
  17. afterEach(async () => {
  18. await provider.endSearch();
  19. widget.dispose();
  20. });
  21. function getHTMLForMatch(match: IGenericSearchMatch): string | undefined {
  22. return match.spanElement?.closest('pre')?.innerHTML;
  23. }
  24. async function queryOne(query: RegExp) {
  25. let matches = (await provider.startQuery(
  26. query,
  27. widget
  28. )) as IGenericSearchMatch[];
  29. expect(matches).toHaveLength(1);
  30. return matches[0];
  31. }
  32. describe('#startQuery()', () => {
  33. it('should highlight text fragment nested in a node', async () => {
  34. widget.node.innerHTML = '<pre>xyz</pre>';
  35. match = await queryOne(/x/);
  36. console.log(match.spanElement);
  37. expect(getHTMLForMatch(match)).toBe(
  38. `<span class="${MATCH_CLASSES}">x</span>yz`
  39. );
  40. match = await queryOne(/y/);
  41. expect(getHTMLForMatch(match)).toBe(
  42. `x<span class="${MATCH_CLASSES}">y</span>z`
  43. );
  44. match = await queryOne(/z/);
  45. expect(getHTMLForMatch(match)).toBe(
  46. `xy<span class="${MATCH_CLASSES}">z</span>`
  47. );
  48. });
  49. it('should highlight in presence of nested spans adjacent to text nodes', async () => {
  50. widget.node.innerHTML = '<pre><span>x</span>yz</pre>';
  51. match = await queryOne(/x/);
  52. expect(getHTMLForMatch(match)).toBe(
  53. `<span><span class="${MATCH_CLASSES}">x</span></span>yz`
  54. );
  55. match = await queryOne(/y/);
  56. expect(getHTMLForMatch(match)).toBe(
  57. `<span>x</span><span class="${MATCH_CLASSES}">y</span>z`
  58. );
  59. match = await queryOne(/z/);
  60. expect(getHTMLForMatch(match)).toBe(
  61. `<span>x</span>y<span class="${MATCH_CLASSES}">z</span>`
  62. );
  63. widget.node.innerHTML = '<pre>x<span>y</span>z</pre>';
  64. match = await queryOne(/x/);
  65. expect(getHTMLForMatch(match)).toBe(
  66. `<span class="${MATCH_CLASSES}">x</span><span>y</span>z`
  67. );
  68. match = await queryOne(/y/);
  69. expect(getHTMLForMatch(match)).toBe(
  70. `x<span><span class="${MATCH_CLASSES}">y</span></span>z`
  71. );
  72. match = await queryOne(/z/);
  73. expect(getHTMLForMatch(match)).toBe(
  74. `x<span>y</span><span class="${MATCH_CLASSES}">z</span>`
  75. );
  76. });
  77. it('should slice out the match correctly in nested nodes', async () => {
  78. widget.node.innerHTML = '<pre><span>xy</span>z</pre>';
  79. match = await queryOne(/x/);
  80. expect(getHTMLForMatch(match)).toBe(
  81. `<span><span class="${MATCH_CLASSES}">x</span>y</span>z`
  82. );
  83. match = await queryOne(/y/);
  84. expect(getHTMLForMatch(match)).toBe(
  85. `<span>x<span class="${MATCH_CLASSES}">y</span></span>z`
  86. );
  87. });
  88. });
  89. });
  90. });