mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2024-12-23 08:36:31 +00:00
ClockTime: add staturating_{add,sub} and ops tests
This commit is contained in:
parent
ba719ac90c
commit
9efe39ff81
2 changed files with 77 additions and 1 deletions
|
@ -422,7 +422,7 @@ impl Stream for AppSinkStream {
|
||||||
};
|
};
|
||||||
|
|
||||||
app_sink
|
app_sink
|
||||||
.try_pull_sample(gst::ClockTime::from_mseconds(0))
|
.try_pull_sample(gst::ClockTime::zero())
|
||||||
.map(|sample| Poll::Ready(Some(sample)))
|
.map(|sample| Poll::Ready(Some(sample)))
|
||||||
.unwrap_or_else(|| {
|
.unwrap_or_else(|| {
|
||||||
if app_sink.is_eos() {
|
if app_sink.is_eos() {
|
||||||
|
|
|
@ -64,11 +64,44 @@ impl ClockTime {
|
||||||
nseconds * ::NSECOND
|
nseconds * ::NSECOND
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn zero() -> ClockTime {
|
||||||
|
ClockTime(Some(0))
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME `matches!` was introduced in rustc 1.42.0, current MSRV is 1.41.0
|
||||||
|
#[allow(clippy::match_like_matches_macro)]
|
||||||
|
pub fn is_zero(&self) -> bool {
|
||||||
|
match self.0 {
|
||||||
|
Some(0) => true,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn none() -> ClockTime {
|
pub fn none() -> ClockTime {
|
||||||
ClockTime(None)
|
ClockTime(None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ClockTime {
|
||||||
|
#[must_use = "this returns the result of the operation, without modifying the original"]
|
||||||
|
#[inline]
|
||||||
|
pub fn saturating_add(self, rhs: ClockTime) -> Option<ClockTime> {
|
||||||
|
match (self.0, rhs.0) {
|
||||||
|
(Some(this), Some(rhs)) => Some(ClockTime(Some(this.saturating_add(rhs)))),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use = "this returns the result of the operation, without modifying the original"]
|
||||||
|
#[inline]
|
||||||
|
pub fn saturating_sub(self, rhs: ClockTime) -> Option<ClockTime> {
|
||||||
|
match (self.0, rhs.0) {
|
||||||
|
(Some(this), Some(rhs)) => Some(ClockTime(Some(this.saturating_sub(rhs)))),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl fmt::Display for ClockTime {
|
impl fmt::Display for ClockTime {
|
||||||
#[allow(clippy::many_single_char_names)]
|
#[allow(clippy::many_single_char_names)]
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
||||||
|
@ -187,3 +220,46 @@ impl convert::TryFrom<ClockTime> for Duration {
|
||||||
.ok_or_else(|| glib_bool_error!("Can't convert ClockTime::NONE to Duration"))
|
.ok_or_else(|| glib_bool_error!("Can't convert ClockTime::NONE to Duration"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[allow(clippy::eq_op)]
|
||||||
|
fn ops() {
|
||||||
|
let ct_10 = ClockTime::from_mseconds(10);
|
||||||
|
let ct_20 = ClockTime::from_mseconds(20);
|
||||||
|
let ct_30 = ClockTime::from_mseconds(30);
|
||||||
|
|
||||||
|
let ct_none = ClockTime::none();
|
||||||
|
|
||||||
|
assert_eq!(ct_10 + ct_20, ct_30);
|
||||||
|
assert_eq!(ct_10 + ct_none, ct_none);
|
||||||
|
assert_eq!(ct_none + ct_10, ct_none);
|
||||||
|
assert_eq!(ct_none + ct_none, ct_none);
|
||||||
|
|
||||||
|
assert_eq!(ct_30 - ct_20, ct_10);
|
||||||
|
assert_eq!(ct_30 - ct_30, ClockTime::zero());
|
||||||
|
assert_eq!(ct_30 - ct_none, ct_none);
|
||||||
|
assert_eq!(ct_none - ct_30, ct_none);
|
||||||
|
assert_eq!(ct_none - ct_none, ct_none);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn saturating_ops() {
|
||||||
|
let ct_1 = ClockTime::from_nseconds(1);
|
||||||
|
let ct_2 = ClockTime::from_nseconds(2);
|
||||||
|
|
||||||
|
let ct_max = ClockTime::from_nseconds(std::u64::MAX);
|
||||||
|
let ct_none = ClockTime::none();
|
||||||
|
|
||||||
|
assert_eq!(ct_max.saturating_add(ct_1), Some(ct_max));
|
||||||
|
assert!(ct_max.saturating_add(ct_none).is_none());
|
||||||
|
assert!(ct_none.saturating_add(ct_max).is_none());
|
||||||
|
|
||||||
|
assert!(ct_1.saturating_sub(ct_2).unwrap().is_zero());
|
||||||
|
assert!(ct_1.saturating_sub(ct_none).is_none());
|
||||||
|
assert!(ct_none.saturating_sub(ct_1).is_none());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue