#[cfg(test)]
mod tests {
use std::cell::Cell;
use std::rc::Rc;
use crate::signal::Signal;
use crate::computed::create_computed;
#[test]
fn test_computed_signal() {
let counter = Signal::new(5);
let counter_for_computed = counter.clone();
let doubled = create_computed(move || {
let counter_value = *counter_for_computed.get().borrow();
counter_value * 2
});
assert_eq!(doubled.value(), 10);
counter.set(7);
assert_eq!(doubled.value(), 14);
counter.set(15);
assert_eq!(doubled.value(), 30);
}
#[test]
fn test_computed_with_dependencies() {
let a = Signal::new(1);
let b = Signal::new(2);
let a_for_computed = a.clone();
let b_for_computed = b.clone();
let sum = create_computed(move || {
let a_val = *a_for_computed.get().borrow();
let b_val = *b_for_computed.get().borrow();
a_val + b_val
});
assert_eq!(sum.value(), 3);
a.set(5);
assert_eq!(sum.value(), 7);
b.set(10);
assert_eq!(sum.value(), 15);
a.set(20);
b.set(30);
assert_eq!(sum.value(), 50);
}
#[test]
fn test_computed_caching() {
let computation_count = Rc::new(Cell::new(0));
let signal = Signal::new(1);
let signal_for_computed = signal.clone();
let computation_count_clone = computation_count.clone();
let computed = create_computed(move || {
computation_count_clone.set(computation_count_clone.get() + 1);
*signal_for_computed.get().borrow() * 2
});
assert_eq!(computed.value(), 2);
assert_eq!(computation_count.get(), 1);
assert_eq!(computed.value(), 2);
assert_eq!(computation_count.get(), 1);
signal.set(10);
assert_eq!(computed.value(), 20);
assert_eq!(computation_count.get(), 2);
}
#[test]
fn test_nested_computed() {
let base = Signal::new(1);
let base_for_doubled = base.clone();
let doubled = create_computed(move || {
*base_for_doubled.get().borrow() * 2
});
let doubled_for_nested = doubled.signal().clone();
let nested = create_computed(move || {
*doubled_for_nested.get().borrow() + 10
});
assert_eq!(doubled.value(), 2);
assert_eq!(nested.value(), 12);
base.set(5);
assert_eq!(doubled.value(), 10);
assert_eq!(nested.value(), 20);
}
}