#[derive(Debug, Clone)]
pub struct BacktrackingIteration {
pub iteration: usize,
pub conflicts: Vec<crate::version::conflict::VersionConflict>,
pub updates: Vec<VersionUpdate>,
pub transitive_reresolutions: usize,
pub made_progress: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TerminationReason {
Success,
MaxIterations,
Timeout,
NoProgress,
Oscillation,
NoCompatibleVersion,
}
#[derive(Debug, Clone)]
pub struct BacktrackingResult {
pub resolved: bool,
pub updates: Vec<VersionUpdate>,
pub iterations: usize,
pub attempted_versions: usize,
pub iteration_history: Vec<BacktrackingIteration>,
pub total_transitive_reresolutions: usize,
pub termination_reason: TerminationReason,
}
#[derive(Debug, Clone)]
pub struct VersionUpdate {
pub resource_id: String,
pub old_version: String,
pub new_version: String,
pub old_sha: String,
pub new_sha: String,
pub variant_inputs: Option<serde_json::Value>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_backtracking_result_structure() {
let result = BacktrackingResult {
resolved: true,
updates: vec![VersionUpdate {
resource_id: "community:test".to_string(),
old_version: "v1.0.0".to_string(),
new_version: "v1.0.1".to_string(),
old_sha: "abc123".to_string(),
new_sha: "def456".to_string(),
variant_inputs: None,
}],
iterations: 1,
attempted_versions: 5,
iteration_history: vec![],
total_transitive_reresolutions: 0,
termination_reason: TerminationReason::Success,
};
assert!(result.resolved);
assert_eq!(result.updates.len(), 1);
assert_eq!(result.iterations, 1);
assert_eq!(result.attempted_versions, 5);
assert_eq!(result.termination_reason, TerminationReason::Success);
}
}