#![allow(dead_code, unused_variables)]
use rust_pattern_macros::observable;
use rust_patterns::{Observable, Observer, ObserverRegistry};
use std::sync::Arc;
mod external {
use rust_pattern_macros::observable;
#[observable(state = u32, error = String)]
pub struct ExternalObservable {
pub data: u32,
}
}
#[observable(state = u32, error = String)]
struct TestObservable {
data: u32,
}
struct TestObserver {
id: u32,
received_values: Vec<u32>,
}
impl Observer for TestObserver {
type Subject = TestObservable;
fn update(&self, state: &u32) -> Result<(), String> {
Ok(())
}
}
#[test]
fn test_observable_macro_basic() {
let observable = TestObservable {
data: 0,
registry: ObserverRegistry::new(),
};
let _registry = &observable.registry;
fn assert_observable<T: Observable<State = u32, Error = String>>(_: &T) {}
assert_observable(&observable);
println!("Basic observable macro test passed");
}
#[test]
fn test_observable_attach_detach() {
let mut observable = TestObservable {
data: 0,
registry: rust_patterns::ObserverRegistry::new(),
};
let observer = Arc::new(TestObserver {
id: 1,
received_values: Vec::new(),
});
observable.attach(observer.clone());
observable.detach(observer);
println!("Attach/detach test passed");
}
#[test]
fn test_observable_notify() {
let observable = TestObservable {
data: 0,
registry: ObserverRegistry::new(),
};
let result = observable.notify(&42);
assert!(result.is_ok());
println!("Notify test passed");
}
#[test]
fn test_observable_notify_ignore_error() {
let observable = TestObservable {
data: 0,
registry: ObserverRegistry::new(),
};
observable.notify_ignore_error(&42);
println!("Notify ignore error test passed");
}
#[derive(Debug)]
enum TestError {
SomeError,
}
impl std::fmt::Display for TestError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "TestError")
}
}
impl std::error::Error for TestError {}
#[observable(state = String, error = TestError)]
struct CustomErrorObservable {
message: String,
}
#[test]
fn test_custom_error_type() {
let observable = CustomErrorObservable {
message: String::new(),
registry: ObserverRegistry::new(),
};
fn assert_custom_error_observable<T: Observable<State = String, Error = TestError>>(_: &T) {}
assert_custom_error_observable(&observable);
println!("Custom error type test passed");
}
#[observable(state = f64, error = std::io::Error)]
struct MultiParamObservable {
value: f64,
}
#[test]
fn test_multi_param_observable() {
let observable = MultiParamObservable {
value: 0.0,
registry: ObserverRegistry::new(),
};
fn assert_multi_param_observable<T: Observable<State = f64, Error = std::io::Error>>(_: &T) {}
assert_multi_param_observable(&observable);
println!("Multi-parameter observable test passed");
}
#[test]
fn test_registry_field_visibility() {
let observable = TestObservable {
data: 0,
registry: ObserverRegistry::new(),
};
let _registry = &observable.registry;
println!("Registry field visibility test passed");
}
fn main() {
println!("Running observable macro tests...");
test_observable_macro_basic();
test_observable_attach_detach();
test_observable_notify();
test_observable_notify_ignore_error();
test_custom_error_type();
test_multi_param_observable();
test_registry_field_visibility();
println!("All tests passed!");
}