#[cfg(test)]
mod tests {
use crate::pts::{PtsCheckResult, PtsState};
use std::collections::{HashMap, HashSet};
fn fresh(pts: i32) -> PtsState {
PtsState {
pts,
qts: 0,
date: 0,
seq: 0,
channel_pts: HashMap::new(),
last_update_at: None,
getting_diff_for: HashSet::new(),
getting_global_diff: false,
}
}
#[test]
fn global_in_order() {
let state = fresh(100);
assert_eq!(state.check_pts(102, 2), PtsCheckResult::Ok);
}
#[test]
fn global_gap() {
let state = fresh(100);
assert_eq!(
state.check_pts(105, 1),
PtsCheckResult::Gap {
expected: 101,
got: 105
}
);
}
#[test]
fn global_duplicate() {
let state = fresh(100);
assert_eq!(state.check_pts(99, 1), PtsCheckResult::Duplicate);
}
#[test]
fn global_advance_monotone() {
let mut state = fresh(50);
state.advance(60);
assert_eq!(state.pts, 60);
state.advance(55);
assert_eq!(state.pts, 60);
}
#[test]
fn global_pts_zero_is_uninitialised() {
let state = fresh(0);
assert_eq!(state.check_pts(5, 5), PtsCheckResult::Ok);
}
#[test]
fn qts_in_order() {
let mut state = fresh(0);
state.qts = 10;
assert_eq!(state.check_qts(11, 1), PtsCheckResult::Ok);
}
#[test]
fn qts_gap() {
let mut state = fresh(0);
state.qts = 10;
assert_eq!(
state.check_qts(15, 1),
PtsCheckResult::Gap {
expected: 11,
got: 15
}
);
}
#[test]
fn qts_duplicate() {
let mut state = fresh(0);
state.qts = 10;
assert_eq!(state.check_qts(9, 1), PtsCheckResult::Duplicate);
}
#[test]
fn seq_uninitialised_accepts_any() {
let mut state = fresh(0);
state.seq = 0;
assert_eq!(state.check_seq(5, 5), PtsCheckResult::Ok);
}
#[test]
fn seq_in_order() {
let mut state = fresh(0);
state.seq = 5;
assert_eq!(state.check_seq(6, 6), PtsCheckResult::Ok);
}
#[test]
fn seq_gap() {
let mut state = fresh(0);
state.seq = 5;
assert_eq!(
state.check_seq(8, 8),
PtsCheckResult::Gap {
expected: 6,
got: 8
}
);
}
#[test]
fn seq_duplicate() {
let mut state = fresh(0);
state.seq = 5;
assert_eq!(state.check_seq(5, 4), PtsCheckResult::Duplicate);
}
#[test]
fn channel_unseen_accepts_any() {
let state = fresh(0);
assert_eq!(state.check_channel_pts(999, 10, 1), PtsCheckResult::Ok);
}
#[test]
fn channel_in_order() {
let mut state = fresh(0);
state.channel_pts.insert(42, 100);
assert_eq!(state.check_channel_pts(42, 101, 1), PtsCheckResult::Ok);
}
#[test]
fn channel_gap() {
let mut state = fresh(0);
state.channel_pts.insert(42, 100);
assert_eq!(
state.check_channel_pts(42, 105, 1),
PtsCheckResult::Gap {
expected: 101,
got: 105
}
);
}
#[test]
fn channel_duplicate() {
let mut state = fresh(0);
state.channel_pts.insert(42, 100);
assert_eq!(
state.check_channel_pts(42, 99, 1),
PtsCheckResult::Duplicate
);
}
#[test]
fn channel_advance_independent() {
let mut state = fresh(100);
state.channel_pts.insert(1, 50);
state.channel_pts.insert(2, 200);
state.advance_channel(1, 55);
assert_eq!(state.channel_pts[&1], 55);
assert_eq!(state.channel_pts[&2], 200); assert_eq!(state.pts, 100); }
#[test]
fn channel_advance_monotone() {
let mut state = fresh(0);
state.channel_pts.insert(7, 80);
state.advance_channel(7, 90);
state.advance_channel(7, 85); assert_eq!(state.channel_pts[&7], 90);
}
#[test]
fn getting_diff_for_starts_empty() {
let state = fresh(0);
assert!(!state.getting_diff_for.contains(&42));
}
#[test]
fn getting_diff_for_insert_remove() {
let mut state = fresh(0);
state.getting_diff_for.insert(42);
assert!(state.getting_diff_for.contains(&42));
state.getting_diff_for.remove(&42);
assert!(!state.getting_diff_for.contains(&42));
}
#[test]
fn getting_diff_for_independent_channels() {
let mut state = fresh(0);
state.getting_diff_for.insert(1);
state.getting_diff_for.insert(2);
assert!(state.getting_diff_for.contains(&1));
assert!(state.getting_diff_for.contains(&2));
state.getting_diff_for.remove(&1);
assert!(!state.getting_diff_for.contains(&1));
assert!(state.getting_diff_for.contains(&2)); }
#[test]
fn deadline_not_exceeded_when_uninitialised() {
let state = fresh(0);
assert!(!state.deadline_exceeded());
}
#[test]
fn deadline_not_exceeded_when_recently_touched() {
let mut state = fresh(0);
state.touch();
assert!(!state.deadline_exceeded());
}
}