Skip to content
Snippets Groups Projects

working on FEC tests again

Merged STEVAN Antoine requested to merge tests into main
+ 81
116
@@ -209,6 +209,9 @@ mod tests {
use super::recode_with_coeffs;
type LC = Vec<usize>;
type LCExclusion = Vec<usize>;
fn bytes() -> Vec<u8> {
include_bytes!("../tests/dragoon_32x32.png").to_vec()
}
@@ -240,6 +243,7 @@ mod tests {
&[3, 6, 8, 9, 10],
&[vec![2, 4, 6], vec![1, 3, 7], vec![6, 7, 8], vec![3, 6, 8]],
));
assert!(contains_one_of(&[0, 4, 5], &[vec![2, 3, 5], vec![4, 5]]));
}
fn try_all_decoding_combinations<F: PrimeField>(
@@ -249,7 +253,7 @@ mod tests {
n: usize,
test_case: &str,
limit: Option<usize>,
should_not_be_decodable: Vec<Vec<usize>>,
should_not_be_decodable: Vec<LCExclusion>,
) {
let there_are_recoded_shards = shards.len() > n;
@@ -262,30 +266,50 @@ mod tests {
{
let is: Vec<usize> = c.iter().map(|(i, _)| *i).collect();
if there_are_recoded_shards {
let contains_recoded_shards = *is.iter().max().unwrap() <= n - 1;
let contains_recoded_shards = *is.iter().max().unwrap() < n;
if contains_recoded_shards {
continue;
}
}
let pretty_is = is
.iter()
.map(|&i| {
#[allow(clippy::comparison_chain)]
if i == n {
"(n)".into()
} else if i > n {
format!("(n + {})", i - n)
} else {
format!("{}", i)
}
})
.collect::<Vec<_>>()
.join(", ");
let pretty_is = format!("[{pretty_is}]");
let actual = decode::<F>(c.iter().map(|(_, s)| s).cloned().collect());
if contains_one_of(&is, &should_not_be_decodable) {
assert!(
actual.is_err(),
"should not decode with {:?} {test_case}",
is
"should not decode with {} {test_case}",
pretty_is
);
continue;
}
assert!(actual.is_ok(), "could not decode with {:?} {test_case}", is);
assert!(
actual.is_ok(),
"could not decode with {} {test_case}",
pretty_is
);
assert_eq!(
data,
actual.unwrap(),
"bad decoded data with {:?} {test_case}",
is,
"bad decoded data with {} {test_case}",
pretty_is,
);
}
}
@@ -304,8 +328,8 @@ mod tests {
data: &[u8],
k: usize,
n: usize,
recoding_steps: Vec<Vec<usize>>,
should_not_be_decodable: Vec<Vec<usize>>,
recoding_steps: Vec<LC>,
should_not_be_decodable: Vec<LCExclusion>,
name: &str,
) {
let mut rng = ark_std::test_rng();
@@ -357,120 +381,61 @@ mod tests {
fn end_to_end_with_recoding() {
let bytes = bytes();
let ks = [3, 5];
let n = 5;
let scenarii = [
// ```mermaid
// graph TD;
// a[n+1]; b[n+2]; c[n+3];
//
// 1;
// 3-->a; 5-->a;
// 2-->b; 4-->b;
// a-->c; b-->c;
// ```
(
"simple",
vec![
vec![2, 4], // = n
vec![1, 3], // = (n + 1)
vec![n, (n + 1)], // = (n + 2) = ((2, 4), (1, 3))
],
vec![
vec![2, 4, n],
vec![1, 3, (n + 1)],
vec![n, (n + 1), (n + 2)],
vec![1, 3, n, (n + 2)],
vec![2, 4, (n + 1), (n + 2)],
vec![1, 2, 3, 4, (n + 2)],
],
),
// ```mermaid
// graph TD;
// a[n+1]; b[n+2];
//
// 1-->a; a-->b;
// 2; 3; 4; 5;
// ```
(
"chain",
vec![
vec![0], // = (n) = (0)
vec![(n)], // = (n + 1) = (0)
],
vec![vec![0, (n)], vec![0, (n + 1)], vec![(n), (n + 1)]],
),
// ```mermaid
// graph TD;
// n0[n + 0]; n1[n + 1]; n2[n + 2]; n3[n + 3]; n4[n + 4];
// n5[n + 5]; n6[n + 6]; n7[n + 7]; n8[n + 8]; n9[n + 9];
// n10[n + 10]; n11[n + 11]; n12[n + 12]; n13[n + 13];
// n14[n + 14]; n15[n + 15]; n16[n + 16]; n17[n + 17];
// n18[n + 18]; n19[n + 19]; n20[n + 20];
//
// 3 --> n0; 2 --> n0;
// n0 --> n1; 4 --> n1;
// 4 --> n2; n0 --> n2;
// 1 --> n3; 3 --> n3;
// 1 --> n4; 4 --> n4;
// 4 --> n5; n3 --> n5;
// 4 --> n6; n1 --> n6;
// n5 --> n7; n3 --> n7;
// 4 --> n8; n5 --> n8;
// n4 --> n9; n2 --> n9;
// n5 --> n10; n1 --> n10;
// 4 --> n11; n6 --> n11;
// n1 --> n12; 2 --> n12;
// 3 --> n13; n1 --> n13;
// 2 --> n14; 5 --> n14;
// n4 --> n15; 3 --> n15;
// n8 --> n16; n3 --> n16;
// n14 --> n17; n5 --> n17;
// n7 --> n18; n5 --> n18;
// n3 --> n19; 5 --> n19;
// 3 --> n20; n15 --> n20;
// ```
(
"deep",
vec![
vec![3, 2],
vec![(n), 4],
vec![4, (n)],
vec![1, 3],
vec![1, 4],
vec![4, (n + 3)],
vec![4, (n + 1)],
vec![(n + 5), (n + 3)],
vec![4, (n + 5)],
vec![(n + 4), (n + 2)],
vec![(n + 5), (n + 1)],
vec![4, (n + 6)],
vec![(n + 1), 2],
vec![3, (n + 1)],
vec![2, 5],
vec![(n + 4), 3],
vec![(n + 8), (n + 3)],
vec![(n + 14), (n + 5)],
vec![(n + 7), (n + 5)],
vec![(n + 3), 5],
vec![3, (n + 15)],
],
vec![
vec![2, 3, (n)],
],
),
];
fn get_scenarii(n: usize) -> Vec<(String, Vec<LC>, Vec<LCExclusion>)> {
vec![
// ```mermaid
// graph TD;
// a[n+1]; b[n+2]; c[n+3];
//
// 1;
// 3-->a; 5-->a;
// 2-->b; 4-->b;
// a-->c; b-->c;
// ```
(
"simple".into(),
vec![
vec![2, 4], // = n
vec![1, 3], // = (n + 1)
vec![n, (n + 1)], // = (n + 2) = ((2, 4), (1, 3))
],
vec![
vec![2, 4, n],
//
vec![1, 3, (n + 1)],
vec![n, (n + 1), (n + 2)],
vec![1, 3, n, (n + 2)],
vec![2, 4, (n + 1), (n + 2)],
vec![1, 2, 3, 4, (n + 2)],
],
),
// ```mermaid
// graph TD;
// a[n+1]; b[n+2];
//
// 1-->a; a-->b;
// 2; 3; 4; 5;
// ```
(
"chain".into(),
vec![
vec![0], // = (n) = (0)
vec![(n)], // = (n + 1) = (0)
],
vec![vec![0, (n)], vec![0, (n + 1)], vec![(n), (n + 1)]],
),
]
}
for k in ks {
for (name, steps, should_not_decode) in scenarii.clone() {
for (k, n) in [(3, 5), (5, 5), (8, 10)] {
for (name, steps, should_not_decode) in get_scenarii(n) {
end_to_end_with_recoding_template::<Fr>(
&bytes,
k,
n,
steps,
should_not_decode,
name,
&name,
);
}
}
Loading