관리자 소스 선택 편집 계산 분리
This commit is contained in:
124
tests/markdown-source-selection.test.js
Normal file
124
tests/markdown-source-selection.test.js
Normal file
@@ -0,0 +1,124 @@
|
||||
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
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user