cob: Make sure we generate all thread variants
Signed-off-by: Alexis Sellier <alexis@radicle.xyz>
This commit is contained in:
parent
41309538fb
commit
63614e9c94
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue