mode.spec.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import 'jest';
  4. import CodeMirror from 'codemirror';
  5. import { Mode } from '@jupyterlab/codemirror';
  6. function fakeMode(name: string) {
  7. return {
  8. mode: name,
  9. ext: [name],
  10. mime: `text/${name}`,
  11. name: name.toUpperCase()
  12. };
  13. }
  14. describe('Mode', () => {
  15. describe('#ensure', () => {
  16. it('should load a defined spec', async () => {
  17. CodeMirror.modeInfo.push(fakeMode('foo'));
  18. CodeMirror.defineMode('foo', () => {
  19. return {};
  20. });
  21. const spec = (await Mode.ensure('text/foo'))!;
  22. expect(spec.name).toBe('FOO');
  23. });
  24. it('should load a bundled spec', async () => {
  25. const spec = (await Mode.ensure('application/json'))!;
  26. expect(spec.name).toBe('JSON');
  27. });
  28. it('should add a spec loader', async () => {
  29. let called = 0;
  30. let loaded = 0;
  31. Mode.addSpecLoader(async spec => {
  32. called++;
  33. if (spec.mode !== 'bar') {
  34. return false;
  35. }
  36. loaded++;
  37. return true;
  38. }, 42);
  39. CodeMirror.modeInfo.push(fakeMode('bar'));
  40. let spec = await Mode.ensure('bar');
  41. expect(called).toBe(1);
  42. expect(loaded).toBe(1);
  43. expect(spec!.name).toBe('BAR');
  44. spec = await Mode.ensure('python');
  45. expect(called).toBe(1);
  46. expect(loaded).toBe(1);
  47. try {
  48. spec = await Mode.ensure('APL');
  49. } catch (err) {
  50. // apparently one cannot use webpack `require` in jest
  51. }
  52. expect(called).toBe(2);
  53. expect(loaded).toBe(1);
  54. });
  55. it('should default to plain text', async () => {
  56. const spec = (await Mode.ensure('this is not a mode'))!;
  57. expect(spec.name).toBe('Plain Text');
  58. });
  59. });
  60. });