#![allow(clippy::pedantic, clippy::assertions_on_constants)]
use quantrs2::config::Config;
use quantrs2::diagnostics;
use quantrs2::error::QuantRS2Result;
use quantrs2::utils;
use quantrs2::version;
mod workflow_validation {
use super::*;
#[test]
fn test_system_readiness_workflow() {
let version_check = version::check_compatibility();
assert!(
version_check.is_ok(),
"Version compatibility check failed: {version_check:?}"
);
let report = diagnostics::run_diagnostics();
assert!(
report.errors().is_empty(),
"System has critical errors: {:?}",
report.errors()
);
let memory_mb = report.capabilities.total_memory_bytes / (1024 * 1024);
let has_enough_memory = memory_mb >= 1024; let has_cpu_cores = report.capabilities.cpu_cores >= 1;
assert!(
has_enough_memory,
"Insufficient memory for quantum computation"
);
assert!(has_cpu_cores, "No CPU cores detected");
println!("✅ System readiness workflow: PASSED");
println!(" - Memory: {memory_mb} MB");
println!(" - CPU cores: {}", report.capabilities.cpu_cores);
}
#[test]
fn test_configuration_workflow() {
let cfg = Config::global();
let default_threads = 4;
let default_memory_gb = 8;
cfg.set_num_threads(default_threads);
cfg.set_memory_limit_gb(default_memory_gb);
let config_snapshot = cfg.snapshot();
assert_eq!(
config_snapshot.num_threads,
Some(default_threads),
"Thread count not set correctly"
);
assert_eq!(
config_snapshot.memory_limit_bytes,
Some(default_memory_gb * 1024 * 1024 * 1024),
"Memory limit not set correctly"
);
let max_qubits = utils::max_qubits_for_memory(default_memory_gb * 1024 * 1024 * 1024);
assert!(
max_qubits >= 10,
"Configuration should support at least 10 qubits"
);
println!("✅ Configuration workflow: PASSED");
println!(" - Threads: {default_threads}");
println!(" - Memory limit: {default_memory_gb} GB");
println!(" - Max qubits: {max_qubits}");
}
}
mod memory_planning_workflow {
use super::*;
#[test]
fn test_memory_estimation_workflow() {
let report = diagnostics::run_diagnostics();
let available_memory_bytes = report.capabilities.total_memory_bytes;
let available_memory_mb = available_memory_bytes / (1024 * 1024);
let usable_memory = ((available_memory_bytes as f64) * 0.8) as usize;
let max_qubits = utils::max_qubits_for_memory(usable_memory);
assert!(
max_qubits >= 5,
"Should be able to simulate at least 5 qubits"
);
assert!(
max_qubits <= 40,
"Max qubits seems unrealistic: {max_qubits}"
);
let test_qubits = vec![10, 15, 20, 25];
let mut feasible_simulations = Vec::new();
for &qubits in &test_qubits {
let required = utils::estimate_statevector_memory(qubits);
if required <= usable_memory {
feasible_simulations.push(qubits);
}
}
assert!(
!feasible_simulations.is_empty(),
"Should be able to run at least one simulation"
);
println!("✅ Memory estimation workflow: PASSED");
println!(" - Available memory: {available_memory_mb} MB");
println!(" - Max qubits: {max_qubits}");
println!(" - Feasible simulations: {feasible_simulations:?} qubits");
}
#[test]
fn test_capacity_planning_workflow() {
let target_qubits = 20;
let target_shots = 1000;
let memory_needed = utils::estimate_statevector_memory(target_qubits);
let memory_needed_mb = memory_needed / (1024 * 1024);
let report = diagnostics::run_diagnostics();
let available_mb = (report.capabilities.total_memory_bytes / (1024 * 1024)) as usize;
let is_feasible = memory_needed_mb < (((available_mb as f64) * 0.8) as usize);
if is_feasible {
println!("✅ Capacity planning: FEASIBLE");
println!(" - Target: {target_qubits} qubits, {target_shots} shots");
println!(" - Required: {memory_needed_mb} MB");
println!(" - Available: {available_mb} MB");
} else {
println!("⚠️ Capacity planning: NOT FEASIBLE");
println!(" - Target: {target_qubits} qubits, {target_shots} shots");
println!(" - Required: {memory_needed_mb} MB");
println!(" - Available: {available_mb} MB");
println!(" - Recommendation: Use tensor network or reduce qubit count");
}
assert!(true, "Capacity planning workflow completed");
}
}
mod error_handling_workflow {
use super::*;
use quantrs2::error::{ErrorCategory, QuantRS2ErrorExt};
#[test]
fn test_error_categorization_workflow() {
let errors = vec![
quantrs2::error::QuantRS2Error::InvalidQubitId(999),
quantrs2::error::QuantRS2Error::InvalidInput("Test error for workflow".to_string()),
];
for error in errors {
let category = error.category();
let is_recoverable = error.is_recoverable();
let user_msg = error.user_message();
match category {
ErrorCategory::Core => {
assert!(
!user_msg.is_empty(),
"Core errors should have user messages"
);
}
ErrorCategory::Circuit => {
assert!(
!user_msg.is_empty(),
"Circuit errors should have user messages"
);
}
_ => {}
}
println!("✅ Error handled: {category:?}");
println!(" - Recoverable: {is_recoverable}");
println!(" - Message: {user_msg}");
}
}
#[test]
fn test_error_context_workflow() {
use quantrs2::error::with_context;
let base_error = quantrs2::error::QuantRS2Error::InvalidQubitId(10);
let error_with_context = with_context(base_error, "in quantum algorithm layer 3");
let error_with_full_context =
with_context(error_with_context, "while executing VQE optimization");
let error_display = format!("{error_with_full_context}");
assert!(
!error_display.is_empty(),
"Error should have a display representation"
);
println!("✅ Error context workflow: PASSED");
println!(" - Error with context: {error_with_full_context}");
}
}
mod version_compatibility_workflow {
use super::*;
#[test]
fn test_version_info_workflow() {
let version_info = version::VersionInfo::current();
let quantrs2_version = &version_info.quantrs2;
let scirs2_version = &version_info.scirs2;
assert!(
!quantrs2_version.is_empty(),
"QuantRS2 version should not be empty"
);
assert!(
!scirs2_version.is_empty(),
"SciRS2 version should not be empty"
);
assert!(
quantrs2_version.contains('.'),
"Version should follow semantic versioning"
);
let detailed = version_info.detailed_version_string();
assert!(
detailed.contains("QuantRS2"),
"Detailed version should mention QuantRS2"
);
println!("✅ Version info workflow: PASSED");
println!(" - QuantRS2: {quantrs2_version}");
println!(" - SciRS2: {scirs2_version}");
}
#[test]
fn test_compatibility_validation_workflow() {
let compat_result = version::check_compatibility();
match compat_result {
Ok(()) => {
println!("✅ Compatibility validation: PASSED");
println!(" - All dependencies compatible");
}
Err(issues) => {
println!("⚠️ Compatibility validation: ISSUES FOUND");
for issue in issues {
println!(" - {issue}");
}
}
}
assert!(true, "Compatibility check workflow completed");
}
}
mod utility_functions_workflow {
use super::*;
#[test]
fn test_quantum_math_workflow() {
let mut probabilities = vec![0.3, 0.5, 0.1];
let was_normalized = utils::normalize_probabilities(&mut probabilities);
assert!(was_normalized, "Probabilities should be normalizable");
let sum: f64 = probabilities.iter().sum();
assert!(
(sum - 1.0).abs() < 1e-10,
"Normalized probabilities should sum to 1"
);
for &p in &probabilities {
assert!(
utils::is_valid_probability(p),
"Probability should be valid"
);
assert!(
utils::clamp_probability(p) == p,
"Valid probability should not be clamped"
);
}
let entropy = utils::entropy(&probabilities);
assert!(entropy >= 0.0, "Entropy should be non-negative");
assert!(entropy <= 2.0, "Entropy should be bounded");
println!("✅ Quantum math workflow: PASSED");
println!(" - Original: {:?}", vec![0.3, 0.5, 0.1]);
println!(" - Normalized: {probabilities:?}");
println!(" - Entropy: {entropy:.6}");
}
#[test]
fn test_hilbert_space_workflow() {
let test_cases = vec![1, 2, 3, 5, 10];
for qubits in test_cases {
let dim = utils::hilbert_dim(qubits);
let expected = 2_usize.pow(qubits);
assert_eq!(
dim, expected,
"Hilbert dimension incorrect for {qubits} qubits"
);
let recovered_qubits = utils::num_qubits_from_dim(dim);
assert_eq!(
recovered_qubits,
Some(qubits),
"Could not recover qubit count from dimension"
);
}
println!("✅ Hilbert space workflow: PASSED");
println!(" - Tested qubit counts: 1-10");
}
#[test]
fn test_formatting_workflow() {
use std::time::Duration;
let memory_values = vec![
(1024, "1.00 KB"),
(1024 * 1024, "1.00 MB"),
(1024 * 1024 * 1024, "1.00 GB"),
];
for (bytes, expected_prefix) in memory_values {
let formatted = utils::format_memory(bytes);
assert!(
formatted.contains(expected_prefix.split_whitespace().next().unwrap()),
"Memory formatting incorrect: expected {expected_prefix}, got {formatted}"
);
}
let duration_tests = vec![
Duration::from_millis(500),
Duration::from_secs(2),
Duration::from_secs(65),
];
for duration in duration_tests {
let formatted = utils::format_duration(duration);
assert!(
!formatted.is_empty(),
"Duration formatting should not be empty"
);
}
println!("✅ Formatting workflow: PASSED");
}
}
mod complete_application_workflow {
use super::*;
#[test]
fn test_complete_initialization_workflow() {
println!("\n========================================");
println!("Complete Application Workflow Test");
println!("========================================\n");
println!("Starting Quantum Computing Application...\n");
println!("📦 Checking versions...");
let version_info = version::VersionInfo::current();
println!(" QuantRS2: {}", version_info.quantrs2);
println!(" SciRS2: {}", version_info.scirs2);
let compat_check = version::check_compatibility();
match compat_check {
Ok(()) => println!(" ✅ Compatibility: OK"),
Err(issues) => {
println!(" ⚠️ Compatibility issues:");
for issue in issues {
println!(" - {issue}");
}
}
}
println!("\n🔍 Running system diagnostics...");
let report = diagnostics::run_diagnostics();
println!(" CPU cores: {}", report.capabilities.cpu_cores);
println!(
" Memory: {} MB",
report.capabilities.total_memory_bytes / (1024 * 1024)
);
println!(
" GPU: {}",
if report.capabilities.has_gpu {
"✅"
} else {
"❌"
}
);
println!(
" SIMD (AVX2): {}",
if report.capabilities.has_avx2 {
"✅"
} else {
"❌"
}
);
if !report.errors().is_empty() {
println!(" ⚠️ Errors found:");
for error in report.errors() {
println!(" - {error}");
}
}
println!("\n⚙️ Configuring system...");
let cfg = Config::global();
cfg.set_num_threads(4);
cfg.set_memory_limit_gb(8);
let config_data = cfg.snapshot();
println!(" Threads: {}", config_data.num_threads.unwrap_or(4));
let mem_limit_gb = config_data
.memory_limit_bytes
.map_or(8, |b| b / (1024 * 1024 * 1024));
println!(" Memory limit: {mem_limit_gb} GB");
println!("\n📊 Planning simulation capacity...");
let max_qubits = utils::max_qubits_for_memory(8 * 1024 * 1024 * 1024);
println!(" Max qubits: {max_qubits}");
let test_qubit_counts = vec![5, 10, 15, 20];
for &qubits in &test_qubit_counts {
let memory = utils::estimate_statevector_memory(qubits);
let memory_mb = memory / (1024 * 1024);
let feasible = memory_mb < 8 * 1024;
println!(
" {} qubits: {} MB {}",
qubits,
memory_mb,
if feasible { "✅" } else { "❌" }
);
}
println!("\n✅ Application initialization complete!");
println!(" Ready for quantum computation.\n");
println!("========================================\n");
assert!(
report.capabilities.cpu_cores >= 1,
"Need at least 1 CPU core"
);
assert!(max_qubits >= 5, "Should support at least 5 qubits");
}
#[test]
fn test_graceful_degradation_workflow() {
println!("\n========================================");
println!("Graceful Degradation Workflow Test");
println!("========================================\n");
let report = diagnostics::run_diagnostics();
if report.capabilities.has_gpu {
println!("✅ GPU available: Using GPU acceleration");
} else {
println!("⚠️ No GPU: Falling back to CPU simulation");
}
if report.capabilities.has_avx2 {
println!("✅ AVX2 available: Using vectorized operations");
} else {
println!("⚠️ No SIMD: Using scalar operations (SSE2 detection not exposed)");
}
let available_mb = report.capabilities.total_memory_bytes / (1024 * 1024);
if available_mb >= 16 * 1024 {
println!("✅ High memory: Can simulate large circuits (25+ qubits)");
} else if available_mb >= 8 * 1024 {
println!("⚠️ Medium memory: Limited to medium circuits (20-25 qubits)");
} else {
println!("⚠️ Low memory: Limited to small circuits (<20 qubits)");
}
println!("\n✅ Graceful degradation strategy determined");
println!("========================================\n");
assert!(true, "Degradation workflow completed");
}
}
#[test]
fn test_all_workflows_integration() {
println!("\n╔═══════════════════════════════════════════════════════════╗");
println!("║ End-to-End Workflow Integration Test Suite ║");
println!("╚═══════════════════════════════════════════════════════════╝\n");
let workflow_count = 12;
println!("✅ {workflow_count} end-to-end workflow tests defined");
println!("✅ All workflows use quantrs2 facade consistently");
println!("✅ Tests cover: initialization, configuration, error handling, capacity planning");
println!("\nRun individual workflow tests with:");
println!(" cargo test --test integration_end_to_end_workflows -- --nocapture\n");
}