#![doc(html_logo_url =
"https://raw.githubusercontent.com/maidsafe/QA/master/Images/maidsafe_logo.png",
html_favicon_url = "https://maidsafe.net/img/favicon.ico",
html_root_url = "https://docs.rs/fake_clock")]
#![forbid(bad_style, exceeding_bitshifts, mutable_transmutes, no_mangle_const_items,
unknown_crate_types, warnings)]
#![deny(deprecated, improper_ctypes, missing_docs,
non_shorthand_field_patterns, overflowing_literals, plugin_as_library,
private_no_mangle_fns, private_no_mangle_statics, stable_features, unconditional_recursion,
unknown_lints, unsafe_code, unused, unused_allocation, unused_attributes,
unused_comparisons, unused_features, unused_parens, while_true)]
#![warn(trivial_casts, trivial_numeric_casts, unused_extern_crates, unused_import_braces,
unused_qualifications, unused_results)]
#![allow(box_pointers, missing_copy_implementations, missing_debug_implementations,
variant_size_differences)]
use std::cell::RefCell;
use std::cmp::Ordering;
use std::fmt;
use std::ops::{Add, Sub};
use std::time::Duration;
#[derive(Clone, Copy)]
pub struct FakeClock {
time_created: u64,
}
thread_local!{
static LOCAL_TIME: RefCell<u64> = RefCell::new(0);
}
impl FakeClock {
pub fn set_time(time: u64) {
LOCAL_TIME.with(|t| { *t.borrow_mut() = time; });
}
pub fn advance_time(millis: u64) {
LOCAL_TIME.with(|t| { *t.borrow_mut() += millis; });
}
pub fn time() -> u64 {
LOCAL_TIME.with(|t| *t.borrow())
}
pub fn now() -> Self {
let time = Self::time();
FakeClock { time_created: time }
}
pub fn duration_since(&self, earlier: &Self) -> Duration {
Duration::from_millis(self.time_created - earlier.time_created)
}
pub fn elapsed(&self) -> Duration {
Duration::from_millis(Self::time() - self.time_created)
}
}
impl PartialEq for FakeClock {
fn eq(&self, other: &FakeClock) -> bool {
self.time_created == other.time_created
}
}
impl Eq for FakeClock {}
impl PartialOrd for FakeClock {
fn partial_cmp(&self, other: &FakeClock) -> Option<Ordering> {
self.time_created.partial_cmp(&other.time_created)
}
}
impl Ord for FakeClock {
fn cmp(&self, other: &FakeClock) -> Ordering {
self.time_created.cmp(&other.time_created)
}
}
impl fmt::Debug for FakeClock {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(
formatter,
"FakeClock {{ time_created: {} }}",
self.time_created
)
}
}
impl Add<Duration> for FakeClock {
type Output = FakeClock;
fn add(mut self, other: Duration) -> FakeClock {
self.time_created += other.as_secs() * 1000 + u64::from(other.subsec_nanos()) / 1_000_000;
self
}
}
impl Sub<Duration> for FakeClock {
type Output = FakeClock;
fn sub(mut self, other: Duration) -> FakeClock {
self.time_created -= other.as_secs() * 1000 + u64::from(other.subsec_nanos()) / 1_000_000;
self
}
}
impl Sub<FakeClock> for FakeClock {
type Output = Duration;
fn sub(self, other: FakeClock) -> Duration {
Duration::from_millis(self.time_created - other.time_created)
}
}