use revue::event::Key;
use revue::layout::Rect;
use revue::render::Buffer;
use revue::widget::traits::{RenderContext, StyledView, View};
use revue::widget::{screen, screen_stack, Screen, ScreenStack, ScreenTransition};
#[test]
fn test_screen_new() {
let s = Screen::new("home");
assert_eq!(s.id, "home");
assert_eq!(s.title, "home");
assert!(!s.modal);
}
#[test]
fn test_screen_default_title() {
let s = Screen::new("settings");
assert_eq!(s.title, "settings");
}
#[test]
fn test_screen_helper() {
let s = screen("dashboard");
assert_eq!(s.id, "dashboard");
assert_eq!(s.title, "dashboard");
}
#[test]
fn test_screen_title_builder() {
let s = Screen::new("home").title("My Home");
assert_eq!(s.id, "home");
assert_eq!(s.title, "My Home");
}
#[test]
fn test_screen_modal_builder() {
let s = Screen::new("alert").modal();
assert!(s.modal);
}
#[test]
fn test_screen_not_modal_by_default() {
let s = Screen::new("normal");
assert!(!s.modal);
}
#[test]
fn test_screen_data_builder() {
let s = Screen::new("detail")
.data("user_id", "123")
.data("username", "test_user");
assert_eq!(s.get_data("user_id"), Some(&"123".to_string()));
assert_eq!(s.get_data("username"), Some(&"test_user".to_string()));
assert_eq!(s.get_data("nonexistent"), None);
}
#[test]
fn test_screen_builder_chain() {
let s = Screen::new("profile")
.title("User Profile")
.modal()
.data("user_id", "456");
assert_eq!(s.id, "profile");
assert_eq!(s.title, "User Profile");
assert!(s.modal);
assert_eq!(s.get_data("user_id"), Some(&"456".to_string()));
}
#[test]
fn test_screen_stack_new() {
let stack = ScreenStack::new();
assert_eq!(stack.depth(), 0);
assert!(!stack.can_go_back());
assert!(stack.current().is_none());
}
#[test]
fn test_screen_stack_default() {
let stack = ScreenStack::default();
assert_eq!(stack.depth(), 0);
}
#[test]
fn test_screen_stack_helper() {
let stack = screen_stack();
assert_eq!(stack.depth(), 0);
}
#[test]
fn test_screen_stack_transition_builder() {
let stack = ScreenStack::new().transition(ScreenTransition::SlideRight);
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_all_transitions() {
let transitions = [
ScreenTransition::None,
ScreenTransition::SlideRight,
ScreenTransition::SlideUp,
ScreenTransition::Fade,
ScreenTransition::Zoom,
];
for transition in transitions {
let stack = ScreenStack::new().transition(transition);
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
}
#[test]
fn test_screen_stack_register() {
let stack = ScreenStack::new().register("home", |screen, ctx| {
let _ = (screen, ctx);
});
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_register_multiple() {
let stack = ScreenStack::new()
.register("home", |screen, ctx| {
let _ = (screen, ctx);
})
.register("settings", |screen, ctx| {
let _ = (screen, ctx);
})
.register("profile", |screen, ctx| {
let _ = (screen, ctx);
});
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_push_single() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
assert_eq!(stack.depth(), 1);
assert_eq!(stack.current().unwrap().id, "home");
}
#[test]
fn test_screen_stack_push_multiple() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
stack.push(Screen::new("profile"));
assert_eq!(stack.depth(), 3);
assert_eq!(stack.current().unwrap().id, "profile");
}
#[test]
fn test_screen_stack_pop() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
let popped = stack.pop();
assert!(popped.is_some());
assert_eq!(popped.unwrap().id, "settings");
assert_eq!(stack.depth(), 1);
assert_eq!(stack.current().unwrap().id, "home");
}
#[test]
fn test_screen_stack_pop_returns_screen() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
let screen = Screen::new("test").title("Test Screen");
stack.push(screen);
let popped = stack.pop();
assert!(popped.is_some());
let popped_screen = popped.unwrap();
assert_eq!(popped_screen.id, "test");
assert_eq!(popped_screen.title, "Test Screen");
}
#[test]
fn test_screen_stack_cannot_pop_last_screen() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
let result = stack.pop();
assert!(result.is_none());
assert_eq!(stack.depth(), 1);
}
#[test]
fn test_screen_stack_pop_empty() {
let mut stack = ScreenStack::new();
let result = stack.pop();
assert!(result.is_none());
assert_eq!(stack.depth(), 0);
}
#[test]
fn test_screen_stack_pop_to() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("a"));
stack.push(Screen::new("b"));
stack.push(Screen::new("c"));
let popped = stack.pop_to("a");
assert_eq!(popped.len(), 2); assert_eq!(stack.depth(), 2);
assert_eq!(stack.current().unwrap().id, "a");
}
#[test]
fn test_screen_stack_pop_to_current() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
let popped = stack.pop_to("settings");
assert_eq!(popped.len(), 0);
assert_eq!(stack.depth(), 2);
}
#[test]
fn test_screen_stack_pop_to_nonexistent() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
let _popped = stack.pop_to("nonexistent");
assert_eq!(stack.current().unwrap().id, "home");
}
#[test]
fn test_screen_stack_pop_to_root() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("a"));
stack.push(Screen::new("b"));
stack.push(Screen::new("c"));
let popped = stack.pop_to_root();
assert_eq!(popped.len(), 3); assert_eq!(stack.depth(), 1);
assert_eq!(stack.current().unwrap().id, "home");
}
#[test]
fn test_screen_stack_pop_to_root_single_screen() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
let popped = stack.pop_to_root();
assert_eq!(popped.len(), 0);
assert_eq!(stack.depth(), 1);
}
#[test]
fn test_screen_stack_replace() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("old"));
stack.replace(Screen::new("new"));
assert_eq!(stack.depth(), 2);
assert_eq!(stack.current().unwrap().id, "new");
}
#[test]
fn test_screen_stack_replace_single() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("old"));
stack.replace(Screen::new("new"));
assert_eq!(stack.depth(), 1);
assert_eq!(stack.current().unwrap().id, "new");
}
#[test]
fn test_screen_stack_current() {
let mut stack = ScreenStack::new();
assert!(stack.current().is_none());
stack.push(Screen::new("home"));
assert_eq!(stack.current().unwrap().id, "home");
stack.push(Screen::new("settings"));
assert_eq!(stack.current().unwrap().id, "settings");
}
#[test]
fn test_screen_stack_current_mut() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
if let Some(screen) = stack.current_mut() {
screen.title = "Updated Home".to_string();
}
assert_eq!(stack.current().unwrap().title, "Updated Home");
}
#[test]
fn test_screen_stack_get() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
stack.push(Screen::new("profile"));
assert_eq!(stack.get("home").unwrap().id, "home");
assert_eq!(stack.get("settings").unwrap().id, "settings");
assert_eq!(stack.get("profile").unwrap().id, "profile");
assert!(stack.get("nonexistent").is_none());
}
#[test]
fn test_screen_stack_contains() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
assert!(stack.contains("home"));
assert!(stack.contains("settings"));
assert!(!stack.contains("nonexistent"));
}
#[test]
fn test_screen_stack_depth() {
let mut stack = ScreenStack::new();
assert_eq!(stack.depth(), 0);
stack.push(Screen::new("home"));
assert_eq!(stack.depth(), 1);
stack.push(Screen::new("settings"));
assert_eq!(stack.depth(), 2);
stack.pop();
assert_eq!(stack.depth(), 1);
}
#[test]
fn test_screen_stack_can_go_back() {
let mut stack = ScreenStack::new();
assert!(!stack.can_go_back());
stack.push(Screen::new("home"));
assert!(!stack.can_go_back());
stack.push(Screen::new("settings"));
assert!(stack.can_go_back());
stack.pop();
assert!(!stack.can_go_back());
}
#[test]
fn test_screen_stack_go_back() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
assert!(stack.go_back());
assert_eq!(stack.current().unwrap().id, "home");
assert!(!stack.can_go_back());
}
#[test]
fn test_screen_stack_go_back_returns_false() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
assert!(!stack.go_back());
assert_eq!(stack.current().unwrap().id, "home");
}
#[test]
fn test_screen_stack_go_back_multiple() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("a"));
stack.push(Screen::new("b"));
assert!(stack.go_back());
assert_eq!(stack.current().unwrap().id, "a");
assert!(stack.go_back());
assert_eq!(stack.current().unwrap().id, "home");
assert!(!stack.go_back());
assert_eq!(stack.current().unwrap().id, "home");
}
#[test]
fn test_screen_stack_handle_key_escape() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
let handled = stack.handle_key(&Key::Escape);
assert!(handled);
assert_eq!(stack.current().unwrap().id, "home");
}
#[test]
fn test_screen_stack_handle_key_escape_no_back() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
let handled = stack.handle_key(&Key::Escape);
assert!(!handled);
assert_eq!(stack.current().unwrap().id, "home");
}
#[test]
fn test_screen_stack_handle_key_other() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
let handled = stack.handle_key(&Key::Char('a'));
assert!(!handled);
assert_eq!(stack.current().unwrap().id, "settings");
}
#[test]
fn test_screen_stack_handle_key_empty_stack() {
let mut stack = ScreenStack::new();
let handled = stack.handle_key(&Key::Escape);
assert!(!handled);
}
#[test]
fn test_screen_stack_update_transition() {
let mut stack = ScreenStack::new().transition(ScreenTransition::SlideRight);
stack.push(Screen::new("home"));
stack.update_transition(0.1);
for _ in 0..10 {
stack.update_transition(0.1);
}
}
#[test]
fn test_screen_stack_no_transition_by_default() {
let stack = ScreenStack::new();
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_transition_starts_on_push() {
let mut stack = ScreenStack::new().transition(ScreenTransition::SlideRight);
stack.push(Screen::new("home"));
stack.update_transition(0.1);
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_transition_starts_on_pop() {
let mut stack = ScreenStack::new().transition(ScreenTransition::SlideRight);
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
stack.pop();
stack.update_transition(0.1);
}
#[test]
fn test_screen_stack_no_transition_with_none() {
let mut stack = ScreenStack::new().transition(ScreenTransition::None);
stack.push(Screen::new("home"));
stack.update_transition(0.1);
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_modal_hides_below() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home").title("Home Screen"));
stack.push(Screen::new("modal").modal().title("Modal Screen"));
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_multiple_modals() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("modal1").modal());
stack.push(Screen::new("modal2").modal());
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_normal_after_modal() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("modal").modal());
stack.push(Screen::new("normal"));
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_render_empty() {
let stack = ScreenStack::new();
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_render_with_renderer() {
let mut stack = ScreenStack::new().register("test", |screen, ctx| {
let _ = (screen, ctx);
});
stack.push(Screen::new("test"));
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_render_no_renderer() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("no_renderer"));
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_render_multiple_screens() {
let mut stack = ScreenStack::new()
.register("home", |screen, ctx| {
let _ = (screen, ctx);
})
.register("settings", |screen, ctx| {
let _ = (screen, ctx);
});
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_history_on_push() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
assert!(stack.can_go_back());
}
#[test]
fn test_screen_stack_max_history() {
let mut stack = ScreenStack::new();
for _ in 0..100 {
stack.push(Screen::new("screen"));
}
assert_eq!(stack.depth(), 100);
assert!(stack.can_go_back());
}
#[test]
fn test_screen_widget_type() {
let stack = ScreenStack::new();
assert_eq!(stack.widget_type(), "ScreenStack");
}
#[test]
fn test_screen_stack_view_id_none() {
let stack = ScreenStack::new();
assert!(View::id(&stack).is_none());
}
#[test]
fn test_screen_stack_view_id_some() {
let stack = ScreenStack::new().element_id("my-stack");
assert_eq!(View::id(&stack), Some("my-stack"));
}
#[test]
fn test_screen_stack_view_classes_empty() {
let stack = ScreenStack::new();
assert!(View::classes(&stack).is_empty());
}
#[test]
fn test_screen_stack_view_classes_with_values() {
let stack = ScreenStack::new().class("first").class("second");
let classes = View::classes(&stack);
assert_eq!(classes.len(), 2);
assert!(classes.contains(&"first".to_string()));
assert!(classes.contains(&"second".to_string()));
}
#[test]
fn test_screen_stack_view_meta() {
let stack = ScreenStack::new().element_id("test-id").class("test-class");
let meta = stack.meta();
assert_eq!(meta.widget_type, "ScreenStack");
assert_eq!(meta.id, Some("test-id".to_string()));
assert!(meta.classes.contains("test-class"));
}
#[test]
fn test_screen_stack_styled_view_set_id() {
let mut stack = ScreenStack::new();
StyledView::set_id(&mut stack, "test-id");
assert_eq!(View::id(&stack), Some("test-id"));
}
#[test]
fn test_screen_stack_styled_view_add_class() {
let mut stack = ScreenStack::new();
StyledView::add_class(&mut stack, "first");
StyledView::add_class(&mut stack, "second");
assert!(StyledView::has_class(&stack, "first"));
assert!(StyledView::has_class(&stack, "second"));
assert_eq!(View::classes(&stack).len(), 2);
}
#[test]
fn test_screen_stack_styled_view_remove_class() {
let mut stack = ScreenStack::new().class("a").class("b").class("c");
StyledView::remove_class(&mut stack, "b");
assert!(StyledView::has_class(&stack, "a"));
assert!(!StyledView::has_class(&stack, "b"));
assert!(StyledView::has_class(&stack, "c"));
}
#[test]
fn test_screen_stack_styled_view_toggle_class() {
let mut stack = ScreenStack::new();
StyledView::toggle_class(&mut stack, "test");
assert!(StyledView::has_class(&stack, "test"));
StyledView::toggle_class(&mut stack, "test");
assert!(!StyledView::has_class(&stack, "test"));
}
#[test]
fn test_screen_stack_builder_element_id() {
let stack = ScreenStack::new().element_id("my-stack");
assert_eq!(View::id(&stack), Some("my-stack"));
}
#[test]
fn test_screen_stack_builder_class() {
let stack = ScreenStack::new().class("stack").class("navigation");
assert!(stack.has_class("stack"));
assert!(stack.has_class("navigation"));
}
#[test]
fn test_screen_stack_builder_classes() {
let stack = ScreenStack::new().classes(vec!["first", "second", "third"]);
assert!(stack.has_class("first"));
assert!(stack.has_class("second"));
assert!(stack.has_class("third"));
}
#[test]
fn test_screen_transition_default() {
let transition = ScreenTransition::default();
assert_eq!(transition, ScreenTransition::None);
}
#[test]
fn test_screen_transition_partial_eq() {
assert_eq!(ScreenTransition::None, ScreenTransition::None);
assert_eq!(ScreenTransition::SlideRight, ScreenTransition::SlideRight);
assert_eq!(ScreenTransition::SlideUp, ScreenTransition::SlideUp);
assert_eq!(ScreenTransition::Fade, ScreenTransition::Fade);
assert_eq!(ScreenTransition::Zoom, ScreenTransition::Zoom);
assert_ne!(ScreenTransition::None, ScreenTransition::Fade);
assert_ne!(ScreenTransition::SlideRight, ScreenTransition::SlideUp);
}
#[test]
fn test_screen_transition_all_variants() {
let transitions = [
ScreenTransition::None,
ScreenTransition::SlideRight,
ScreenTransition::SlideUp,
ScreenTransition::Fade,
ScreenTransition::Zoom,
];
for transition in transitions {
let stack = ScreenStack::new().transition(transition);
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
}
#[test]
fn test_screen_with_empty_id() {
let s = Screen::new("");
assert_eq!(s.id, "");
assert_eq!(s.title, "");
}
#[test]
fn test_screen_with_special_characters() {
let s = Screen::new("screen-with-special.chars_123");
assert_eq!(s.id, "screen-with-special.chars_123");
}
#[test]
fn test_screen_data_overwrite() {
let s = Screen::new("test")
.data("key", "value1")
.data("key", "value2");
assert_eq!(s.get_data("key"), Some(&"value2".to_string()));
}
#[test]
fn test_screen_multiple_data_entries() {
let s = Screen::new("test")
.data("key1", "value1")
.data("key2", "value2")
.data("key3", "value3")
.data("key4", "value4")
.data("key5", "value5");
assert_eq!(s.get_data("key1"), Some(&"value1".to_string()));
assert_eq!(s.get_data("key2"), Some(&"value2".to_string()));
assert_eq!(s.get_data("key3"), Some(&"value3".to_string()));
assert_eq!(s.get_data("key4"), Some(&"value4".to_string()));
assert_eq!(s.get_data("key5"), Some(&"value5".to_string()));
}
#[test]
fn test_screen_stack_push_same_id_multiple_times() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home").title("First"));
stack.push(Screen::new("home").title("Second"));
stack.push(Screen::new("home").title("Third"));
assert_eq!(stack.depth(), 3);
assert_eq!(stack.current().unwrap().title, "Third");
}
#[test]
fn test_screen_stack_large_depth() {
let mut stack = ScreenStack::new();
let screen_ids: Vec<&'static str> = vec![
"screen_0",
"screen_1",
"screen_2",
"screen_3",
"screen_4",
"screen_5",
"screen_6",
"screen_7",
"screen_8",
"screen_9",
"screen_10",
"screen_11",
"screen_12",
"screen_13",
"screen_14",
"screen_15",
"screen_16",
"screen_17",
"screen_18",
"screen_19",
"screen_20",
"screen_21",
"screen_22",
"screen_23",
"screen_24",
"screen_25",
"screen_26",
"screen_27",
"screen_28",
"screen_29",
"screen_30",
"screen_31",
"screen_32",
"screen_33",
"screen_34",
"screen_35",
"screen_36",
"screen_37",
"screen_38",
"screen_39",
"screen_40",
"screen_41",
"screen_42",
"screen_43",
"screen_44",
"screen_45",
"screen_46",
"screen_47",
"screen_48",
"screen_49",
"screen_50",
"screen_51",
"screen_52",
"screen_53",
"screen_54",
"screen_55",
"screen_56",
"screen_57",
"screen_58",
"screen_59",
"screen_60",
"screen_61",
"screen_62",
"screen_63",
"screen_64",
"screen_65",
"screen_66",
"screen_67",
"screen_68",
"screen_69",
"screen_70",
"screen_71",
"screen_72",
"screen_73",
"screen_74",
"screen_75",
"screen_76",
"screen_77",
"screen_78",
"screen_79",
"screen_80",
"screen_81",
"screen_82",
"screen_83",
"screen_84",
"screen_85",
"screen_86",
"screen_87",
"screen_88",
"screen_89",
"screen_90",
"screen_91",
"screen_92",
"screen_93",
"screen_94",
"screen_95",
"screen_96",
"screen_97",
"screen_98",
"screen_99",
];
for id in screen_ids {
stack.push(Screen::new(id));
}
assert_eq!(stack.depth(), 100);
assert_eq!(stack.current().unwrap().id, "screen_99");
}
#[test]
fn test_screen_stack_pop_from_large_depth() {
let mut stack = ScreenStack::new();
let screen_ids: Vec<&'static str> = vec![
"screen_0",
"screen_1",
"screen_2",
"screen_3",
"screen_4",
"screen_5",
"screen_6",
"screen_7",
"screen_8",
"screen_9",
"screen_10",
"screen_11",
"screen_12",
"screen_13",
"screen_14",
"screen_15",
"screen_16",
"screen_17",
"screen_18",
"screen_19",
"screen_20",
"screen_21",
"screen_22",
"screen_23",
"screen_24",
"screen_25",
"screen_26",
"screen_27",
"screen_28",
"screen_29",
"screen_30",
"screen_31",
"screen_32",
"screen_33",
"screen_34",
"screen_35",
"screen_36",
"screen_37",
"screen_38",
"screen_39",
"screen_40",
"screen_41",
"screen_42",
"screen_43",
"screen_44",
"screen_45",
"screen_46",
"screen_47",
"screen_48",
"screen_49",
];
for id in screen_ids {
stack.push(Screen::new(id));
}
for _ in 0..49 {
stack.pop();
}
assert_eq!(stack.depth(), 1);
assert_eq!(stack.current().unwrap().id, "screen_0");
}
#[test]
fn test_screen_stack_replace_in_middle_of_stack() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("middle"));
stack.push(Screen::new("top"));
stack.replace(Screen::new("new_top"));
assert_eq!(stack.depth(), 3);
assert_eq!(stack.current().unwrap().id, "new_top");
assert_eq!(stack.get("middle").unwrap().id, "middle");
}
#[test]
fn test_screen_stack_get_mut_not_available() {
let mut stack = ScreenStack::new();
stack.push(Screen::new("home"));
stack.push(Screen::new("settings"));
if let Some(screen) = stack.current_mut() {
screen.title = "Updated".to_string();
}
assert_eq!(stack.current().unwrap().title, "Updated");
}
#[test]
fn test_screen_stack_render_with_offset() {
let mut stack = ScreenStack::new().register("test", |screen, ctx| {
let _ = (screen, ctx);
});
stack.push(Screen::new("test"));
let mut buffer = Buffer::new(40, 20);
let area = Rect::new(10, 5, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_stack_render_zero_size() {
let stack = ScreenStack::new();
let mut buffer = Buffer::new(0, 0);
let area = Rect::new(0, 0, 0, 0);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_transition_completes() {
let mut stack = ScreenStack::new().transition(ScreenTransition::Fade);
stack.push(Screen::new("home"));
for _ in 0..100 {
stack.update_transition(1.0);
}
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
stack.render(&mut ctx);
}
#[test]
fn test_screen_transition_update_zero_delta() {
let mut stack = ScreenStack::new().transition(ScreenTransition::SlideRight);
stack.push(Screen::new("home"));
stack.update_transition(0.0);
stack.update_transition(0.0);
stack.update_transition(0.0);
}
#[test]
fn test_screen_with_unicode_title() {
let s = Screen::new("test").title("한글 타이틀 🎉");
assert_eq!(s.title, "한글 타이틀 🎉");
}
#[test]
fn test_screen_with_unicode_data() {
let s = Screen::new("test")
.data("emoji", "😀😃😄")
.data("korean", "안녕하세요")
.data("japanese", "こんにちは");
assert_eq!(s.get_data("emoji"), Some(&"😀😃😄".to_string()));
assert_eq!(s.get_data("korean"), Some(&"안녕하세요".to_string()));
assert_eq!(s.get_data("japanese"), Some(&"こんにちは".to_string()));
}