#![cfg_attr(coverage_nightly, coverage(off))]
use std::time::Duration;
use crate::pal::abstractions::Platform;
#[cfg(test)]
use crate::pal::fake::FakePlatform;
use crate::pal::real::RealPlatform;
#[derive(Clone, Debug)]
pub(crate) enum PlatformFacade {
Real(RealPlatform),
#[cfg(test)]
Fake(FakePlatform),
}
impl PlatformFacade {
pub(crate) fn real() -> Self {
Self::Real(RealPlatform)
}
#[cfg(test)]
pub(crate) fn fake(fake_platform: FakePlatform) -> Self {
Self::Fake(fake_platform)
}
}
impl Platform for PlatformFacade {
fn thread_time(&self) -> Duration {
match self {
Self::Real(platform) => platform.thread_time(),
#[cfg(test)]
Self::Fake(platform) => platform.thread_time(),
}
}
fn process_time(&self) -> Duration {
match self {
Self::Real(platform) => platform.process_time(),
#[cfg(test)]
Self::Fake(platform) => platform.process_time(),
}
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
#[test]
fn creates_real_facade() {
let facade = PlatformFacade::real();
matches!(facade, PlatformFacade::Real(_));
}
#[test]
fn creates_fake_facade() {
let fake_platform = FakePlatform::new();
let facade = PlatformFacade::fake(fake_platform);
matches!(facade, PlatformFacade::Fake(_));
}
#[test]
fn delegates_thread_time() {
let fake_platform = FakePlatform::new();
fake_platform.set_thread_time(Duration::from_millis(300));
let facade = PlatformFacade::fake(fake_platform);
let time = facade.thread_time();
assert_eq!(time, Duration::from_millis(300));
}
#[test]
fn delegates_process_time() {
let fake_platform = FakePlatform::new();
fake_platform.set_process_time(Duration::from_millis(400));
let facade = PlatformFacade::fake(fake_platform);
let time = facade.process_time();
assert_eq!(time, Duration::from_millis(400));
}
}