| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- // @vitest-environment jsdom
- import { EditorSelection, EditorState } from '@codemirror/state';
- import { EditorView } from '@codemirror/view';
- import { describe, expect, it } from 'vitest';
- import { toggleMarkdownSymbol } from './toggle-markdown-symbol';
- const createView = (doc: string, anchor: number, head?: number): EditorView => {
- const state = EditorState.create({
- doc,
- selection: EditorSelection.create([
- EditorSelection.range(anchor, head ?? anchor),
- ]),
- });
- return new EditorView({ state });
- };
- describe('toggleMarkdownSymbol', () => {
- it('should wrap selected text with prefix and suffix', () => {
- const view = createView('hello world', 0, 5);
- toggleMarkdownSymbol(view, '**', '**');
- expect(view.state.doc.toString()).toBe('**hello** world');
- });
- it('should unwrap text already wrapped with prefix and suffix', () => {
- const view = createView('**hello** world', 0, 9);
- toggleMarkdownSymbol(view, '**', '**');
- expect(view.state.doc.toString()).toBe('hello world');
- });
- it('should insert prefix+suffix and place cursor between them when no selection', () => {
- const view = createView('hello world', 5);
- toggleMarkdownSymbol(view, '**', '**');
- expect(view.state.doc.toString()).toBe('hello**** world');
- expect(view.state.selection.main.head).toBe(7);
- });
- it('should handle single-char symbols (backtick)', () => {
- const view = createView('code', 0, 4);
- toggleMarkdownSymbol(view, '`', '`');
- expect(view.state.doc.toString()).toBe('`code`');
- });
- it('should unwrap single-char symbols', () => {
- const view = createView('`code`', 0, 6);
- toggleMarkdownSymbol(view, '`', '`');
- expect(view.state.doc.toString()).toBe('code');
- });
- it('should handle multiline prefix/suffix (code block)', () => {
- const view = createView('some code', 0, 9);
- toggleMarkdownSymbol(view, '```\n', '\n```');
- expect(view.state.doc.toString()).toBe('```\nsome code\n```');
- });
- it('should handle asymmetric prefix and suffix (link)', () => {
- const view = createView('text', 0, 4);
- toggleMarkdownSymbol(view, '[', ']()');
- expect(view.state.doc.toString()).toBe('[text]()');
- });
- });
|