Files
sori.studio/tests/markdown-source-selection.test.js

125 lines
2.9 KiB
JavaScript

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
})
})