mod common;
use common::*;
use hail_core::types::*;
use std::time::Instant;
#[test]
#[ignore]
fn basic_state_transitions() {
let mut s = init();
assert_eq!(s.changes, vec![StateChange::Reset]);
let now = Instant::now();
s.request(StateChangeRequest::Split); s.update(); assert_eq!(s.changes, vec![StateChange::StartSeg { segment: None }]);
loop {
sleep(10); s.update();
if !s.changes.is_empty() {
assert_eq!(s.changes, vec![StateChange::StartSeg { segment: Some(0) }]);
break;
}
if now.elapsed().as_millis() >= 1300 {
panic!("Offset was not left on time!");
}
}
assert!(!s.in_offset());
same_time!(s.rta.active_time, 0); assert!(now.elapsed().as_millis() >= s.run.offset.val().unsigned_abs());
sleep(100);
s.update();
same_time!(s.rta.active_time, 100); assert_eq!(s.rta.active_pb_status, SplitStatus::Ahead);
sleep(400); s.request(StateChangeRequest::Split); s.update();
assert!(s.is_rta_running()); same_time!(s.rta.active_time, 500);
assert_eq!(
s.changes,
vec![
StateChange::FinishSeg { segment: 0 },
StateChange::ChangeSeg { old: 0, new: 1 },
StateChange::StartSeg { segment: Some(1) }
]
);
same_time!(s.run.avg_segments(TimingMethod::Rta)[0].val(), 766); same_time!(s.rta.run_pb_diffs.last().unwrap().val(), -500); same_time!(s.rta.run_pb_seg_diffs.last().unwrap().val(), -500);
same_time!(s.rta.run_gold_diffs.last().unwrap().val(), -300); same_time!(s.rta.run_gold_seg_diffs.last().unwrap().val(), -300);
same_time!(s.rta.run_avg_diffs.last().unwrap().val(), -400); same_time!(s.rta.run_avg_seg_diffs.last().unwrap().val(), -400);
assert_eq!(s.rta.run_pb_statuses[0], SplitStatus::Gold); assert_eq!(s.rta.active_pb_status, SplitStatus::Ahead);
s.request(StateChangeRequest::SetComparison(Comparison::Golds));
s.update();
assert_eq!(
s.changes,
vec![StateChange::ChangeComparison {
old: Comparison::PersonalBest,
new: Comparison::Golds
}]
);
s.request(StateChangeRequest::SetComparison(Comparison::PersonalBest));
s.update();
sleep(1400); s.request(StateChangeRequest::Split); s.update();
same_time!(s.rta.active_time, 1900);
assert_eq!(
s.changes,
vec![
StateChange::FinishSeg { segment: 1 },
StateChange::ChangeSeg { old: 1, new: 2 },
StateChange::StartSeg { segment: Some(2) }
]
);
same_time!(s.run.avg_segments(TimingMethod::Rta)[1].val(), 1200); same_time!(s.rta.run_pb_diffs.last().unwrap().val(), -100); same_time!(s.rta.run_pb_seg_diffs.last().unwrap().val(), 400);
same_time!(s.rta.run_gold_diffs.last().unwrap().val(), 1000); same_time!(s.rta.run_gold_seg_diffs.last().unwrap().val(), 1300);
same_time!(s.rta.run_avg_diffs.last().unwrap().val(), 0); same_time!(s.rta.run_avg_seg_diffs.last().unwrap().val(), 400);
assert_eq!(s.rta.active_pb_status, SplitStatus::Ahead); sleep(1150); s.request(StateChangeRequest::Split); s.update();
assert_eq!(*s.rta.run_pb_statuses.last().unwrap(), SplitStatus::Behind);
sleep(50); s.request(StateChangeRequest::Split);
s.update();
assert_eq!(s.changes, vec![StateChange::FinishSeg { segment: 3 }]);
same_time!(s.run.rta_pb_splits[0].val(), 500); same_time!(s.run.rta_pb_splits[1].val(), 1900);
same_time!(s.run.rta_gold_segments[3].val(), 50);
assert_eq!(s.rta.active_pb_status, SplitStatus::Ahead);
}
#[test]
#[ignore]
fn unsplit() {
let mut s = init();
s.request(StateChangeRequest::Split);
s.update();
sleep(2100); s.request(StateChangeRequest::Split);
s.update();
same_time!(s.rta.run_pb_diffs.last().unwrap().val(), -100);
sleep(50); s.request(StateChangeRequest::Split);
s.update();
assert_eq!(s.rta.run_pb_statuses[1], SplitStatus::Gold);
same_time!(s.rta.run_pb_diffs.last().unwrap().val(), -1050);
sleep(1400); s.request(StateChangeRequest::Split);
s.update();
same_time!(s.rta.run_pb_diffs.last().unwrap().val(), -650);
s.request(StateChangeRequest::Unsplit);
s.update();
same_time!(s.rta.run_pb_diffs.last().unwrap().val(), -1050); assert_eq!(s.rta.run_split_times.len(), 2);
assert_eq!(s.rta.run_pb_diffs.len(), 2);
assert_eq!(s.rta.run_gold_diffs.len(), 2);
assert_eq!(s.rta.run_avg_diffs.len(), 2);
assert_eq!(s.rta.run_pb_statuses.len(), 2);
assert_eq!(s.current_seg, 2);
assert_eq!(s.run.avg_segments(TimingMethod::Rta)[2], TimeType::None); s.request(StateChangeRequest::Unsplit);
s.update();
same_time!(s.rta.run_pb_diffs.last().unwrap().val(), -100);
assert_eq!(s.rta.run_split_times.len(), 1);
assert_eq!(s.rta.run_pb_diffs.len(), 1);
assert_eq!(s.rta.run_gold_diffs.len(), 1);
assert_eq!(s.rta.run_avg_diffs.len(), 1);
assert_eq!(s.rta.run_pb_statuses.len(), 1);
assert_eq!(s.current_seg, 1);
assert_eq!(s.run.avg_segments(TimingMethod::Rta)[1].val(), 1000);
same_time!(s.run.rta_gold_segments[1].val(), 100); }
#[test]
#[ignore]
fn empty_run() {
let mut s = init_empty();
s.request(StateChangeRequest::Split);
s.update();
sleep(1000); s.request(StateChangeRequest::Split);
s.update();
same_time!(s.rta.run_split_times[0].val(), 1000);
assert_eq!(s.rta.active_pb_status, SplitStatus::None);
s.request(StateChangeRequest::Reset);
s.update();
same_time!(s.run.rta_gold_segments[0].val(), 1000);
s.request(StateChangeRequest::Split);
s.update();
sleep(1100);
s.request(StateChangeRequest::Split);
s.update();
same_time!(s.run.avg_segments(TimingMethod::Rta)[0].val(), 1050);
}