Add very crude planning and properties fuzzing.

This commit is contained in:
Alex Roper 2020-05-10 16:58:09 -07:00
parent 59b4f73bb2
commit 37bdd9fd53

View file

@ -60,32 +60,59 @@ fn fuzz(
let structure_len = structure.chars().count(); let structure_len = structure.chars().count();
while s.len() < length { while s.len() < length {
let r = rng.gen_range(0, 7); let r = rng.gen_range(0, 80);
if r == 0 { if r < 10 {
s += "* "; s += "* ";
} else if r == 1 { } else if r < 20 {
s += "\n* "; s += "\n* ";
} else if r == 2 { } else if r < 30 {
s.push('\n'); s.push('\n');
} else if r == 3 { } else if r < 40 {
s.extend( s.extend(
rng.sample_iter(rand::distributions::Alphanumeric) rng.sample_iter(rand::distributions::Alphanumeric)
.take((rng.next_u32() % 20).try_into().unwrap()), .take((rng.next_u32() % 20).try_into().unwrap()),
); );
s.push(' ') s.push(' ')
} else if r == 4 { } else if r < 50 {
s.extend( s.extend(
rng.sample_iter::<char, _>(rand::distributions::Standard) rng.sample_iter::<char, _>(rand::distributions::Standard)
.take((rng.next_u32() % 20 as u32).try_into().unwrap()), .take((rng.next_u32() % 20 as u32).try_into().unwrap()),
); );
s.push(' ') s.push(' ')
} else if r == 5 { } else if r < 60 {
s.push( s.push(
structure structure
.chars() .chars()
.nth(rng.gen_range(0, structure_len)) .nth(rng.gen_range(0, structure_len))
.unwrap(), .unwrap(),
); );
} else if r < 64 {
let mut thing = gen_planning();
if rng.gen_range(0, 10) == 2 {
thing = format!("Hello\n{}", &thing);
}
appendify(&mut s, &thing);
} else if r < 68 {
let mut thing = gen_properties();
if rng.gen_range(0, 10) == 2 {
thing = format!("Hello\n{}", &thing);
}
appendify(&mut s, &thing);
} else if r < 72 {
let r = rng.gen_range(0, 13);
let stuff = if r == 1 {
format!("{}{}", gen_planning(), gen_properties())
} else if r == 2 {
format!("{}\n{}", gen_properties(), gen_planning())
} else if r == 3 {
format!("Hello!\n{}\n{}", gen_planning(), gen_properties())
} else if r == 4 {
format!("Hello!\nWorld!\n{}\n{}", gen_planning(), gen_properties())
} else {
format!("\n{}\n{}", gen_planning(), gen_properties())
};
appendify(&mut s, &stuff);
} else { } else {
s.extend( s.extend(
rng.sample_iter::<char, _>(rand::distributions::Standard) rng.sample_iter::<char, _>(rand::distributions::Standard)
@ -128,6 +155,94 @@ fn fuzz(
} }
} }
fn appendify(s: &mut String, thing: &str) {
let mut rng = rand::thread_rng();
let r = rng.gen_range(0, 10);
if r == 1 {
*s += thing;
} else if r == 2 {
*s += thing;
s.push('\n');
} else if r == 3 {
s.push('\n');
*s += thing;
} else {
*s += "\n* Hello\n";
*s += thing;
s.push('\n');
}
}
fn gen_properties() -> String {
let mut rng = rand::thread_rng();
let mut properties = " :PROPERTIES:\n".to_string();
for _ in 0..rng.gen_range(0, 10) {
let mut name: String = rng
.sample_iter::<char, _>(rand::distributions::Standard)
.take(rng.gen_range(1, 5))
.filter(|c| *c != '+' && !c.is_whitespace())
.collect();
if name.is_empty() {
continue;
}
if rng.gen_range(0, 5) == 2 {
name.push('+');
}
let value: String = rng
.sample_iter::<char, _>(rand::distributions::Standard)
.take(rng.gen_range(0, 50))
.filter(|c| *c != '\n')
.collect();
properties += &format!(" {}: {}\n", &name, &value);
}
properties += ":END:";
properties
}
fn gen_planning() -> String {
let mut rng = rand::thread_rng();
let mut planning = String::new();
for _ in 0..rng.gen_range(0, 5) {
let r = rng.gen_range(0, 3);
if r == 0 {
planning += "DEADLINE";
} else if r == 1 {
planning += "SCHEDULED";
} else {
planning += "CLOSED";
}
if rng.gen_range(0, 20) == 7 {
planning += "FROBBLE";
}
if rng.gen_range(0, 7) != 1 {
planning += ": ";
}
if rng.gen_range(0, 7) != 1 {
let r = rng.gen_range(0, 5);
if r == 0 {
planning += "<2019-02-04>";
} else if r == 1 {
planning += "[2019-02-04]";
} else if r == 2 {
planning += "<2019-02-04 .+1w>";
} else if r == 3 {
planning += "<2019-02-04 Sun ++1w>";
} else if r == 4 {
planning += "<2019-02-04 Sun -1w>";
}
}
if rng.gen_range(0, 10) != 1 {
planning += " ";
}
}
planning
}
fn main() { fn main() {
let args: Vec<String> = ::std::env::args().collect(); let args: Vec<String> = ::std::env::args().collect();