import { describe, it, expect } from 'vitest'; import { stripThinkingTokens } from './strip-thinking.js'; describe('stripThinkingTokens', () => { it('returns plain text unchanged (modulo trim)', () => { expect(stripThinkingTokens('hello world')).toBe('hello world'); expect(stripThinkingTokens(' padded ')).toBe('padded'); }); it('handles empty input', () => { expect(stripThinkingTokens('')).toBe(''); }); it('strips a DeepSeek-style block', () => { expect(stripThinkingTokens('internal reasoninganswer')).toBe('answer'); }); it('strips multiple blocks non-greedily', () => { const input = 'afirstbsecond'; expect(stripThinkingTokens(input)).toBe('firstsecond'); }); it('strips multiline content', () => { const input = 'line1\nline2\n\nresult'; expect(stripThinkingTokens(input)).toBe('result'); }); it('leaves an unclosed block intact', () => { const input = 'never closed... answer'; expect(stripThinkingTokens(input)).toBe('never closed... answer'); }); it('strips generic <|thinking|> blocks', () => { expect(stripThinkingTokens('<|thinking|>hmm<|/thinking|>ok')).toBe('ok'); }); it('strips Gemma-style thought + channel marker', () => { expect(stripThinkingTokens('thought\nvisible')).toBe('visible'); }); it('strips paired blocks', () => { expect(stripThinkingTokens('internalvisible')).toBe('visible'); }); it('preserves unicode content outside thinking blocks', () => { expect(stripThinkingTokens('思考日本語の回答')).toBe('日本語の回答'); }); it('returns empty string when the whole response is a thinking block', () => { expect(stripThinkingTokens('only thoughts')).toBe(''); }); });