#![allow(dead_code)]
use crate::error::Result;
use crate::types::TestCase;
use rayon::prelude::*;
pub fn parallel_generate<F>(test_builders: Vec<F>) -> Result<Vec<TestCase>>
where
F: Fn() -> Result<TestCase> + Send + Sync,
{
let test_count = test_builders.len();
if test_count < 10 {
test_builders.into_iter().map(|f| f()).collect()
} else {
test_builders.par_iter().map(|f| f()).collect()
}
}
pub fn parallel_generate_optional<F>(test_builders: Vec<F>) -> Result<Vec<TestCase>>
where
F: Fn() -> Result<Option<TestCase>> + Send + Sync,
{
let test_count = test_builders.len();
if test_count < 10 {
Ok(test_builders
.into_iter()
.map(|f| f())
.collect::<Result<Vec<_>>>()?
.into_iter()
.flatten()
.collect())
} else {
Ok(test_builders
.par_iter()
.map(|f| f())
.collect::<Result<Vec<_>>>()?
.into_iter()
.flatten()
.collect())
}
}
pub fn parallel_generate_chunked<F>(
test_builders: Vec<F>,
chunk_size: usize,
) -> Result<Vec<TestCase>>
where
F: Fn() -> Result<TestCase> + Send + Sync,
{
test_builders
.par_chunks(chunk_size)
.flat_map(|chunk| chunk.iter().map(|f| f()).collect::<Vec<_>>())
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::TestCategory;
fn create_test_builder(id: usize) -> impl Fn() -> Result<TestCase> {
move || {
Ok(TestCase::new(
format!("test-{}", id),
format!("Test {}", id),
TestCategory::Basic,
"echo test".to_string(),
))
}
}
#[test]
fn test_parallel_generate_small_workload() {
let builders: Vec<_> = (0..5).map(create_test_builder).collect();
let tests = parallel_generate(builders).unwrap();
assert_eq!(tests.len(), 5);
}
#[test]
fn test_parallel_generate_medium_workload() {
let builders: Vec<_> = (0..20).map(create_test_builder).collect();
let tests = parallel_generate(builders).unwrap();
assert_eq!(tests.len(), 20);
}
#[test]
fn test_parallel_generate_large_workload() {
let builders: Vec<_> = (0..100).map(create_test_builder).collect();
let tests = parallel_generate(builders).unwrap();
assert_eq!(tests.len(), 100);
}
#[test]
fn test_parallel_generate_optional() {
let builders = vec![
|| Ok(Some(create_test_builder(1)()?)),
|| Ok(None), || Ok(Some(create_test_builder(3)()?)),
];
let tests = parallel_generate_optional(builders).unwrap();
assert_eq!(tests.len(), 2);
}
#[test]
fn test_parallel_generate_chunked() {
let builders: Vec<_> = (0..15).map(create_test_builder).collect();
let tests = parallel_generate_chunked(builders, 5).unwrap();
assert_eq!(tests.len(), 15);
}
}