documentsearchprovider.spec.ts 3.9 KB

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