#[test]
fn test_budget_enforcement() {
let config = ContextConfig {
budget_lines: 10,
depth: 0,
max_coupled: 3,
coupling_threshold: 0.1,
semantic_weight: 0.7,
content_mode: ContentMode::Full,
search_limit: 20,
doc_demotion: 0.5,
rrf_k: 60.0,
recency_half_life_days: 0.0,
recency_weight: 0.0,
bridge_mode: BridgeMode::Inject,
bridge_boost_factor: 0.3,
extra_filter: None,
tags_config: None,
role: None,
file_type_rules: vec![],
repo_affinity: None,
repo_affinity_boost: 2.0,
ppr_weight: 0.0,
max_bridged_files: 3,
max_bridged_chunks_per_file: 2,
repo_path_prefix: None,
..ContextConfig::default()
};
let seeds = vec![
make_seed("c1", "a.rs", 1, 6, 0.9), make_seed("c2", "b.rs", 1, 8, 0.8), make_seed("c3", "c.rs", 1, 3, 0.7), ];
let bundle = assemble_bundle("test", &config, seeds, vec![], vec![], vec![], vec![]).unwrap();
assert!(bundle.budget.used_lines <= bundle.budget.max_lines);
assert_eq!(bundle.budget.max_lines, 10);
}
#[test]
fn test_estimate_tokens() {
assert_eq!(estimate_tokens(""), 0);
assert_eq!(estimate_tokens("a"), 1); assert_eq!(estimate_tokens("abcd"), 1); assert_eq!(estimate_tokens("abcde"), 2); assert_eq!(estimate_tokens(&"x".repeat(40)), 10); }
#[test]
fn test_budget_unit_roundtrip() {
for unit in [BudgetUnit::Line, BudgetUnit::Token] {
let s = unit.to_string();
let parsed: BudgetUnit = s.parse().unwrap();
assert_eq!(unit, parsed);
}
assert_eq!(BudgetUnit::default(), BudgetUnit::Line);
}
#[test]
fn test_token_budget_enforcement() {
let config = ContextConfig {
budget_lines: 20, budget_unit: BudgetUnit::Token,
depth: 0,
bridge_mode: BridgeMode::Inject,
..ContextConfig::default()
};
let mut a = make_seed("c1", "a.rs", 1, 200, 0.9);
a.content = "x".repeat(32);
let mut b = make_seed("c2", "b.rs", 1, 5, 0.8);
b.content = "x".repeat(40);
let mut c = make_seed("c3", "c.rs", 1, 3, 0.7);
c.content = "x".repeat(16);
let bundle = assemble_bundle(
"test",
&config,
vec![a, b, c],
vec![],
vec![],
vec![],
vec![],
)
.unwrap();
assert_eq!(bundle.budget.max_lines, 20);
assert_eq!(bundle.budget.used_lines, 18); assert_eq!(bundle.summary.total_chunks, 2); }