use crate::state::{AppState, PackageItem};
use tracing::debug;
pub fn add_to_install_list(app: &mut AppState, item: PackageItem) {
let name_lower = item.name.to_lowercase();
if !app.install_list_names.insert(name_lower) {
return;
}
let prev_len = app.install_list.len();
app.install_list.insert(0, item);
app.install_dirty = true;
app.last_install_change = Some(std::time::Instant::now());
app.install_state.select(Some(0));
debug!(
new_len = app.install_list.len(),
previous_len = prev_len,
first = ?app.install_list.first().map(|p| &p.name),
"[State] Added package to install list"
);
}
pub fn add_to_remove_list(app: &mut AppState, item: PackageItem) {
let name_lower = item.name.to_lowercase();
if !app.remove_list_names.insert(name_lower) {
return;
}
let prev_len = app.remove_list.len();
app.remove_list.insert(0, item);
app.remove_state.select(Some(0));
debug!(
new_len = app.remove_list.len(),
previous_len = prev_len,
first = ?app.remove_list.first().map(|p| &p.name),
"[State] Added package to remove list"
);
}
pub fn add_to_downgrade_list(app: &mut AppState, item: PackageItem) {
let name_lower = item.name.to_lowercase();
if !app.downgrade_list_names.insert(name_lower) {
return;
}
let prev_len = app.downgrade_list.len();
app.downgrade_list.insert(0, item);
app.downgrade_state.select(Some(0));
debug!(
new_len = app.downgrade_list.len(),
previous_len = prev_len,
first = ?app.downgrade_list.first().map(|p| &p.name),
"[State] Added package to downgrade list"
);
}
#[cfg(test)]
mod tests {
use super::*;
fn item_official(name: &str, repo: &str) -> PackageItem {
PackageItem {
name: name.to_string(),
version: "1.0".to_string(),
description: format!("{name} desc"),
source: crate::state::Source::Official {
repo: repo.to_string(),
arch: "x86_64".to_string(),
},
popularity: None,
out_of_date: None,
orphaned: false,
}
}
#[test]
fn add_to_install_list_behavior() {
let mut app = AppState::default();
add_to_install_list(&mut app, item_official("pkg1", "core"));
add_to_install_list(&mut app, item_official("Pkg1", "core"));
assert_eq!(app.install_list.len(), 1);
assert!(app.install_dirty);
assert_eq!(app.install_state.selected(), Some(0));
}
#[test]
fn add_to_remove_list_behavior() {
let mut app = AppState::default();
add_to_remove_list(&mut app, item_official("pkg1", "extra"));
add_to_remove_list(&mut app, item_official("Pkg1", "extra"));
assert_eq!(app.remove_list.len(), 1);
assert_eq!(app.remove_state.selected(), Some(0));
}
#[test]
fn add_to_downgrade_list_behavior() {
let mut app = AppState::default();
add_to_downgrade_list(&mut app, item_official("PkgX", "extra"));
add_to_downgrade_list(&mut app, item_official("pkgx", "extra"));
assert_eq!(app.downgrade_list.len(), 1);
assert_eq!(app.downgrade_state.selected(), Some(0));
}
#[test]
fn install_list_hashset_synchronization() {
let mut app = AppState::default();
add_to_install_list(&mut app, item_official("pkg1", "core"));
add_to_install_list(&mut app, item_official("pkg2", "extra"));
assert!(app.install_list_names.contains("pkg1"));
assert!(app.install_list_names.contains("pkg2"));
assert_eq!(app.install_list_names.len(), 2);
let removed_name = app.install_list[0].name.to_lowercase();
app.install_list_names.remove(&removed_name);
app.install_list.remove(0);
assert!(app.install_list_names.contains("pkg1"));
assert!(!app.install_list_names.contains("pkg2"));
assert_eq!(app.install_list_names.len(), 1);
}
#[test]
fn install_list_hashset_clear_synchronization() {
let mut app = AppState::default();
add_to_install_list(&mut app, item_official("pkg1", "core"));
add_to_install_list(&mut app, item_official("pkg2", "extra"));
assert_eq!(app.install_list_names.len(), 2);
app.install_list.clear();
app.install_list_names.clear();
assert!(app.install_list_names.is_empty());
}
}