toc.spec.ts 10 KB

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