use std::collections::BTreeMap;
use std::num::NonZeroUsize;
use crate::name::TagName;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
pub enum ConcurrencyDefault {
#[default]
Auto,
Fixed(NonZeroUsize),
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ConcurrencySettings {
pub default: ConcurrencyDefault,
pub tags: BTreeMap<TagName, NonZeroUsize>,
}
#[cfg(test)]
mod tests {
use std::collections::BTreeMap;
use std::num::NonZeroUsize;
use std::str::FromStr;
use crate::name::TagName;
use crate::settings::concurrency::{ConcurrencyDefault, ConcurrencySettings};
#[test]
fn concurrency_default_is_auto() {
assert_eq!(ConcurrencyDefault::default(), ConcurrencyDefault::Auto);
}
#[test]
fn concurrency_default_fixed_distinct_from_auto() {
let n = NonZeroUsize::new(1).unwrap();
assert_ne!(ConcurrencyDefault::Fixed(n), ConcurrencyDefault::Auto);
}
#[test]
fn concurrency_default_fixed_carries_chosen_value() {
let four = NonZeroUsize::new(4).unwrap();
match ConcurrencyDefault::Fixed(four) {
ConcurrencyDefault::Fixed(n) => assert_eq!(n.get(), 4),
ConcurrencyDefault::Auto => unreachable!(),
}
}
#[test]
fn concurrency_settings_default_has_auto_and_empty_tags() {
let cs = ConcurrencySettings::default();
assert_eq!(cs.default, ConcurrencyDefault::Auto);
assert!(cs.tags.is_empty());
}
#[test]
fn concurrency_settings_carry_tag_caps() {
let mut tags = BTreeMap::new();
tags.insert(
TagName::from_str("native").unwrap(),
NonZeroUsize::new(2).unwrap(),
);
tags.insert(
TagName::from_str("io").unwrap(),
NonZeroUsize::new(16).unwrap(),
);
let cs = ConcurrencySettings {
default: ConcurrencyDefault::Fixed(NonZeroUsize::new(8).unwrap()),
tags,
};
assert_eq!(cs.tags.len(), 2);
assert_eq!(
cs.tags
.get(&TagName::from_str("native").unwrap())
.map(|n| n.get()),
Some(2)
);
}
}