126 lines
3.7 KiB
JavaScript
126 lines
3.7 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import { describe, it } from 'node:test'
|
|
import { ref } from 'vue'
|
|
import { useAdminMarkdownSourceActions } from '../composables/useAdminMarkdownSourceActions.js'
|
|
|
|
/**
|
|
* 소스 액션 테스트 상태를 만든다.
|
|
* @param {string} initialValue - 초기 본문
|
|
* @param {number} start - 선택 시작
|
|
* @param {number} end - 선택 끝
|
|
* @returns {Object} 테스트 상태
|
|
*/
|
|
const createSourceActionHarness = (initialValue, start = 0, end = start) => {
|
|
const value = ref(initialValue)
|
|
const selection = {
|
|
start,
|
|
end
|
|
}
|
|
|
|
const actions = useAdminMarkdownSourceActions({
|
|
value,
|
|
getSelectionState: () => ({
|
|
start: selection.start,
|
|
end: selection.end,
|
|
value: value.value
|
|
}),
|
|
setTextareaSelection: (selectionStart, selectionEnd = selectionStart) => {
|
|
selection.start = selectionStart
|
|
selection.end = selectionEnd
|
|
}
|
|
})
|
|
|
|
return {
|
|
value,
|
|
selection,
|
|
actions
|
|
}
|
|
}
|
|
|
|
describe('useAdminMarkdownSourceActions', () => {
|
|
it('선택 영역을 지정 문자열로 교체하고 선택 범위를 갱신한다', () => {
|
|
const harness = createSourceActionHarness('hello world', 6, 11)
|
|
|
|
harness.actions.replaceSelection('sori')
|
|
|
|
assert.equal(harness.value.value, 'hello sori')
|
|
assert.deepEqual(harness.selection, {
|
|
start: 10,
|
|
end: 10
|
|
})
|
|
})
|
|
|
|
it('블록 조각 삽입 시 주변 줄바꿈을 보정한다', () => {
|
|
const harness = createSourceActionHarness('앞문장뒤문장', 3, 3)
|
|
|
|
harness.actions.insertBlockSnippet('')
|
|
|
|
assert.equal(harness.value.value, '앞문장\n\n\n\n뒤문장')
|
|
assert.deepEqual(harness.selection, {
|
|
start: 26,
|
|
end: 26
|
|
})
|
|
})
|
|
|
|
it('인라인 감싸기와 링크 삽입은 새 선택 위치를 유지한다', () => {
|
|
const boldHarness = createSourceActionHarness('굵게', 0, 2)
|
|
boldHarness.actions.wrapInline('**', '**', '굵은 글씨')
|
|
|
|
assert.equal(boldHarness.value.value, '**굵게**')
|
|
assert.deepEqual(boldHarness.selection, {
|
|
start: 2,
|
|
end: 4
|
|
})
|
|
|
|
const linkHarness = createSourceActionHarness('문서', 0, 2)
|
|
linkHarness.actions.insertInlineLink()
|
|
|
|
assert.equal(linkHarness.value.value, '[문서](https://)')
|
|
assert.deepEqual(linkHarness.selection, {
|
|
start: 5,
|
|
end: 13
|
|
})
|
|
})
|
|
|
|
it('줄 단위 제목·인용·목록 변환을 적용한다', () => {
|
|
const headingHarness = createSourceActionHarness('기존\n문장', 0, 2)
|
|
headingHarness.actions.applyHeading(2)
|
|
|
|
assert.equal(headingHarness.value.value, '## 기존\n문장')
|
|
|
|
const quoteHarness = createSourceActionHarness('첫 줄\n둘째 줄', 0, 7)
|
|
quoteHarness.actions.applyQuote()
|
|
|
|
assert.equal(quoteHarness.value.value, '> 첫 줄\n> 둘째 줄')
|
|
|
|
const listHarness = createSourceActionHarness('첫 줄\n- 둘째 줄', 0, 10)
|
|
listHarness.actions.applyList()
|
|
|
|
assert.equal(listHarness.value.value, '- 첫 줄\n- 둘째 줄')
|
|
})
|
|
|
|
it('코드 블록 삽입은 선택 본문을 유지하고 코드 본문을 선택한다', () => {
|
|
const harness = createSourceActionHarness('console.log(1)', 0, 14)
|
|
|
|
harness.actions.insertCodeBlock()
|
|
|
|
assert.equal(harness.value.value, '```\nconsole.log(1)\n```')
|
|
assert.deepEqual(harness.selection, {
|
|
start: 4,
|
|
end: 18
|
|
})
|
|
})
|
|
|
|
it('선택 범위가 걸친 줄을 삭제한다', () => {
|
|
const harness = createSourceActionHarness('첫 줄\n둘째 줄\n셋째 줄', 4, 7)
|
|
|
|
harness.actions.deleteSelectedSourceLines()
|
|
|
|
assert.equal(harness.value.value, '첫 줄\n셋째 줄')
|
|
assert.deepEqual(harness.selection, {
|
|
start: 0,
|
|
end: 0
|
|
})
|
|
})
|
|
})
|