use crate::solve::cost::CostWeights;
macro_rules! documented_defaults {
(
$(
$(#[doc = $doc:expr])+
pub const $name:ident: $ty:ty = $value:expr;
)+
) => {
$(
$(#[doc = $doc])+
pub const $name: $ty = $value;
)+
#[cfg(test)]
const REGISTRY: &[(&str, &[&str])] = &[
$( (stringify!($name), &[$($doc),+]) ),+
];
};
}
documented_defaults! {
pub const EVIDENCE_FLOOR: f64 = 0.5;
pub const EVIDENCE_DELTA: f64 = 0.02;
pub const HYBRID_HIGH_CONFIDENCE: f64 = 0.75;
pub const HYBRID_CARDINALITY: u8 = 1;
pub const CEILING_EXACT_IDENTIFIER: f64 = 1.00;
pub const CEILING_DECLARED_LABEL: f64 = 0.95;
pub const CEILING_DECLARED_EDGE_LABEL: f64 = 0.90;
pub const CEILING_SYNONYM: f64 = 0.85;
pub const CEILING_DERIVED: f64 = 0.80;
pub const CEILING_INFERRED: f64 = 0.75;
pub const CEILING_USER_SUPPLIED: f64 = 1.00;
pub const W_ANCHOR: f64 = 0.0;
pub const DEFAULT_WEIGHTS: CostWeights = crate::solve::cost::DEFAULT_WEIGHTS;
}
#[cfg(test)]
#[allow(clippy::float_cmp)]
mod tests {
use super::*;
fn declared_constants() -> Vec<String> {
include_str!("defaults.rs")
.lines()
.filter_map(|line| {
let rest = line.trim_start().strip_prefix("pub const ")?;
let name = rest.split(':').next()?.trim();
let named_well = !name.is_empty()
&& name
.chars()
.all(|c| c.is_ascii_uppercase() || c.is_ascii_digit() || c == '_');
named_well.then(|| name.to_owned())
})
.collect()
}
#[test]
fn every_default_is_documented() {
assert!(!REGISTRY.is_empty(), "the registry lost its entries");
for (name, doc) in REGISTRY {
let text = doc
.iter()
.flat_map(|line| line.split_whitespace())
.collect::<Vec<&str>>()
.join(" ");
assert!(
text.contains("calibration:"),
"`{name}` has no `calibration:` marker"
);
assert!(
text.contains("not a calibrated value"),
"`{name}` does not say it is not a calibrated value"
);
assert!(
text.contains("autolens_corpus"),
"`{name}` does not warn against tuning on the synthetic corpus"
);
}
let names: Vec<&str> = REGISTRY.iter().map(|(name, _)| *name).collect();
assert_eq!(
names,
[
"EVIDENCE_FLOOR",
"EVIDENCE_DELTA",
"HYBRID_HIGH_CONFIDENCE",
"HYBRID_CARDINALITY",
"CEILING_EXACT_IDENTIFIER",
"CEILING_DECLARED_LABEL",
"CEILING_DECLARED_EDGE_LABEL",
"CEILING_SYNONYM",
"CEILING_DERIVED",
"CEILING_INFERRED",
"CEILING_USER_SUPPLIED",
"W_ANCHOR",
"DEFAULT_WEIGHTS",
],
"a constant was added or removed without updating this list"
);
let declared = declared_constants();
assert!(
!declared.is_empty(),
"the source scan found nothing, so it is not reading this file"
);
assert_eq!(
declared, names,
"a `pub const` in this file is not in the registry, so it was \
declared around the macro and carries no calibration doc"
);
}
#[test]
fn the_source_scan_sees_a_constant_declared_around_the_macro() {
let smuggled = "pub const SMUGGLED_KNOB: f64 = 0.37;";
let name = smuggled
.trim_start()
.strip_prefix("pub const ")
.and_then(|rest| rest.split(':').next())
.map(str::trim);
assert_eq!(name, Some("SMUGGLED_KNOB"));
assert!(!declared_constants().iter().any(|n| n.contains('$')));
assert!(!declared_constants().iter().any(|n| n == "SMUGGLED_KNOB"));
}
#[test]
fn provenance_ceilings_are_ordered() {
let descending = [
CEILING_EXACT_IDENTIFIER,
CEILING_DECLARED_LABEL,
CEILING_DECLARED_EDGE_LABEL,
CEILING_SYNONYM,
CEILING_DERIVED,
CEILING_INFERRED,
];
for pair in descending.windows(2) {
assert!(pair[0] > pair[1], "{} !> {}", pair[0], pair[1]);
}
assert_eq!(CEILING_USER_SUPPLIED, CEILING_EXACT_IDENTIFIER);
for ceiling in descending {
assert!((0.0..=1.0).contains(&ceiling));
}
}
#[test]
fn anchor_weight_ships_neutral() {
assert_eq!(W_ANCHOR, 0.0);
assert_eq!(DEFAULT_WEIGHTS.anchor(), W_ANCHOR);
assert_eq!(DEFAULT_WEIGHTS, crate::solve::cost::DEFAULT_WEIGHTS);
assert_eq!(DEFAULT_WEIGHTS.as_array(), [0.25, 0.25, 0.30, 0.20]);
}
#[test]
fn selection_defaults_are_in_range() {
assert!((0.0..=1.0).contains(&EVIDENCE_FLOOR));
assert!((0.0..=1.0).contains(&EVIDENCE_DELTA));
assert!((0.0..=1.0).contains(&HYBRID_HIGH_CONFIDENCE));
const { assert!(HYBRID_CARDINALITY >= 1) };
}
}