1pub mod core;
2#[macro_use]
3pub mod macros;
4pub mod api;
5pub(crate) mod area_calculation;
6pub mod hooks;
7pub mod render;
8pub mod tui;
9pub(crate) mod utils;
10pub mod windows;
11
12#[cfg(test)]
13mod tests {
14
15    use std::error::Error;
16    use std::thread;
17    use std::time::Duration;
18
19    use ratatui::{
20        buffer::Buffer,
21        layout::Rect,
22        widgets::{Block, Borders, Paragraph, Widget},
23    };
24
25    use crate::{
26        core::RenderComponent,
27        render::{FocusableRender, Render, RenderProps},
28        tui::TuiCrossterm,
29        windows::{
30            page::Page,
31            page_collection::PageCollection,
32            window::{DefaultEventMapper, Window},
33        },
34    };
35
36    struct TestWidget {}
37
38    impl FocusableRender for TestWidget {
39        fn render(&mut self, render_props: &RenderProps, buff: &mut Buffer, area: Rect) {
40            Paragraph::new(format!("Hello world! Focused? {}", render_props.is_focused))
41                .block(Block::new().borders(Borders::all()))
42                .render(area, buff)
43        }
44    }
45
46    struct StaticWidget {}
47
48    impl Render for StaticWidget {
49        fn render(&mut self, _render_props: &RenderProps, buff: &mut Buffer, area: Rect) {
50            Paragraph::new("I'm static")
51                .block(Block::new().borders(Borders::all()))
52                .render(area, buff)
53        }
54    }
55
56    #[test]
57    fn tui_test() -> Result<(), Box<dyn Error>> {
58        thread::sleep(Duration::from_millis(500));
59
60        let mut tui = TuiCrossterm::new()?;
61        let terminal = tui.setup()?;
62        let mut app = PageCollection::new(vec![Page::new(
64            "Page",
65            'p',
66            row_widget!(TestWidget {}, StaticWidget {}),
67        )]);
68        let mut window = Window::new(&app, |ev| match ev {
69            crate::core::InputEvent::Key(c) => *c == 'q',
70            _ => false,
71        });
72        terminal.draw(|f| {
73            let area = f.size();
74            let buff = f.buffer_mut();
75
76            window.render::<DefaultEventMapper>(&mut app, buff, area)
78        })?;
79        thread::sleep(Duration::from_secs(1));
80
81        Ok(())
83    }
84
85    #[test]
86    fn test_asoc() {}
87}