toggle-markdown-symbol.spec.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // @vitest-environment jsdom
  2. import { EditorSelection, EditorState } from '@codemirror/state';
  3. import { EditorView } from '@codemirror/view';
  4. import { describe, expect, it } from 'vitest';
  5. import { toggleMarkdownSymbol } from './toggle-markdown-symbol';
  6. const createView = (doc: string, anchor: number, head?: number): EditorView => {
  7. const state = EditorState.create({
  8. doc,
  9. selection: EditorSelection.create([
  10. EditorSelection.range(anchor, head ?? anchor),
  11. ]),
  12. });
  13. return new EditorView({ state });
  14. };
  15. describe('toggleMarkdownSymbol', () => {
  16. it('should wrap selected text with prefix and suffix', () => {
  17. const view = createView('hello world', 0, 5);
  18. toggleMarkdownSymbol(view, '**', '**');
  19. expect(view.state.doc.toString()).toBe('**hello** world');
  20. });
  21. it('should unwrap text already wrapped with prefix and suffix', () => {
  22. const view = createView('**hello** world', 0, 9);
  23. toggleMarkdownSymbol(view, '**', '**');
  24. expect(view.state.doc.toString()).toBe('hello world');
  25. });
  26. it('should insert prefix+suffix and place cursor between them when no selection', () => {
  27. const view = createView('hello world', 5);
  28. toggleMarkdownSymbol(view, '**', '**');
  29. expect(view.state.doc.toString()).toBe('hello**** world');
  30. expect(view.state.selection.main.head).toBe(7);
  31. });
  32. it('should handle single-char symbols (backtick)', () => {
  33. const view = createView('code', 0, 4);
  34. toggleMarkdownSymbol(view, '`', '`');
  35. expect(view.state.doc.toString()).toBe('`code`');
  36. });
  37. it('should unwrap single-char symbols', () => {
  38. const view = createView('`code`', 0, 6);
  39. toggleMarkdownSymbol(view, '`', '`');
  40. expect(view.state.doc.toString()).toBe('code');
  41. });
  42. it('should handle multiline prefix/suffix (code block)', () => {
  43. const view = createView('some code', 0, 9);
  44. toggleMarkdownSymbol(view, '```\n', '\n```');
  45. expect(view.state.doc.toString()).toBe('```\nsome code\n```');
  46. });
  47. it('should handle asymmetric prefix and suffix (link)', () => {
  48. const view = createView('text', 0, 4);
  49. toggleMarkdownSymbol(view, '[', ']()');
  50. expect(view.state.doc.toString()).toBe('[text]()');
  51. });
  52. });