#[macro_use]
extern crate riker_testkit;
use riker::actors::*;
use riker_testkit::probe::{Probe, ProbeReceive};
use riker_testkit::probe::channel::{probe, ChannelProbe};
#[derive(Clone, Debug)]
pub struct TestProbe(ChannelProbe<(), ()>);
struct Child;
impl Child {
fn new() -> Self {
Child
}
}
impl Actor for Child {
type Msg = TestProbe;
fn recv(&mut self,
_ctx: &Context<Self::Msg>,
msg: Self::Msg,
_sender: Sender) {
msg.0.event(());
}
}
struct SelectTest;
impl SelectTest {
fn new() -> Self {
SelectTest
}
}
impl Actor for SelectTest {
type Msg = TestProbe;
fn pre_start(&mut self, ctx: &Context<Self::Msg>) {
let props = Props::new(Child::new);
let _ = ctx.actor_of(props, "child_a").unwrap();
let props = Props::new(Child::new);
let _ = ctx.actor_of(props, "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();
let props = Props::new(SelectTest::new);
sys.actor_of(props, "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();
let props = Props::new(SelectTest::new);
sys.actor_of(props, "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();
let props = Props::new(SelectTest::new);
sys.actor_of(props, "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)]
struct SelectTest2;
impl SelectTest2 {
fn new() -> Self {
SelectTest2
}
}
impl Actor for SelectTest2 {
type Msg = TestProbe;
fn pre_start(&mut self, ctx: &Context<Self::Msg>) {
let props = Props::new(Child::new);
let _ = ctx.actor_of(props, "child_a").unwrap();
let props = Props::new(Child::new);
let _ = ctx.actor_of(props, "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 props = Props::new(SelectTest2::new);
let actor = sys.actor_of(props, "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());
}