mirror of
https://github.com/zoriya/v10.git
synced 2026-08-16 02:45:09 +00:00
feat(packages): i18n (#1708)
This commit is contained in:
@@ -1,18 +1,18 @@
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import { resolveVttSegment } from '../../../../media/dom/text/resolve-vtt-segment';
|
||||
import { describe, expect, it, vi } from 'vitest';
|
||||
import type { TextTrack } from '../../../../media/types';
|
||||
import { createTextTrackSegmentLoaderActor } from '../../text-track-segment-loader';
|
||||
import { createTextTracksActor } from '../text-tracks';
|
||||
|
||||
vi.mock('../../../../media/dom/text/resolve-vtt-segment', () => ({
|
||||
resolveVttSegment: vi.fn((url: string) => {
|
||||
type ResolveVttSegment = (url: string) => Promise<VTTCue[]>;
|
||||
|
||||
function createResolveVttSegment(): ReturnType<typeof vi.fn<ResolveVttSegment>> {
|
||||
return vi.fn((url: string) => {
|
||||
if (url.includes('fail')) {
|
||||
return Promise.reject(new Error('Network error'));
|
||||
}
|
||||
return Promise.resolve([new VTTCue(0, 5, `Cue from ${url}`)]);
|
||||
}),
|
||||
destroyVttResolver: vi.fn(),
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
function makeMediaElement(trackIds: string[]): HTMLMediaElement {
|
||||
const video = document.createElement('video');
|
||||
@@ -49,11 +49,8 @@ function makeResolvedTextTrack(id: string, segmentUrls: string[]): TextTrack {
|
||||
}
|
||||
|
||||
describe('TextTrackSegmentLoaderActor', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
it('can be created and destroyed without error', () => {
|
||||
const resolveVttSegment = createResolveVttSegment();
|
||||
const video = makeMediaElement(['track-en']);
|
||||
const textTracksActor = createTextTracksActor(video);
|
||||
const actor = createTextTrackSegmentLoaderActor(textTracksActor, resolveVttSegment);
|
||||
@@ -62,8 +59,7 @@ describe('TextTrackSegmentLoaderActor', () => {
|
||||
});
|
||||
|
||||
it('does not fetch when no segments need loading', async () => {
|
||||
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
|
||||
|
||||
const resolveVttSegment = createResolveVttSegment();
|
||||
const video = makeMediaElement(['track-en']);
|
||||
const textTracksActor = createTextTracksActor(video);
|
||||
const actor = createTextTrackSegmentLoaderActor(textTracksActor, resolveVttSegment);
|
||||
@@ -78,6 +74,7 @@ describe('TextTrackSegmentLoaderActor', () => {
|
||||
});
|
||||
|
||||
it('delegates cue loading to TextTracksActor', async () => {
|
||||
const resolveVttSegment = createResolveVttSegment();
|
||||
const video = makeMediaElement(['track-en']);
|
||||
const textTracksActor = createTextTracksActor(video);
|
||||
const actor = createTextTrackSegmentLoaderActor(textTracksActor, resolveVttSegment);
|
||||
@@ -96,8 +93,7 @@ describe('TextTrackSegmentLoaderActor', () => {
|
||||
});
|
||||
|
||||
it('skips already-loaded segments on repeat send()', async () => {
|
||||
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
|
||||
|
||||
const resolveVttSegment = createResolveVttSegment();
|
||||
const video = makeMediaElement(['track-en']);
|
||||
const textTracksActor = createTextTracksActor(video);
|
||||
const actor = createTextTrackSegmentLoaderActor(textTracksActor, resolveVttSegment);
|
||||
@@ -116,7 +112,7 @@ describe('TextTrackSegmentLoaderActor', () => {
|
||||
});
|
||||
|
||||
it('continues loading remaining segments after a fetch error', async () => {
|
||||
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
|
||||
const resolveVttSegment = createResolveVttSegment();
|
||||
vi.mocked(resolveVttSegment)
|
||||
.mockResolvedValueOnce([new VTTCue(0, 5, 'Good')])
|
||||
.mockRejectedValueOnce(new Error('Network error'))
|
||||
@@ -145,7 +141,7 @@ describe('TextTrackSegmentLoaderActor', () => {
|
||||
});
|
||||
|
||||
it('preempts in-flight work when a new send() arrives', async () => {
|
||||
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
|
||||
const resolveVttSegment = createResolveVttSegment();
|
||||
|
||||
let resolveSeg0!: (cues: VTTCue[]) => void;
|
||||
vi.mocked(resolveVttSegment)
|
||||
@@ -187,7 +183,7 @@ describe('TextTrackSegmentLoaderActor', () => {
|
||||
});
|
||||
|
||||
it('continues in-flight fetch when new send keeps the same segment in the plan', async () => {
|
||||
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
|
||||
const resolveVttSegment = createResolveVttSegment();
|
||||
|
||||
let resolveSeg0!: (cues: VTTCue[]) => void;
|
||||
vi.mocked(resolveVttSegment)
|
||||
@@ -242,7 +238,7 @@ describe('TextTrackSegmentLoaderActor', () => {
|
||||
});
|
||||
|
||||
it('preempts in-flight fetch when new send drops it from the plan (e.g. seek out of window)', async () => {
|
||||
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
|
||||
const resolveVttSegment = createResolveVttSegment();
|
||||
|
||||
let resolveSeg0!: (cues: VTTCue[]) => void;
|
||||
vi.mocked(resolveVttSegment)
|
||||
@@ -296,8 +292,7 @@ describe('TextTrackSegmentLoaderActor', () => {
|
||||
});
|
||||
|
||||
it('does not schedule work after destroy()', async () => {
|
||||
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
|
||||
|
||||
const resolveVttSegment = createResolveVttSegment();
|
||||
const video = makeMediaElement(['track-en']);
|
||||
const textTracksActor = createTextTracksActor(video);
|
||||
const actor = createTextTrackSegmentLoaderActor(textTracksActor, resolveVttSegment);
|
||||
|
||||
Reference in New Issue
Block a user