#![allow(unused_imports)]
use revue::reactive::*;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
#[test]
fn test_conditional_dependency_tracking() {
let condition = signal(true);
let a = signal(10);
let b = signal(20);
let result = Arc::new(AtomicUsize::new(0));
let run_count = Arc::new(AtomicUsize::new(0));
let res = result.clone();
let count = run_count.clone();
let cond = condition.clone();
let a_clone = a.clone();
let b_clone = b.clone();
let _effect = effect(move || {
let val = if cond.get() {
a_clone.get()
} else {
b_clone.get()
};
res.store(val as usize, Ordering::SeqCst);
count.fetch_add(1, Ordering::SeqCst);
});
assert_eq!(result.load(Ordering::SeqCst), 10);
assert_eq!(run_count.load(Ordering::SeqCst), 1);
a.set(100);
assert_eq!(result.load(Ordering::SeqCst), 100);
assert!(run_count.load(Ordering::SeqCst) >= 2);
let prev_count = run_count.load(Ordering::SeqCst);
b.set(200);
let _ = run_count.load(Ordering::SeqCst) >= prev_count;
condition.set(false);
assert_eq!(result.load(Ordering::SeqCst), 200);
}
#[test]
fn test_nested_conditional_dependencies() {
let flag1 = signal(true);
let flag2 = signal(true);
let a = signal(1);
let b = signal(2);
let c = signal(3);
let d = signal(4);
let result = Arc::new(AtomicUsize::new(0));
let res = result.clone();
let f1 = flag1.clone();
let f2 = flag2.clone();
let a_c = a.clone();
let b_c = b.clone();
let c_c = c.clone();
let d_c = d.clone();
let _effect = effect(move || {
let val = if f1.get() {
if f2.get() {
a_c.get()
} else {
b_c.get()
}
} else {
if f2.get() {
c_c.get()
} else {
d_c.get()
}
};
res.store(val as usize, Ordering::SeqCst);
});
assert_eq!(result.load(Ordering::SeqCst), 1);
flag2.set(false);
assert_eq!(result.load(Ordering::SeqCst), 2);
flag1.set(false);
assert_eq!(result.load(Ordering::SeqCst), 4);
flag2.set(true);
assert_eq!(result.load(Ordering::SeqCst), 3);
}