import { describe, it, expect } from 'vitest' import { extractCodeBlocks } from '../../src/repl/code-blocks.js' describe('extractCodeBlocks', () => { it('returns empty array for empty string', () => { expect(extractCodeBlocks('')).toEqual([]) }) it('returns empty array for null/falsy input', () => { expect(extractCodeBlocks(null as unknown as string)).toEqual([]) }) it('returns empty array when no fences present', () => { expect(extractCodeBlocks('Just some plain text, no code here.')).toEqual([]) }) it('extracts a single fenced block without language', () => { const md = '```\nhello world\n```' const result = extractCodeBlocks(md) expect(result).toHaveLength(1) expect(result[0].lang).toBeNull() expect(result[0].code).toBe('hello world') }) it('extracts a block with a language tag', () => { const md = '```typescript\nconst x = 1\n```' const result = extractCodeBlocks(md) expect(result).toHaveLength(1) expect(result[0].lang).toBe('typescript') expect(result[0].code).toBe('const x = 1') }) it('extracts multiple fenced blocks', () => { const md = '```bash\necho hi\n```\nsome text\n```python\nprint("hello")\n```' const result = extractCodeBlocks(md) expect(result).toHaveLength(2) expect(result[0].lang).toBe('bash') expect(result[0].code).toBe('echo hi') expect(result[1].lang).toBe('python') expect(result[1].code).toBe('print("hello")') }) it('trims single trailing newline from code', () => { const md = '```js\nconsole.log(1)\n```' expect(extractCodeBlocks(md)[0].code).toBe('console.log(1)') }) it('preserves intentional blank lines inside code', () => { const md = '```\nline1\n\nline3\n```' expect(extractCodeBlocks(md)[0].code).toBe('line1\n\nline3') }) it('ignores empty fenced blocks (no content)', () => { const md = '```\n```' expect(extractCodeBlocks(md)).toEqual([]) }) it('handles language with spaces in the tag (trims it)', () => { const md = '``` js \nconsole.log()\n```' const result = extractCodeBlocks(md) expect(result[0].lang).toBe('js') }) it('handles language-only whitespace tag → null lang', () => { const md = '``` \ncode here\n```' const result = extractCodeBlocks(md) expect(result[0].lang).toBeNull() }) it('extracts multi-line code block correctly', () => { const code = 'function foo() {\n return 42\n}' const md = '```typescript\n' + code + '\n```' expect(extractCodeBlocks(md)[0].code).toBe(code) }) })