toc.spec.ts 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import 'jest';
  4. import {
  5. NotebookPanel,
  6. NotebookTracker,
  7. NotebookWidgetFactory,
  8. NotebookModelFactory
  9. } from '@jupyterlab/notebook';
  10. import { DocumentManager } from '@jupyterlab/docmanager';
  11. import * as ToC from '@jupyterlab/toc';
  12. import { RenderMimeRegistry } from '@jupyterlab/rendermime';
  13. import { ServiceManager } from '@jupyterlab/services';
  14. import {
  15. DocumentRegistry,
  16. TextModelFactory,
  17. IDocumentWidget,
  18. DocumentWidget
  19. } from '@jupyterlab/docregistry';
  20. import { UUID } from '@lumino/coreutils';
  21. import {
  22. CodeMirrorEditorFactory,
  23. CodeMirrorMimeTypeService
  24. } from '@jupyterlab/codemirror';
  25. import { NBTestUtils, Mock, defaultRenderMime } from '@jupyterlab/testutils';
  26. import { WidgetTracker } from '@jupyterlab/apputils';
  27. import { FileEditor, FileEditorFactory } from '@jupyterlab/fileeditor';
  28. import {
  29. MarkdownViewerFactory,
  30. MarkdownDocument
  31. } from '@jupyterlab/markdownviewer';
  32. let manager: DocumentManager;
  33. let widget: ToC.TableOfContents;
  34. let registry: DocumentRegistry;
  35. let services: ServiceManager.IManager;
  36. let factory: TextModelFactory;
  37. beforeAll(async () => {
  38. jest.setTimeout(20000);
  39. const opener: DocumentManager.IWidgetOpener = {
  40. open: widget => {
  41. // no-op
  42. }
  43. };
  44. factory = new TextModelFactory();
  45. registry = new DocumentRegistry({
  46. textModelFactory: factory
  47. });
  48. const contentFactory = NBTestUtils.createNotebookPanelFactory();
  49. const notebookFactory = new NotebookModelFactory({});
  50. registry.addModelFactory(notebookFactory);
  51. registry.addWidgetFactory(
  52. new NotebookWidgetFactory({
  53. modelName: 'notebook',
  54. contentFactory,
  55. fileTypes: ['notebook'],
  56. rendermime: defaultRenderMime(),
  57. mimeTypeService: NBTestUtils.mimeTypeService,
  58. name: 'notebook'
  59. })
  60. );
  61. registry.addWidgetFactory(
  62. new FileEditorFactory({
  63. editorServices: {
  64. factoryService: new CodeMirrorEditorFactory(),
  65. mimeTypeService: new CodeMirrorMimeTypeService()
  66. },
  67. factoryOptions: {
  68. name: 'editor',
  69. fileTypes: ['*'],
  70. defaultFor: ['*']
  71. }
  72. })
  73. );
  74. registry.addWidgetFactory(
  75. new MarkdownViewerFactory({
  76. rendermime: defaultRenderMime(),
  77. name: 'Markdown Preview',
  78. primaryFileType: registry.getFileType('markdown'),
  79. fileTypes: ['markdown'],
  80. defaultRendered: []
  81. })
  82. );
  83. services = new Mock.ServiceManagerMock();
  84. manager = new DocumentManager({
  85. registry,
  86. opener,
  87. manager: services
  88. });
  89. });
  90. describe('@jupyterlab/toc', () => {
  91. describe('TableOfContents', () => {
  92. describe('#constructor', () => {
  93. it('should construct a new ToC widget', () => {
  94. widget = new ToC.TableOfContents({
  95. docmanager: manager,
  96. rendermime: new RenderMimeRegistry()
  97. });
  98. expect(widget).toBeInstanceOf(ToC.TableOfContents);
  99. });
  100. });
  101. });
  102. describe('TableOfContentsRegistry', () => {
  103. let registry: ToC.TableOfContentsRegistry;
  104. beforeAll(() => {
  105. registry = new ToC.TableOfContentsRegistry();
  106. });
  107. describe('Notebook Generator: IGenerator<NotebookPanel>', () => {
  108. let notebookTracker: NotebookTracker;
  109. let notebookGenerator: ToC.TableOfContentsRegistry.IGenerator<NotebookPanel>;
  110. let notebookWidget: NotebookPanel;
  111. it('should create a notebook generator', () => {
  112. notebookTracker = new NotebookTracker({
  113. namespace: 'notebook'
  114. });
  115. notebookGenerator = ToC.createNotebookGenerator(
  116. notebookTracker,
  117. widget,
  118. NBTestUtils.defaultRenderMime().sanitizer
  119. );
  120. });
  121. it('should add a notebook generator to the registry', () => {
  122. registry.add(notebookGenerator);
  123. });
  124. it('should find the notebook generator', async () => {
  125. const path = UUID.uuid4() + '.ipynb';
  126. const newNotebookWidget = manager.createNew(path, 'notebook');
  127. expect(newNotebookWidget).toBeInstanceOf(NotebookPanel);
  128. notebookWidget = newNotebookWidget as NotebookPanel;
  129. await notebookTracker.add(notebookWidget);
  130. const foundNotebookGenerator = registry.find(notebookWidget);
  131. expect(foundNotebookGenerator).toBeDefined();
  132. });
  133. it('should change current', async () => {
  134. widget.current = {
  135. widget: notebookWidget,
  136. generator: notebookGenerator
  137. };
  138. });
  139. });
  140. describe('Markdown Generator: IGenerator<IDocumentWidget<FileEditor>>', () => {
  141. let markdownTracker: WidgetTracker<IDocumentWidget<FileEditor>>;
  142. let markdownGenerator: ToC.TableOfContentsRegistry.IGenerator<IDocumentWidget<
  143. FileEditor
  144. >>;
  145. let markdownWidget: IDocumentWidget<FileEditor>;
  146. it('should create a markdown generator', () => {
  147. markdownTracker = new WidgetTracker<IDocumentWidget<FileEditor>>({
  148. namespace: 'markdown'
  149. });
  150. markdownGenerator = ToC.createMarkdownGenerator(
  151. markdownTracker,
  152. widget,
  153. NBTestUtils.defaultRenderMime().sanitizer
  154. );
  155. });
  156. it('should add a markdown generator to the registry', () => {
  157. registry.add(markdownGenerator);
  158. });
  159. it('should find the markdown generator', async () => {
  160. const path = UUID.uuid4() + '.md';
  161. const newMarkdownWidget = manager.createNew(path);
  162. expect(newMarkdownWidget).toBeInstanceOf(DocumentWidget);
  163. markdownWidget = newMarkdownWidget as IDocumentWidget<FileEditor>;
  164. await markdownTracker.add(markdownWidget);
  165. const foundNotebookGenerator = registry.find(markdownWidget);
  166. expect(foundNotebookGenerator).toBeDefined();
  167. });
  168. it('should change current', async () => {
  169. widget.current = {
  170. widget: markdownWidget,
  171. generator: markdownGenerator
  172. };
  173. });
  174. });
  175. describe('Rendered Markdown Generator: IGenerator<MarkdownDocument>', () => {
  176. let markdownTracker: WidgetTracker<MarkdownDocument>;
  177. let markdownGenerator: ToC.TableOfContentsRegistry.IGenerator<MarkdownDocument>;
  178. let markdownWidget: MarkdownDocument;
  179. it('should create a markdown generator', () => {
  180. markdownTracker = new WidgetTracker<MarkdownDocument>({
  181. namespace: 'markdownviewer-widget'
  182. });
  183. markdownGenerator = ToC.createRenderedMarkdownGenerator(
  184. markdownTracker,
  185. widget,
  186. NBTestUtils.defaultRenderMime().sanitizer
  187. );
  188. });
  189. it('should add a markdown generator to the registry', () => {
  190. registry.add(markdownGenerator);
  191. });
  192. it('should find the markdown generator', async () => {
  193. const path = UUID.uuid4() + '.md';
  194. const newMarkdownWidget = manager.createNew(path, 'Markdown Preview');
  195. expect(newMarkdownWidget).toBeInstanceOf(MarkdownDocument);
  196. markdownWidget = newMarkdownWidget as MarkdownDocument;
  197. await markdownTracker.add(markdownWidget);
  198. const foundNotebookGenerator = registry.find(markdownWidget);
  199. expect(foundNotebookGenerator).toBeDefined();
  200. });
  201. it('should change current', async () => {
  202. widget.current = {
  203. widget: markdownWidget,
  204. generator: markdownGenerator
  205. };
  206. });
  207. });
  208. describe('Latex Generator: IGenerator<IDocumentWidget<FileEditor>>', () => {
  209. let latexTracker: WidgetTracker<IDocumentWidget<FileEditor>>;
  210. let latexGenerator: ToC.TableOfContentsRegistry.IGenerator<IDocumentWidget<
  211. FileEditor
  212. >>;
  213. let latexWidget: IDocumentWidget<FileEditor>;
  214. it('should create a latex generator', () => {
  215. latexTracker = new WidgetTracker<IDocumentWidget<FileEditor>>({
  216. namespace: 'latex'
  217. });
  218. latexGenerator = ToC.createLatexGenerator(latexTracker);
  219. });
  220. it('should add a latex generator to the registry', () => {
  221. registry.add(latexGenerator);
  222. });
  223. it('should find the latex generator', async () => {
  224. const path = UUID.uuid4() + '.tex';
  225. const newLatexWidget = manager.createNew(path);
  226. expect(newLatexWidget).toBeInstanceOf(DocumentWidget);
  227. latexWidget = newLatexWidget as IDocumentWidget<FileEditor>;
  228. await latexTracker.add(latexWidget);
  229. const foundNotebookGenerator = registry.find(latexWidget);
  230. expect(foundNotebookGenerator).toBeDefined();
  231. });
  232. it('should change current', async () => {
  233. widget.current = {
  234. widget: latexWidget,
  235. generator: latexGenerator
  236. };
  237. });
  238. });
  239. });
  240. });