import assert from 'node:assert/strict' import test from 'node:test' import { deleteMarkdownSelectedLines, getMarkdownLineIndexAtOffset, getMarkdownLineStartOffset, getMarkdownSelectionState, insertMarkdownBlockSnippet, insertMarkdownInlineLink, replaceMarkdownSelection, transformMarkdownSelectedLines, wrapMarkdownInlineSelection } from '../lib/markdown-source-selection.js' test('마크다운 줄 오프셋과 줄 번호를 계산한다', () => { const value = '첫 줄\n두 번째\n세 번째' assert.equal(getMarkdownLineStartOffset(value, 0), 0) assert.equal(getMarkdownLineStartOffset(value, 1), 4) assert.equal(getMarkdownLineStartOffset(value, 9), 9) assert.equal(getMarkdownLineIndexAtOffset(value, 0), 0) assert.equal(getMarkdownLineIndexAtOffset(value, 5), 1) assert.equal(getMarkdownLineIndexAtOffset(value, 100), 2) }) test('textarea 선택 정보가 없으면 본문 끝을 선택 상태로 사용한다', () => { assert.deepEqual(getMarkdownSelectionState({ value: '본문', textarea: null }), { start: 2, end: 2, value: '본문' }) }) test('선택 영역을 교체하고 다음 선택 범위를 반환한다', () => { const result = replaceMarkdownSelection({ value: 'hello world', start: 6, end: 11, replacement: 'link', cursorOffset: 1, selectionLength: 2 }) assert.deepEqual(result, { value: 'hello link', selectionStart: 7, selectionEnd: 9 }) }) test('블록 조각 삽입은 앞뒤 줄바꿈을 보정한다', () => { const result = insertMarkdownBlockSnippet({ value: '앞뒤', start: 1, end: 1, snippet: '```\ncode\n```' }) assert.equal(result.value, '앞\n\n```\ncode\n```\n\n뒤') assert.equal(result.selectionStart, result.value.length - 1) }) test('인라인 감싸기는 선택 텍스트를 유지하고 내부를 선택한다', () => { const result = wrapMarkdownInlineSelection({ value: 'hello', start: 0, end: 5, prefix: '**', suffix: '**', placeholder: '굵게' }) assert.deepEqual(result, { value: '**hello**', selectionStart: 2, selectionEnd: 7 }) }) test('링크 삽입은 URL 영역을 다음 선택 범위로 반환한다', () => { const result = insertMarkdownInlineLink({ value: '링크', start: 0, end: 2 }) assert.deepEqual(result, { value: '[링크](https://)', selectionStart: 5, selectionEnd: 13 }) }) test('선택된 여러 줄을 변환한다', () => { const result = transformMarkdownSelectedLines({ value: 'a\nb\nc', start: 0, end: 3, transformLine: (line) => `- ${line}` }) assert.deepEqual(result, { value: '- a\n- b\nc', selectionStart: 0, selectionEnd: 7 }) }) test('선택된 줄 전체를 삭제한다', () => { const result = deleteMarkdownSelectedLines({ value: 'a\nb\nc', start: 2, end: 3 }) assert.deepEqual(result, { value: 'a\nc', selectionStart: 0, selectionEnd: 0 }) })