237 lines
5.9 KiB
Dart
237 lines
5.9 KiB
Dart
|
|
import 'package:flutter_test/flutter_test.dart';
|
|||
|
|
import 'package:smplayer/features/player/session/player_engine_resolution.dart';
|
|||
|
|
import 'package:smplayer/providers/player_engine_override_provider.dart';
|
|||
|
|
|
|||
|
|
void main() {
|
|||
|
|
group('resolvePlayerEngineKind - media3 override', () {
|
|||
|
|
test('Android + 非 DV/ProRes → media3', () {
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.media3,
|
|||
|
|
isDolbyVision: false,
|
|||
|
|
videoCodec: 'h264',
|
|||
|
|
isAndroid: true,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.media3,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('桌面 → mpv(不论 DV / codec)', () {
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.media3,
|
|||
|
|
isDolbyVision: false,
|
|||
|
|
videoCodec: 'h264',
|
|||
|
|
isAndroid: false,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.mpv,
|
|||
|
|
);
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.media3,
|
|||
|
|
isDolbyVision: true,
|
|||
|
|
videoCodec: 'prores',
|
|||
|
|
isAndroid: false,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.mpv,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('Android + DV → media3(用户显式选 media3 时直通 DV)', () {
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.media3,
|
|||
|
|
isDolbyVision: true,
|
|||
|
|
videoCodec: 'hevc',
|
|||
|
|
isAndroid: true,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.media3,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('Android + ProRes → fvp(MediaCodec 不解 ProRes)', () {
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.media3,
|
|||
|
|
isDolbyVision: false,
|
|||
|
|
videoCodec: 'prores',
|
|||
|
|
isAndroid: true,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.fvp,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
group('resolvePlayerEngineKind - auto behavior', () {
|
|||
|
|
test('auto + Android + 非 DV/ProRes → media3', () {
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.auto,
|
|||
|
|
isDolbyVision: false,
|
|||
|
|
videoCodec: 'h264',
|
|||
|
|
isAndroid: true,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.media3,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('auto + Android + DV → media3', () {
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.auto,
|
|||
|
|
isDolbyVision: true,
|
|||
|
|
videoCodec: 'hevc',
|
|||
|
|
isAndroid: true,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.media3,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('auto + Android + ProRes → fvp', () {
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.auto,
|
|||
|
|
isDolbyVision: false,
|
|||
|
|
videoCodec: 'prores',
|
|||
|
|
isAndroid: true,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.fvp,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('auto + 桌面 → mpv', () {
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.auto,
|
|||
|
|
isDolbyVision: false,
|
|||
|
|
videoCodec: 'h264',
|
|||
|
|
isAndroid: false,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.mpv,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('auto + 桌面 DV → fvp', () {
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.auto,
|
|||
|
|
isDolbyVision: true,
|
|||
|
|
videoCodec: 'hevc',
|
|||
|
|
isAndroid: false,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.fvp,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('fvp override → 总是 fvp', () {
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.fvp,
|
|||
|
|
isDolbyVision: false,
|
|||
|
|
videoCodec: 'h264',
|
|||
|
|
isAndroid: false,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.fvp,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('mpv override → 总是 mpv(即便 DV)', () {
|
|||
|
|
expect(
|
|||
|
|
resolvePlayerEngineKind(
|
|||
|
|
PlayerEngineOverride.mpv,
|
|||
|
|
isDolbyVision: true,
|
|||
|
|
videoCodec: 'hevc',
|
|||
|
|
isAndroid: true,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.mpv,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
group('playerEngineKindFromDisplayName', () {
|
|||
|
|
test('media3 → PlayerEngineKind.media3', () {
|
|||
|
|
expect(
|
|||
|
|
playerEngineKindFromDisplayName('media3'),
|
|||
|
|
PlayerEngineKind.media3,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('fvp / mpv 仍可反查', () {
|
|||
|
|
expect(playerEngineKindFromDisplayName('fvp'), PlayerEngineKind.fvp);
|
|||
|
|
expect(playerEngineKindFromDisplayName('mpv'), PlayerEngineKind.mpv);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('未知 displayName → null', () {
|
|||
|
|
expect(playerEngineKindFromDisplayName('unknown'), isNull);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
group('nextAutoFallbackEngine', () {
|
|||
|
|
test('auto + media3 失败(非 DV)→ mpv', () {
|
|||
|
|
expect(
|
|||
|
|
nextAutoFallbackEngine(
|
|||
|
|
override: PlayerEngineOverride.auto,
|
|||
|
|
failedEngineKind: PlayerEngineKind.media3,
|
|||
|
|
isDolbyVision: false,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.mpv,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('auto + media3 失败(DV)→ 跳过 mpv 直达 fvp', () {
|
|||
|
|
expect(
|
|||
|
|
nextAutoFallbackEngine(
|
|||
|
|
override: PlayerEngineOverride.auto,
|
|||
|
|
failedEngineKind: PlayerEngineKind.media3,
|
|||
|
|
isDolbyVision: true,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.fvp,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('auto + mpv 失败 → fvp', () {
|
|||
|
|
expect(
|
|||
|
|
nextAutoFallbackEngine(
|
|||
|
|
override: PlayerEngineOverride.auto,
|
|||
|
|
failedEngineKind: PlayerEngineKind.mpv,
|
|||
|
|
isDolbyVision: false,
|
|||
|
|
),
|
|||
|
|
PlayerEngineKind.fvp,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('auto + fvp 失败 → 无回退', () {
|
|||
|
|
expect(
|
|||
|
|
nextAutoFallbackEngine(
|
|||
|
|
override: PlayerEngineOverride.auto,
|
|||
|
|
failedEngineKind: PlayerEngineKind.fvp,
|
|||
|
|
isDolbyVision: true,
|
|||
|
|
),
|
|||
|
|
isNull,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('非 auto 不自动回退', () {
|
|||
|
|
expect(
|
|||
|
|
nextAutoFallbackEngine(
|
|||
|
|
override: PlayerEngineOverride.media3,
|
|||
|
|
failedEngineKind: PlayerEngineKind.media3,
|
|||
|
|
isDolbyVision: true,
|
|||
|
|
),
|
|||
|
|
isNull,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('未知失败引擎不自动回退', () {
|
|||
|
|
expect(
|
|||
|
|
nextAutoFallbackEngine(
|
|||
|
|
override: PlayerEngineOverride.auto,
|
|||
|
|
failedEngineKind: null,
|
|||
|
|
isDolbyVision: false,
|
|||
|
|
),
|
|||
|
|
isNull,
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|