Add edits to thread test generator

Signed-off-by: Alexis Sellier <alexis@radicle.xyz>
This commit is contained in:
Alexis Sellier 2022-12-15 11:39:14 +01:00
parent e47d7ca2aa
commit f1217713af
No known key found for this signature in database
1 changed files with 38 additions and 16 deletions

View File

@ -315,6 +315,7 @@ impl<G> DerefMut for Actor<G> {
#[cfg(test)]
mod tests {
use std::collections::BTreeSet;
use std::ops::ControlFlow;
use std::str::FromStr;
use std::{array, iter};
@ -381,9 +382,9 @@ mod tests {
let rng = fastrand::Rng::with_seed(u64::arbitrary(g));
let root = (Lamport::initial(), author);
let gen =
WeightedGenerator::<(Lamport, Action), (Lamport, Vec<OpId>)>::new(rng.clone())
.variant(3, |(clock, changes), rng| {
changes.push((clock.tick(), author));
WeightedGenerator::<(Lamport, Action), (Lamport, BTreeSet<OpId>)>::new(rng.clone())
.variant(3, |(clock, comments), rng| {
comments.insert((clock.tick(), author));
Some((
*clock,
@ -393,11 +394,25 @@ mod tests {
},
))
})
.variant(2, |(clock, changes), rng| {
if changes.is_empty() {
.variant(2, |(clock, comments), rng| {
if comments.is_empty() {
return None;
}
let to = changes[rng.usize(..changes.len())];
let id = *comments.iter().nth(rng.usize(..comments.len())).unwrap();
Some((
*clock,
Action::Edit {
id,
body: iter::repeat_with(|| rng.alphabetic()).take(16).collect(),
},
))
})
.variant(2, |(clock, comments), rng| {
if comments.is_empty() {
return None;
}
let to = *comments.iter().nth(rng.usize(..comments.len())).unwrap();
Some((
clock.tick(),
@ -408,16 +423,17 @@ mod tests {
},
))
})
.variant(2, |(clock, changes), rng| {
if changes.is_empty() {
.variant(2, |(clock, comments), rng| {
if comments.is_empty() {
return None;
}
let id = changes[rng.usize(..changes.len())];
let id = *comments.iter().nth(rng.usize(..comments.len())).unwrap();
comments.remove(&id);
Some((clock.tick(), Action::Redact { id }))
});
let mut changes = vec![Op {
let mut ops = vec![Op {
action: Action::Comment {
body: String::default(),
reply_to: None,
@ -430,7 +446,7 @@ mod tests {
for (clock, action) in gen.take(g.size()) {
let timestamp = Timestamp::now() + rng.u64(..60);
changes.push(Op {
ops.push(Op {
action,
author,
clock,
@ -439,8 +455,8 @@ mod tests {
}
for p in &mut permutations {
*p = changes.clone();
rng.shuffle(&mut changes);
*p = ops.clone();
rng.shuffle(&mut ops);
}
Changes { permutations }
@ -595,13 +611,19 @@ mod tests {
let [p1, p2, p3] = log.permutations;
let mut t1 = t.clone();
t1.apply(p1).unwrap();
if t1.apply(p1).is_err() {
return TestResult::discard();
}
let mut t2 = t.clone();
t2.apply(p2).unwrap();
if t2.apply(p2).is_err() {
return TestResult::discard();
}
let mut t3 = t;
t3.apply(p3).unwrap();
if t3.apply(p3).is_err() {
return TestResult::discard();
}
assert_eq!(t1, t2);
assert_eq!(t2, t3);