This commit is contained in:
102
tests/unit/GuideAudioOptions.spec.ts
Normal file
102
tests/unit/GuideAudioOptions.spec.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
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)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user