use super::{HierarchyStrategy, NodeRole};
use crate::beacon::{GeographicBeacon, HierarchyLevel, NodeProfile};
#[derive(Debug, Clone)]
pub struct StaticHierarchyStrategy {
pub assigned_level: HierarchyLevel,
pub assigned_role: NodeRole,
}
impl StaticHierarchyStrategy {
pub fn new(assigned_level: HierarchyLevel, assigned_role: NodeRole) -> Self {
Self {
assigned_level,
assigned_role,
}
}
}
impl HierarchyStrategy for StaticHierarchyStrategy {
fn determine_level(&self, _node_profile: &NodeProfile) -> HierarchyLevel {
self.assigned_level
}
fn determine_role(
&self,
_node_profile: &NodeProfile,
_nearby_peers: &[GeographicBeacon],
) -> NodeRole {
self.assigned_role
}
fn can_transition(&self, _current_level: HierarchyLevel, _new_level: HierarchyLevel) -> bool {
false
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::beacon::{NodeMobility, NodeResources};
fn create_test_profile() -> NodeProfile {
NodeProfile {
mobility: NodeMobility::Static,
resources: NodeResources {
cpu_cores: 4,
memory_mb: 2048,
bandwidth_mbps: 100,
cpu_usage_percent: 30,
memory_usage_percent: 40,
battery_percent: None,
},
can_parent: true,
prefer_leaf: false,
parent_priority: 100,
}
}
#[test]
fn test_static_strategy_returns_assigned_level() {
let strategy = StaticHierarchyStrategy::new(HierarchyLevel::Platoon, NodeRole::Leader);
let profile = create_test_profile();
let level = strategy.determine_level(&profile);
assert_eq!(level, HierarchyLevel::Platoon);
}
#[test]
fn test_static_strategy_returns_assigned_role() {
let strategy = StaticHierarchyStrategy::new(HierarchyLevel::Squad, NodeRole::Member);
let profile = create_test_profile();
let role = strategy.determine_role(&profile, &[]);
assert_eq!(role, NodeRole::Member);
}
#[test]
fn test_static_strategy_no_transitions() {
let strategy = StaticHierarchyStrategy::new(HierarchyLevel::Squad, NodeRole::Leader);
assert!(!strategy.can_transition(HierarchyLevel::Squad, HierarchyLevel::Platoon));
assert!(!strategy.can_transition(HierarchyLevel::Squad, HierarchyLevel::Company));
assert!(!strategy.can_transition(HierarchyLevel::Platoon, HierarchyLevel::Squad));
}
}