에디터 소스 선택 실행 분리
This commit is contained in:
125
tests/useAdminMarkdownSourceActions.test.js
Normal file
125
tests/useAdminMarkdownSourceActions.test.js
Normal file
@@ -0,0 +1,125 @@
|
||||
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
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user