import { type AudioPlayerStore, audioFeatures, definePlayerFeature, features, type PlayerStore, type PlayerTarget, type VideoPlayerStore, 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); }); 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('accepts the orientation lock feature alias with and without config', () => { const configuredOrientationLock = features.orientationLock({ type: 'portrait' }); const defaultResult = createPlayer({ features: [features.orientationLock] }); const configuredResult = createPlayer({ features: [configuredOrientationLock] }); assertType>>(defaultResult); assertType>>(configuredResult); }); 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); }); it('resolves extended audio features to generic PlayerStore', () => { interface AnalyticsState { events: string[]; } const analyticsFeature = definePlayerFeature({ state: (): AnalyticsState => ({ events: [] }), }); const result = createPlayer({ features: [...audioFeatures, analyticsFeature], }); assertType>>(result); }); });