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, |(_, changes), rng| { })
if changes.is_empty() { .variant(2, |(clock, _, changes), rng| {
return None; if changes.is_empty() {
} 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, |(_, changes), rng| { })
if changes.is_empty() { .variant(2, |(clock, _, changes), rng| {
return None; if changes.is_empty() {
} return None;
let id = changes[rng.usize(..changes.len())].id(); }
Some(Action::Redact { id }) let id = changes[rng.usize(..changes.len())];
})
.variant(2, |(tags, _), rng| { Some((clock.tick(), Action::Redact { id }))
let tag = if tags.is_empty() || rng.bool() { })
let tag = iter::repeat_with(|| rng.alphabetic()) .variant(2, |(clock, tags, _), rng| {
.take(8) let tag = if tags.is_empty() || rng.bool() {
.collect::<String>(); let tag = iter::repeat_with(|| rng.alphabetic())
let tag = Tag::new(tag).unwrap(); .take(8)
tags.push(tag.clone()); .collect::<String>();
tag let tag = Tag::new(tag).unwrap();
} else {
tags[rng.usize(..tags.len())].clone() tags.push(tag.clone());
}; tag
Some(Action::Tag { tags: vec![tag] }) } else {
}) tags[rng.usize(..tags.len())].clone()
.variant(2, |(tags, _), rng| { };
if tags.is_empty() {
return None; Some((clock.tick(), Action::Tag { tags: vec![tag] }))
} })
let tag = tags[rng.usize(..tags.len())].clone(); .variant(2, |(clock, tags, _), rng| {
Some(Action::Untag { tags: vec![tag] }) if tags.is_empty() {
}); return None;
}
let tag = tags[rng.usize(..tags.len())].clone();
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,