use revue::widget::multi_select::{MultiSelect, MultiSelectOption};
fn create_test_select() -> MultiSelect {
MultiSelect::new().options(vec!["Apple", "Banana", "Cherry", "Date", "Elderberry"])
}
#[test]
fn test_is_open_initial_state() {
let select = create_test_select();
assert!(!select.is_open());
}
#[test]
fn test_is_open_after_open() {
let mut select = create_test_select();
select.open();
assert!(select.is_open());
}
#[test]
fn test_is_open_after_close() {
let mut select = create_test_select();
select.open();
select.close();
assert!(!select.is_open());
}
#[test]
fn test_get_selected_indices_empty() {
let select = create_test_select();
let indices = select.get_selected_indices();
assert!(indices.is_empty());
}
#[test]
fn test_get_selected_indices_with_selections() {
let select = MultiSelect::new()
.options(vec!["Apple", "Banana", "Cherry"])
.selected_indices(vec![0, 2]);
let indices = select.get_selected_indices();
assert_eq!(indices.len(), 2);
assert_eq!(indices[0], 0);
assert_eq!(indices[1], 2);
}
#[test]
fn test_get_selected_values_empty() {
let select = create_test_select();
let values = select.get_selected_values();
assert!(values.is_empty());
}
#[test]
fn test_get_selected_values() {
let select = MultiSelect::new()
.options(vec!["Apple", "Banana", "Cherry"])
.selected_indices(vec![0, 2]);
let values = select.get_selected_values();
assert_eq!(values.len(), 2);
assert_eq!(values[0], "Apple");
assert_eq!(values[1], "Cherry");
}
#[test]
fn test_get_selected_labels() {
let select = MultiSelect::new()
.options_detailed(vec![
MultiSelectOption::new("Display Apple", "apple"),
MultiSelectOption::new("Display Banana", "banana"),
])
.selected_indices(vec![0, 1]);
let labels = select.get_selected_labels();
assert_eq!(labels.len(), 2);
assert_eq!(labels[0], "Display Apple");
assert_eq!(labels[1], "Display Banana");
}
#[test]
fn test_selection_count_empty() {
let select = create_test_select();
let count = select.selection_count();
assert_eq!(count, 0);
}
#[test]
fn test_selection_count_with_selections() {
let select = MultiSelect::new()
.options(vec!["A", "B", "C", "D"])
.selected_indices(vec![0, 1, 3]);
let count = select.selection_count();
assert_eq!(count, 3);
}
#[test]
fn test_is_selected_true() {
let select = MultiSelect::new()
.options(vec!["Apple", "Banana"])
.selected_indices(vec![0]);
let result = select.is_selected(0);
assert!(result);
}
#[test]
fn test_is_selected_false() {
let select = MultiSelect::new()
.options(vec!["Apple", "Banana"])
.selected_indices(vec![0]);
let result = select.is_selected(1);
assert!(!result);
}
#[test]
fn test_can_select_more_unlimited() {
let select = MultiSelect::new()
.options(vec!["A", "B", "C"])
.selected_indices(vec![0, 1, 2]);
let result = select.can_select_more();
assert!(result);
}
#[test]
fn test_can_select_more_with_limit_available() {
let select = MultiSelect::new()
.options(vec!["A", "B", "C", "D"])
.selected_indices(vec![0, 1])
.max_selections(3);
let result = select.can_select_more();
assert!(result);
}
#[test]
fn test_can_select_more_at_limit() {
let select = MultiSelect::new()
.options(vec!["A", "B", "C", "D"])
.selected_indices(vec![0, 1, 2])
.max_selections(3);
let result = select.can_select_more();
assert!(!result);
}
#[test]
fn test_len() {
let select = MultiSelect::new().options(vec!["A", "B", "C"]);
let len = select.len();
assert_eq!(len, 3);
}
#[test]
fn test_len_empty() {
let select = MultiSelect::new();
let len = select.len();
assert_eq!(len, 0);
}
#[test]
fn test_is_empty_true() {
let select = MultiSelect::new();
let result = select.is_empty();
assert!(result);
}
#[test]
fn test_is_empty_false() {
let select = MultiSelect::new().options(vec!["A", "B"]);
let result = select.is_empty();
assert!(!result);
}
#[test]
fn test_open_resets_filter() {
let mut select = MultiSelect::new().options(vec!["A", "B"]);
select.filtered = vec![];
select.open();
assert!(select.is_open());
assert_eq!(select.filtered.len(), 2);
assert_eq!(select.tag_cursor, None);
}
#[test]
fn test_close_clears_query() {
let mut select = MultiSelect::new().options(vec!["A", "B"]);
select.open();
select.query = "test".to_string();
select.close();
assert!(!select.is_open());
assert!(select.query.is_empty());
}
#[test]
fn test_toggle_from_closed() {
let mut select = create_test_select();
select.toggle();
assert!(select.is_open());
}
#[test]
fn test_toggle_from_open() {
let mut select = create_test_select();
select.open();
select.toggle();
assert!(!select.is_open());
}
#[test]
fn test_select_option_valid() {
let mut select = MultiSelect::new().options(vec!["A", "B", "C"]);
select.select_option(1);
assert_eq!(select.selection_count(), 1);
assert!(select.is_selected(1));
}
#[test]
fn test_select_option_out_of_bounds() {
let mut select = MultiSelect::new().options(vec!["A", "B", "C"]);
select.select_option(10);
assert_eq!(select.selection_count(), 0);
}
#[test]
fn test_select_option_disabled() {
let mut select = MultiSelect::new().options_detailed(vec![
MultiSelectOption::simple("A"),
MultiSelectOption::simple("B").disabled(true),
]);
select.select_option(1);
assert_eq!(select.selection_count(), 0);
}
#[test]
fn test_select_option_already_selected() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C"])
.selected_indices(vec![0]);
select.select_option(0);
assert_eq!(select.selection_count(), 1);
}
#[test]
fn test_select_option_at_max_limit() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C", "D"])
.selected_indices(vec![0, 1])
.max_selections(2);
select.select_option(2);
assert_eq!(select.selection_count(), 2);
assert!(!select.is_selected(2));
}
#[test]
fn test_deselect_option() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C"])
.selected_indices(vec![0, 1, 2]);
select.deselect_option(1);
assert_eq!(select.selection_count(), 2);
assert!(!select.is_selected(1));
assert!(select.is_selected(0));
assert!(select.is_selected(2));
}
#[test]
fn test_deselect_option_not_selected() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C"])
.selected_indices(vec![0, 2]);
select.deselect_option(1);
assert_eq!(select.selection_count(), 2);
}
#[test]
fn test_toggle_option_from_unselected() {
let mut select = MultiSelect::new().options(vec!["A", "B", "C"]);
select.toggle_option(1);
assert!(select.is_selected(1));
}
#[test]
fn test_toggle_option_from_selected() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C"])
.selected_indices(vec![0, 1]);
select.toggle_option(1);
assert!(!select.is_selected(1));
assert!(select.is_selected(0));
}
#[test]
fn test_clear_selection() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C"])
.selected_indices(vec![0, 1, 2]);
select.clear_selection();
assert_eq!(select.selection_count(), 0);
}
#[test]
fn test_clear_selection_already_empty() {
let mut select = create_test_select();
select.clear_selection();
assert_eq!(select.selection_count(), 0);
}
#[test]
fn test_select_all() {
let mut select = MultiSelect::new().options(vec!["A", "B", "C"]);
select.select_all();
assert_eq!(select.selection_count(), 3);
assert!(select.is_selected(0));
assert!(select.is_selected(1));
assert!(select.is_selected(2));
}
#[test]
fn test_select_all_with_disabled() {
let mut select = MultiSelect::new().options_detailed(vec![
MultiSelectOption::simple("A"),
MultiSelectOption::simple("B").disabled(true),
MultiSelectOption::simple("C"),
]);
select.select_all();
assert_eq!(select.selection_count(), 2);
assert!(select.is_selected(0));
assert!(!select.is_selected(1));
assert!(select.is_selected(2));
}
#[test]
fn test_select_all_with_max_limit() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C", "D", "E"])
.max_selections(3);
select.select_all();
assert_eq!(select.selection_count(), 3);
}
#[test]
fn test_select_all_empty() {
let mut select = MultiSelect::new();
select.select_all();
assert_eq!(select.selection_count(), 0);
}
#[test]
fn test_remove_last_tag() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C"])
.selected_indices(vec![0, 1, 2]);
select.remove_last_tag();
assert_eq!(select.selection_count(), 2);
assert!(!select.is_selected(2));
assert!(select.is_selected(0));
assert!(select.is_selected(1));
}
#[test]
fn test_remove_last_tag_from_single() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C"])
.selected_indices(vec![0]);
select.remove_last_tag();
assert_eq!(select.selection_count(), 0);
}
#[test]
fn test_remove_last_tag_from_empty() {
let mut select = create_test_select();
select.remove_last_tag();
assert_eq!(select.selection_count(), 0);
}
#[test]
fn test_remove_tag_at_cursor_middle() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C", "D"])
.selected_indices(vec![0, 1, 2]);
select.tag_cursor = Some(1);
select.remove_tag_at_cursor();
assert_eq!(select.selection_count(), 2);
assert_eq!(select.selected, vec![0, 2]);
assert_eq!(select.tag_cursor, Some(1));
}
#[test]
fn test_remove_tag_at_cursor_first() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C"])
.selected_indices(vec![0, 1, 2]);
select.tag_cursor = Some(0);
select.remove_tag_at_cursor();
assert_eq!(select.selection_count(), 2);
assert_eq!(select.selected, vec![1, 2]);
assert_eq!(select.tag_cursor, Some(0));
}
#[test]
fn test_remove_tag_at_cursor_last() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C"])
.selected_indices(vec![0, 1, 2]);
select.tag_cursor = Some(2);
select.remove_tag_at_cursor();
assert_eq!(select.selection_count(), 2);
assert_eq!(select.selected, vec![0, 1]);
assert_eq!(select.tag_cursor, Some(1));
}
#[test]
fn test_remove_tag_at_cursor_single_item() {
let mut select = MultiSelect::new()
.options(vec!["A", "B", "C"])
.selected_indices(vec![1]);
select.tag_cursor = Some(0);
select.remove_tag_at_cursor();
assert_eq!(select.selection_count(), 0);
assert_eq!(select.tag_cursor, None);
}
#[test]
fn test_remove_tag_at_cursor_no_cursor() {
let mut select = MultiSelect::new()
.options(vec!["A", "B"])
.selected_indices(vec![0, 1]);
select.remove_tag_at_cursor();
assert_eq!(select.selection_count(), 2);
}