refactor(music): move the playback stub beside the tests that use it
StubMusicPlaybackService is a base for test doubles with no production caller, so `check-unused-code lib` flagged it and the analysis job failed. Moves it to test/test_helpers/, where shared fakes belong.
This commit is contained in:
@@ -147,146 +147,3 @@ abstract class MusicPlaybackService extends ChangeNotifier {
|
||||
/// to `MediaServerClient.fetchLyrics`; null = none available.
|
||||
Future<Lyrics?> fetchLyrics(MediaItem track);
|
||||
}
|
||||
|
||||
/// No-op base for test doubles, which override only the members under test.
|
||||
/// Production always binds `MusicPlaybackServiceImpl`.
|
||||
class StubMusicPlaybackService extends MusicPlaybackService {
|
||||
final ValueNotifier<double> _volumeNotifier = ValueNotifier<double>(100);
|
||||
int _playIntentGeneration = 0;
|
||||
int _queueSessionRevision = 0;
|
||||
|
||||
@override
|
||||
MediaItem? get currentTrack => null;
|
||||
|
||||
@override
|
||||
MusicPlaybackStatus get status => MusicPlaybackStatus.idle;
|
||||
|
||||
@override
|
||||
Duration? get duration => null;
|
||||
|
||||
@override
|
||||
Duration get position => Duration.zero;
|
||||
|
||||
@override
|
||||
Stream<Duration> get positionStream => const Stream.empty();
|
||||
|
||||
@override
|
||||
List<MediaItem> get queue => const [];
|
||||
|
||||
@override
|
||||
int get currentIndex => -1;
|
||||
|
||||
@override
|
||||
MusicPlayContext? get playContext => null;
|
||||
|
||||
@override
|
||||
bool get shuffled => false;
|
||||
|
||||
@override
|
||||
MusicRepeatMode get repeatMode => MusicRepeatMode.off;
|
||||
|
||||
@override
|
||||
Stream<Object> get errors => const Stream.empty();
|
||||
|
||||
@override
|
||||
int beginPlayIntent() => ++_playIntentGeneration;
|
||||
|
||||
@override
|
||||
bool isPlayIntentCurrent(int intent) => intent == _playIntentGeneration;
|
||||
|
||||
@override
|
||||
int get queueSessionRevision => _queueSessionRevision;
|
||||
|
||||
@override
|
||||
Future<void> playFromList({
|
||||
required List<MediaItem> tracks,
|
||||
MediaItem? startTrack,
|
||||
required MusicPlayContext playContext,
|
||||
bool shuffle = false,
|
||||
}) async {
|
||||
beginPlayIntent();
|
||||
_queueSessionRevision++;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> playInstantMix(MediaItem seed) async {}
|
||||
|
||||
@override
|
||||
Future<void> play() async {}
|
||||
|
||||
@override
|
||||
Future<void> pause() async {}
|
||||
|
||||
@override
|
||||
Future<void> togglePlayPause() async {}
|
||||
|
||||
@override
|
||||
Future<void> next() async {}
|
||||
|
||||
@override
|
||||
Future<void> previous() async {}
|
||||
|
||||
@override
|
||||
Future<void> seek(Duration position) async {}
|
||||
|
||||
@override
|
||||
double get volume => 100;
|
||||
@override
|
||||
ValueListenable<double> get volumeListenable => _volumeNotifier;
|
||||
|
||||
@override
|
||||
Future<void> setVolume(double volume, {bool persist = true}) async {}
|
||||
|
||||
@override
|
||||
void setRepeatMode(MusicRepeatMode mode) {}
|
||||
|
||||
@override
|
||||
void toggleShuffle() {}
|
||||
|
||||
@override
|
||||
Future<void> jumpTo(int index) async {}
|
||||
|
||||
@override
|
||||
void removeAt(int index) {}
|
||||
|
||||
@override
|
||||
void reorder(int from, int to) {}
|
||||
|
||||
@override
|
||||
void addNext(List<MediaItem> tracks) {}
|
||||
|
||||
@override
|
||||
void addToEnd(List<MediaItem> tracks) {}
|
||||
|
||||
@override
|
||||
void clearUpcoming() {}
|
||||
|
||||
@override
|
||||
Future<void> stop() async {
|
||||
beginPlayIntent();
|
||||
_queueSessionRevision++;
|
||||
}
|
||||
|
||||
@override
|
||||
bool get sleepTimerActive => false;
|
||||
|
||||
@override
|
||||
DateTime? get sleepTimerEndsAt => null;
|
||||
|
||||
@override
|
||||
Duration? get sleepTimerDuration => null;
|
||||
|
||||
@override
|
||||
bool get sleepTimerEndOfTrack => false;
|
||||
|
||||
@override
|
||||
void setSleepTimer(Duration? duration, {bool endOfTrack = false}) {}
|
||||
|
||||
@override
|
||||
Future<Lyrics?> fetchLyrics(MediaItem track) async => null;
|
||||
@override
|
||||
void dispose() {
|
||||
_volumeNotifier.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import '../../test_helpers/prefs.dart';
|
||||
import '../../test_helpers/media_items.dart';
|
||||
import '../../test_helpers/io_fakes.dart';
|
||||
import '../../test_helpers/multi_server_fixtures.dart';
|
||||
import '../../test_helpers/stub_music_playback_service.dart';
|
||||
|
||||
class _FakeConnectionRegistry extends ConnectionRegistry {
|
||||
_FakeConnectionRegistry(super.db);
|
||||
|
||||
@@ -19,6 +19,7 @@ import 'package:provider/provider.dart';
|
||||
import '../../test_helpers/prefs.dart';
|
||||
import '../../test_helpers/media_items.dart';
|
||||
import '../../test_helpers/multi_server_fixtures.dart';
|
||||
import '../../test_helpers/stub_music_playback_service.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
@@ -17,6 +17,7 @@ import 'package:provider/provider.dart';
|
||||
|
||||
import '../../test_helpers/media_items.dart';
|
||||
import '../../test_helpers/multi_server_fixtures.dart';
|
||||
import '../../test_helpers/stub_music_playback_service.dart';
|
||||
|
||||
MediaItem _track({required String id, required String title, required String album, required int year}) {
|
||||
return testMediaItem(
|
||||
|
||||
@@ -17,6 +17,7 @@ import 'package:provider/provider.dart';
|
||||
import '../../test_helpers/media_items.dart';
|
||||
import '../../test_helpers/multi_server_fixtures.dart';
|
||||
import '../../test_helpers/prefs.dart';
|
||||
import '../../test_helpers/stub_music_playback_service.dart';
|
||||
|
||||
MediaItem _track(String id, String title) => testMediaItem(
|
||||
id: id,
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:plezy/media/lyrics.dart';
|
||||
import 'package:plezy/media/media_item.dart';
|
||||
import 'package:plezy/services/music/music_playback_service.dart';
|
||||
|
||||
/// No-op base for test doubles, which override only the members under test.
|
||||
/// Production always binds `MusicPlaybackServiceImpl`.
|
||||
class StubMusicPlaybackService extends MusicPlaybackService {
|
||||
final ValueNotifier<double> _volumeNotifier = ValueNotifier<double>(100);
|
||||
int _playIntentGeneration = 0;
|
||||
int _queueSessionRevision = 0;
|
||||
|
||||
@override
|
||||
MediaItem? get currentTrack => null;
|
||||
|
||||
@override
|
||||
MusicPlaybackStatus get status => MusicPlaybackStatus.idle;
|
||||
|
||||
@override
|
||||
Duration? get duration => null;
|
||||
|
||||
@override
|
||||
Duration get position => Duration.zero;
|
||||
|
||||
@override
|
||||
Stream<Duration> get positionStream => const Stream.empty();
|
||||
|
||||
@override
|
||||
List<MediaItem> get queue => const [];
|
||||
|
||||
@override
|
||||
int get currentIndex => -1;
|
||||
|
||||
@override
|
||||
MusicPlayContext? get playContext => null;
|
||||
|
||||
@override
|
||||
bool get shuffled => false;
|
||||
|
||||
@override
|
||||
MusicRepeatMode get repeatMode => MusicRepeatMode.off;
|
||||
|
||||
@override
|
||||
Stream<Object> get errors => const Stream.empty();
|
||||
|
||||
@override
|
||||
int beginPlayIntent() => ++_playIntentGeneration;
|
||||
|
||||
@override
|
||||
bool isPlayIntentCurrent(int intent) => intent == _playIntentGeneration;
|
||||
|
||||
@override
|
||||
int get queueSessionRevision => _queueSessionRevision;
|
||||
|
||||
@override
|
||||
Future<void> playFromList({
|
||||
required List<MediaItem> tracks,
|
||||
MediaItem? startTrack,
|
||||
required MusicPlayContext playContext,
|
||||
bool shuffle = false,
|
||||
}) async {
|
||||
beginPlayIntent();
|
||||
_queueSessionRevision++;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> playInstantMix(MediaItem seed) async {}
|
||||
|
||||
@override
|
||||
Future<void> play() async {}
|
||||
|
||||
@override
|
||||
Future<void> pause() async {}
|
||||
|
||||
@override
|
||||
Future<void> togglePlayPause() async {}
|
||||
|
||||
@override
|
||||
Future<void> next() async {}
|
||||
|
||||
@override
|
||||
Future<void> previous() async {}
|
||||
|
||||
@override
|
||||
Future<void> seek(Duration position) async {}
|
||||
|
||||
@override
|
||||
double get volume => 100;
|
||||
@override
|
||||
ValueListenable<double> get volumeListenable => _volumeNotifier;
|
||||
|
||||
@override
|
||||
Future<void> setVolume(double volume, {bool persist = true}) async {}
|
||||
|
||||
@override
|
||||
void setRepeatMode(MusicRepeatMode mode) {}
|
||||
|
||||
@override
|
||||
void toggleShuffle() {}
|
||||
|
||||
@override
|
||||
Future<void> jumpTo(int index) async {}
|
||||
|
||||
@override
|
||||
void removeAt(int index) {}
|
||||
|
||||
@override
|
||||
void reorder(int from, int to) {}
|
||||
|
||||
@override
|
||||
void addNext(List<MediaItem> tracks) {}
|
||||
|
||||
@override
|
||||
void addToEnd(List<MediaItem> tracks) {}
|
||||
|
||||
@override
|
||||
void clearUpcoming() {}
|
||||
|
||||
@override
|
||||
Future<void> stop() async {
|
||||
beginPlayIntent();
|
||||
_queueSessionRevision++;
|
||||
}
|
||||
|
||||
@override
|
||||
bool get sleepTimerActive => false;
|
||||
|
||||
@override
|
||||
DateTime? get sleepTimerEndsAt => null;
|
||||
|
||||
@override
|
||||
Duration? get sleepTimerDuration => null;
|
||||
|
||||
@override
|
||||
bool get sleepTimerEndOfTrack => false;
|
||||
|
||||
@override
|
||||
void setSleepTimer(Duration? duration, {bool endOfTrack = false}) {}
|
||||
|
||||
@override
|
||||
Future<Lyrics?> fetchLyrics(MediaItem track) async => null;
|
||||
@override
|
||||
void dispose() {
|
||||
_volumeNotifier.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
@@ -48,6 +48,7 @@ import '../test_helpers/media_items.dart';
|
||||
import '../test_helpers/multi_server_fixtures.dart';
|
||||
import '../test_helpers/prefs.dart';
|
||||
import '../test_helpers/profile_stack.dart';
|
||||
import '../test_helpers/stub_music_playback_service.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
@@ -27,6 +27,7 @@ import '../../test_helpers/media_items.dart';
|
||||
import '../../test_helpers/multi_server_fixtures.dart';
|
||||
import '../../test_helpers/prefs.dart';
|
||||
import '../../test_helpers/profile_stack.dart';
|
||||
import '../../test_helpers/stub_music_playback_service.dart';
|
||||
|
||||
final _track = testMediaItem(
|
||||
id: 'track_1',
|
||||
|
||||
Reference in New Issue
Block a user