use super::orbit_app::OrbitApp;
use super::tsp_app::TspApp;
use crossterm::event::KeyCode;
#[test]
fn test_orbit_app_lifecycle() {
let mut app = OrbitApp::new();
assert!(!app.paused);
assert!(!app.should_quit);
assert_eq!(app.frame_count, 0);
for _ in 0..5 {
app.update();
}
assert_eq!(app.frame_count, 5);
app.handle_key(KeyCode::Char(' '));
assert!(app.paused);
let frame_before = app.frame_count;
app.update();
assert_eq!(app.frame_count, frame_before);
app.handle_key(KeyCode::Char('r'));
assert_eq!(app.frame_count, 0);
app.handle_key(KeyCode::Char('q'));
assert!(app.should_quit);
}
#[test]
fn test_tsp_app_lifecycle() {
let mut app = TspApp::new(15, 42);
assert!(app.auto_run);
assert!(!app.paused);
assert!(!app.should_quit());
assert_eq!(app.demo.n, 15);
for _ in 0..5 {
app.step();
}
assert_eq!(app.frame_count, 5);
assert!(app.convergence_history.len() >= 5);
app.handle_key(KeyCode::Char(' '));
assert!(!app.auto_run);
assert!(app.paused);
let restarts_before = app.demo.restarts;
app.handle_key(KeyCode::Char('g'));
assert!(app.demo.restarts > restarts_before);
app.handle_key(KeyCode::Char('r'));
assert_eq!(app.frame_count, 0);
app.handle_key(KeyCode::Char('q'));
assert!(app.should_quit());
}
#[test]
fn test_orbit_jidoka_status_preserved() {
let mut app = OrbitApp::new();
app.update();
let status = app.jidoka_status();
assert!(status.finite_ok);
}
#[test]
fn test_tsp_equation_verification() {
let mut app = TspApp::new(20, 42);
for _ in 0..10 {
app.step();
}
assert!(app.verify_equation());
let gap = app.optimality_gap();
assert!(gap < 1.0);
}
#[test]
fn test_orbit_energy_conservation() {
let mut app = OrbitApp::new();
let initial_energy = app.total_energy();
for _ in 0..10 {
app.update();
}
let final_energy = app.total_energy();
let relative_error = ((final_energy - initial_energy) / initial_energy).abs();
assert!(relative_error < 0.01, "Energy drift: {relative_error:.6}");
}