extern crate riker;
#[macro_use]
extern crate riker_testkit;
#[macro_use]
extern crate riker_patterns;
use riker::actors::*;
use riker_patterns::transform::Receive;
use riker_testkit::probe::channel::{probe, ChannelProbe};
use riker_testkit::probe::{Probe, ProbeReceive};
#[derive(Clone, Debug)]
struct TestProbe(ChannelProbe<(), ProbeMsg>);
#[derive(Clone, Debug, PartialEq)]
enum ProbeMsg {
Ok,
Err,
}
#[derive(Clone, Debug)]
enum MyMsg {
SetPassword(String),
Authenticate(String),
Probe(TestProbe), }
#[allow(dead_code)]
struct UserActor {
username: String,
password: Option<String>,
rec: Receive<UserActor, MyMsg>,
probe: Option<TestProbe>,
}
impl ActorFactoryArgs<String> for UserActor {
fn create_args(username: String) -> Self {
UserActor {
username,
password: None,
rec: Self::created,
probe: None,
}
}
}
impl UserActor {
fn created(&mut self, _ctx: &Context<MyMsg>, msg: MyMsg, _sender: Sender) {
match msg {
MyMsg::SetPassword(passwd) => {
self.password = Some(passwd);
transform!(self, UserActor::active);
}
MyMsg::Authenticate(_passwd) => {
self.probe.as_ref().unwrap().0.event(ProbeMsg::Err);
}
MyMsg::Probe(probe) => {
self.probe = Some(probe);
}
}
}
fn active(&mut self, _ctx: &Context<MyMsg>, msg: MyMsg, _sender: Sender) {
match msg {
MyMsg::Authenticate(_passwd) => {
self.probe.as_ref().unwrap().0.event(ProbeMsg::Ok);
}
MyMsg::SetPassword(passwd) => {
self.password = Some(passwd);
}
_ => {
}
}
}
}
impl Actor for UserActor {
type Msg = MyMsg;
fn recv(&mut self, ctx: &Context<Self::Msg>, msg: Self::Msg, sender: Sender) {
(self.rec)(self, ctx, msg, sender)
}
}
#[test]
fn transform() {
let sys = ActorSystem::new().unwrap();
let actor = sys.actor_of_args::<UserActor, _>("trans", "user123".into()).unwrap();
let (probe, listen) = probe();
actor.tell(MyMsg::Probe(TestProbe(probe)), None);
actor.tell(MyMsg::SetPassword("password123".into()), None);
actor.tell(MyMsg::Authenticate("password123".into()), None);
p_assert_eq!(listen, ProbeMsg::Ok);
}
#[test]
fn transform_incorrect() {
let sys = ActorSystem::new().unwrap();
let actor = sys.actor_of_args::<UserActor, _>("trans", "user123".into()).unwrap();
let (probe, listen) = probe();
actor.tell(MyMsg::Probe(TestProbe(probe)), None);
actor.tell(MyMsg::Authenticate("password123".into()), None);
p_assert_eq!(listen, ProbeMsg::Err);
}