diff --git a/crates/fidc-core/src/platform_strategy_spec.rs b/crates/fidc-core/src/platform_strategy_spec.rs index 0d45b26..6078dad 100644 --- a/crates/fidc-core/src/platform_strategy_spec.rs +++ b/crates/fidc-core/src/platform_strategy_spec.rs @@ -720,10 +720,8 @@ const STRATEGY_ALIAS_GROUPS: &[(&str, &[&str])] = &[ ), ("stampTaxRateAfterChange", &["stamp_tax_rate_after_change"]), ("stampTaxChangeDate", &["stamp_tax_change_date"]), - ("volumeLimit", &["volume_limit"]), - ("volumeLimitEnabled", &["volume_limit_enabled"]), - ("liquidityLimit", &["liquidity_limit"]), - ("liquidityLimitEnabled", &["liquidity_limit_enabled"]), + ("volumeLimit", &["volume_limit", "volumeLimitEnabled", "volume_limit_enabled"]), + ("liquidityLimit", &["liquidity_limit", "liquidityLimitEnabled", "liquidity_limit_enabled"]), ("volumePercent", &["volume_percent"]), ("riskPolicy", &["risk_policy"]), ("strictValueBudget", &["strict_value_budget"]), @@ -4119,6 +4117,28 @@ mod tests { ); } + #[test] + fn execution_limit_aliases_normalize_to_one_serde_field_without_touching_policy() { + for section in ["execution", "engineConfig"] { + let mut spec = serde_json::json!({}); + spec[section] = serde_json::json!({ + "volumeLimit": false, "volumeLimitEnabled": false, "volume_limit_enabled": false, + "liquidityLimit": true, "liquidityLimitEnabled": true, "liquidity_limit_enabled": true, + "riskPolicy": {"volumeLimitEnabled": false, "liquidityLimitEnabled": true} + }); + let cfg = platform_expr_config_from_value("test", "000300.SH", &spec).unwrap(); + assert!(!cfg.risk_config.trading_constraints.volume_limit_enabled); + assert!(cfg.risk_config.trading_constraints.liquidity_limit_enabled); + super::normalize_strategy_aliases_in_value(&mut spec).unwrap(); + assert!(spec[section].get("volumeLimitEnabled").is_none()); + assert!(spec[section].get("liquidity_limit_enabled").is_none()); + assert_eq!(spec[section]["riskPolicy"]["liquidityLimitEnabled"], true); + spec[section]["liquidity_limit_enabled"] = serde_json::json!(false); + assert!(platform_expr_config_from_value("test", "000300.SH", &spec) + .unwrap_err().to_string().contains("conflicting alias values")); + } + } + #[test] fn canonicalizes_duplicate_execution_aliases_without_changing_strategy_intent() { let spec = serde_json::json!({