use hypen_engine::{
ir::{Element, Value},
lifecycle::{Module, ModuleInstance},
reactive::Binding,
Engine,
};
use serde_json::json;
#[test]
fn test_engine_tracks_dependencies_after_render() {
let mut engine = Engine::new();
let module_meta = Module::new("TestModule");
let module = ModuleInstance::new(module_meta, json!({"count": 0}));
engine.set_module(module);
let mut element = Element::new("Text");
element.props.insert(
"text".to_string(),
Value::Binding(Binding::state(vec!["count".to_string()])),
);
engine.render(&element);
assert_eq!(
engine.revision(),
1,
"Should have revision 1 after first render"
);
}
#[test]
fn test_engine_update_state_finds_affected_nodes() {
let mut engine = Engine::new();
let module_meta = Module::new("TestModule");
let module = ModuleInstance::new(module_meta, json!({"count": 0}));
engine.set_module(module);
let mut element = Element::new("Text");
element.props.insert(
"text".to_string(),
Value::Binding(Binding::state(vec!["count".to_string()])),
);
engine.render(&element);
assert_eq!(engine.revision(), 1);
engine.update_state(json!({"count": 1}));
assert_eq!(
engine.revision(),
2,
"Revision should increment after state update if dependencies are tracked and patches are generated"
);
}
#[test]
fn test_engine_multiple_state_updates() {
let mut engine = Engine::new();
let module_meta = Module::new("TestModule");
let module = ModuleInstance::new(module_meta, json!({"count": 0}));
engine.set_module(module);
let mut element = Element::new("Text");
element.props.insert(
"text".to_string(),
Value::Binding(Binding::state(vec!["count".to_string()])),
);
engine.render(&element);
assert_eq!(engine.revision(), 1);
engine.update_state(json!({"count": 1}));
assert_eq!(engine.revision(), 2, "First update");
engine.update_state(json!({"count": 2}));
assert_eq!(engine.revision(), 3, "Second update");
engine.update_state(json!({"count": 3}));
assert_eq!(engine.revision(), 4, "Third update");
}