feat: initial release v0.3.0

This commit is contained in:
saturn
2026-03-08 03:15:27 +08:00
commit 881ed44996
1311 changed files with 225407 additions and 0 deletions

View File

@@ -0,0 +1,68 @@
import { describe, expect, it, vi } from 'vitest'
import {
DEFAULT_VOICE_SCHEME_COUNT,
MAX_VOICE_SCHEME_COUNT,
MIN_VOICE_SCHEME_COUNT,
generateVoiceDesignOptions,
normalizeVoiceSchemeCount,
} from '@/components/voice/voice-design-shared'
describe('voice-design-shared', () => {
it('clamps scheme count into the supported range', () => {
expect(normalizeVoiceSchemeCount(undefined)).toBe(DEFAULT_VOICE_SCHEME_COUNT)
expect(normalizeVoiceSchemeCount('not-a-number')).toBe(DEFAULT_VOICE_SCHEME_COUNT)
expect(normalizeVoiceSchemeCount(0)).toBe(MIN_VOICE_SCHEME_COUNT)
expect(normalizeVoiceSchemeCount(99)).toBe(MAX_VOICE_SCHEME_COUNT)
expect(normalizeVoiceSchemeCount('5')).toBe(5)
})
it('generates the requested number of voice options with default preview text fallback', async () => {
const onDesignVoice = vi
.fn<(_: {
voicePrompt: string
previewText: string
preferredName: string
language: 'zh'
}) => Promise<{ voiceId: string; audioBase64: string }>>()
.mockResolvedValueOnce({ voiceId: 'voice-1', audioBase64: 'audio-1' })
.mockResolvedValueOnce({ voiceId: 'voice-2', audioBase64: 'audio-2' })
.mockResolvedValueOnce({ voiceId: 'voice-3', audioBase64: 'audio-3' })
.mockResolvedValueOnce({ voiceId: 'voice-4', audioBase64: 'audio-4' })
const result = await generateVoiceDesignOptions({
count: '4',
voicePrompt: ' 温柔女声 ',
previewText: ' ',
defaultPreviewText: '默认试听文案',
onDesignVoice,
createPreferredName: (index) => `preferred-${index + 1}`,
})
expect(result).toEqual([
{ voiceId: 'voice-1', audioBase64: 'audio-1', audioUrl: 'data:audio/wav;base64,audio-1' },
{ voiceId: 'voice-2', audioBase64: 'audio-2', audioUrl: 'data:audio/wav;base64,audio-2' },
{ voiceId: 'voice-3', audioBase64: 'audio-3', audioUrl: 'data:audio/wav;base64,audio-3' },
{ voiceId: 'voice-4', audioBase64: 'audio-4', audioUrl: 'data:audio/wav;base64,audio-4' },
])
expect(onDesignVoice.mock.calls).toEqual([
[{ voicePrompt: '温柔女声', previewText: '默认试听文案', preferredName: 'preferred-1', language: 'zh' }],
[{ voicePrompt: '温柔女声', previewText: '默认试听文案', preferredName: 'preferred-2', language: 'zh' }],
[{ voicePrompt: '温柔女声', previewText: '默认试听文案', preferredName: 'preferred-3', language: 'zh' }],
[{ voicePrompt: '温柔女声', previewText: '默认试听文案', preferredName: 'preferred-4', language: 'zh' }],
])
})
it('fails explicitly when a designed voice is missing voiceId', async () => {
const onDesignVoice = vi.fn(async () => ({ voiceId: '', audioBase64: 'audio-only' }))
await expect(
generateVoiceDesignOptions({
count: 1,
voicePrompt: '旁白',
previewText: '测试',
defaultPreviewText: '默认试听文案',
onDesignVoice,
}),
).rejects.toThrow('VOICE_DESIGN_INVALID_RESPONSE: missing voiceId')
})
})