125 lines
2.9 KiB
JavaScript
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
|
|
})
|
|
})
|