#[macro_use]
mod common;
use iced_aw::sidebar::{Sidebar, SidebarPosition, SidebarWithContent, TabLabel};
use iced_test::Error;
use iced_widget::text::Text;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
enum TabId {
Home,
Settings,
Profile,
}
#[derive(Clone, Debug)]
#[allow(dead_code)]
enum Message {
TabSelected(TabId),
TabClosed(TabId),
}
test_helpers!(Message);
#[test]
fn sidebar_can_find_tab_text_labels() -> Result<(), Error> {
let (mut app, _) = App::new(move || {
Sidebar::new(Message::TabSelected)
.push(TabId::Home, TabLabel::Text("Home".to_string()))
.push(TabId::Settings, TabLabel::Text("Settings".to_string()))
.push(TabId::Profile, TabLabel::Text("Profile".to_string()))
.into()
});
let ui = simulator(&app);
process_messages(ui, &mut app);
let mut ui = simulator(&app);
assert_snapshot_matches(&mut ui, "tests/snapshots/sidebar_can_find_tab_text_labels")?;
assert!(
ui.find("Home").is_ok(),
"Tab label 'Home' should be findable"
);
assert!(
ui.find("Settings").is_ok(),
"Tab label 'Settings' should be findable"
);
assert!(
ui.find("Profile").is_ok(),
"Tab label 'Profile' should be findable"
);
Ok(())
}
#[test]
fn sidebar_clicking_tab_produces_tab_selected_message() -> Result<(), Error> {
let (mut app, _) = App::new(move || {
Sidebar::new(Message::TabSelected)
.push(TabId::Home, TabLabel::Text("Home".to_string()))
.push(TabId::Settings, TabLabel::Text("Settings".to_string()))
.push(TabId::Profile, TabLabel::Text("Profile".to_string()))
.into()
});
let mut ui = simulator(&app);
assert!(
ui.find("Settings").is_ok(),
"Settings tab should be findable"
);
ui.click("Settings")?;
assert_message_received(
ui,
&mut app,
|m| matches!(m, Message::TabSelected(TabId::Settings)),
"Clicking tab should produce TabSelected message",
);
Ok(())
}
#[test]
fn sidebar_can_find_different_tab_label_types() -> Result<(), Error> {
let (mut app, _) = App::new(move || {
Sidebar::new(Message::TabSelected)
.push(TabId::Home, TabLabel::Icon('H'))
.push(TabId::Settings, TabLabel::Text("Settings".to_string()))
.push(
TabId::Profile,
TabLabel::IconText('P', "Profile".to_string()),
)
.into()
});
let ui = simulator(&app);
process_messages(ui, &mut app);
let mut ui = simulator(&app);
assert!(ui.find("H").is_ok(), "Icon 'H' should be findable");
assert!(
ui.find("Settings").is_ok(),
"Text label 'Settings' should be findable"
);
assert!(ui.find("P").is_ok(), "Icon 'P' should be findable");
assert!(
ui.find("Profile").is_ok(),
"Text 'Profile' should be findable"
);
Ok(())
}
#[test]
fn sidebar_with_close_callback_displays_close_icon() -> Result<(), Error> {
let (mut app, _) = App::new(move || {
Sidebar::new(Message::TabSelected)
.push(TabId::Home, TabLabel::Text("Home".to_string()))
.push(TabId::Settings, TabLabel::Text("Settings".to_string()))
.on_close(Message::TabClosed)
.into()
});
let ui = simulator(&app);
process_messages(ui, &mut app);
let mut ui = simulator(&app);
assert!(ui.find("Home").is_ok(), "Home tab should be findable");
assert!(
ui.find("Settings").is_ok(),
"Settings tab should be findable"
);
Ok(())
}
#[test]
#[ignore]
fn sidebar_clicking_close_icon_produces_tab_closed_message() -> Result<(), Error> {
let (mut app, _) = App::new(move || {
Sidebar::new(Message::TabSelected)
.push(TabId::Home, TabLabel::Text("Home".to_string()))
.push(TabId::Settings, TabLabel::Text("Settings".to_string()))
.on_close(Message::TabClosed)
.into()
});
let mut ui = simulator(&app);
assert!(
ui.find("\u{e800}").is_ok(),
"Close icon should be findable in the sidebar"
);
ui.click("\u{e800}")?;
assert_message_received(
ui,
&mut app,
|m| matches!(m, Message::TabClosed(_)),
"Clicking close icon should produce TabClosed message",
);
Ok(())
}
#[test]
fn sidebar_with_close_exposes_elements_through_operate() -> Result<(), Error> {
let (mut app, _) = App::new(move || {
Sidebar::new(Message::TabSelected)
.push(TabId::Home, TabLabel::Text("Home".to_string()))
.push(TabId::Settings, TabLabel::Text("Settings".to_string()))
.on_close(Message::TabClosed)
.into()
});
let ui = simulator(&app);
process_messages(ui, &mut app);
let mut ui = simulator(&app);
assert!(ui.find("Home").is_ok(), "Home tab should be findable");
assert!(
ui.find("Settings").is_ok(),
"Settings tab should be findable"
);
Ok(())
}
#[test]
fn sidebar_with_content_displays_tabs_and_content() -> Result<(), Error> {
let (mut app, _) = App::new(move || {
SidebarWithContent::new(Message::TabSelected)
.push(
TabId::Home,
TabLabel::Text("Home".to_string()),
Text::new("Home Content"),
)
.push(
TabId::Settings,
TabLabel::Text("Settings".to_string()),
Text::new("Settings Content"),
)
.push(
TabId::Profile,
TabLabel::Text("Profile".to_string()),
Text::new("Profile Content"),
)
.set_active_tab(&TabId::Home)
.into()
});
let ui = simulator(&app);
process_messages(ui, &mut app);
let mut ui = simulator(&app);
assert!(ui.find("Home").is_ok(), "Home tab should be findable");
assert!(
ui.find("Settings").is_ok(),
"Settings tab should be findable"
);
assert!(ui.find("Profile").is_ok(), "Profile tab should be findable");
assert!(
ui.find("Home Content").is_ok(),
"Active tab content should be displayed"
);
Ok(())
}
#[test]
fn sidebar_with_content_clicking_tab_shows_new_content() -> Result<(), Error> {
let (mut app, _) = App::new(move || {
SidebarWithContent::new(Message::TabSelected)
.push(
TabId::Home,
TabLabel::Text("Home".to_string()),
Text::new("Home Content"),
)
.push(
TabId::Settings,
TabLabel::Text("Settings".to_string()),
Text::new("Settings Content"),
)
.set_active_tab(&TabId::Home)
.into()
});
let mut ui = simulator(&app);
assert!(
ui.find("Home Content").is_ok(),
"Home content should be displayed initially"
);
ui.click("Settings")?;
assert_message_received(
ui,
&mut app,
|m| matches!(m, Message::TabSelected(TabId::Settings)),
"Clicking Settings tab should produce TabSelected message",
);
Ok(())
}
#[test]
fn sidebar_with_content_start_position() -> Result<(), Error> {
let (mut app, _) = App::new(move || {
SidebarWithContent::new(Message::TabSelected)
.push(
TabId::Home,
TabLabel::Text("Home".to_string()),
Text::new("Home Content"),
)
.push(
TabId::Settings,
TabLabel::Text("Settings".to_string()),
Text::new("Settings Content"),
)
.sidebar_position(SidebarPosition::Start)
.set_active_tab(&TabId::Home)
.into()
});
let ui = simulator(&app);
process_messages(ui, &mut app);
let mut ui = simulator(&app);
assert!(ui.find("Home").is_ok(), "Sidebar should be findable");
assert!(
ui.find("Home Content").is_ok(),
"Content should be findable"
);
Ok(())
}
#[test]
fn sidebar_with_content_end_position() -> Result<(), Error> {
let (mut app, _) = App::new(move || {
SidebarWithContent::new(Message::TabSelected)
.push(
TabId::Home,
TabLabel::Text("Home".to_string()),
Text::new("Home Content"),
)
.push(
TabId::Settings,
TabLabel::Text("Settings".to_string()),
Text::new("Settings Content"),
)
.sidebar_position(SidebarPosition::End)
.set_active_tab(&TabId::Home)
.into()
});
let ui = simulator(&app);
process_messages(ui, &mut app);
let mut ui = simulator(&app);
assert!(ui.find("Home").is_ok(), "Sidebar should be findable");
assert!(
ui.find("Home Content").is_ok(),
"Content should be findable"
);
Ok(())
}
#[test]
fn sidebar_with_content_multiple_tab_clicks() -> Result<(), Error> {
let (mut app, _) = App::new(move || {
SidebarWithContent::new(Message::TabSelected)
.push(
TabId::Home,
TabLabel::Text("Home".to_string()),
Text::new("Home Content"),
)
.push(
TabId::Settings,
TabLabel::Text("Settings".to_string()),
Text::new("Settings Content"),
)
.push(
TabId::Profile,
TabLabel::Text("Profile".to_string()),
Text::new("Profile Content"),
)
.set_active_tab(&TabId::Home)
.into()
});
let mut ui = simulator(&app);
ui.click("Settings")?;
assert_message_received(
ui,
&mut app,
|m| matches!(m, Message::TabSelected(TabId::Settings)),
"Should receive Settings tab selection",
);
let mut ui = simulator(&app);
ui.click("Profile")?;
assert_message_received(
ui,
&mut app,
|m| matches!(m, Message::TabSelected(TabId::Profile)),
"Should receive Profile tab selection",
);
Ok(())
}