mode.spec.ts 1.7 KB

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