#![allow(missing_docs)]
#[cfg(test)]
mod regression {
use cmn::constants::{
ConstantValue, Constants, AVOGADRO, BOLTZMANN, EULER, FARADAY,
GAS_CONSTANT, HASH_ALGORITHM, HASH_COST, HASH_LENGTH, PHI, PI,
SPECIAL_CHARS, SPEED_OF_LIGHT, SQRT2, SQRT3, SQRT5, TAU,
VACUUM_PERMEABILITY, VACUUM_PERMITTIVITY,
};
use cmn::words::WORD_LIST;
use cmn::{Common, Words};
#[test]
fn reg_01_float_string_roundtrip_all_constants() {
let c = Constants::new();
let float_names = [
"APERY",
"AVOGADRO",
"BOLTZMANN",
"CATALAN",
"COULOMB",
"EULER",
"FARADAY",
"GAMMA",
"GAS_CONSTANT",
"GLAISHER_KINKELIN",
"GRAVITATIONAL_CONSTANT",
"KHINCHIN",
"PHI",
"PI",
"PLANCK",
"PLANCK_REDUCED",
"SILVER_RATIO",
"SPEED_OF_LIGHT",
"SQRT2",
"SQRT3",
"SQRT5",
"TAU",
"VACUUM_PERMEABILITY",
"VACUUM_PERMITTIVITY",
];
for name in &float_names {
let constant = c.constant(name).unwrap();
let parsed: f64 = constant
.value
.parse()
.unwrap_or_else(|e| panic!("{name}: {e}"));
assert_eq!(
parsed.to_string(),
constant.value,
"{name}: round-trip string mismatch"
);
}
}
#[test]
fn reg_02_hash_cost_string_matches_const() {
let c = Constants::new();
let val = c.constant("HASH_COST").unwrap();
assert_eq!(val.value.parse::<u32>().unwrap(), HASH_COST);
}
#[test]
fn reg_03_hash_length_string_matches_const() {
let c = Constants::new();
let val = c.constant("HASH_LENGTH").unwrap();
assert_eq!(val.value.parse::<usize>().unwrap(), HASH_LENGTH);
}
#[test]
fn reg_04_hash_algorithm_string_matches_const() {
let c = Constants::new();
let val = c.constant("HASH_ALGORITHM").unwrap();
assert_eq!(val.value, HASH_ALGORITHM);
}
#[test]
fn reg_05_special_chars_string_matches_const() {
let c = Constants::new();
let val = c.constant("SPECIAL_CHARS").unwrap();
let expected: String = SPECIAL_CHARS.iter().collect();
assert_eq!(val.value, expected);
}
#[test]
fn reg_06_no_constant_has_empty_name() {
let c = Constants::new();
for item in c.constants() {
assert!(
!item.name.is_empty(),
"Found constant with empty name"
);
}
}
#[test]
fn reg_07_no_constant_has_empty_value() {
let c = Constants::new();
for item in c.constants() {
assert!(
!item.value.is_empty(),
"Constant '{}' has empty value",
item.name
);
}
}
#[test]
fn reg_08_common_constants_equals_standalone() {
let via_common = Common::new().constants();
let standalone = Constants::new();
assert_eq!(via_common.constants(), standalone.constants());
}
#[test]
fn reg_09_common_words_fresh_is_empty() {
let w = Common::new().words();
assert_eq!(w.count(), 0);
}
#[test]
fn reg_10_parse_words_end_to_end() {
let json = r#"{"words":["gamma","alpha","beta"]}"#;
let common = Common::parse(json).unwrap();
let list = common.words().words_list();
assert_eq!(list, vec!["alpha", "beta", "gamma"]);
}
#[test]
fn reg_11_get_value_returns_correct_float_for_pi() {
let c = Constants::new();
if let Some(ConstantValue::Float(v)) = c.get_value("PI") {
assert!(
(v - std::f64::consts::PI).abs() < 1e-15,
"PI value drift detected"
);
} else {
panic!("Expected Float for PI");
}
}
#[test]
fn reg_12_constant_returns_independent_clone() {
let c = Constants::new();
let mut first = c.constant("EULER").unwrap();
first.value = "TAMPERED".to_string();
let second = c.constant("EULER").unwrap();
assert_ne!(
first.value, second.value,
"constant() must return independent clones"
);
}
#[test]
fn reg_13_default_words_all_in_word_list() {
let words = Words::default();
for w in &words.words_list() {
assert!(
WORD_LIST.contains(&w.as_str()),
"Word '{w}' not found in WORD_LIST"
);
}
}
#[test]
fn reg_14_constants_construction_is_deterministic() {
let a = Constants::new();
let b = Constants::new();
assert_eq!(a.constants(), b.constants());
}
#[test]
fn reg_15_constant_json_shape() {
let c = Constants::new().constant("PI").unwrap();
let v: serde_json::Value = serde_json::to_value(&c).unwrap();
let obj = v.as_object().unwrap();
assert!(obj.contains_key("name"), "Missing 'name' key");
assert!(obj.contains_key("value"), "Missing 'value' key");
assert_eq!(
obj.len(),
2,
"Unexpected extra keys in Constant JSON"
);
}
#[test]
fn reg_16_constants_json_has_array() {
let c = Constants::new();
let v: serde_json::Value = serde_json::to_value(&c).unwrap();
assert!(
v["constants"].is_array(),
"'constants' must serialise as an array"
);
assert_eq!(v["constants"].as_array().unwrap().len(), 121);
}
#[test]
fn reg_17_common_serde_idempotent() {
let input = r#"{"x":1,"y":"two"}"#;
let a = Common::parse(input).unwrap();
let json_a = serde_json::to_string(&a).unwrap();
let b: Common = serde_json::from_str(&json_a).unwrap();
let json_b = serde_json::to_string(&b).unwrap();
assert_eq!(json_a, json_b);
}
#[test]
fn reg_18_words_serde_preserves_all() {
let original = Words::default();
let json = serde_json::to_string(&original).unwrap();
let restored: Words = serde_json::from_str(&json).unwrap();
assert_eq!(original.count(), restored.count());
for w in &original.words_list() {
assert!(
restored.contains(w),
"Lost word '{w}' after serde roundtrip"
);
}
}
#[test]
fn reg_19_constant_value_float_tagged() {
let v = ConstantValue::Float(1.0);
let json = serde_json::to_string(&v).unwrap();
assert!(
json.contains("Float"),
"Float variant must serialise with tag"
);
}
#[test]
fn reg_20_constant_value_string_tagged() {
let v = ConstantValue::String("hello".into());
let json = serde_json::to_string(&v).unwrap();
assert!(
json.contains("String"),
"String variant must serialise with tag"
);
}
#[test]
fn reg_21_constants_json_valid() {
let c = Constants::new();
let json = serde_json::to_string(&c).unwrap();
let parsed: Result<serde_json::Value, _> =
serde_json::from_str(&json);
assert!(parsed.is_ok(), "Constants JSON must be valid");
}
#[test]
fn reg_22_constants_concurrent_reads() {
use std::sync::Arc;
let c = Arc::new(Constants::new());
let handles: Vec<_> = (0..8)
.map(|_| {
let c = Arc::clone(&c);
std::thread::spawn(move || {
assert_eq!(c.constants().len(), 121);
let _ = c.constant("PI");
let _ = c.get_value("EULER");
})
})
.collect();
for h in handles {
h.join().unwrap();
}
}
#[test]
fn reg_23_words_default_concurrent_construction() {
let handles: Vec<_> = (0..8)
.map(|_| {
std::thread::spawn(|| {
let w = Words::default();
w.count()
})
})
.collect();
let counts: Vec<usize> =
handles.into_iter().map(|h| h.join().unwrap()).collect();
assert!(
counts.iter().all(|&c| c == counts[0]),
"Concurrent Words::default() produced inconsistent counts"
);
}
#[test]
fn reg_24_common_parse_concurrent() {
let handles: Vec<_> = (0..8)
.map(|i| {
std::thread::spawn(move || {
let json = format!(r#"{{"id":{i}}}"#);
Common::parse(&json).unwrap()
})
})
.collect();
for h in handles {
let _ = h.join().unwrap();
}
}
#[test]
fn reg_25_common_constructors_thread_safe() {
let handles: Vec<_> = (0..8)
.map(|i| {
std::thread::spawn(move || {
if i % 2 == 0 {
Common::new().constants().constants().len()
} else {
Common::default().constants().constants().len()
}
})
})
.collect();
for h in handles {
assert_eq!(h.join().unwrap(), 121);
}
}
#[test]
fn reg_26_phi_satisfies_quadratic() {
let lhs = PHI * PHI;
let rhs = PHI + 1.0;
assert!((lhs - rhs).abs() < 1e-14, "PHI^2 must equal PHI + 1");
}
#[test]
fn reg_27_sqrt2_squared_equals_two() {
assert!((SQRT2 * SQRT2 - 2.0).abs() < 1e-15, "SQRT2^2 drift");
}
#[test]
fn reg_28_sqrt3_squared_equals_three() {
assert!((SQRT3 * SQRT3 - 3.0).abs() < 1e-15, "SQRT3^2 drift");
}
#[test]
fn reg_29_sqrt5_squared_equals_five() {
assert!((SQRT5 * SQRT5 - 5.0).abs() < 1e-13, "SQRT5^2 drift");
}
#[test]
fn reg_30_boltzmann_avogadro_gas_constant() {
let computed = BOLTZMANN * AVOGADRO;
assert!(
(computed - GAS_CONSTANT).abs() < 0.01,
"R = k_B * N_A violated: {computed} vs {GAS_CONSTANT}"
);
}
#[test]
fn reg_31_electromagnetic_relation() {
let product = VACUUM_PERMEABILITY
* VACUUM_PERMITTIVITY
* SPEED_OF_LIGHT
* SPEED_OF_LIGHT;
assert!(
(product - 1.0).abs() < 1e-4,
"mu0 * eps0 * c^2 must ≈ 1, got {product}"
);
}
#[test]
fn reg_32_words_bulk_add() {
let mut w = Words::new();
for i in 0..1_000 {
w.add_word(&format!("word_{i}"));
}
assert_eq!(w.count(), 1_000);
}
#[test]
fn reg_33_words_bulk_add_then_remove() {
let mut w = Words::new();
let items: Vec<String> =
(0..500).map(|i| format!("w{i}")).collect();
for s in &items {
w.add_word(s);
}
assert_eq!(w.count(), 500);
for s in &items {
assert!(w.remove_word(s));
}
assert_eq!(w.count(), 0);
}
#[test]
fn reg_34_words_large_set_sorted() {
let mut w = Words::new();
for i in (0..200).rev() {
w.add_word(&format!("item_{i:04}"));
}
let list = w.words_list();
for pair in list.windows(2) {
assert!(
pair[0] <= pair[1],
"Sorting broken: {} > {}",
pair[0],
pair[1]
);
}
}
#[test]
fn reg_35_words_add_remove_readd() {
let mut w = Words::new();
w.add_word("ping");
assert!(w.contains("ping"));
assert!(w.remove_word("ping"));
assert!(!w.contains("ping"));
w.add_word("ping");
assert!(w.contains("ping"));
assert_eq!(w.count(), 1);
}
#[test]
fn reg_36_words_clear_then_repopulate() {
let mut w = Words::default();
let original_count = w.count();
assert!(original_count > 0);
w.clear();
assert_eq!(w.count(), 0);
w.add_word("fresh");
assert_eq!(w.count(), 1);
assert!(w.contains("fresh"));
}
#[test]
fn reg_37_word_list_no_duplicates() {
let mut seen = std::collections::HashSet::new();
for word in WORD_LIST {
assert!(
seen.insert(word),
"Duplicate word in WORD_LIST: '{word}'"
);
}
}
#[test]
fn reg_38_parse_nested_json() {
let json = r#"{"a":{"b":{"c":{"d":"deep"}}}}"#;
let result = Common::parse(json);
assert!(result.is_ok());
}
#[test]
fn reg_39_parse_unicode_keys() {
let json = r#"{"clé":"valeur","キー":"値"}"#;
let result = Common::parse(json);
assert!(result.is_ok());
}
#[test]
fn reg_40_parse_numeric_values() {
let json = r#"{"count":42,"ratio":1.5,"flag":true}"#;
let result = Common::parse(json);
assert!(result.is_ok());
}
#[test]
fn reg_41_parse_root_array_errors() {
let result = Common::parse("[1,2,3]");
assert!(result.is_err());
}
#[test]
fn reg_42_parse_escaped_strings() {
let json = r#"{"msg":"line1\nline2\ttab\"quote"}"#;
let result = Common::parse(json);
assert!(result.is_ok());
}
#[test]
fn reg_43_parse_whitespace_only_errors() {
let result = Common::parse(" ");
assert!(result.is_err());
}
#[test]
fn reg_44_parse_is_stateless() {
let json = r#"{"words":["a","b"]}"#;
let a = Common::parse(json).unwrap();
let b = Common::parse(json).unwrap();
assert_eq!(
serde_json::to_string(&a).unwrap(),
serde_json::to_string(&b).unwrap(),
"parse() must be stateless"
);
}
#[test]
fn reg_45_exactly_121_constants() {
assert_eq!(
Constants::new().constants().len(),
121,
"Public API contract: 121 constants"
);
}
#[test]
fn reg_46_euler_is_std_e() {
assert_eq!(EULER, std::f64::consts::E);
}
#[test]
fn reg_47_pi_is_std_pi() {
assert_eq!(PI, std::f64::consts::PI);
}
#[test]
fn reg_48_tau_is_std_tau() {
assert_eq!(TAU, std::f64::consts::TAU);
}
#[test]
fn reg_49_sqrt2_is_std_sqrt2() {
assert_eq!(SQRT2, std::f64::consts::SQRT_2);
}
#[test]
fn reg_50_faraday_avogadro_relation() {
let elementary_charge = 1.602_176_634e-19_f64;
let computed = AVOGADRO * elementary_charge;
assert!(
(FARADAY - computed).abs() < 0.01,
"F = N_A * e violated: {} vs {}",
FARADAY,
computed
);
}
}