test: prune low-value coverage

This commit is contained in:
edde746
2026-08-06 05:33:18 +02:00
parent 094be1fa3e
commit db4f7a643b
27 changed files with 5 additions and 418 deletions
-21
View File
@@ -1,29 +1,8 @@
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:plezy/data/hid_key_labels.dart';
import 'package:plezy/models/hotkey_model.dart';
void main() {
test('catalog preserves all 325 unique keys in canonical numeric order', () {
final ids = hidKeyLabels.keys.toList();
final sortedIds = [...ids]..sort();
expect(hidKeyLabels, hasLength(325));
expect(ids.toSet(), hasLength(ids.length));
expect(ids, sortedIds);
expect(ids.every((id) => id >= 0 && id <= 0xffffffff), isTrue);
expect(hidKeyLabels.values.every((label) => label.trim().isNotEmpty), isTrue);
});
test('catalog preserves representative labels across usage groups', () {
expect(hidKeyLabels[0x00000012], 'Fn');
expect(hidKeyLabels[0x000100b5], 'Display Toggle');
expect(hidKeyLabels[0x0005ff1f], 'Game Button Z');
expect(hidKeyLabels[0x00070031], r'\');
expect(hidKeyLabels[0x000c00cd], 'Play/Pause');
expect(hidKeyLabels[0x000c029f], 'Show All Windows');
});
test('physicalKeyLabel uses the catalog and formats an unknown HID fallback', () {
expect(physicalKeyLabel(PhysicalKeyboardKey.keyA), 'A');
expect(physicalKeyLabel(const PhysicalKeyboardKey(0xffffffff)), 'Key 0xffffffff');
+1 -43
View File
@@ -1,50 +1,8 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:plezy/data/iso_639_data.dart';
import 'package:plezy/utils/language_codes.dart';
void main() {
test('catalog preserves 184 canonical entries and globally unique codes', () {
final primaryCodes = languageEntries.keys.toList();
final sortedPrimaryCodes = [...primaryCodes]..sort();
final allCodes = <String>{};
expect(languageEntries, hasLength(184));
expect(primaryCodes, sortedPrimaryCodes);
for (final mapEntry in languageEntries.entries) {
final entry = mapEntry.value;
expect(entry.code1, mapEntry.key);
expect(entry.code1, matches(RegExp(r'^[a-z]{2}$')));
expect(entry.code2, matches(RegExp(r'^[a-z]{3}$')));
expect(entry.name.trim(), isNotEmpty);
expect(allCodes.add(entry.code1), isTrue);
expect(allCodes.add(entry.code2), isTrue);
if (entry.code2B case final bibliographic?) {
expect(bibliographic, matches(RegExp(r'^[a-z]{3}$')));
expect(allCodes.add(bibliographic), isTrue);
}
}
});
test('reverse maps are derived completely from terminology and bibliographic aliases', () {
expect(code2ToCode1, hasLength(184));
expect(code2BToCode1, hasLength(20));
for (final entry in languageEntries.values) {
expect(code2ToCode1[entry.code2], entry.code1);
if (entry.code2B case final bibliographic?) {
expect(code2BToCode1[bibliographic], entry.code1);
}
}
});
test('representative terminology and bibliographic aliases preserve behavior', () {
final german = languageEntries['de']!;
expect(german.code2, 'deu');
expect(german.code2B, 'ger');
expect(german.name, 'German');
expect(languageEntries['bn']!.name, 'Bengali, Bangla');
expect(languageEntries['mi']!.name, 'Māori');
test('bibliographic aliases resolve via trim, case, and variation expansion', () {
expect(LanguageCodes.getIso6391Code(' DEU '), 'de');
expect(LanguageCodes.getIso6391Code('ger'), 'de');
expect(LanguageCodes.getLanguageName('GER'), 'German');
-14
View File
@@ -48,18 +48,4 @@ void main() {
});
});
group('AppLocaleExternalFormats', () {
test('preserves Traditional Chinese for downstream formatters and Plex', () {
expect(AppLocale.zhHant.intlLocaleName, 'zh_TW');
expect(AppLocale.zhHant.durationLocaleName, 'zh_Hant');
expect(AppLocale.zhHant.plexLanguageCode, 'zh-TW');
});
test('keeps existing locales on their language code', () {
expect(AppLocale.hu.intlLocaleName, 'hu');
expect(AppLocale.hu.durationLocaleName, 'hu');
expect(AppLocale.hu.plexLanguageCode, 'hu');
expect(AppLocale.zh.plexLanguageCode, 'zh');
});
});
}
@@ -34,48 +34,6 @@ void main() {
});
});
group('MediaBrowserDialect capabilities', () {
test('Jellyfin-only features are off for Emby', () {
expect(MediaBrowserDialect.jellyfin.supportsQuickConnect, isTrue);
expect(MediaBrowserDialect.emby.supportsQuickConnect, isFalse);
expect(MediaBrowserDialect.jellyfin.supportsTrickplay, isTrue);
expect(MediaBrowserDialect.emby.supportsTrickplay, isFalse);
expect(MediaBrowserDialect.jellyfin.supportsMediaSegments, isTrue);
expect(MediaBrowserDialect.emby.supportsMediaSegments, isFalse);
// Emby resolves /Audio/{id}/Lyrics to audio streaming with `Lyrics` as
// the container and starts a failing ffmpeg process, so this gate is
// load-bearing rather than cosmetic.
expect(MediaBrowserDialect.jellyfin.supportsLyrics, isTrue);
expect(MediaBrowserDialect.emby.supportsLyrics, isFalse);
expect(MediaBrowserDialect.jellyfin.supportsAggregateItemFilters, isTrue);
expect(MediaBrowserDialect.emby.supportsAggregateItemFilters, isFalse);
});
test('only Emby needs the pre-10.9 user-scoped item routes', () {
expect(MediaBrowserDialect.emby.requiresUserScopedItemRoutes, isTrue);
expect(MediaBrowserDialect.jellyfin.requiresUserScopedItemRoutes, isFalse);
});
test('LAN discovery payloads are distinct so the datagram identifies the dialect', () {
expect(MediaBrowserDialect.jellyfin.lanDiscoveryMessage, 'who is JellyfinServer?');
expect(MediaBrowserDialect.emby.lanDiscoveryMessage, 'who is EmbyServer?');
});
test('Emby adds its 8920 HTTPS default to the port guesses', () {
expect(MediaBrowserDialect.jellyfin.httpsPortGuesses, [8096]);
expect(MediaBrowserDialect.emby.httpsPortGuesses, contains(8920));
expect(MediaBrowserDialect.emby.httpsPortGuesses, contains(8096));
});
test('product names are the untranslated brand names', () {
expect(MediaBrowserDialect.jellyfin.productName, 'Jellyfin');
expect(MediaBrowserDialect.emby.productName, 'Emby');
});
});
group('MediaBrowserDialect.detectFromPublicSystemInfo', () {
test('identifies a real Jellyfin 10.10.7 body by ProductName', () {
-7
View File
@@ -118,13 +118,6 @@ void main() {
});
});
group('MediaPlaylist.displayTitle', () {
test('is an alias of title', () {
final pl = _playlist(title: 'Anything');
expect(pl.displayTitle, 'Anything');
expect(pl.displayTitle, pl.title);
});
});
group('MediaPlaylist.globalKey', () {
test('uses "<serverId>:<id>" when serverId is set', () {
@@ -44,15 +44,6 @@ void main() {
expect(state.isContextMenuOpen, isFalse);
});
testWidgets('storeTapPosition records the global tap offset', (tester) async {
late _ProbeState state;
await tester.pumpWidget(_Probe(onState: (s) => state = s));
const offset = Offset(123.0, 456.0);
state.storeTapPosition(TapDownDetails(globalPosition: offset));
expect(state.lastTapPosition, offset);
});
testWidgets('showContextMenuFromTap and showContextMenu are no-ops without a mounted menu', (tester) async {
late _ProbeState state;
@@ -30,14 +30,6 @@ void main() {
expect(fired, 0);
});
test('isDisposed flips to true after dispose()', () {
final n = _Probe();
expect(n.isDisposed, isFalse);
n.dispose();
expect(n.isDisposed, isTrue);
});
test('multiple safeNotifyListeners calls succeed before dispose', () {
final n = _Probe();
@@ -45,25 +45,7 @@ void main() {
TestWidgetsFlutterBinding.ensureInitialized();
group('ServerBoundMediaMixin', () {
testWidgets('serverBoundServerId mirrors metadata.serverId', (tester) async {
late _ProbeState state;
await tester.pumpWidget(
_Probe(
metadata: _meta(serverId: ServerId('srv-A')),
offline: false,
onState: (s, _) => state = s,
),
);
await tester.pump();
expect(state.serverBoundServerId, 'srv-A');
});
testWidgets('serverBoundServerId is null when metadata has no server', (tester) async {
late _ProbeState state;
await tester.pumpWidget(_Probe(metadata: _meta(), offline: false, onState: (s, _) => state = s));
await tester.pump();
expect(state.serverBoundServerId, isNull);
});
testWidgets('toServerBoundGlobalKey uses the metadata serverId by default', (tester) async {
late _ProbeState state;
-68
View File
@@ -3,74 +3,6 @@ import 'package:plezy/models/shader_preset.dart';
void main() {
group('ShaderPreset ArtCNN presets', () {
test('exposes the complete built-in catalog in stable order', () {
expect(ShaderPreset.allPresets.map((preset) => preset.toJson()).toList(), [
{'id': 'none', 'name': 'Off', 'type': 'none'},
{
'id': 'nvscaler',
'name': 'NVScaler',
'type': 'nvscaler',
'nvscalerConfig': {'autoHdrSkip': true},
},
{
'id': 'artcnn_c4f16_neutral',
'name': 'ArtCNN C4F16',
'type': 'artcnn',
'artcnnConfig': {'model': 'c4f16', 'variant': 'neutral'},
},
{
'id': 'artcnn_c4f16_dn',
'name': 'ArtCNN C4F16 Denoise',
'type': 'artcnn',
'artcnnConfig': {'model': 'c4f16', 'variant': 'denoise'},
},
{
'id': 'artcnn_c4f16_ds',
'name': 'ArtCNN C4F16 Denoise + Sharpen',
'type': 'artcnn',
'artcnnConfig': {'model': 'c4f16', 'variant': 'denoiseSharpen'},
},
{
'id': 'artcnn_c4f32_neutral',
'name': 'ArtCNN C4F32',
'type': 'artcnn',
'artcnnConfig': {'model': 'c4f32', 'variant': 'neutral'},
},
{
'id': 'artcnn_c4f32_dn',
'name': 'ArtCNN C4F32 Denoise',
'type': 'artcnn',
'artcnnConfig': {'model': 'c4f32', 'variant': 'denoise'},
},
{
'id': 'artcnn_c4f32_ds',
'name': 'ArtCNN C4F32 Denoise + Sharpen',
'type': 'artcnn',
'artcnnConfig': {'model': 'c4f32', 'variant': 'denoiseSharpen'},
},
for (final entry in const [
('fast', 'modeA', 'Anime4K Fast A'),
('fast', 'modeB', 'Anime4K Fast B'),
('fast', 'modeC', 'Anime4K Fast C'),
('fast', 'modeAA', 'Anime4K Fast A+A'),
('fast', 'modeBB', 'Anime4K Fast B+B'),
('fast', 'modeCA', 'Anime4K Fast C+A'),
('hq', 'modeA', 'Anime4K HQ A'),
('hq', 'modeB', 'Anime4K HQ B'),
('hq', 'modeC', 'Anime4K HQ C'),
('hq', 'modeAA', 'Anime4K HQ A+A'),
('hq', 'modeBB', 'Anime4K HQ B+B'),
('hq', 'modeCA', 'Anime4K HQ C+A'),
])
{
'id': 'anime4k_${entry.$1}_${entry.$2}',
'name': entry.$3,
'type': 'anime4k',
'anime4kConfig': {'quality': entry.$1, 'mode': entry.$2},
},
]);
});
test('shares an unmodifiable catalog and canonical id lookup', () {
final first = ShaderPreset.allPresets;
final second = ShaderPreset.allPresets;
@@ -42,9 +42,6 @@ void main() {
});
group('fatalPlaybackHttpStatuses', () {
test('covers exactly the statuses no client-side retry can recover', () {
expect(fatalPlaybackHttpStatuses, {404, 500});
});
test('excludes the 503 the reconnect path deliberately retries', () {
// stream-lavf-o sets reconnect_on_http_error=503, so a 503 is expected
-27
View File
@@ -3,35 +3,8 @@ import 'package:plezy/profiles/profile.dart';
void main() {
group('Profile', () {
test('local profile defaults', () {
final p = Profile.local(id: 'local-1', displayName: 'Owner', createdAt: DateTime(2026, 1, 1));
expect(p.isLocal, isTrue);
expect(p.isPlexHome, isFalse);
expect(p.isPinProtected, isFalse);
expect(p.parentConnectionId, isNull);
});
test('local profile with PIN is pin-protected', () {
final p = Profile.local(
id: 'local-1',
displayName: 'Kids',
pinHash: computePinHash('1234'),
createdAt: DateTime(2026, 1, 1),
);
expect(p.isPinProtected, isTrue);
});
test('plex_home profile pin protection follows the protected flag', () {
final p = Profile.plexHome(
id: 'plex-home-acct1-uuid1',
displayName: 'Sarah',
parentConnectionId: 'acct1',
plexProtected: true,
createdAt: DateTime(2026, 1, 1),
);
expect(p.isLocal, isFalse);
expect(p.isPinProtected, isTrue);
});
test('local PIN hash is round-tripped via configJson', () {
final p = Profile.local(
@@ -24,41 +24,10 @@ void main() {
setUp(resetSharedPreferencesForTest);
group('CompanionRemoteProvider — initial state', () {
test('starts with no session and no connected device', () {
final p = CompanionRemoteProvider();
expect(p.session, isNull);
expect(p.isInSession, isFalse);
expect(p.isHost, isFalse);
expect(p.isRemote, isFalse);
expect(p.isConnected, isFalse);
expect(p.connectedDevice, isNull);
expect(p.status, RemoteSessionStatus.disconnected);
p.dispose();
});
test('isPlayerActive starts false', () {
final p = CompanionRemoteProvider();
expect(p.isPlayerActive, isFalse);
p.dispose();
});
test('isHostServerRunning starts false (no peer service yet)', () {
final p = CompanionRemoteProvider();
expect(p.isHostServerRunning, isFalse);
p.dispose();
});
test('reconnectAttempts starts at 0', () {
final p = CompanionRemoteProvider();
expect(p.reconnectAttempts, 0);
p.dispose();
});
test('isCryptoReady is false until ensureCryptoReady succeeds', () {
final p = CompanionRemoteProvider();
expect(p.isCryptoReady, isFalse);
p.dispose();
});
test('discoverHosts returns null when crypto is not ready', () {
final p = CompanionRemoteProvider();
-18
View File
@@ -33,24 +33,6 @@ void main() {
p.dispose();
});
test('allPresets exposes built-in presets and includes none + nvscaler', () async {
final p = ShaderProvider();
await Future.delayed(Duration.zero);
// Built-ins should always be present even with no custom presets stored.
final ids = p.allPresets.map((preset) => preset.id).toList();
expect(ids, contains(ShaderPreset.none.id));
expect(ids, contains(ShaderPreset.nvscalerDefault.id));
expect(ids, contains('artcnn_c4f16_neutral'));
expect(ids, contains('artcnn_c4f16_dn'));
expect(ids, contains('artcnn_c4f16_ds'));
expect(ids, contains('artcnn_c4f32_neutral'));
expect(ids, contains('artcnn_c4f32_dn'));
expect(ids, contains('artcnn_c4f32_ds'));
expect(p.allPresets.length, ShaderPreset.allPresets.length);
p.dispose();
});
test('setPreset persists, updates current/saved, and notifies', () async {
final p = ShaderProvider();
@@ -19,11 +19,6 @@ void main() {
setUp(resetSharedPreferencesForTest);
group('UserProfileProvider (settings-only)', () {
test('starts with null settings', () {
final p = UserProfileProvider();
expect(p.profileSettings, isNull);
p.dispose();
});
test('refreshProfileSettings without a stored token is a no-op', () async {
final p = UserProfileProvider();
@@ -93,14 +93,6 @@ void main() {
);
});
test('does not exit while the initial adjacency load is unresolved', () {
// VideoPlayerScreen initializes adjacency status to failed until its
// fire-and-forget first load commits a resolved status.
expect(
completionNavigationAction(hasNext: false, adjacentStatus: QueueNavigationStatus.failed),
CompletionNavigationAction.retryAdjacent,
);
});
test('exits a standalone movie after adjacency resolves unavailable', () {
expect(
@@ -27,10 +27,6 @@ void main() {
TvDetectionService.debugSetAppleTVOverride(null);
});
test('a television opens the player with its chrome down', () {
expect(playerChromeStartsVisible(isTv: true), isFalse);
expect(playerChromeStartsVisible(isTv: false), isTrue);
});
testWidgets('the TV player route opens with the chrome down and unpresented', (tester) async {
TvDetectionService.debugSetAppleTVOverride(true);
@@ -20,20 +20,6 @@ void main() {
}
});
test('pins immutable Unicode and CLDR source descriptors', () {
expect(allKeysSource.url, 'https://www.unicode.org/Public/UCA/13.0.0/allkeys.txt');
expect(allKeysSource.sha256Digest, 'a3255d45b7af97f4dc14fb8364d7573b434425e5c58cacf00d16901ce081c78d');
expect(allKeysSource.bundledFileName, 'allkeys-13.0.0.txt.gz');
expect(allKeysSource.licenseUrl, 'https://www.unicode.org/license.txt');
expect(
fractionalUcaSource.url,
'https://raw.githubusercontent.com/unicode-org/cldr/'
'651afecf9ccf1541a49306993e8210fa2209aa0b/common/uca/FractionalUCA.txt',
);
expect(fractionalUcaSource.sha256Digest, 'a6144d0c8c19cc899a5d2f48fbc14e3e31e819049a73aa86b67111f1f3f81637');
expect(fractionalUcaSource.bundledFileName, 'FractionalUCA-651afecf9ccf1541a49306993e8210fa2209aa0b.txt.gz');
expect(fractionalUcaSource.licenseUrl, contains('/651afecf9ccf1541a49306993e8210fa2209aa0b/LICENSE'));
});
test('bundled gzip inputs have deterministic normalized headers and bytes', () {
final allKeys = File('scripts/data/${allKeysSource.bundledFileName}').readAsBytesSync();
@@ -6,7 +6,6 @@ import 'package:plezy/media/media_backend.dart';
import 'package:plezy/media/media_item.dart';
import 'package:plezy/media/media_kind.dart';
import 'package:plezy/media/media_server_client.dart';
import 'package:plezy/models/external_player_models.dart';
import 'package:plezy/services/external_player_service.dart';
import 'package:plezy/services/jellyfin_api_cache.dart';
import 'package:plezy/services/multi_server_manager.dart';
@@ -82,15 +81,6 @@ MediaItem _item({int? durationMs}) {
}
void main() {
test('MX Player Android package candidates include free and Pro variants', () {
final mxPlayer = KnownPlayers.findById('mx_player');
expect(mxPlayer, isNotNull);
expect(KnownPlayers.androidPackageCandidates(mxPlayer!), [
'com.mxtech.videoplayer.ad',
'com.mxtech.videoplayer.pro',
]);
});
test('Android external progress preserves null duration and still stops after start failure', () async {
final client = _RecordingClient()..failStart = true;
@@ -12,10 +12,6 @@ import 'package:plezy/services/image_cache_service.dart';
void main() {
const timeout = Duration(seconds: 5);
test('reduced-tier devices cap artwork fan-out', () {
expect(artworkRequestConcurrencyForTier(reduced: true), 3);
expect(artworkRequestConcurrencyForTier(reduced: false), 6);
});
http.Request get(String path) => http.Request('GET', Uri.parse('https://example.invalid$path'));
@@ -85,11 +85,6 @@ void main() {
expect(sorted.map((server) => server.id), ['srv-1', 'srv-2', 'srv-3']);
});
test('discovery messages are the two distinct measured payloads', () {
expect(MediaBrowserDialect.jellyfin.lanDiscoveryMessage, 'who is JellyfinServer?');
expect(MediaBrowserDialect.emby.lanDiscoveryMessage, 'who is EmbyServer?');
expect(JellyfinLanDiscoveryService.discoveryPort, 7359);
});
test('listenDatagrams receives queued loopback datagrams', () async {
final receiver = await RawDatagramSocket.bind(InternetAddress.loopbackIPv4, 0);
@@ -78,12 +78,6 @@ void main() {
// ============================================================
group('PlayQueueResult', () {
test('PlayQueueError carries the wrapped error', () {
final error = StateError('boom');
final result = PlayQueueError(error);
expect(result.error, same(error));
expect(result, isA<PlayQueueResult>());
});
test('PlayQueueCancelled is a distinct re-exported result', () {
const PlayQueueResult result = PlayQueueCancelled();
-17
View File
@@ -1,10 +1,8 @@
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:plezy/i18n/strings.g.dart';
import 'package:plezy/models/audio_quality_preset.dart';
import 'package:plezy/models/hotkey_model.dart';
import 'package:plezy/services/base_shared_preferences_service.dart';
import 'package:plezy/services/settings_service.dart';
import 'package:plezy/services/trackers/tracker_constants.dart';
@@ -74,14 +72,6 @@ void main() {
});
});
group('SettingsService keyboard hotkey defaults', () {
test('includes Ctrl+S screenshot shortcut', () {
final hotkey = SettingsService.defaultKeyboardHotkeys()['screenshot'];
expect(hotkey, isNotNull);
expect(hotkey!.key, PhysicalKeyboardKey.keyS);
expect(hotkey.modifiers, [HotKeyModifier.control]);
});
});
group('SettingsService mute volume restoration', () {
test('keeps 37 persisted across mute and restores it on unmute', () async {
@@ -127,13 +117,6 @@ void main() {
});
});
group('SettingsService TV card defaults', () {
test('full card layout starts disabled', () async {
final settings = await SettingsService.getInstance();
expect(settings.read(SettingsService.tvFullCardLayout), isFalse);
});
});
group('SettingsService episode action', () {
test('defaults to play and resets to play', () async {
-8
View File
@@ -36,13 +36,5 @@ void main() {
expect(ScreenBreakpoints.isWideTabletOrLarger(900), isTrue);
expect(ScreenBreakpoints.isWideTabletOrLarger(5000), isTrue);
});
test('constant values match expected thresholds', () {
expect(ScreenBreakpoints.mobile, 600);
expect(ScreenBreakpoints.tablet, 600);
expect(ScreenBreakpoints.wideTablet, 900);
expect(ScreenBreakpoints.desktop, 1200);
expect(ScreenBreakpoints.largeDesktop, 1600);
});
});
}
-6
View File
@@ -3,13 +3,7 @@ import 'package:plezy/utils/track_label_builder.dart';
void main() {
group('TrackLabel', () {
test('joined concatenates primary and secondary with " · "', () {
expect(const TrackLabel('Tamil', 'E-AC3 · 5.1').joined, 'Tamil · E-AC3 · 5.1');
});
test('joined is just primary when secondary is null', () {
expect(const TrackLabel('Tamil').joined, 'Tamil');
});
test('equality compares both parts', () {
expect(const TrackLabel('A', 'B'), const TrackLabel('A', 'B'));
-8
View File
@@ -8,12 +8,4 @@ void main() {
expect(orderedStringListsEqual(const ['a', 'b'], const ['b', 'a']), isFalse);
expect(orderedStringListsEqual(const ['a', 'a'], const ['a', 'b']), isFalse);
});
test('watchTogetherSystemNowMs returns wall-clock milliseconds', () {
final before = DateTime.now().millisecondsSinceEpoch;
final value = watchTogetherSystemNowMs();
final after = DateTime.now().millisecondsSinceEpoch;
expect(value, inInclusiveRange(before, after));
});
}
@@ -1,5 +1,3 @@
import 'dart:io' show Platform;
import 'package:drift/native.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
@@ -31,14 +29,6 @@ import '../test_helpers/theme.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
test('the keep-alive ticks on Linux and nowhere else', () {
LinuxKeepAlive.debugIsLinuxOverride = null;
expect(
LinuxKeepAlive.ticksOnThisPlatform,
Platform.isLinux,
reason: 'forced repaints on any other platform reintroduce the #1707 VRR micro-stutter',
);
});
group('hidden-chrome frame quiescence', () {
late _IdlePlayer player;