49 lines
1.7 KiB
TypeScript
49 lines
1.7 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
import { separateGluedReasoningBlocks } from '@/lib/reasoning-blocks'
|
|
|
|
describe('separateGluedReasoningBlocks', () => {
|
|
it('splits heading-onto-heading parts (the `****` run)', () => {
|
|
const glued =
|
|
'**Investigating likely culprit PRs****Inspecting message schema****Analyzing interrupted tool call impact**'
|
|
|
|
expect(separateGluedReasoningBlocks(glued)).toBe(
|
|
[
|
|
'**Investigating likely culprit PRs**',
|
|
'',
|
|
'**Inspecting message schema**',
|
|
'',
|
|
'**Analyzing interrupted tool call impact**'
|
|
].join('\n')
|
|
)
|
|
})
|
|
|
|
it('splits prose-onto-heading parts (vercel/ai#6742 repro)', () => {
|
|
const glued =
|
|
'**Simulating a greeting stream**\n\nIt feels like a streaming interaction!**Simulating a greeting stream**\n\nI want to meet the request.'
|
|
|
|
expect(separateGluedReasoningBlocks(glued)).toContain('interaction!\n\n**Simulating')
|
|
expect(separateGluedReasoningBlocks(glued)).not.toContain('interaction!**')
|
|
})
|
|
|
|
it('is idempotent on already-separated text', () => {
|
|
const separated = '**One**\n\n**Two**'
|
|
|
|
expect(separateGluedReasoningBlocks(separated)).toBe(separated)
|
|
})
|
|
|
|
it('leaves emphasis inside prose alone', () => {
|
|
const prose = 'Looking at the logs, the **signature** field is missing — so the replay 400s.'
|
|
|
|
expect(separateGluedReasoningBlocks(prose)).toBe(prose)
|
|
})
|
|
|
|
it('leaves an unclosed emphasis run alone', () => {
|
|
expect(separateGluedReasoningBlocks('weighing options **')).toBe('weighing options **')
|
|
})
|
|
|
|
it('does not split a heading that already opens the text', () => {
|
|
expect(separateGluedReasoningBlocks('**Only one part**')).toBe('**Only one part**')
|
|
})
|
|
})
|