import { describe, expect, it } from 'vitest' import { toGuideStopInfo } from '@/data/adapters/guideStopInfoAdapter' import { canToggleGuideAudioGender, GUIDE_AUDIO_LANGUAGE_OPTIONS, resolveGuideAudioOption } from '@/domain/guideAudioOptions' import type { MuseumGuideAudioOption } from '@/domain/museum' const audioOptions: MuseumGuideAudioOption[] = [ { channelCode: 'standard.zh-CN.female', languageCode: 'zh-CN', gender: 'female', playUrl: '/audio/zh-female.mp3', isDefault: true, sortOrder: 10 }, { channelCode: 'standard.zh-CN.male', languageCode: 'zh-CN', gender: 'male', playUrl: '/audio/zh-male.mp3', sortOrder: 20 }, { channelCode: 'standard.en-US.female', languageCode: 'en-US', gender: 'female', playUrl: '/audio/en-female.mp3' }, { channelCode: 'standard.en-US.male', languageCode: 'en-US', gender: 'male', playUrl: '/audio/en-male.mp3' }, { channelCode: 'standard.yue-HK.female', languageCode: 'yue-HK', gender: 'female', playUrl: '/audio/yue-female.mp3' } ] describe('guide audio options', () => { it('parses directly playable audio options from stop-info', () => { const stopInfo = toGuideStopInfo({ available: true, targetType: 'STOP', targetId: '100', lang: 'zh-CN', title: '测试讲解', audioStatus: 'READY', audioOptionCount: 5, audioOptions: audioOptions.map((option) => ({ ...option, duration: 120 })) }, { targetType: 'STOP', targetId: '100', lang: 'zh-CN' }) expect(stopInfo.audioOptions).toHaveLength(5) expect(stopInfo.audioOptions[1]).toMatchObject({ channelCode: 'standard.zh-CN.male', languageCode: 'zh-CN', gender: 'male', playUrl: '/audio/zh-male.mp3', duration: 120 }) expect(stopInfo.supportedLanguages).toEqual(['zh-CN', 'en-US', 'yue-HK']) }) it('keeps tabs in Chinese, English, Cantonese order and defaults Chinese and English to male', () => { expect(GUIDE_AUDIO_LANGUAGE_OPTIONS.map((option) => option.value)).toEqual([ 'zh-CN', 'en-US', 'yue-HK' ]) expect(resolveGuideAudioOption(audioOptions, 'zh-CN', 'male')?.channelCode) .toBe('standard.zh-CN.male') expect(resolveGuideAudioOption(audioOptions, 'en-US', 'male')?.channelCode) .toBe('standard.en-US.male') }) it('shares the selected voice between Chinese and English, while Cantonese is female-only', () => { const selectedGender = 'female' as const expect(resolveGuideAudioOption(audioOptions, 'zh-CN', selectedGender)?.channelCode) .toBe('standard.zh-CN.female') expect(resolveGuideAudioOption(audioOptions, 'en-US', selectedGender)?.channelCode) .toBe('standard.en-US.female') expect(resolveGuideAudioOption(audioOptions, 'yue-HK', 'male')?.channelCode) .toBe('standard.yue-HK.female') expect(canToggleGuideAudioGender(audioOptions, 'zh-CN')).toBe(true) expect(canToggleGuideAudioGender(audioOptions, 'yue-HK')).toBe(false) }) })