import assert from 'node:assert/strict' import test from 'node:test' import { getSlashCommandFocusTarget, insertMarkdownLinesAtSlashTarget, isMediaSlashAction, parseSlashInput, resolveSlashCommand, shouldIgnorePendingMediaSlashCommit } from '../lib/markdown-slash-commands.js' test('슬래시 입력은 단일 줄 명령만 파싱한다', () => { assert.deepEqual(parseSlashInput('/image'), { query: 'image', raw: '/image' }) assert.equal(parseSlashInput(' /image'), null) assert.equal(parseSlashInput('/image\n다음 줄'), null) }) test('정확한 슬래시 명령과 미디어 액션을 판별한다', () => { assert.equal(resolveSlashCommand('image')?.action, 'media-image') assert.equal(resolveSlashCommand('img')?.id, 'image') assert.equal(isMediaSlashAction('media-image'), true) assert.equal(isMediaSlashAction('lines'), false) }) test('미디어 슬래시 명령 지연 commit은 같은 줄 slash 원문일 때만 무시한다', () => { assert.equal(shouldIgnorePendingMediaSlashCommit({ pendingInsertLine: 3, startLine: 3, replacementLines: ['/image'] }), true) assert.equal(shouldIgnorePendingMediaSlashCommit({ pendingInsertLine: 3, startLine: 4, replacementLines: ['/image'] }), false) assert.equal(shouldIgnorePendingMediaSlashCommit({ pendingInsertLine: 3, startLine: 3, replacementLines: ['본문'] }), false) }) test('슬래시 명령 줄에 미디어를 삽입할 때 원문 줄을 교체한다', () => { const markdown = [ '첫 줄', '/image', '마지막 줄' ].join('\n') assert.equal(insertMarkdownLinesAtSlashTarget(markdown, 1, ['![](/uploads/a.png)']), [ '첫 줄', '![](/uploads/a.png)', '마지막 줄' ].join('\n')) }) test('일반 줄에는 지정 위치 앞에 마크다운 줄을 삽입한다', () => { assert.equal(insertMarkdownLinesAtSlashTarget('첫 줄\n마지막 줄', 1, ['중간 줄']), '첫 줄\n중간 줄\n마지막 줄') }) test('슬래시 명령 포커스 대상은 단일 줄과 블록 삽입을 구분한다', () => { assert.deepEqual(getSlashCommandFocusTarget(2, ['## ']), { line: 2, offset: 3 }) assert.deepEqual(getSlashCommandFocusTarget(2, ['```', '', '```']), { line: 3, offset: 0 }) })