use ai_behavior::{Action, Sequence, State, Success, Wait, WaitForever, WhenAll, While};
use input::{Event, UpdateArgs};
use crate::test_events::TestActions::{Dec, Inc};
#[derive(Clone)]
#[allow(dead_code)]
pub enum TestActions {
Inc,
Dec,
}
fn exec(mut acc: u32, dt: f64, state: &mut State<TestActions, ()>) -> u32 {
let e: Event = UpdateArgs { dt }.into();
state.event(&e, &mut |args| match *args.action {
Inc => {
acc += 1;
(Success, args.dt)
}
Dec => {
acc -= 1;
(Success, args.dt)
}
});
acc
}
#[test]
fn print_2() {
let a: u32 = 0;
let seq = Sequence(vec![Action(Inc), Action(Inc)]);
let mut state = State::new(seq);
let a = exec(a, 0.0, &mut state);
assert_eq!(a, 2);
}
#[test]
fn wait_sec() {
let a: u32 = 0;
let seq = Sequence(vec![Wait(1.0), Action(Inc)]);
let mut state = State::new(seq);
let a = exec(a, 1.0, &mut state);
assert_eq!(a, 1);
}
#[test]
fn wait_half_sec() {
let a: u32 = 0;
let seq = Sequence(vec![Wait(1.0), Action(Inc)]);
let mut state = State::new(seq);
let a = exec(a, 0.5, &mut state);
assert_eq!(a, 0);
let a = exec(a, 0.5, &mut state);
assert_eq!(a, 1);
}
#[test]
fn sequence_of_one_event() {
let a: u32 = 0;
let seq = Sequence(vec![Action(Inc)]);
let mut state = State::new(seq);
let a = exec(a, 1.0, &mut state);
assert_eq!(a, 1);
}
#[test]
fn wait_two_waits() {
let a: u32 = 0;
let seq = Sequence(vec![Wait(0.5), Wait(0.5), Action(Inc)]);
let mut state = State::new(seq);
let a = exec(a, 1.0, &mut state);
assert_eq!(a, 1);
}
#[test]
fn loop_ten_times() {
let a: u32 = 0;
let rep = While(
Box::new(Wait(50.0)),
vec![Wait(0.5), Action(Inc), Wait(0.5)],
);
let mut state = State::new(rep);
let a = exec(a, 10.0, &mut state);
assert_eq!(a, 10);
}
#[test]
fn when_all_wait() {
let a: u32 = 0;
let all = Sequence(vec![
WhenAll(vec![Wait(0.5), Wait(1.0)]),
Action(Inc),
]);
let mut state = State::new(all);
let a = exec(a, 0.5, &mut state);
assert_eq!(a, 0);
let a = exec(a, 0.5, &mut state);
assert_eq!(a, 1);
}
#[test]
fn while_wait_sequence() {
let mut a: u32 = 0;
let w = While(
Box::new(Wait(9.999999)),
vec![Sequence(vec![
Wait(0.5),
Action(Inc),
Wait(0.5),
Action(Inc),
])],
);
let mut state = State::new(w);
for _ in 0..100 {
a = exec(a, 0.1, &mut state);
}
assert_eq!(a, 19);
}
#[test]
fn while_wait_forever_sequence() {
let mut a: u32 = 0;
let w = While(
Box::new(WaitForever),
vec![Sequence(vec![Action(Inc), Wait(1.0)])],
);
let mut state = State::new(w);
a = exec(a, 1.001, &mut state);
assert_eq!(a, 2);
}