@@ -25,6 +25,7 @@ const createStopInfo = (overrides: Partial<GuideStopInfo> = {}): GuideStopInfo =
|
||||
hasAudio: false,
|
||||
hasText: false,
|
||||
supportedLanguages: [],
|
||||
audioOptions: [],
|
||||
languageVariants: {},
|
||||
audioStatus: 'MISSING',
|
||||
...overrides
|
||||
@@ -156,4 +157,91 @@ describe('ExplainUseCase stop image policy', () => {
|
||||
expect((audio as any).getPlayInfo).not.toHaveBeenCalled()
|
||||
expect((audio as any).getTextInfo).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('prefers default audio options and switches the selected voice locally', async () => {
|
||||
const useCase = createUseCase(createStopInfo({
|
||||
hasAudio: true,
|
||||
hasText: true,
|
||||
supportedLanguages: ['zh-CN', 'en-US'],
|
||||
languageVariants: {
|
||||
'zh-CN': {
|
||||
lang: 'zh-CN',
|
||||
enabled: true,
|
||||
playable: true,
|
||||
playUrl: '/audio/legacy-zh.mp3',
|
||||
textAvailable: true,
|
||||
text: '普通话讲解词',
|
||||
hasText: true,
|
||||
fallback: false,
|
||||
audioStatus: 'READY'
|
||||
},
|
||||
'en-US': {
|
||||
lang: 'en-US',
|
||||
enabled: true,
|
||||
playable: true,
|
||||
playUrl: '/audio/legacy-en.mp3',
|
||||
textAvailable: true,
|
||||
text: 'English narration',
|
||||
hasText: true,
|
||||
fallback: false,
|
||||
audioStatus: 'READY'
|
||||
}
|
||||
} as GuideStopInfo['languageVariants'],
|
||||
audioOptions: [
|
||||
{
|
||||
channelCode: 'standard.zh-CN.female',
|
||||
displayName: '普通话女声',
|
||||
languageCode: 'zh-CN',
|
||||
gender: 'female',
|
||||
playUrl: '/audio/zh-female.mp3',
|
||||
duration: 50,
|
||||
isDefault: true
|
||||
},
|
||||
{
|
||||
channelCode: 'standard.zh-CN.male',
|
||||
displayName: '普通话男声',
|
||||
languageCode: 'zh-CN',
|
||||
gender: 'male',
|
||||
playUrl: '/audio/zh-male.mp3',
|
||||
duration: 51,
|
||||
isDefault: false
|
||||
},
|
||||
{
|
||||
channelCode: 'standard.en-US.female',
|
||||
displayName: '英文女声',
|
||||
languageCode: 'en-US',
|
||||
gender: 'female',
|
||||
playUrl: '/audio/en-female.mp3',
|
||||
duration: 49,
|
||||
isDefault: true
|
||||
}
|
||||
]
|
||||
}))
|
||||
|
||||
const chinese = await useCase.enterExplainDetail({
|
||||
exhibitId: 'stop-1', targetType: 'STOP', targetId: 'stop-1', lang: 'zh-CN'
|
||||
})
|
||||
const english = useCase.selectExplainDetailLanguage(chinese, 'en-US')
|
||||
const chineseMale = useCase.selectExplainDetailAudioOption(chinese, 'standard.zh-CN.male')
|
||||
|
||||
expect(chinese).toMatchObject({
|
||||
audioUrl: '/audio/zh-female.mp3',
|
||||
audioDuration: 50,
|
||||
audioChannelCode: 'standard.zh-CN.female',
|
||||
audioVoiceGender: 'female',
|
||||
guideText: '普通话讲解词'
|
||||
})
|
||||
expect(english).toMatchObject({
|
||||
audioUrl: '/audio/en-female.mp3',
|
||||
audioChannelCode: 'standard.en-US.female',
|
||||
guideText: 'English narration'
|
||||
})
|
||||
expect(chineseMale).toMatchObject({
|
||||
audioUrl: '/audio/zh-male.mp3',
|
||||
audioDuration: 51,
|
||||
audioChannelCode: 'standard.zh-CN.male',
|
||||
audioVoiceGender: 'male',
|
||||
guideText: '普通话讲解词'
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user