import assert from 'node:assert/strict' import test from 'node:test' import { createPreviewAppendParagraphValue, createPreviewDeleteLineValue, createPreviewExtractGalleryImageValue, createPreviewGalleryReorderValue, createPreviewImagesMergeValue, createPreviewInsertAfterLineResult, createPreviewInsertImageToGalleryValue, createPreviewMergeWithPreviousLineValue, createPreviewRemoveGalleryImageResult, parseEditorImageLine, replacePreviewLineRangeValue } from '../lib/markdown-editor-preview-blocks.js' test('단독 이미지 URL도 에디터 이미지 줄로 해석한다', () => { assert.deepEqual(parseEditorImageLine('/uploads/posts/sample.png'), { url: '/uploads/posts/sample.png', width: 'regular', pixelWidth: null, caption: '', useAlt: false }) assert.equal(parseEditorImageLine('일반 텍스트'), null) }) test('줄 범위 교체와 갤러리 순서 변경 값을 만든다', () => { assert.equal(replacePreviewLineRangeValue({ value: 'a\nb\nc', startLine: 1, endLine: 1, replacementLines: ['B', 'BB'] }), 'a\nB\nBB\nc') assert.equal(createPreviewGalleryReorderValue({ value: '위\n:::gallery\n![](/a.png)\n![](/b.png "둘")\n:::\n아래', startLine: 1, endLine: 4, images: [ { url: '/b.png', caption: '둘' }, { url: '/a.png' } ] }), '위\n:::gallery\n![](/b.png "둘")\n![](/a.png)\n:::\n아래') }) test('두 단일 이미지 줄을 드래그 원본 우선 순서로 갤러리 병합한다', () => { assert.equal(createPreviewImagesMergeValue({ value: '앞\n![](/a.png)\n중간\n![](/b.png "둘")\n뒤', sourceLine: 3, targetLine: 1 }), '앞\n:::gallery\n![](/b.png "둘")\n![](/a.png)\n:::\n뒤') }) test('단일 이미지 줄을 기존 갤러리에 삽입하고 원본 줄을 제거한다', () => { assert.equal(createPreviewInsertImageToGalleryValue({ value: '![](/source.png)\n본문\n:::gallery\n![](/a.png)\n![](/b.png)\n:::\n끝', sourceLine: 0, startLine: 2, endLine: 5, targetIndex: 1 }), '본문\n:::gallery\n![](/a.png)\n![](/source.png)\n![](/b.png)\n:::\n끝') }) test('갤러리 이미지 삭제는 남은 개수에 따라 갤러리 또는 단일 이미지로 바꾼다', () => { assert.deepEqual(createPreviewRemoveGalleryImageResult({ value: '위\n:::gallery\n![](/a.png)\n![](/b.png)\n:::\n아래', startLine: 1, endLine: 4, imageIndex: 0 }), { value: '위\n![](/b.png)\n아래', focusLine: 1 }) assert.deepEqual(createPreviewRemoveGalleryImageResult({ value: '위\n:::gallery\n![](/a.png)\n![](/b.png)\n![](/c.png)\n:::\n아래', startLine: 1, endLine: 5, imageIndex: 1 }), { value: '위\n:::gallery\n![](/a.png)\n![](/c.png)\n:::\n아래', focusLine: 2 }) }) test('갤러리 이미지를 블록 사이로 분리한다', () => { assert.equal(createPreviewExtractGalleryImageValue({ value: '위\n:::gallery\n![](/a.png)\n![](/b.png)\n![](/c.png)\n:::\n아래', startLine: 1, endLine: 5, imageIndex: 1, insertBeforeLine: 6 }), '위\n:::gallery\n![](/a.png)\n![](/c.png)\n:::\n아래\n![](/b.png)') }) test('문단 추가·지정 줄 삽입·삭제·이전 줄 병합 값을 만든다', () => { assert.equal(createPreviewAppendParagraphValue('a\n\n'), 'a\n\n') assert.equal(createPreviewAppendParagraphValue(''), '') assert.deepEqual(createPreviewInsertAfterLineResult({ value: 'a\nb', afterLine: 0, lines: ['x', 'y'] }), { value: 'a\nx\ny\nb', focusLine: 1 }) assert.equal(createPreviewDeleteLineValue({ value: 'a\nb\nc', lineIndex: 1 }), 'a\nc') assert.equal(createPreviewMergeWithPreviousLineValue({ value: 'a\nb\nc', lineIndex: 1, mergedLine: 'ab' }), 'ab\nc') })