Add edits to thread test generator
Signed-off-by: Alexis Sellier <alexis@radicle.xyz>
This commit is contained in:
parent
e47d7ca2aa
commit
f1217713af
|
|
@ -315,6 +315,7 @@ impl<G> DerefMut for Actor<G> {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use std::collections::BTreeSet;
|
||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::{array, iter};
|
use std::{array, iter};
|
||||||
|
|
@ -381,9 +382,9 @@ mod tests {
|
||||||
let rng = fastrand::Rng::with_seed(u64::arbitrary(g));
|
let rng = fastrand::Rng::with_seed(u64::arbitrary(g));
|
||||||
let root = (Lamport::initial(), author);
|
let root = (Lamport::initial(), author);
|
||||||
let gen =
|
let gen =
|
||||||
WeightedGenerator::<(Lamport, Action), (Lamport, Vec<OpId>)>::new(rng.clone())
|
WeightedGenerator::<(Lamport, Action), (Lamport, BTreeSet<OpId>)>::new(rng.clone())
|
||||||
.variant(3, |(clock, changes), rng| {
|
.variant(3, |(clock, comments), rng| {
|
||||||
changes.push((clock.tick(), author));
|
comments.insert((clock.tick(), author));
|
||||||
|
|
||||||
Some((
|
Some((
|
||||||
*clock,
|
*clock,
|
||||||
|
|
@ -393,11 +394,25 @@ mod tests {
|
||||||
},
|
},
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
.variant(2, |(clock, changes), rng| {
|
.variant(2, |(clock, comments), rng| {
|
||||||
if changes.is_empty() {
|
if comments.is_empty() {
|
||||||
return None;
|
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((
|
Some((
|
||||||
clock.tick(),
|
clock.tick(),
|
||||||
|
|
@ -408,16 +423,17 @@ mod tests {
|
||||||
},
|
},
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
.variant(2, |(clock, changes), rng| {
|
.variant(2, |(clock, comments), rng| {
|
||||||
if changes.is_empty() {
|
if comments.is_empty() {
|
||||||
return None;
|
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 }))
|
Some((clock.tick(), Action::Redact { id }))
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut changes = vec![Op {
|
let mut ops = vec![Op {
|
||||||
action: Action::Comment {
|
action: Action::Comment {
|
||||||
body: String::default(),
|
body: String::default(),
|
||||||
reply_to: None,
|
reply_to: None,
|
||||||
|
|
@ -430,7 +446,7 @@ mod tests {
|
||||||
|
|
||||||
for (clock, action) in gen.take(g.size()) {
|
for (clock, action) in gen.take(g.size()) {
|
||||||
let timestamp = Timestamp::now() + rng.u64(..60);
|
let timestamp = Timestamp::now() + rng.u64(..60);
|
||||||
changes.push(Op {
|
ops.push(Op {
|
||||||
action,
|
action,
|
||||||
author,
|
author,
|
||||||
clock,
|
clock,
|
||||||
|
|
@ -439,8 +455,8 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
for p in &mut permutations {
|
for p in &mut permutations {
|
||||||
*p = changes.clone();
|
*p = ops.clone();
|
||||||
rng.shuffle(&mut changes);
|
rng.shuffle(&mut ops);
|
||||||
}
|
}
|
||||||
|
|
||||||
Changes { permutations }
|
Changes { permutations }
|
||||||
|
|
@ -595,13 +611,19 @@ mod tests {
|
||||||
let [p1, p2, p3] = log.permutations;
|
let [p1, p2, p3] = log.permutations;
|
||||||
|
|
||||||
let mut t1 = t.clone();
|
let mut t1 = t.clone();
|
||||||
t1.apply(p1).unwrap();
|
if t1.apply(p1).is_err() {
|
||||||
|
return TestResult::discard();
|
||||||
|
}
|
||||||
|
|
||||||
let mut t2 = t.clone();
|
let mut t2 = t.clone();
|
||||||
t2.apply(p2).unwrap();
|
if t2.apply(p2).is_err() {
|
||||||
|
return TestResult::discard();
|
||||||
|
}
|
||||||
|
|
||||||
let mut t3 = t;
|
let mut t3 = t;
|
||||||
t3.apply(p3).unwrap();
|
if t3.apply(p3).is_err() {
|
||||||
|
return TestResult::discard();
|
||||||
|
}
|
||||||
|
|
||||||
assert_eq!(t1, t2);
|
assert_eq!(t1, t2);
|
||||||
assert_eq!(t2, t3);
|
assert_eq!(t2, t3);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue