toc.spec.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  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 tocWidget: 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. tocWidget = new ToC.TableOfContents({
  95. docmanager: manager,
  96. rendermime: new RenderMimeRegistry()
  97. });
  98. expect(tocWidget).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. tocWidget,
  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. tocWidget.current = {
  135. widget: notebookWidget,
  136. generator: notebookGenerator
  137. };
  138. expect(tocWidget.current.widget).toBeInstanceOf(NotebookPanel);
  139. });
  140. });
  141. describe('Markdown Generator: IGenerator<IDocumentWidget<FileEditor>>', () => {
  142. let markdownTracker: WidgetTracker<IDocumentWidget<FileEditor>>;
  143. let markdownGenerator: ToC.TableOfContentsRegistry.IGenerator<IDocumentWidget<
  144. FileEditor
  145. >>;
  146. let markdownWidget: IDocumentWidget<FileEditor>;
  147. it('should create a markdown generator', () => {
  148. markdownTracker = new WidgetTracker<IDocumentWidget<FileEditor>>({
  149. namespace: 'markdown'
  150. });
  151. markdownGenerator = ToC.createMarkdownGenerator(
  152. markdownTracker,
  153. tocWidget,
  154. NBTestUtils.defaultRenderMime().sanitizer
  155. );
  156. });
  157. it('should add a markdown generator to the registry', () => {
  158. registry.add(markdownGenerator);
  159. });
  160. it('should find the markdown generator', async () => {
  161. const path = UUID.uuid4() + '.md';
  162. const newMarkdownWidget = manager.createNew(path);
  163. expect(newMarkdownWidget).toBeInstanceOf(DocumentWidget);
  164. markdownWidget = newMarkdownWidget as IDocumentWidget<FileEditor>;
  165. await markdownTracker.add(markdownWidget);
  166. const foundMarkdownGenerator = registry.find(markdownWidget);
  167. expect(foundMarkdownGenerator).toBeDefined();
  168. });
  169. it('should change current', async () => {
  170. tocWidget.current = {
  171. widget: markdownWidget,
  172. generator: markdownGenerator
  173. };
  174. expect(tocWidget.current.widget).toBeInstanceOf(DocumentWidget);
  175. });
  176. });
  177. describe('Rendered Markdown Generator: IGenerator<MarkdownDocument>', () => {
  178. let markdownTracker: WidgetTracker<MarkdownDocument>;
  179. let markdownGenerator: ToC.TableOfContentsRegistry.IGenerator<MarkdownDocument>;
  180. let markdownWidget: MarkdownDocument;
  181. it('should create a markdown generator', () => {
  182. markdownTracker = new WidgetTracker<MarkdownDocument>({
  183. namespace: 'markdownviewer-widget'
  184. });
  185. markdownGenerator = ToC.createRenderedMarkdownGenerator(
  186. markdownTracker,
  187. tocWidget,
  188. NBTestUtils.defaultRenderMime().sanitizer
  189. );
  190. });
  191. it('should add a markdown generator to the registry', () => {
  192. registry.add(markdownGenerator);
  193. });
  194. it('should find the markdown generator', async () => {
  195. const path = UUID.uuid4() + '.md';
  196. const newMarkdownWidget = manager.createNew(path, 'Markdown Preview');
  197. expect(newMarkdownWidget).toBeInstanceOf(MarkdownDocument);
  198. markdownWidget = newMarkdownWidget as MarkdownDocument;
  199. await markdownTracker.add(markdownWidget);
  200. const foundMarkdownGenerator = registry.find(markdownWidget);
  201. expect(foundMarkdownGenerator).toBeDefined();
  202. });
  203. it('should change current', async () => {
  204. tocWidget.current = {
  205. widget: markdownWidget,
  206. generator: markdownGenerator
  207. };
  208. expect(tocWidget.current.widget).toBeInstanceOf(MarkdownDocument);
  209. });
  210. });
  211. describe('Latex Generator: IGenerator<IDocumentWidget<FileEditor>>', () => {
  212. let latexTracker: WidgetTracker<IDocumentWidget<FileEditor>>;
  213. let latexGenerator: ToC.TableOfContentsRegistry.IGenerator<IDocumentWidget<
  214. FileEditor
  215. >>;
  216. let latexWidget: IDocumentWidget<FileEditor>;
  217. it('should create a latex generator', () => {
  218. latexTracker = new WidgetTracker<IDocumentWidget<FileEditor>>({
  219. namespace: 'latex'
  220. });
  221. latexGenerator = ToC.createLatexGenerator(latexTracker);
  222. });
  223. it('should add a latex generator to the registry', () => {
  224. registry.add(latexGenerator);
  225. });
  226. it('should find the latex generator', async () => {
  227. const path = UUID.uuid4() + '.tex';
  228. const newLatexWidget = manager.createNew(path);
  229. expect(newLatexWidget).toBeInstanceOf(DocumentWidget);
  230. latexWidget = newLatexWidget as IDocumentWidget<FileEditor>;
  231. await latexTracker.add(latexWidget);
  232. const foundLatexGenerator = registry.find(latexWidget);
  233. expect(foundLatexGenerator).toBeDefined();
  234. });
  235. it('should change current', async () => {
  236. tocWidget.current = {
  237. widget: latexWidget,
  238. generator: latexGenerator
  239. };
  240. expect(tocWidget.current.widget).toBeInstanceOf(DocumentWidget);
  241. });
  242. });
  243. describe('Python Generator: IGenerator<IDocumentWidget<FileEditor>>', () => {
  244. let pythonTracker: WidgetTracker<IDocumentWidget<FileEditor>>;
  245. let pythonGenerator: ToC.TableOfContentsRegistry.IGenerator<IDocumentWidget<
  246. FileEditor
  247. >>;
  248. let pythonWidget: IDocumentWidget<FileEditor>;
  249. it('should create a python generator', () => {
  250. pythonTracker = new WidgetTracker<IDocumentWidget<FileEditor>>({
  251. namespace: 'python'
  252. });
  253. pythonGenerator = ToC.createPythonGenerator(pythonTracker);
  254. });
  255. it('should add a python generator to the registry', () => {
  256. registry.add(pythonGenerator);
  257. });
  258. it('should find the python generator', async () => {
  259. const path = UUID.uuid4() + '.py';
  260. const newPythonWidget = manager.createNew(path);
  261. expect(newPythonWidget).toBeInstanceOf(DocumentWidget);
  262. pythonWidget = newPythonWidget as IDocumentWidget<FileEditor>;
  263. await pythonTracker.add(pythonWidget);
  264. const foundPythonGenerator = registry.find(pythonWidget);
  265. expect(foundPythonGenerator).toBeDefined();
  266. });
  267. it('should change current', async () => {
  268. tocWidget.current = {
  269. widget: pythonWidget,
  270. generator: pythonGenerator
  271. };
  272. expect(tocWidget.current.widget).toBeInstanceOf(DocumentWidget);
  273. });
  274. });
  275. });
  276. });