#[macro_use]
extern crate riker_testkit;
use actors_rs::*;
use actors_rs::system::ActorSystem;
use riker_testkit::probe::channel::{probe, ChannelProbe};
use riker_testkit::probe::{Probe, ProbeReceive};
#[derive(Clone, Debug)]
pub struct TestProbe(ChannelProbe<(), ()>);
#[derive(Default)]
struct Child;
impl Actor for Child {
type Msg = TestProbe;
fn recv(&mut self, _ctx: &Context<Self::Msg>, msg: Self::Msg, _sender: Sender) {
msg.0.event(());
}
}
#[derive(Default)]
struct SelectTest;
impl Actor for SelectTest {
type Msg = TestProbe;
fn pre_start(&mut self, ctx: &Context<Self::Msg>) {
let _ = ctx.actor_of::<Child>("child_a").unwrap();
let _ = ctx.actor_of::<Child>("child_b").unwrap();
}
fn recv(&mut self, _ctx: &Context<Self::Msg>, msg: Self::Msg, _sender: Sender) {
msg.0.event(());
}
}
#[test]
fn select_child() {
let sys = ActorSystem::new().unwrap();
sys.actor_of::<SelectTest>("select-actor").unwrap();
let (probe, listen) = probe();
let sel = sys.select("select-actor").unwrap();
sel.try_tell(TestProbe(probe), None);
p_assert_eq!(listen, ());
}
#[test]
fn select_child_of_child() {
let sys = ActorSystem::new().unwrap();
sys.actor_of::<SelectTest>("select-actor").unwrap();
std::thread::sleep(std::time::Duration::from_millis(500));
let (probe, listen) = probe();
let sel = sys.select("select-actor/child_a").unwrap();
sel.try_tell(TestProbe(probe), None);
p_assert_eq!(listen, ());
}
#[test]
fn select_all_children_of_child() {
let sys = ActorSystem::new().unwrap();
sys.actor_of::<SelectTest>("select-actor").unwrap();
std::thread::sleep(std::time::Duration::from_millis(500));
let (probe, listen) = probe();
let sel = sys.select("select-actor/*").unwrap();
sel.try_tell(TestProbe(probe.clone()), None);
p_assert_eq!(listen, ());
p_assert_eq!(listen, ());
let sel = sys.select("/user/select-actor/*").unwrap();
sel.try_tell(TestProbe(probe), None);
p_assert_eq!(listen, ());
p_assert_eq!(listen, ());
}
#[derive(Clone, Default)]
struct SelectTest2;
impl Actor for SelectTest2 {
type Msg = TestProbe;
fn pre_start(&mut self, ctx: &Context<Self::Msg>) {
let _ = ctx.actor_of::<Child>("child_a").unwrap();
let _ = ctx.actor_of::<Child>("child_b").unwrap();
}
fn recv(&mut self, ctx: &Context<Self::Msg>, msg: Self::Msg, _sender: Sender) {
let sel = ctx.select("../select-actor/child_a").unwrap();
sel.try_tell(msg.clone(), None);
let sel = ctx.select("child_a").unwrap();
sel.try_tell(msg.clone(), None);
let sel = ctx.select("/user/select-actor/child_a").unwrap();
sel.try_tell(msg.clone(), None);
let sel = ctx.select("/user/select-actor/*").unwrap();
sel.try_tell(msg.clone(), None);
let sel = ctx.select("*").unwrap();
sel.try_tell(msg, None);
}
}
#[test]
fn select_from_context() {
let sys = ActorSystem::new().unwrap();
let actor = sys.actor_of::<SelectTest2>("select-actor").unwrap();
let (probe, listen) = probe();
actor.tell(TestProbe(probe), None);
p_assert_eq!(listen, ());
p_assert_eq!(listen, ());
p_assert_eq!(listen, ());
p_assert_eq!(listen, ());
p_assert_eq!(listen, ());
p_assert_eq!(listen, ());
p_assert_eq!(listen, ());
}
#[test]
fn select_paths() {
let sys = ActorSystem::new().unwrap();
assert!(sys.select("foo/").is_ok());
assert!(sys.select("/foo/").is_ok());
assert!(sys.select("/foo").is_ok());
assert!(sys.select("/foo/..").is_ok());
assert!(sys.select("../foo/").is_ok());
assert!(sys.select("/foo/*").is_ok());
assert!(sys.select("*").is_ok());
assert!(sys.select("foo/`").is_err());
assert!(sys.select("foo/@").is_err());
assert!(sys.select("!").is_err());
assert!(sys.select("foo/$").is_err());
assert!(sys.select("&").is_err());
}