diff --git a/src/app/queue.rs b/src/app/queue.rs index 47488e9..d81bd74 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"]); + } +}