aboutsummaryrefslogtreecommitdiffstats
path: root/tests/queue.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--tests/queue.rs105
1 files changed, 105 insertions, 0 deletions
diff --git a/tests/queue.rs b/tests/queue.rs
index ccc6e54..2dd9f8c 100644
--- a/tests/queue.rs
+++ b/tests/queue.rs
@@ -286,6 +286,8 @@ fn test_shuffle_modes() {
286 assert_eq!(*q.shuffle_mode(), ShuffleMode::All); 286 assert_eq!(*q.shuffle_mode(), ShuffleMode::All);
287 q.set_shuffle(ShuffleMode::Album); 287 q.set_shuffle(ShuffleMode::Album);
288 assert_eq!(*q.shuffle_mode(), ShuffleMode::Album); 288 assert_eq!(*q.shuffle_mode(), ShuffleMode::Album);
289 q.set_shuffle(ShuffleMode::Albums);
290 assert_eq!(*q.shuffle_mode(), ShuffleMode::Albums);
289 q.set_shuffle(ShuffleMode::None); 291 q.set_shuffle(ShuffleMode::None);
290 assert_eq!(*q.shuffle_mode(), ShuffleMode::None); 292 assert_eq!(*q.shuffle_mode(), ShuffleMode::None);
291} 293}
@@ -486,6 +488,109 @@ fn test_track_no_metadata_fields() {
486 assert!(t.album.is_none()); 488 assert!(t.album.is_none());
487} 489}
488 490
491// ---------- Shuffle albums ----------
492
493#[test]
494fn test_shuffle_albums_groups_tracks_by_album() {
495 let mut q = Queue::new();
496 q.push_track(track(
497 "/music/a1.mp3",
498 Some("A1"),
499 Some("Artist"),
500 Some("Album A"),
501 ));
502 q.push_track(track(
503 "/music/a2.mp3",
504 Some("A2"),
505 Some("Artist"),
506 Some("Album A"),
507 ));
508 q.push_track(track(
509 "/music/b1.mp3",
510 Some("B1"),
511 Some("Artist"),
512 Some("Album B"),
513 ));
514 q.push_track(track(
515 "/music/b2.mp3",
516 Some("B2"),
517 Some("Artist"),
518 Some("Album B"),
519 ));
520 q.push_track(track(
521 "/music/c1.mp3",
522 Some("C1"),
523 Some("Artist"),
524 Some("Album C"),
525 ));
526 // Queue: Album A (a1, a2), Album B (b1, b2), Album C (c1)
527
528 q.set_shuffle(ShuffleMode::Albums);
529 q.shuffle_initial(); // full shuffle of everything (as happens at play start)
530
531 let shuffled = q.shuffled_indices().to_vec();
532 assert_eq!(shuffled.len(), 5);
533
534 // Tracks from the same album must appear as a contiguous block
535 let shuffled_tracks: Vec<_> = shuffled.iter().map(|&i| q.track_at(i).unwrap()).collect();
536
537 // Find positions of all tracks
538 let a_positions: Vec<_> = shuffled_tracks
539 .iter()
540 .enumerate()
541 .filter(|(_, t)| t.album.as_deref() == Some("Album A"))
542 .map(|(i, _)| i)
543 .collect();
544 let b_positions: Vec<_> = shuffled_tracks
545 .iter()
546 .enumerate()
547 .filter(|(_, t)| t.album.as_deref() == Some("Album B"))
548 .map(|(i, _)| i)
549 .collect();
550
551 assert_eq!(a_positions.len(), 2, "Album A should have 2 tracks");
552 assert_eq!(b_positions.len(), 2, "Album B should have 2 tracks");
553 assert_eq!(
554 a_positions[1] - a_positions[0],
555 1,
556 "Album A tracks should be contiguous"
557 );
558 assert_eq!(
559 b_positions[1] - b_positions[0],
560 1,
561 "Album B tracks should be contiguous"
562 );
563}
564
565#[test]
566fn test_shuffle_albums_solo_track_forms_own_group() {
567 let mut q = Queue::new();
568 q.push_track(track("/music/x.mp3", Some("X"), None, None));
569 q.push_track(track("/music/y.mp3", Some("Y"), None, Some("Album Y")));
570 q.push_track(track("/music/z.mp3", Some("Z"), None, Some("Album Y")));
571
572 q.set_shuffle(ShuffleMode::Albums);
573 let shuffled = q.shuffled_indices().to_vec();
574 assert_eq!(shuffled.len(), 3);
575
576 // Track without album should form its own group of size 1
577 // Tracks y and z share Album Y and should be adjacent
578 let shuffled_tracks: Vec<_> = shuffled.iter().map(|&i| q.track_at(i).unwrap()).collect();
579 let y_pos = shuffled_tracks
580 .iter()
581 .position(|t| t.title.as_deref() == Some("Y"))
582 .unwrap();
583 let z_pos = shuffled_tracks
584 .iter()
585 .position(|t| t.title.as_deref() == Some("Z"))
586 .unwrap();
587 assert_eq!(
588 (y_pos as isize - z_pos as isize).abs(),
589 1,
590 "tracks from same album must be adjacent"
591 );
592}
593
489// ---------- Shuffle restore ---------- 594// ---------- Shuffle restore ----------
490 595
491#[test] 596#[test]