solverforge 0.12.0

SolverForge - A constraint solver in Rust
Documentation
use solverforge::{SolverEvent, SolverLifecycleState, SolverManager};

#[path = "scalar_runtime_selector_assembly/domain/mod.rs"]
mod domain;

use domain::{Plan, Resource, Task};

fn seeded_plan() -> Plan {
    let resources = (0..4)
        .map(|idx| Resource {
            id: format!("resource-{idx}"),
        })
        .collect();
    let tasks = (0..12)
        .map(|idx| Task {
            id: format!("task-{idx}"),
            resource_idx: None,
        })
        .collect();

    Plan {
        resources,
        tasks,
        score: None,
    }
}

#[test]
fn scalar_only_solution_builds_default_selector_without_failure() {
    static MANAGER: SolverManager<Plan> = SolverManager::new();

    let (job_id, mut receiver) = MANAGER.solve(seeded_plan()).expect("job should start");
    let mut completed = false;

    while let Some(event) = receiver.blocking_recv() {
        match event {
            SolverEvent::BestSolution { .. } => {}
            SolverEvent::Completed { metadata, .. } => {
                assert_eq!(metadata.lifecycle_state, SolverLifecycleState::Completed);
                completed = true;
                break;
            }
            SolverEvent::Failed { error, .. } => {
                panic!("scalar runtime selector assembly failed: {error}");
            }
            _ => {}
        }
    }

    assert!(completed, "expected selector assembly solve to complete");
    MANAGER.delete(job_id).expect("delete completed job");
}