a bit more queue testing

This commit is contained in:
Moritz Weber 2023-08-30 18:58:58 -04:00
parent f88c1ebf96
commit 5a766d9be7
4 changed files with 130 additions and 22 deletions

View file

@ -26,9 +26,14 @@ class DynamicQueue implements ManagedQueueInfo {
final MusicDataRepository _musicDataRepository;
/// The queue as a list of Songs instead of QueueItems.
List<Song> get queue => _queue.map((e) => e.song).toList();
/// The list of Songs still available for queue generation.
///
/// This excludes songs that have already been queued.
List<Song> get availableSongs =>
(_availableSongs..where((element) => element.isAvailable)).map((e) => e.song).toList();
_availableSongs.where((element) => element.isAvailable).map((e) => e.song).toList();
/// The queue generated so far from the [_availableSongs].
List<QueueItem> _queue = [];
@ -431,10 +436,10 @@ class DynamicQueue implements ManagedQueueInfo {
}
int getNextNormalIndex(int index) {
if (index >= queue.length) return queue.length;
if (index >= _queue.length) return _queue.length;
int i = index;
while (i < queue.length && _queue[i].source == QueueItemSource.added) {
while (i < _queue.length && _queue[i].source == QueueItemSource.added) {
i++;
}

View file

@ -128,11 +128,12 @@ class AudioPlayerRepositoryImpl implements AudioPlayerRepository {
availableSongs,
playable,
);
_queueSubject.add(_dynamicQueue.queue);
final queue = _dynamicQueue.queue;
_queueSubject.add(queue);
await _audioPlayerDataSource.loadQueue(
initialIndex: index,
queue: _dynamicQueue.queue.map((e) => e as SongModel).toList(),
queue: queue.map((e) => e as SongModel).toList(),
);
}
}
@ -154,11 +155,12 @@ class AudioPlayerRepositoryImpl implements AudioPlayerRepository {
keepIndex: keepInitialIndex,
);
_queueSubject.add(_dynamicQueue.queue);
final queue = _dynamicQueue.queue;
_queueSubject.add(queue);
await _audioPlayerDataSource.loadQueue(
initialIndex: _initialIndex,
queue: _dynamicQueue.queue.map((e) => e as SongModel).toList(),
queue: queue.map((e) => e as SongModel).toList(),
);
}
@ -270,15 +272,14 @@ class AudioPlayerRepositoryImpl implements AudioPlayerRepository {
final splitIndex = await _dynamicQueue.reshuffleQueue(shuffleMode, currentIndex);
_blockIndexUpdate = true;
final queue = _dynamicQueue.queue;
_audioPlayerDataSource
.replaceQueueAroundIndex(
index: currentIndex,
before: _dynamicQueue.queue.sublist(0, splitIndex).map((e) => e as SongModel).toList(),
after: _dynamicQueue.queue.sublist(splitIndex + 1).map((e) => e as SongModel).toList(),
before: queue.sublist(0, splitIndex).map((e) => e as SongModel).toList(),
after: queue.sublist(splitIndex + 1).map((e) => e as SongModel).toList(),
)
.then((_) {
_queueSubject.add(_dynamicQueue.queue);
});
.then((_) => _queueSubject.add(_dynamicQueue.queue));
}
}
@ -300,16 +301,16 @@ class AudioPlayerRepositoryImpl implements AudioPlayerRepository {
final blockLevel = calcBlockLevel(shuffleModeStream.value, playableStream.value);
final queue = _dynamicQueue.queue;
final indecesToRemove = <int>[];
final indicesToRemove = <int>[];
for (int i = 0; i < queue.length; i++) {
final song = queue[i];
if (song.blockLevel > blockLevel) {
if (oldQueue.firstWhere((e) => e.path == song.path).blockLevel != song.blockLevel) {
indecesToRemove.add(i);
indicesToRemove.add(i);
}
}
}
if (indecesToRemove.isNotEmpty) _removeQueueIndices(indecesToRemove, false);
if (indicesToRemove.isNotEmpty) _removeQueueIndices(indicesToRemove, false);
_queueSubject.add(_dynamicQueue.queue);
}

