123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- use std::time::Duration;
- use crossterm::event::{Event, KeyCode, KeyEvent, KeyModifiers, MouseButton, MouseEvent};
- use dioxus_core::VNode;
- use dioxus_core::*;
- use dioxus_core_macro::*;
- use dioxus_hooks::*;
- use dioxus_html as dioxus_elements;
- use dioxus_tui::TuiContext;
- #[test]
- fn key_down() {
- dioxus_tui::launch_cfg(app, dioxus_tui::Config::new().with_headless());
- fn app(cx: Scope) -> Element {
- let render_count = use_state(&cx, || 0);
- let tui_ctx: TuiContext = cx.consume_context().unwrap();
- let render_count_handle = render_count.clone();
- cx.spawn(async move {
- tokio::time::sleep(Duration::from_millis(100)).await;
- render_count_handle.modify(|x| *x + 1);
- });
- if *render_count.get() > 2 {
- panic!("Event was not received");
- }
- tui_ctx.inject_event(Event::Key(KeyEvent {
- code: KeyCode::Char('a'),
- modifiers: KeyModifiers::NONE,
- }));
- cx.render(rsx! {
- div {
- width: "100%",
- height: "100%",
- onkeydown: move |evt| {
- assert_eq!(evt.data.key_code, dioxus_html::KeyCode::A);
- tui_ctx.quit();
- },
- }
- })
- }
- }
- #[test]
- fn mouse_down() {
- dioxus_tui::launch_cfg(app, dioxus_tui::Config::new().with_headless());
- fn app(cx: Scope) -> Element {
- let render_count = use_state(&cx, || 0);
- let tui_ctx: TuiContext = cx.consume_context().unwrap();
- let render_count_handle = render_count.clone();
- cx.spawn(async move {
- tokio::time::sleep(Duration::from_millis(100)).await;
- render_count_handle.modify(|x| *x + 1);
- });
- if *render_count.get() > 2 {
- panic!("Event was not received");
- }
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 0,
- row: 0,
- kind: crossterm::event::MouseEventKind::Down(MouseButton::Left),
- modifiers: KeyModifiers::NONE,
- }));
- cx.render(rsx! {
- div {
- width: "100%",
- height: "100%",
- onmousedown: move |evt| {
- assert!(evt.data.held_buttons().contains(dioxus_html::input_data::MouseButton::Primary));
- tui_ctx.quit();
- },
- }
- })
- }
- }
- #[test]
- fn mouse_up() {
- dioxus_tui::launch_cfg(app, dioxus_tui::Config::new().with_headless());
- fn app(cx: Scope) -> Element {
- let render_count = use_state(&cx, || 0);
- let tui_ctx: TuiContext = cx.consume_context().unwrap();
- let render_count_handle = render_count.clone();
- cx.spawn(async move {
- tokio::time::sleep(Duration::from_millis(100)).await;
- render_count_handle.modify(|x| *x + 1);
- });
- if *render_count.get() > 2 {
- panic!("Event was not received");
- }
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 0,
- row: 0,
- kind: crossterm::event::MouseEventKind::Down(MouseButton::Left),
- modifiers: KeyModifiers::NONE,
- }));
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 0,
- row: 0,
- kind: crossterm::event::MouseEventKind::Up(MouseButton::Left),
- modifiers: KeyModifiers::NONE,
- }));
- cx.render(rsx! {
- div {
- width: "100%",
- height: "100%",
- onmouseup: move |_| {
- tui_ctx.quit();
- },
- }
- })
- }
- }
- #[test]
- fn mouse_enter() {
- dioxus_tui::launch_cfg(app, dioxus_tui::Config::new().with_headless());
- fn app(cx: Scope) -> Element {
- let render_count = use_state(&cx, || 0);
- let tui_ctx: TuiContext = cx.consume_context().unwrap();
- let render_count_handle = render_count.clone();
- cx.spawn(async move {
- tokio::time::sleep(Duration::from_millis(100)).await;
- render_count_handle.modify(|x| *x + 1);
- });
- if *render_count.get() > 2 {
- panic!("Event was not received");
- }
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 100,
- row: 100,
- kind: crossterm::event::MouseEventKind::Moved,
- modifiers: KeyModifiers::NONE,
- }));
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 0,
- row: 0,
- kind: crossterm::event::MouseEventKind::Moved,
- modifiers: KeyModifiers::NONE,
- }));
- cx.render(rsx! {
- div {
- width: "50%",
- height: "50%",
- onmouseenter: move |_| {
- tui_ctx.quit();
- },
- }
- })
- }
- }
- #[test]
- fn mouse_exit() {
- dioxus_tui::launch_cfg(app, dioxus_tui::Config::new().with_headless());
- fn app(cx: Scope) -> Element {
- let render_count = use_state(&cx, || 0);
- let tui_ctx: TuiContext = cx.consume_context().unwrap();
- let render_count_handle = render_count.clone();
- cx.spawn(async move {
- tokio::time::sleep(Duration::from_millis(100)).await;
- render_count_handle.modify(|x| *x + 1);
- });
- if *render_count.get() > 2 {
- panic!("Event was not received");
- }
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 0,
- row: 0,
- kind: crossterm::event::MouseEventKind::Moved,
- modifiers: KeyModifiers::NONE,
- }));
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 100,
- row: 100,
- kind: crossterm::event::MouseEventKind::Moved,
- modifiers: KeyModifiers::NONE,
- }));
- cx.render(rsx! {
- div {
- width: "50%",
- height: "50%",
- onmouseenter: move |_| {
- tui_ctx.quit();
- },
- }
- })
- }
- }
- #[test]
- fn mouse_move() {
- dioxus_tui::launch_cfg(app, dioxus_tui::Config::new().with_headless());
- fn app(cx: Scope) -> Element {
- let render_count = use_state(&cx, || 0);
- let tui_ctx: TuiContext = cx.consume_context().unwrap();
- let render_count_handle = render_count.clone();
- cx.spawn(async move {
- tokio::time::sleep(Duration::from_millis(100)).await;
- render_count_handle.modify(|x| *x + 1);
- });
- if *render_count.get() > 2 {
- panic!("Event was not received");
- }
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 40,
- row: 40,
- kind: crossterm::event::MouseEventKind::Moved,
- modifiers: KeyModifiers::NONE,
- }));
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 60,
- row: 60,
- kind: crossterm::event::MouseEventKind::Moved,
- modifiers: KeyModifiers::NONE,
- }));
- cx.render(rsx! {
- div {
- width: "100%",
- height: "100%",
- onmousemove: move |_|{
- tui_ctx.quit();
- },
- }
- })
- }
- }
- #[test]
- fn wheel() {
- dioxus_tui::launch_cfg(app, dioxus_tui::Config::new().with_headless());
- fn app(cx: Scope) -> Element {
- let render_count = use_state(&cx, || 0);
- let tui_ctx: TuiContext = cx.consume_context().unwrap();
- let render_count_handle = render_count.clone();
- cx.spawn(async move {
- tokio::time::sleep(Duration::from_millis(100)).await;
- render_count_handle.modify(|x| *x + 1);
- });
- if *render_count.get() > 2 {
- panic!("Event was not received");
- }
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 50,
- row: 50,
- kind: crossterm::event::MouseEventKind::Moved,
- modifiers: KeyModifiers::NONE,
- }));
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 50,
- row: 50,
- kind: crossterm::event::MouseEventKind::ScrollDown,
- modifiers: KeyModifiers::NONE,
- }));
- cx.render(rsx! {
- div {
- width: "100%",
- height: "100%",
- onwheel: move |evt| {
- assert!(evt.data.delta_y > 0.0);
- tui_ctx.quit();
- },
- }
- })
- }
- }
- #[test]
- fn click() {
- dioxus_tui::launch_cfg(app, dioxus_tui::Config::new().with_headless());
- fn app(cx: Scope) -> Element {
- let render_count = use_state(&cx, || 0);
- let tui_ctx: TuiContext = cx.consume_context().unwrap();
- let render_count_handle = render_count.clone();
- cx.spawn(async move {
- tokio::time::sleep(Duration::from_millis(100)).await;
- render_count_handle.modify(|x| *x + 1);
- });
- if *render_count.get() > 2 {
- panic!("Event was not received");
- }
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 50,
- row: 50,
- kind: crossterm::event::MouseEventKind::Down(MouseButton::Left),
- modifiers: KeyModifiers::NONE,
- }));
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 50,
- row: 50,
- kind: crossterm::event::MouseEventKind::Up(MouseButton::Left),
- modifiers: KeyModifiers::NONE,
- }));
- cx.render(rsx! {
- div {
- width: "100%",
- height: "100%",
- onclick: move |_|{
- tui_ctx.quit();
- },
- }
- })
- }
- }
- #[test]
- fn context_menu() {
- dioxus_tui::launch_cfg(app, dioxus_tui::Config::new().with_headless());
- fn app(cx: Scope) -> Element {
- let render_count = use_state(&cx, || 0);
- let tui_ctx: TuiContext = cx.consume_context().unwrap();
- let render_count_handle = render_count.clone();
- cx.spawn(async move {
- tokio::time::sleep(Duration::from_millis(100)).await;
- render_count_handle.modify(|x| *x + 1);
- });
- if *render_count.get() > 2 {
- panic!("Event was not received");
- }
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 50,
- row: 50,
- kind: crossterm::event::MouseEventKind::Down(MouseButton::Right),
- modifiers: KeyModifiers::NONE,
- }));
- tui_ctx.inject_event(Event::Mouse(MouseEvent {
- column: 50,
- row: 50,
- kind: crossterm::event::MouseEventKind::Up(MouseButton::Right),
- modifiers: KeyModifiers::NONE,
- }));
- cx.render(rsx! {
- div {
- width: "100%",
- height: "100%",
- oncontextmenu: move |_|{
- tui_ctx.quit();
- },
- }
- })
- }
- }
|