import type { AudioPlayerStore, PlayerStore, PlayerTarget, VideoPlayerStore } from '@videojs/core/dom'; import { audioFeatures, backgroundFeatures, definePlayerFeature, videoFeatures } from '@videojs/core/dom'; import type { Slice } from '@videojs/store'; import { assertType, describe, it } from 'vitest'; import { type CreatePlayerResult, createPlayer } from '../create-player'; describe('createPlayer', () => { it('resolves video features to VideoPlayerStore', () => { const result = createPlayer({ features: videoFeatures }); assertType>(result); }); it('resolves audio features to AudioPlayerStore', () => { const result = createPlayer({ features: audioFeatures }); assertType>(result); const store = result.create(); assertType(store.error?.code); assertType(store.error?.message); assertType<() => void>(store.dismissError); }); it('resolves spread video features to VideoPlayerStore', () => { const result = createPlayer({ features: videoFeatures }); assertType>(result); }); it('resolves custom features to generic PlayerStore', () => { interface CustomState { custom: boolean; } const customFeature = definePlayerFeature({ state: (): CustomState => ({ custom: true }), }); const result = createPlayer({ features: [customFeature] }); assertType]>>>(result); }); it('resolves extended video features to generic PlayerStore', () => { interface AnalyticsState { events: string[]; } const analyticsFeature = definePlayerFeature({ state: (): AnalyticsState => ({ events: [] }), }); const result = createPlayer({ features: [...videoFeatures, analyticsFeature], }); // Extended features fall through to the generic overload assertType>>(result); // The store has both video and analytics state const store = result.create(); assertType(store.paused); assertType(store.volume); assertType(store.events); }); it('resolves background features to generic PlayerStore', () => { const result = createPlayer({ features: backgroundFeatures }); assertType>>(result); }); it('resolves extended audio features to generic PlayerStore', () => { interface AnalyticsState { events: string[]; } const analyticsFeature = definePlayerFeature({ state: (): AnalyticsState => ({ events: [] }), }); const result = createPlayer({ features: [...audioFeatures, analyticsFeature], }); const store = result.create(); assertType(store.paused); assertType(store.volume); assertType(store.events); }); });