From 176f16394fb75add2d239aab93218e56d36bddc4 Mon Sep 17 00:00:00 2001 From: defaultdino Date: Fri, 23 Oct 2026 09:10:34 +0200 Subject: [PATCH 1/2] fix out of sync queue and moved track queue order; add first test --- src/app/queue.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/app/queue.rs b/src/app/queue.rs index 47488e9..d6ab329 100644 --- a/src/app/queue.rs +++ b/src/app/queue.rs @@ -194,7 +194,7 @@ impl Queue { self.entries.swap(i, j); if !self.shuffle { - self.unshuffled.swap(i, j); + self.unshuffled = self.entries.iter().map(|e| e.id).collect(); } self.current = self.current.map(|c| match c { @@ -270,3 +270,29 @@ impl Queue { fn positions(ids: impl IntoIterator) -> HashMap { ids.into_iter().enumerate().map(|(i, id)| (id, i)).collect() } + +#[cfg(test)] +mod tests { + use super::*; + + fn titles(q: &Queue) -> Vec<&str> { + q.entries.iter().map(|e| e.track.title.as_str()).collect() + } + + #[test] + fn moves_survive_shuffle_toggle_and_heal_stale_order() { + let mut q = Queue::default(); + let tracks = ["a", "b", "c", "d"].map(|t| { + Arc::new(Track { + title: t.into(), + ..Track::default() + }) + }); + q.replace(tracks.to_vec(), None); + q.unshuffled.reverse(); // out of sync, as saved by older versions + q.move_entry(0, true); + q.set_shuffle(true); + q.set_shuffle(false); + assert_eq!(titles(&q), ["b", "a", "c", "d"]); + } +} From 2433304be7184d1a311e56d75a0ef96b84a40640 Mon Sep 17 00:00:00 2001 From: defaultdino Date: Fri, 23 Oct 2026 09:38:42 +0200 Subject: [PATCH 2/2] format --- src/app/queue.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/queue.rs b/src/app/queue.rs index d6ab329..d81bd74 100644 --- a/src/app/queue.rs +++ b/src/app/queue.rs @@ -278,7 +278,7 @@ mod tests { fn titles(q: &Queue) -> Vec<&str> { q.entries.iter().map(|e| e.track.title.as_str()).collect() } - + #[test] fn moves_survive_shuffle_toggle_and_heal_stale_order() { let mut q = Queue::default();