92 lines
3.2 KiB
Rust
92 lines
3.2 KiB
Rust
use std::collections::HashMap;
|
|
|
|
use super::tab_group_menu_entry_flags;
|
|
use crate::workspace::tab_group::{TabGroup, TabGroupId};
|
|
|
|
/// Build a `tab_groups` map containing exactly the given group ids.
|
|
fn groups(ids: &[TabGroupId]) -> HashMap<TabGroupId, TabGroup> {
|
|
ids.iter()
|
|
.map(|id| {
|
|
let mut group = TabGroup::new();
|
|
group.id = *id;
|
|
(*id, group)
|
|
})
|
|
.collect()
|
|
}
|
|
|
|
// GH-13073: a tab that is the sole member of its group must NOT be offered
|
|
// "New group with tab" (it would just recreate an identical single-tab group);
|
|
// it offers "Remove from group" instead.
|
|
#[test]
|
|
fn sole_member_of_group_hides_new_group_and_offers_remove() {
|
|
let gid = TabGroupId::new();
|
|
let (show_new_group, _show_move_to_group, show_remove_from_group) =
|
|
tab_group_menu_entry_flags(Some(gid), &groups(&[gid]), /* is_only_member */ true);
|
|
|
|
assert!(
|
|
!show_new_group,
|
|
"the sole member of a group should not offer 'New group with tab'"
|
|
);
|
|
assert!(
|
|
show_remove_from_group,
|
|
"a tab in a group should offer 'Remove from group'"
|
|
);
|
|
}
|
|
|
|
// GH-13073 follow-up: a tab that shares a group with siblings SHOULD still be
|
|
// offered "New group with tab" so it can be pulled out into its own new group
|
|
// (à la Chrome), and it offers "Remove from group" as well.
|
|
#[test]
|
|
fn grouped_tab_with_siblings_offers_new_group_and_remove() {
|
|
let gid = TabGroupId::new();
|
|
let (show_new_group, _show_move_to_group, show_remove_from_group) =
|
|
tab_group_menu_entry_flags(Some(gid), &groups(&[gid]), /* is_only_member */ false);
|
|
|
|
assert!(
|
|
show_new_group,
|
|
"a grouped tab with siblings should still offer 'New group with tab'"
|
|
);
|
|
assert!(
|
|
show_remove_from_group,
|
|
"a grouped tab should offer 'Remove from group'"
|
|
);
|
|
}
|
|
|
|
// An ungrouped tab always offers "New group with tab" and never offers
|
|
// "Remove from group". `is_only_member` is irrelevant when ungrouped.
|
|
#[test]
|
|
fn ungrouped_tab_offers_new_group_and_hides_remove() {
|
|
let (show_new_group, _show_move_to_group, show_remove_from_group) =
|
|
tab_group_menu_entry_flags(None, &HashMap::new(), /* is_only_member */ false);
|
|
|
|
assert!(
|
|
show_new_group,
|
|
"an ungrouped tab should offer 'New group with tab'"
|
|
);
|
|
assert!(
|
|
!show_remove_from_group,
|
|
"an ungrouped tab should not offer 'Remove from group'"
|
|
);
|
|
}
|
|
|
|
// "Move to group" should only appear when a group other than the tab's own
|
|
// exists — for both grouped and ungrouped tabs.
|
|
#[test]
|
|
fn move_to_group_only_shown_when_other_groups_exist() {
|
|
let own = TabGroupId::new();
|
|
let other = TabGroupId::new();
|
|
|
|
// Grouped tab whose group is the only one: no other groups to move to.
|
|
let (_n, move_only_own, _r) = tab_group_menu_entry_flags(Some(own), &groups(&[own]), true);
|
|
assert!(!move_only_own);
|
|
|
|
// Grouped tab with another group present: offer "Move to group".
|
|
let (_n, move_with_other, _r) =
|
|
tab_group_menu_entry_flags(Some(own), &groups(&[own, other]), true);
|
|
assert!(move_with_other);
|
|
|
|
// Ungrouped tab with an existing group: offer "Move to group".
|
|
let (_n, move_ungrouped, _r) = tab_group_menu_entry_flags(None, &groups(&[other]), false);
|
|
assert!(move_ungrouped);
|
|
}
|