use crate::resources::{ResourceType, CapabilityLevel, ResourceAmount};
use crate::types::{SystemInfo, CpuInfo, GpuInfo, MemoryInfo, StorageInfo, NetworkInfo};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CapabilityProfile {
pub cpu_capabilities: CpuCapabilities,
pub gpu_capabilities: GpuCapabilities,
pub memory_capabilities: MemoryCapabilities,
pub storage_capabilities: StorageCapabilities,
pub network_capabilities: NetworkCapabilities,
pub scores: CapabilityScores,
pub metadata: CapabilityMetadata,
}
impl CapabilityProfile {
pub fn from_system_info(system_info: &SystemInfo) -> Self {
let cpu_capabilities = CpuCapabilities::from_cpu_info(&system_info.cpu_info);
let gpu_capabilities = GpuCapabilities::from_gpu_info(&system_info.gpu_info);
let memory_capabilities = MemoryCapabilities::from_memory_info(&system_info.memory_info);
let storage_capabilities = StorageCapabilities::from_storage_info(&system_info.storage_info);
let network_capabilities = NetworkCapabilities::from_network_info(&system_info.network_info);
let scores = CapabilityScores::calculate(
&cpu_capabilities,
&gpu_capabilities,
&memory_capabilities,
&storage_capabilities,
&network_capabilities,
);
let metadata = CapabilityMetadata {
analysis_version: "1.0".to_string(),
created_at: chrono::Utc::now(),
system_fingerprint: Self::generate_fingerprint(system_info),
};
Self {
cpu_capabilities,
gpu_capabilities,
memory_capabilities,
storage_capabilities,
network_capabilities,
scores,
metadata,
}
}
fn generate_fingerprint(system_info: &SystemInfo) -> String {
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
let mut hasher = DefaultHasher::new();
system_info.cpu_info.brand.hash(&mut hasher);
system_info.cpu_info.physical_cores.hash(&mut hasher);
system_info.memory_info.total_ram.hash(&mut hasher);
for gpu in &system_info.gpu_info {
gpu.name.hash(&mut hasher);
gpu.vendor.hash(&mut hasher);
}
format!("{:x}", hasher.finish())
}
pub fn get_capability_level(&self, resource_type: &ResourceType) -> CapabilityLevel {
match resource_type {
ResourceType::CPU => self.scores.cpu_score.into(),
ResourceType::GPU => self.scores.gpu_score.into(),
ResourceType::Memory => self.scores.memory_score.into(),
ResourceType::Storage => self.scores.storage_score.into(),
ResourceType::Network => self.scores.network_score.into(),
ResourceType::Custom(_) => CapabilityLevel::Medium, }
}
pub fn get_resource_amount(&self, resource_type: &ResourceType) -> Option<ResourceAmount> {
match resource_type {
ResourceType::CPU => Some(ResourceAmount::Score(self.scores.cpu_score)),
ResourceType::GPU => Some(ResourceAmount::Score(self.scores.gpu_score)),
ResourceType::Memory => Some(ResourceAmount::Gigabytes(
self.memory_capabilities.total_ram_gb
)),
ResourceType::Storage => Some(ResourceAmount::Gigabytes(
self.storage_capabilities.total_capacity_gb
)),
ResourceType::Network => Some(ResourceAmount::Score(self.scores.network_score)),
ResourceType::Custom(_) => None,
}
}
pub fn supports_feature(&self, feature: &SystemFeature) -> bool {
match feature {
SystemFeature::CudaCompute => self.gpu_capabilities.cuda_support,
SystemFeature::OpenCLCompute => self.gpu_capabilities.opencl_support,
SystemFeature::AVXInstructions => self.cpu_capabilities.avx_support,
SystemFeature::NVMeStorage => self.storage_capabilities.nvme_support,
SystemFeature::HighBandwidthMemory => self.memory_capabilities.high_bandwidth,
SystemFeature::VirtualizationSupport => self.cpu_capabilities.virtualization_support,
SystemFeature::HighSpeedNetwork => self.network_capabilities.high_speed_support,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CpuCapabilities {
pub physical_cores: usize,
pub logical_cores: usize,
pub base_frequency_mhz: u64,
pub max_frequency_mhz: Option<u64>,
pub cache_size_mb: Option<u64>,
pub architecture: String,
pub instruction_sets: Vec<String>,
pub avx_support: bool,
pub virtualization_support: bool,
pub thread_performance: f64,
pub multicore_efficiency: f64,
}
impl CpuCapabilities {
pub fn from_cpu_info(cpu_info: &CpuInfo) -> Self {
let avx_support = cpu_info.brand.to_lowercase().contains("intel") ||
cpu_info.brand.to_lowercase().contains("amd");
let virtualization_support = cpu_info.logical_cores > cpu_info.physical_cores;
let thread_performance = Self::calculate_thread_performance(cpu_info);
let multicore_efficiency = Self::calculate_multicore_efficiency(cpu_info);
Self {
physical_cores: cpu_info.physical_cores,
logical_cores: cpu_info.logical_cores,
base_frequency_mhz: cpu_info.base_frequency,
max_frequency_mhz: cpu_info.max_frequency,
cache_size_mb: cpu_info.cache_size,
architecture: cpu_info.architecture.clone(),
instruction_sets: vec![], avx_support,
virtualization_support,
thread_performance,
multicore_efficiency,
}
}
fn calculate_thread_performance(cpu_info: &CpuInfo) -> f64 {
let base_score = (cpu_info.base_frequency as f64 / 1000.0).min(5.0); let cache_bonus = cpu_info.cache_size.map(|c| (c as f64 / 16.0).min(2.0)).unwrap_or(0.0); let arch_bonus = if cpu_info.architecture.contains("x86_64") { 1.0 } else { 0.5 };
(base_score + cache_bonus + arch_bonus).min(10.0)
}
fn calculate_multicore_efficiency(cpu_info: &CpuInfo) -> f64 {
let core_score = (cpu_info.physical_cores as f64 / 2.0).min(5.0); let hyperthreading_bonus = if cpu_info.logical_cores > cpu_info.physical_cores { 2.0 } else { 0.0 };
let architecture_bonus = if cpu_info.architecture.contains("x86_64") { 1.0 } else { 0.5 };
(core_score + hyperthreading_bonus + architecture_bonus).min(10.0)
}
pub fn ai_capability_level(&self) -> crate::resources::CapabilityLevel {
let combined_score = (self.thread_performance + self.multicore_efficiency) / 2.0;
crate::resources::CapabilityLevel::from_numeric(combined_score)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GpuCapabilities {
pub gpus: Vec<GpuDevice>,
pub primary_compute_gpu: Option<usize>,
pub total_vram_gb: f64,
pub cuda_support: bool,
pub opencl_support: bool,
pub ai_acceleration_score: f64,
pub graphics_score: f64,
pub compute_score: f64,
}
impl GpuCapabilities {
pub fn from_gpu_info(gpu_info: &[GpuInfo]) -> Self {
let gpus: Vec<GpuDevice> = gpu_info.iter().map(GpuDevice::from_gpu_info).collect();
let total_vram_gb = gpus.iter()
.map(|gpu| gpu.vram_gb.unwrap_or(0.0))
.sum();
let cuda_support = gpus.iter().any(|gpu| gpu.cuda_support);
let opencl_support = gpus.iter().any(|gpu| gpu.opencl_support);
let primary_compute_gpu = Self::find_best_compute_gpu(&gpus);
let ai_acceleration_score = Self::calculate_ai_score(&gpus);
let graphics_score = Self::calculate_graphics_score(&gpus);
let compute_score = Self::calculate_compute_score(&gpus);
Self {
gpus,
primary_compute_gpu,
total_vram_gb,
cuda_support,
opencl_support,
ai_acceleration_score,
graphics_score,
compute_score,
}
}
fn find_best_compute_gpu(gpus: &[GpuDevice]) -> Option<usize> {
gpus.iter()
.enumerate()
.max_by(|(_, a), (_, b)| a.compute_capability_score.partial_cmp(&b.compute_capability_score).unwrap())
.map(|(idx, _)| idx)
}
fn calculate_ai_score(gpus: &[GpuDevice]) -> f64 {
if gpus.is_empty() {
return 0.0;
}
let best_gpu = gpus.iter()
.max_by(|a, b| a.compute_capability_score.partial_cmp(&b.compute_capability_score).unwrap())
.unwrap();
let vram_score = best_gpu.vram_gb.map(|v| (v / 8.0).min(4.0)).unwrap_or(0.0); let vendor_bonus = if best_gpu.vendor.to_lowercase().contains("nvidia") { 3.0 } else { 1.0 };
let cuda_bonus = if best_gpu.cuda_support { 2.0 } else { 0.0 };
(vram_score + vendor_bonus + cuda_bonus).min(10.0)
}
fn calculate_graphics_score(gpus: &[GpuDevice]) -> f64 {
if gpus.is_empty() {
return 0.0;
}
let best_gpu = gpus.iter()
.max_by(|a, b| a.graphics_score.partial_cmp(&b.graphics_score).unwrap())
.unwrap();
best_gpu.graphics_score
}
fn calculate_compute_score(gpus: &[GpuDevice]) -> f64 {
if gpus.is_empty() {
return 0.0;
}
let best_gpu = gpus.iter()
.max_by(|a, b| a.compute_capability_score.partial_cmp(&b.compute_capability_score).unwrap())
.unwrap();
best_gpu.compute_capability_score
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GpuDevice {
pub name: String,
pub vendor: String,
pub vram_gb: Option<f64>,
pub compute_capability: Option<String>,
pub cuda_support: bool,
pub opencl_support: bool,
pub graphics_score: f64,
pub compute_capability_score: f64,
pub power_efficiency: f64,
}
impl GpuDevice {
pub fn from_gpu_info(gpu_info: &GpuInfo) -> Self {
let vram_gb = gpu_info.vram_size.map(|v| v as f64 / 1024.0);
let graphics_score = Self::calculate_graphics_score_for_device(gpu_info);
let compute_score = Self::calculate_compute_score_for_device(gpu_info);
let power_efficiency = Self::calculate_power_efficiency(gpu_info);
Self {
name: gpu_info.name.clone(),
vendor: gpu_info.vendor.clone(),
vram_gb,
compute_capability: gpu_info.compute_capability.clone(),
cuda_support: gpu_info.cuda_support,
opencl_support: gpu_info.opencl_support,
graphics_score,
compute_capability_score: compute_score,
power_efficiency,
}
}
fn calculate_graphics_score_for_device(gpu_info: &GpuInfo) -> f64 {
let vram_score = gpu_info.vram_size.map(|v| (v as f64 / 1024.0 / 4.0).min(3.0)).unwrap_or(0.0);
let vendor_score = match gpu_info.vendor.to_lowercase().as_str() {
vendor if vendor.contains("nvidia") => 4.0,
vendor if vendor.contains("amd") => 3.5,
vendor if vendor.contains("intel") => 2.0,
_ => 1.0,
};
let modern_bonus = if gpu_info.name.contains("RTX") || gpu_info.name.contains("RX") { 2.0 } else { 0.0 };
(vram_score + vendor_score + modern_bonus).min(10.0)
}
fn calculate_compute_score_for_device(gpu_info: &GpuInfo) -> f64 {
let mut score = 0.0;
if let Some(vram) = gpu_info.vram_size {
score += (vram as f64 / 1024.0 / 8.0).min(4.0); }
if gpu_info.cuda_support {
score += 3.0;
}
score += match gpu_info.vendor.to_lowercase().as_str() {
vendor if vendor.contains("nvidia") => 2.0,
vendor if vendor.contains("amd") => 1.5,
vendor if vendor.contains("intel") => 0.5,
_ => 0.0,
};
if gpu_info.name.contains("RTX") || gpu_info.name.contains("A100") || gpu_info.name.contains("H100") {
score += 1.0;
}
score.min(10.0)
}
fn calculate_power_efficiency(gpu_info: &GpuInfo) -> f64 {
match gpu_info.vendor.to_lowercase().as_str() {
vendor if vendor.contains("nvidia") && gpu_info.name.contains("RTX") => 8.0,
vendor if vendor.contains("amd") && gpu_info.name.contains("RX") => 7.0,
vendor if vendor.contains("intel") => 6.0,
_ => 5.0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryCapabilities {
pub total_ram_gb: f64,
pub available_ram_gb: f64,
pub memory_type: Option<String>,
pub memory_speed_mhz: Option<u64>,
pub bandwidth_score: f64,
pub capacity_score: f64,
pub high_bandwidth: bool,
pub ecc_support: bool,
}
impl MemoryCapabilities {
pub fn from_memory_info(memory_info: &MemoryInfo) -> Self {
let total_ram_gb = memory_info.total_ram as f64 / 1024.0;
let available_ram_gb = memory_info.available_ram as f64 / 1024.0;
let capacity_score = Self::calculate_capacity_score(total_ram_gb);
let bandwidth_score = Self::calculate_bandwidth_score(memory_info);
let high_bandwidth = memory_info.memory_speed.map(|s| s >= 3200).unwrap_or(false);
let ecc_support = memory_info.memory_type.as_ref()
.map(|t| t.to_lowercase().contains("ecc"))
.unwrap_or(false);
Self {
total_ram_gb,
available_ram_gb,
memory_type: memory_info.memory_type.clone(),
memory_speed_mhz: memory_info.memory_speed,
bandwidth_score,
capacity_score,
high_bandwidth,
ecc_support,
}
}
fn calculate_capacity_score(total_gb: f64) -> f64 {
match total_gb {
gb if gb >= 128.0 => 10.0,
gb if gb >= 64.0 => 9.0,
gb if gb >= 32.0 => 8.0,
gb if gb >= 16.0 => 7.0,
gb if gb >= 8.0 => 5.0,
gb if gb >= 4.0 => 3.0,
_ => 1.0,
}
}
fn calculate_bandwidth_score(memory_info: &MemoryInfo) -> f64 {
let speed_score = memory_info.memory_speed
.map(|speed| (speed as f64 / 800.0).min(5.0)) .unwrap_or(2.0);
let type_bonus = memory_info.memory_type.as_ref()
.map(|t| match t.to_lowercase().as_str() {
t if t.contains("ddr5") => 3.0,
t if t.contains("ddr4") => 2.0,
t if t.contains("ddr3") => 1.0,
_ => 0.5,
})
.unwrap_or(1.0);
(speed_score + type_bonus).min(10.0)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StorageCapabilities {
pub devices: Vec<StorageDevice>,
pub total_capacity_gb: f64,
pub available_capacity_gb: f64,
pub performance_score: f64,
pub nvme_support: bool,
pub ssd_ratio: f64,
}
impl StorageCapabilities {
pub fn from_storage_info(storage_info: &[StorageInfo]) -> Self {
let devices: Vec<StorageDevice> = storage_info.iter()
.map(StorageDevice::from_storage_info)
.collect();
let total_capacity_gb = devices.iter()
.map(|d| d.total_capacity_gb)
.sum();
let available_capacity_gb = devices.iter()
.map(|d| d.available_capacity_gb)
.sum();
let performance_score = devices.iter()
.map(|d| d.performance_score)
.fold(0.0, f64::max);
let nvme_support = devices.iter()
.any(|d| d.storage_type.to_lowercase().contains("nvme"));
let ssd_capacity: f64 = devices.iter()
.filter(|d| d.is_ssd())
.map(|d| d.total_capacity_gb)
.sum();
let ssd_ratio = if total_capacity_gb > 0.0 {
ssd_capacity / total_capacity_gb * 100.0
} else {
0.0
};
Self {
devices,
total_capacity_gb,
available_capacity_gb,
performance_score,
nvme_support,
ssd_ratio,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StorageDevice {
pub name: String,
pub storage_type: String,
pub total_capacity_gb: f64,
pub available_capacity_gb: f64,
pub read_speed_mbps: Option<u64>,
pub write_speed_mbps: Option<u64>,
pub performance_score: f64,
pub reliability_score: f64,
}
impl StorageDevice {
pub fn from_storage_info(storage_info: &StorageInfo) -> Self {
let performance_score = Self::calculate_performance_score(storage_info);
let reliability_score = Self::calculate_reliability_score(storage_info);
Self {
name: storage_info.name.clone(),
storage_type: storage_info.storage_type.clone(),
total_capacity_gb: storage_info.total_capacity as f64,
available_capacity_gb: storage_info.available_capacity as f64,
read_speed_mbps: storage_info.read_speed,
write_speed_mbps: storage_info.write_speed,
performance_score,
reliability_score,
}
}
pub fn is_ssd(&self) -> bool {
let storage_type = self.storage_type.to_lowercase();
storage_type.contains("ssd") || storage_type.contains("nvme")
}
fn calculate_performance_score(storage_info: &StorageInfo) -> f64 {
let type_score = match storage_info.storage_type.to_lowercase().as_str() {
t if t.contains("nvme") => 8.0,
t if t.contains("ssd") => 6.0,
t if t.contains("hdd") => 2.0,
_ => 3.0,
};
let speed_bonus = storage_info.read_speed
.map(|s| (s as f64 / 1000.0).min(2.0)) .unwrap_or(0.0);
(type_score + speed_bonus).min(10.0)
}
fn calculate_reliability_score(storage_info: &StorageInfo) -> f64 {
match storage_info.storage_type.to_lowercase().as_str() {
t if t.contains("nvme") => 9.0,
t if t.contains("ssd") => 8.0,
t if t.contains("hdd") => 6.0,
_ => 5.0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkCapabilities {
pub interfaces: Vec<NetworkInterface>,
pub internet_connected: bool,
pub estimated_bandwidth_mbps: Option<u64>,
pub performance_score: f64,
pub high_speed_support: bool,
pub estimated_latency_ms: Option<f64>,
}
impl NetworkCapabilities {
pub fn from_network_info(network_info: &NetworkInfo) -> Self {
let interfaces: Vec<NetworkInterface> = network_info.interfaces.iter()
.map(NetworkInterface::from_network_interface_info)
.collect();
let performance_score = Self::calculate_network_performance(&interfaces, network_info.estimated_bandwidth);
let high_speed_support = network_info.estimated_bandwidth
.map(|b| b >= 1000)
.unwrap_or(false);
Self {
interfaces,
internet_connected: network_info.internet_connected,
estimated_bandwidth_mbps: network_info.estimated_bandwidth,
performance_score,
high_speed_support,
estimated_latency_ms: None, }
}
fn calculate_network_performance(interfaces: &[NetworkInterface], bandwidth: Option<u64>) -> f64 {
let bandwidth_score = bandwidth
.map(|b| (b as f64 / 100.0).min(5.0)) .unwrap_or(1.0);
let interface_score = if interfaces.iter().any(|i| i.is_high_speed()) {
3.0
} else if interfaces.iter().any(|i| i.is_ethernet()) {
2.0
} else {
1.0
};
let connection_bonus = if interfaces.iter().any(|i| !i.ip_addresses.is_empty()) {
2.0
} else {
0.0
};
(bandwidth_score + interface_score + connection_bonus).min(10.0)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkInterface {
pub name: String,
pub interface_type: String,
pub mac_address: String,
pub ip_addresses: Vec<String>,
pub speed_mbps: Option<u64>,
pub quality_score: f64,
}
impl NetworkInterface {
pub fn from_network_interface_info(interface_info: &crate::types::NetworkInterface) -> Self {
let quality_score = Self::calculate_quality_score(interface_info);
Self {
name: interface_info.name.clone(),
interface_type: interface_info.interface_type.clone(),
mac_address: interface_info.mac_address.clone(),
ip_addresses: interface_info.ip_addresses.clone(),
speed_mbps: interface_info.speed,
quality_score,
}
}
pub fn is_high_speed(&self) -> bool {
self.speed_mbps.map(|s| s >= 1000).unwrap_or(false)
}
pub fn is_ethernet(&self) -> bool {
self.interface_type.to_lowercase().contains("ethernet")
}
fn calculate_quality_score(interface_info: &crate::types::NetworkInterface) -> f64 {
let type_score = match interface_info.interface_type.to_lowercase().as_str() {
t if t.contains("ethernet") => 4.0,
t if t.contains("wifi") => 3.0,
t if t.contains("wireless") => 3.0,
_ => 2.0,
};
let speed_score = interface_info.speed
.map(|s| (s as f64 / 500.0).min(3.0)) .unwrap_or(1.0);
let connection_bonus = if !interface_info.ip_addresses.is_empty() {
3.0
} else {
0.0
};
(type_score + speed_score + connection_bonus).min(10.0)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CapabilityScores {
pub cpu_score: f64,
pub gpu_score: f64,
pub npu_score: Option<f64>,
pub tpu_score: Option<f64>,
pub fpga_score: Option<f64>,
pub arm_optimization_score: Option<f64>,
pub memory_score: f64,
pub storage_score: f64,
pub network_score: f64,
pub overall_score: f64,
}
impl CapabilityScores {
pub fn calculate(
cpu: &CpuCapabilities,
gpu: &GpuCapabilities,
memory: &MemoryCapabilities,
storage: &StorageCapabilities,
network: &NetworkCapabilities,
) -> Self {
let cpu_score = (cpu.thread_performance + cpu.multicore_efficiency) / 2.0;
let gpu_score = (gpu.ai_acceleration_score + gpu.compute_score) / 2.0;
let memory_score = (memory.capacity_score + memory.bandwidth_score) / 2.0;
let storage_score = storage.performance_score;
let network_score = network.performance_score;
let npu_score = None; let tpu_score = None; let fpga_score = None; let arm_optimization_score = None;
let overall_score = (cpu_score + gpu_score + memory_score + storage_score + network_score) / 5.0;
Self {
cpu_score,
gpu_score,
npu_score,
tpu_score,
fpga_score,
arm_optimization_score,
memory_score,
storage_score,
network_score,
overall_score,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CapabilityMetadata {
pub analysis_version: String,
pub created_at: chrono::DateTime<chrono::Utc>,
pub system_fingerprint: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SystemFeature {
CudaCompute,
OpenCLCompute,
AVXInstructions,
NVMeStorage,
HighBandwidthMemory,
VirtualizationSupport,
HighSpeedNetwork,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::{CpuInfo, MemoryInfo, StorageInfo, NetworkInfo, NetworkInterface};
#[test]
fn test_cpu_capability_creation() {
let cpu_info = CpuInfo {
brand: "Intel Core i7-8700K".to_string(),
physical_cores: 6,
logical_cores: 12,
base_frequency: 3700,
max_frequency: Some(4700),
cache_size: Some(12288),
architecture: "x86_64".to_string(),
};
let cpu_capability = CpuCapabilities::from_cpu_info(&cpu_info);
assert_eq!(cpu_capability.architecture, "x86_64");
assert_eq!(cpu_capability.physical_cores, 6);
assert_eq!(cpu_capability.logical_cores, 12);
assert_eq!(cpu_capability.base_frequency_mhz, 3700);
assert!(cpu_capability.thread_performance > 0.0);
assert!(cpu_capability.multicore_efficiency > 0.0);
}
#[test]
fn test_memory_capability_creation() {
let memory_info = MemoryInfo {
total_ram: 16_000_000_000, available_ram: 12_000_000_000, memory_speed: Some(3200),
memory_type: Some("DDR4".to_string()),
};
let memory_capability = MemoryCapabilities::from_memory_info(&memory_info);
assert!(memory_capability.total_ram_gb > 0.0);
assert!(memory_capability.available_ram_gb > 0.0);
assert_eq!(memory_capability.memory_type, Some("DDR4".to_string()));
assert!(memory_capability.bandwidth_score > 0.0);
}
#[test]
fn test_storage_capability_creation() {
let storage_info = vec![StorageInfo {
name: "Samsung SSD 970 EVO".to_string(),
storage_type: "NVMe SSD".to_string(),
total_capacity: 500,
available_capacity: 400,
read_speed: Some(3500),
write_speed: Some(3200),
}];
let storage_capability = StorageCapabilities::from_storage_info(&storage_info);
assert!(storage_capability.total_capacity_gb > 0.0);
assert!(storage_capability.available_capacity_gb > 0.0);
assert!(storage_capability.nvme_support);
assert!(storage_capability.performance_score > 0.0);
}
#[test]
fn test_network_capability_creation() {
let network_info = NetworkInfo {
interfaces: vec![
NetworkInterface {
name: "Ethernet".to_string(),
interface_type: "Ethernet".to_string(),
mac_address: "00:11:22:33:44:55".to_string(),
ip_addresses: vec!["192.168.1.100".to_string()],
speed: Some(1000),
}
],
internet_connected: true,
estimated_bandwidth: Some(1000),
};
let network_capability = NetworkCapabilities::from_network_info(&network_info);
assert!(network_capability.internet_connected);
assert!(network_capability.estimated_bandwidth_mbps.unwrap_or(0) > 0);
assert!(network_capability.performance_score > 0.0);
}
#[test]
fn test_capability_profile_creation() {
let cpu_info = CpuInfo {
brand: "Intel Core i5-8400".to_string(),
physical_cores: 6,
logical_cores: 6,
base_frequency: 2800,
max_frequency: Some(4000),
cache_size: Some(9216),
architecture: "x86_64".to_string(),
};
let memory_info = MemoryInfo {
total_ram: 8_000_000_000, available_ram: 6_000_000_000, memory_speed: Some(2666),
memory_type: Some("DDR4".to_string()),
};
let storage_info = vec![StorageInfo {
name: "Generic SSD".to_string(),
storage_type: "SSD".to_string(),
total_capacity: 256,
available_capacity: 200,
read_speed: Some(500),
write_speed: Some(450),
}];
let network_info = NetworkInfo {
interfaces: vec![],
internet_connected: false,
estimated_bandwidth: None,
};
let gpu_info = vec![];
let system_info = crate::types::SystemInfo {
os_name: "Windows".to_string(),
os_version: "11".to_string(),
cpu_info,
gpu_info,
memory_info,
storage_info,
network_info,
npu_info: vec![], tpu_info: vec![], fpga_info: vec![], arm_info: None, };
let capability_profile = CapabilityProfile::from_system_info(&system_info);
assert!(capability_profile.scores.overall_score >= 0.0);
assert!(capability_profile.scores.overall_score <= 10.0);
}
#[test]
fn test_ai_capability_levels() {
let low_end_cpu = CpuInfo {
brand: "Intel Celeron".to_string(),
physical_cores: 2,
logical_cores: 2,
base_frequency: 1600,
max_frequency: Some(2400),
cache_size: Some(2048),
architecture: "x86_64".to_string(),
};
let low_capability = CpuCapabilities::from_cpu_info(&low_end_cpu);
let low_ai_level = low_capability.ai_capability_level();
assert!(matches!(low_ai_level, CapabilityLevel::VeryLow | CapabilityLevel::Low));
let high_end_cpu = CpuInfo {
brand: "Intel Core i9-12900K".to_string(),
physical_cores: 16,
logical_cores: 24,
base_frequency: 3200,
max_frequency: Some(5200),
cache_size: Some(30720),
architecture: "x86_64".to_string(),
};
let high_capability = CpuCapabilities::from_cpu_info(&high_end_cpu);
let high_ai_level = high_capability.ai_capability_level();
assert!(matches!(high_ai_level, CapabilityLevel::High | CapabilityLevel::VeryHigh));
}
}