cob: Make sure we generate all thread variants

Signed-off-by: Alexis Sellier <alexis@radicle.xyz>
This commit is contained in:
Alexis Sellier 2022-11-27 20:24:35 +01:00
parent 41309538fb
commit 63614e9c94
No known key found for this signature in database
1 changed files with 57 additions and 45 deletions

View File

@ -340,65 +340,77 @@ mod tests {
impl<const N: usize> Arbitrary for Changes<N> { impl<const N: usize> Arbitrary for Changes<N> {
fn arbitrary(g: &mut quickcheck::Gen) -> Self { fn arbitrary(g: &mut quickcheck::Gen) -> Self {
let author = ActorId::from([0; 32]);
let rng = fastrand::Rng::with_seed(u64::arbitrary(g)); let rng = fastrand::Rng::with_seed(u64::arbitrary(g));
let gen = let gen =
WeightedGenerator::<Action, (Vec<Tag>, Vec<Change<Action>>)>::new(rng.clone()) WeightedGenerator::<(Lamport, Action), (Lamport, Vec<Tag>, Vec<ChangeId>)>::new(
.variant(2, |_, rng| { rng.clone(),
Some(Action::Comment { )
.variant(3, |(clock, _, changes), rng| {
changes.push((clock.tick(), author));
Some((
*clock,
Action::Comment {
comment: Comment { comment: Comment {
body: iter::repeat_with(|| rng.alphabetic()).take(16).collect(), body: iter::repeat_with(|| rng.alphabetic()).take(16).collect(),
reply_to: Default::default(), reply_to: Default::default(),
}, },
},
))
}) })
}) .variant(2, |(clock, _, changes), rng| {
.variant(2, |(_, changes), rng| {
if changes.is_empty() { if changes.is_empty() {
return None; return None;
} }
let to = changes[rng.usize(..changes.len())].id(); let to = changes[rng.usize(..changes.len())];
Some(Action::React { Some((
clock.tick(),
Action::React {
to, to,
reaction: Reaction::new('✨').unwrap(), reaction: Reaction::new('✨').unwrap(),
active: rng.bool(), active: rng.bool(),
},
))
}) })
}) .variant(2, |(clock, _, changes), rng| {
.variant(2, |(_, changes), rng| {
if changes.is_empty() { if changes.is_empty() {
return None; return None;
} }
let id = changes[rng.usize(..changes.len())].id(); let id = changes[rng.usize(..changes.len())];
Some(Action::Redact { id })
Some((clock.tick(), Action::Redact { id }))
}) })
.variant(2, |(tags, _), rng| { .variant(2, |(clock, tags, _), rng| {
let tag = if tags.is_empty() || rng.bool() { let tag = if tags.is_empty() || rng.bool() {
let tag = iter::repeat_with(|| rng.alphabetic()) let tag = iter::repeat_with(|| rng.alphabetic())
.take(8) .take(8)
.collect::<String>(); .collect::<String>();
let tag = Tag::new(tag).unwrap(); let tag = Tag::new(tag).unwrap();
tags.push(tag.clone()); tags.push(tag.clone());
tag tag
} else { } else {
tags[rng.usize(..tags.len())].clone() tags[rng.usize(..tags.len())].clone()
}; };
Some(Action::Tag { tags: vec![tag] })
Some((clock.tick(), Action::Tag { tags: vec![tag] }))
}) })
.variant(2, |(tags, _), rng| { .variant(2, |(clock, tags, _), rng| {
if tags.is_empty() { if tags.is_empty() {
return None; return None;
} }
let tag = tags[rng.usize(..tags.len())].clone(); let tag = tags[rng.usize(..tags.len())].clone();
Some(Action::Untag { tags: vec![tag] }) clock.tick();
Some((clock.tick(), Action::Untag { tags: vec![tag] }))
}); });
let mut changes = Vec::new(); let mut changes = Vec::new();
let mut permutations: [Vec<Change<Action>>; N] = array::from_fn(|_| Vec::new()); let mut permutations: [Vec<Change<Action>>; N] = array::from_fn(|_| Vec::new());
let mut clock = Lamport::default();
let author = ActorId::from([0; 32]);
for action in gen.take(g.size().min(8)) {
let clock = clock.tick();
for (clock, action) in gen.take(g.size().min(8)) {
changes.push(Change { changes.push(Change {
action, action,
author, author,