use ruchy::wasm::notebook::NotebookRuntime;
#[test]
fn test_basic_state_persistence() {
let mut runtime = NotebookRuntime::new().unwrap();
let result1 = runtime
.execute_cell_with_session("cell1", "let x = 42")
.unwrap();
assert!(result1.success);
assert_eq!(result1.value, "42");
let result2 = runtime.execute_cell_with_session("cell2", "x + 8").unwrap();
assert!(result2.success);
assert_eq!(result2.value, "50");
let result3 = runtime
.execute_cell_with_session("cell3", "let y = x * 2")
.unwrap();
assert!(result3.success);
assert_eq!(result3.value, "84");
let result4 = runtime.execute_cell_with_session("cell4", "x + y").unwrap();
assert!(result4.success);
assert_eq!(result4.value, "126");
}
#[test]
fn test_function_persistence() {
let mut runtime = NotebookRuntime::new().unwrap();
runtime
.execute_cell_with_session("cell1", "fun add(a, b) { a + b }")
.unwrap();
let result = runtime
.execute_cell_with_session("cell2", "add(3, 4)")
.unwrap();
assert!(result.success);
assert_eq!(result.value, "7");
runtime
.execute_cell_with_session("cell3", "fun double_add(a, b) { add(a, b) * 2 }")
.unwrap();
let result = runtime
.execute_cell_with_session("cell4", "double_add(5, 6)")
.unwrap();
assert!(result.success);
assert_eq!(result.value, "22");
}
#[test]
fn test_semantic_dependency_tracking() {
let mut runtime = NotebookRuntime::new().unwrap();
runtime
.execute_cell_with_session("cell1", "let x = 10")
.unwrap();
runtime
.execute_cell_with_session("cell2", "let y = x * 2")
.unwrap();
let graph_json = runtime.get_dependency_graph();
assert!(graph_json.contains("cell1"));
assert!(graph_json.contains("cell2"));
runtime
.execute_cell_with_session("cell3", "let x = 20")
.unwrap();
let provenance_json = runtime.get_cell_provenance("cell2");
assert!(provenance_json.contains("depends_on"));
}
#[test]
fn test_reactive_cascade_execution() {
let mut runtime = NotebookRuntime::new().unwrap();
runtime.set_execution_mode("reactive");
runtime
.execute_cell_with_session("c1", "let x = 10")
.unwrap();
runtime
.execute_cell_with_session("c2", "let y = x * 2")
.unwrap();
runtime
.execute_cell_with_session("c3", "let z = y + 5")
.unwrap();
let responses_json = runtime.execute_reactive("c1", "let x = 20").unwrap();
let responses: serde_json::Value = serde_json::from_str(&responses_json).unwrap();
assert!(responses.is_array());
let responses_array = responses.as_array().unwrap();
assert!(!responses_array.is_empty());
}
#[test]
fn test_transactional_rollback() {
let mut runtime = NotebookRuntime::new().unwrap();
runtime
.execute_cell_with_session("cell1", "let x = 42")
.unwrap();
runtime
.execute_cell_with_session("cell2", "let y = 10")
.unwrap();
let globals_before = runtime.get_globals();
assert!(globals_before.contains('x') || globals_before.contains("values"));
let _result = runtime.execute_cell_with_session("cell3", "let z = x / 0");
let globals_after = runtime.get_globals();
assert!(globals_after.contains('x') || globals_after.contains("values"));
}
#[test]
fn test_cow_checkpoint_performance() {
let mut runtime = NotebookRuntime::new().unwrap();
for i in 0..100 {
runtime
.execute_cell_with_session(&format!("cell_{i}"), &format!("let var_{i} = {i}"))
.ok();
}
let start = std::time::Instant::now();
let _usage = runtime.get_memory_usage();
let duration = start.elapsed();
assert!(duration.as_millis() < 100);
}
#[test]
fn test_hierarchical_modules() {
}
#[test]
fn test_execution_plan_preview() {
let mut runtime = NotebookRuntime::new().unwrap();
runtime
.execute_cell_with_session("c1", "let a = 1")
.unwrap();
runtime
.execute_cell_with_session("c2", "let b = a * 2")
.unwrap();
runtime
.execute_cell_with_session("c3", "let c = b + a")
.unwrap();
runtime
.execute_cell_with_session("c4", "let d = c * 2")
.unwrap();
let plan_json = runtime.explain_reactive("c1");
let plan: serde_json::Value = serde_json::from_str(&plan_json).unwrap();
assert!(plan["primary"].is_string());
assert_eq!(plan["primary"].as_str().unwrap(), "c1");
}
#[test]
fn test_state_inspection_api() {
let mut runtime = NotebookRuntime::new().unwrap();
runtime
.execute_cell_with_session("c1", "let x = 42")
.unwrap();
runtime
.execute_cell_with_session("c2", "let y = x * 2")
.unwrap();
runtime
.execute_cell_with_session("c3", "fun add(a, b) { a + b }")
.unwrap();
let globals_json = runtime.get_globals();
let globals: serde_json::Value = serde_json::from_str(&globals_json).unwrap();
assert!(globals.is_object());
let graph_json = runtime.get_dependency_graph();
let graph: serde_json::Value = serde_json::from_str(&graph_json).unwrap();
assert!(graph["nodes"].is_array());
let provenance_json = runtime.get_cell_provenance("c2");
let provenance: serde_json::Value = serde_json::from_str(&provenance_json).unwrap();
assert!(provenance.is_object());
}
#[test]
fn test_memory_usage_tracking() {
let mut runtime = NotebookRuntime::new().unwrap();
runtime
.execute_cell_with_session("c1", "let data = [1, 2, 3, 4, 5]")
.unwrap();
runtime
.execute_cell_with_session("c2", "let matrix = [[1, 2], [3, 4]]")
.unwrap();
let usage_json = runtime.get_memory_usage();
let usage: serde_json::Value = serde_json::from_str(&usage_json).unwrap();
assert!(usage["globals_bytes"].is_number());
assert!(usage["checkpoints_count"].is_number());
}
#[test]
fn property_no_dependency_cycles() {
}
#[test]
fn property_checkpoint_restore_identity() {
}