View file

@ -1,14 +1,12 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:mucke/domain/entities/playable.dart';
import 'package:mucke/domain/entities/queue_item.dart';
import 'package:mucke/domain/entities/shuffle_mode.dart';
import 'package:mucke/domain/modules/dynamic_queue.dart';
import 'package:mucke/domain/repositories/music_data_repository.dart';
import '../../test_songs.dart';
@GenerateNiceMocks([MockSpec<MusicDataRepository>(), MockSpec<Playable>()])
import 'dynamic_queue_test.mocks.dart';
@ -37,5 +35,57 @@ void main() {
expect(sut.playableStream.value, tPlayable);
},
);
test(
'should set queue',
() async {
// arrange
final tQueue = <QueueItem>[
QueueItem(song1, originalIndex: 0, isAvailable: true),
QueueItem(song2, originalIndex: 1, isAvailable: true),
QueueItem(song3, originalIndex: 2, isAvailable: true)
];
final tAvailableSongs = <QueueItem>[
QueueItem(song1, originalIndex: 0, isAvailable: true),
QueueItem(song2, originalIndex: 1, isAvailable: true),
QueueItem(song3, originalIndex: 2, isAvailable: true)
];
final tPlayable = MockPlayable();
// act
sut.init(tQueue, tAvailableSongs, tPlayable);
// assert
expect(sut.queueItemsStream.value, tQueue);
expect(sut.queue, [song1, song2, song3]);
},
);
test(
'should set available songs',
() async {
// arrange
final tQueue = <QueueItem>[
QueueItem(song1, originalIndex: 0, isAvailable: true),
QueueItem(song2, originalIndex: 1, isAvailable: true),
QueueItem(song3, originalIndex: 2, isAvailable: false)
];
final tAvailableSongs = <QueueItem>[
QueueItem(song1, originalIndex: 0, isAvailable: true),
QueueItem(song2, originalIndex: 1, isAvailable: true),
QueueItem(song3, originalIndex: 2, isAvailable: false)
];
final tPlayable = MockPlayable();
// act
sut.init(tQueue, tAvailableSongs, tPlayable);
// assert
expect(sut.availableSongsStream.value, tAvailableSongs);
expect(sut.availableSongs, [song1, song2]);
},
);
});
}

52
src/test/test_songs.dart Normal file
View file

@ -0,0 +1,52 @@
import 'package:mucke/domain/entities/song.dart';
final Song song1 = Song(
album: 'Sample Album',
albumId: 1,
artist: 'Sample Artist',
blockLevel: 3,
duration: const Duration(minutes: 3, seconds: 45),
path: '/path/to/song1.mp3',
title: 'Sample Song 1',
likeCount: 1,
playCount: 350,
discNumber: 1,
next: false,
previous: false,
timeAdded: DateTime(1990),
trackNumber: 5,
);
final Song song2 = Song(
album: 'Sample Album 2',
albumId: 2,
artist: 'Sample Artist 2',
blockLevel: 2,
duration: const Duration(minutes: 4, seconds: 10),
path: '/path/to/song2.mp3',
title: 'Sample Song 2',
likeCount: 3,
playCount: 420,
discNumber: 1,
next: false,
previous: false,
timeAdded: DateTime(2000),
trackNumber: 2,
);
final Song song3 = Song(
album: 'Sample Album 1',
albumId: 1,
artist: 'Sample Artist 1',
blockLevel: 0,
duration: const Duration(minutes: 5, seconds: 20),
path: '/path/to/song3.mp3',
title: 'Sample Song 3',
likeCount: 0,
playCount: 150,
discNumber: 2,
next: false,
previous: false,
timeAdded: DateTime(2010),
trackNumber: 7,
);