malvin 0.2.5

Non-interactive research and coding agent
use super::BudgetScopeLayer;

#[test]
fn budget_scope_layer_all_has_two_variants() {
    assert_eq!(BudgetScopeLayer::all().len(), 2);
}

#[test]
fn budget_scope_layer_single_attempt_contracts() {
    assert!(!BudgetScopeLayer::OuterRouterLoop.respects_single_attempt());
    assert!(BudgetScopeLayer::AcpSpawnRetry.respects_single_attempt());
}

#[test]
fn budget_scope_layer_variants_exist() {
    let _ = (
        BudgetScopeLayer::OuterRouterLoop,
        BudgetScopeLayer::AcpSpawnRetry,
    );
}

#[test]
fn effective_max_attempts_single_attempt_forces_one_at_acp_layer() {
    assert_eq!(
        BudgetScopeLayer::AcpSpawnRetry.effective_max_attempts(5, true),
        1
    );
    assert_eq!(
        BudgetScopeLayer::AcpSpawnRetry.effective_max_attempts(5, false),
        5
    );
    assert_eq!(
        BudgetScopeLayer::OuterRouterLoop.effective_max_attempts(32, true),
        32
    );
}

#[test]
fn effective_outer_loop_iterations_is_at_least_one() {
    assert_eq!(BudgetScopeLayer::effective_outer_loop_iterations(0), 1);
    assert_eq!(BudgetScopeLayer::effective_outer_loop_iterations(3), 3);
}

#[test]
fn budget_scope_layer_single_attempt_flags() {
    for layer in BudgetScopeLayer::all() {
        let single = layer.respects_single_attempt();
        match layer {
            BudgetScopeLayer::AcpSpawnRetry => {
                assert!(single);
            }
            BudgetScopeLayer::OuterRouterLoop => {
                assert!(!single);
            }
        }
    }
}