123 lines
2.6 KiB
JavaScript
123 lines
2.6 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import test from 'node:test'
|
|
import {
|
|
findCodeFenceRangeAtLine,
|
|
findNextFencedClosingLine,
|
|
findPreviousFencedOpeningLine,
|
|
isCodeFenceBodyLine,
|
|
resolvePreviewFocusPosition
|
|
} from '../lib/markdown-editor-focus.js'
|
|
|
|
test('fenced 블록의 이전 여는 줄과 다음 닫는 줄을 찾는다', () => {
|
|
const lines = [
|
|
'앞',
|
|
':::callout',
|
|
'본문',
|
|
':::',
|
|
'뒤'
|
|
]
|
|
|
|
assert.equal(findPreviousFencedOpeningLine(
|
|
lines,
|
|
3,
|
|
(line) => line.startsWith(':::callout')
|
|
), 1)
|
|
assert.equal(findNextFencedClosingLine(lines, 1, ':::'), 3)
|
|
})
|
|
|
|
test('코드 펜스 범위와 본문 줄을 판별한다', () => {
|
|
const lines = [
|
|
'앞',
|
|
'```js',
|
|
'console.log(1)',
|
|
'```',
|
|
'뒤'
|
|
]
|
|
|
|
assert.deepEqual(findCodeFenceRangeAtLine(lines, 1), {
|
|
openingLine: 1,
|
|
closingLine: 3
|
|
})
|
|
assert.deepEqual(findCodeFenceRangeAtLine(lines, 2), {
|
|
openingLine: 1,
|
|
closingLine: 3
|
|
})
|
|
assert.equal(isCodeFenceBodyLine(lines, 2), true)
|
|
assert.equal(isCodeFenceBodyLine(lines, 3), false)
|
|
assert.equal(isCodeFenceBodyLine(lines, 4), false)
|
|
})
|
|
|
|
test('닫히지 않은 코드 펜스는 이후 줄을 본문으로 본다', () => {
|
|
const lines = [
|
|
'```',
|
|
'code'
|
|
]
|
|
|
|
assert.deepEqual(findCodeFenceRangeAtLine(lines, 0), {
|
|
openingLine: 0,
|
|
closingLine: null
|
|
})
|
|
assert.equal(isCodeFenceBodyLine(lines, 1), true)
|
|
})
|
|
|
|
test('라이브 포커스는 코드 선언 줄에서 첫 본문 줄로 이동한다', () => {
|
|
const value = [
|
|
'앞',
|
|
'```js',
|
|
'const a = 1',
|
|
'```',
|
|
'뒤'
|
|
].join('\n')
|
|
|
|
assert.deepEqual(resolvePreviewFocusPosition({
|
|
value,
|
|
line: 1,
|
|
offset: 5
|
|
}), {
|
|
line: 2,
|
|
offset: 0
|
|
})
|
|
})
|
|
|
|
test('라이브 포커스는 callout과 toggle 선언 줄에서 본문 줄로 이동한다', () => {
|
|
assert.deepEqual(resolvePreviewFocusPosition({
|
|
value: ':::callout title=주의\n본문\n:::',
|
|
line: 0,
|
|
offset: 10
|
|
}), {
|
|
line: 1,
|
|
offset: 0
|
|
})
|
|
|
|
assert.deepEqual(resolvePreviewFocusPosition({
|
|
value: ':::toggle title=더보기\n본문\n:::',
|
|
line: 0,
|
|
offset: 10
|
|
}), {
|
|
line: 1,
|
|
offset: 0
|
|
})
|
|
})
|
|
|
|
test('라이브 포커스는 fenced 닫는 줄에서 이전 본문 줄로 보정한다', () => {
|
|
assert.deepEqual(resolvePreviewFocusPosition({
|
|
value: ':::callout\n본문\n:::',
|
|
line: 2,
|
|
offset: 4
|
|
}), {
|
|
line: 1,
|
|
offset: 4
|
|
})
|
|
})
|
|
|
|
test('라이브 포커스는 인용 옵션 줄에서 실제 인용 본문 줄로 이동한다', () => {
|
|
assert.deepEqual(resolvePreviewFocusPosition({
|
|
value: '> [!bg=blue]\n> 본문',
|
|
line: 0,
|
|
offset: 7
|
|
}), {
|
|
line: 1,
|
|
offset: 0
|
|
})
|
|
})
|