diff --git a/bench/src/lib.rs b/bench/src/lib.rs index aadd5b8..c5453ba 100644 --- a/bench/src/lib.rs +++ b/bench/src/lib.rs @@ -29,6 +29,7 @@ pub struct DummyBackend { } impl Default for DummyBackend { + #[inline] fn default() -> Self { Self { width: 40, @@ -39,6 +40,7 @@ impl Default for DummyBackend { } impl Backend for DummyBackend { + #[inline] fn draw<'a, I>(&mut self, _content: I) -> Result<(), io::Error> where I: Iterator, @@ -46,27 +48,33 @@ impl Backend for DummyBackend { Ok(()) } + #[inline] fn hide_cursor(&mut self) -> Result<(), io::Error> { Ok(()) } + #[inline] fn show_cursor(&mut self) -> Result<(), io::Error> { Ok(()) } + #[inline] fn get_cursor(&mut self) -> Result<(u16, u16), io::Error> { Ok(self.cursor) } + #[inline] fn set_cursor(&mut self, x: u16, y: u16) -> Result<(), io::Error> { self.cursor = (x, y); Ok(()) } + #[inline] fn clear(&mut self) -> Result<(), io::Error> { Ok(()) } + #[inline] fn size(&self) -> Result { Ok(Rect { x: 0, @@ -76,11 +84,13 @@ impl Backend for DummyBackend { }) } + #[inline] fn flush(&mut self) -> Result<(), io::Error> { Ok(()) } } +#[inline] pub fn dummy_terminal() -> Terminal { Terminal::new(DummyBackend::default()).unwrap() } @@ -90,6 +100,7 @@ pub trait TerminalExt { } impl TerminalExt for Terminal { + #[inline] fn draw_textarea(&mut self, textarea: &TextArea<'_>) { self.draw(|f| f.render_widget(textarea.widget(), f.size())) .unwrap(); diff --git a/fuzz/Cargo.lock b/fuzz/Cargo.lock index 94acf1f..b5c7d98 100644 --- a/fuzz/Cargo.lock +++ b/fuzz/Cargo.lock @@ -289,6 +289,14 @@ dependencies = [ "tui", ] +[[package]] +name = "tui-textarea-bench" +version = "0.0.0" +dependencies = [ + "tui", + "tui-textarea", +] + [[package]] name = "tui-textarea-fuzz" version = "0.0.0" @@ -296,6 +304,7 @@ dependencies = [ "arbitrary", "libfuzzer-sys", "tui-textarea", + "tui-textarea-bench", ] [[package]] diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 441de4b..d726232 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -12,6 +12,7 @@ cargo-fuzz = true libfuzzer-sys = "0.4" arbitrary = "1" tui-textarea = { path = "..", features = ["search", "arbitrary"] } +tui-textarea-bench = { path = "../bench" } # Prevent this from interfering with workspaces [workspace] diff --git a/fuzz/fuzz_targets/edit.rs b/fuzz/fuzz_targets/edit.rs index 76347fd..92a5fe3 100644 --- a/fuzz/fuzz_targets/edit.rs +++ b/fuzz/fuzz_targets/edit.rs @@ -5,17 +5,19 @@ use libfuzzer_sys::fuzz_target; use std::iter; use std::str; use tui_textarea::{Input, TextArea}; +use tui_textarea_bench::{dummy_terminal, TerminalExt}; fn fuzz(data: &[u8]) -> Result<()> { - let mut u = Unstructured::new(data); - let inputs: Vec<_> = iter::repeat_with(|| Input::arbitrary(&mut u)) + let mut term = dummy_terminal(); + let mut data = Unstructured::new(data); + let inputs: Vec<_> = iter::repeat_with(|| Input::arbitrary(&mut data)) .take(100) .collect::>()?; - let text = <&str>::arbitrary(&mut u)?; + let text = <&str>::arbitrary(&mut data)?; let mut textarea = TextArea::from(text.lines()); for input in inputs { textarea.input(input); - let _ = textarea.widget(); + term.draw_textarea(&mut textarea); } Ok(()) }