use crate::locale::Locale;
use crate::quality::{MetricPack, QualityDimension};
use crate::semantic::SemanticHints;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct AnalysisOptions {
metric_packs: Option<Vec<MetricPack>>,
quality_dimensions: Option<Vec<QualityDimension>>,
locale: Option<Locale>,
semantic_hints: SemanticHints,
}
impl AnalysisOptions {
pub fn with_metric_packs(mut self, packs: Option<Vec<MetricPack>>) -> Self {
self.metric_packs = packs;
self
}
pub fn with_quality_dimensions(mut self, dimensions: Option<Vec<QualityDimension>>) -> Self {
self.quality_dimensions = dimensions;
self
}
pub fn with_locale(mut self, locale: Option<Locale>) -> Self {
self.locale = locale;
self
}
pub fn with_semantic_hints(mut self, hints: SemanticHints) -> Self {
self.semantic_hints = hints;
self
}
pub fn effective_metric_packs(&self) -> Option<Vec<MetricPack>> {
MetricPack::resolve_with_dimensions(
self.metric_packs.as_deref(),
self.quality_dimensions.as_deref(),
)
}
pub fn include_statistics(&self) -> bool {
MetricPack::include_statistics(self.effective_metric_packs().as_deref())
}
pub fn include_patterns(&self) -> bool {
MetricPack::include_patterns(self.effective_metric_packs().as_deref())
}
pub fn include_quality(&self) -> bool {
MetricPack::include_quality(self.effective_metric_packs().as_deref())
}
pub fn locale(&self) -> Option<Locale> {
self.locale
}
pub fn quality_dimensions(&self) -> Option<&[QualityDimension]> {
self.quality_dimensions.as_deref()
}
pub fn semantic_hints(&self) -> &SemanticHints {
&self.semantic_hints
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_analyzes_everything() {
let options = AnalysisOptions::default();
assert!(options.include_statistics());
assert!(options.include_patterns());
assert!(options.include_quality());
assert_eq!(options.locale(), None);
assert_eq!(options.quality_dimensions(), None);
}
#[test]
fn schema_only_deselects_every_other_pack() {
let options = AnalysisOptions::default().with_metric_packs(Some(vec![MetricPack::Schema]));
assert!(!options.include_statistics());
assert!(!options.include_patterns());
assert!(!options.include_quality());
}
#[test]
fn empty_dimension_selection_removes_the_quality_pack() {
let options = AnalysisOptions::default().with_quality_dimensions(Some(vec![]));
assert!(!options.include_quality());
assert!(options.include_statistics());
assert!(options.include_patterns());
}
#[test]
fn resolution_does_not_depend_on_setter_order() {
let packs = vec![MetricPack::Schema, MetricPack::Quality];
let dims_first = AnalysisOptions::default()
.with_quality_dimensions(Some(vec![]))
.with_metric_packs(Some(packs.clone()));
let packs_first = AnalysisOptions::default()
.with_metric_packs(Some(packs))
.with_quality_dimensions(Some(vec![]));
assert_eq!(
dims_first.effective_metric_packs(),
packs_first.effective_metric_packs()
);
assert!(!dims_first.include_quality());
}
#[test]
fn a_locale_alone_does_not_re_enable_pattern_detection() {
let options = AnalysisOptions::default()
.with_locale(Some(Locale::It))
.with_metric_packs(Some(vec![MetricPack::Schema]));
assert_eq!(options.locale(), Some(Locale::It));
assert!(!options.include_patterns());
}
}