1
0
зеркало из https://github.com/glebtv/tui-textarea.git synced 2026-09-05 07:15:49 +03:00

add arbitrary crate as optional dependency

to avoid converting `Input` in fuzz test for making arbitrary inputs
Этот коммит содержится в:
rhysd
2022-07-16 21:40:05 +09:00
родитель 8b3b0aa34c
Коммит ac04feb5ea
5 изменённых файлов: 48 добавлений и 69 удалений

Просмотреть файл

@@ -4,77 +4,19 @@ use arbitrary::{Arbitrary, Result, Unstructured};
use libfuzzer_sys::fuzz_target;
use std::iter;
use std::str;
use tui_textarea::{Input, Key, TextArea};
macro_rules! arbitrary_key_enum {
($($p:ident$(($x:ident))?,)+) => {
#[derive(Arbitrary)]
enum ArbitraryKey {
$(
$p$(($x))?,
)+
}
impl From<ArbitraryKey> for Key {
fn from(k: ArbitraryKey) -> Key {
match k {
$(
ArbitraryKey::$p$(($x))? => Key::$p$(($x))?,
)+
}
}
}
}
}
arbitrary_key_enum!(
Char(char),
F(u8),
Backspace,
Enter,
Left,
Right,
Up,
Down,
Tab,
Delete,
Home,
End,
PageUp,
PageDown,
Esc,
Null,
);
#[derive(Arbitrary)]
struct ArbitraryInput {
key: ArbitraryKey,
ctrl: bool,
alt: bool,
}
impl From<ArbitraryInput> for Input {
fn from(i: ArbitraryInput) -> Input {
Input {
key: i.key.into(),
ctrl: i.ctrl,
alt: i.alt,
}
}
}
use tui_textarea::{Input, TextArea};
fn fuzz(data: &[u8]) -> Result<()> {
let mut u = Unstructured::new(data);
let inputs: Vec<_> = iter::repeat_with(|| ArbitraryInput::arbitrary(&mut u))
.take(10)
let inputs: Vec<_> = iter::repeat_with(|| Input::arbitrary(&mut u))
.take(100)
.collect::<Result<_>>()?;
let text = <&str>::arbitrary(&mut u)?;
let mut textarea = TextArea::from(text.lines());
for input in inputs {
textarea.input(input);
let _ = textarea.widget();
}
let _ = textarea.widget();
Ok(())
}