use rustyphoenixclockbackend::{AbstractClockBackend, AbstractClockMockBackend, SimpleTime};
use rustyphoenixdatastream::{datastream_read, datastream_write};
#[derive(Debug, Default)]
pub struct ClockMockBackend{
is_mock_record: bool,
vec_time: Vec<SimpleTime>,
current_index: usize,
}
impl AbstractClockBackend for ClockMockBackend {
fn new(is_mock_record: bool) -> Self {
let mut mock = ClockMockBackend{
is_mock_record: is_mock_record,
vec_time: vec![],
current_index: 0
};
if !is_mock_record {
let _ = datastream_read(&String::from("clock.clockmock"), &mut mock.vec_time);
}
return mock;
}
fn now(&mut self) -> SimpleTime {
if !self.is_mock_record && self.current_index < self.vec_time.len() {
let current_time = self.vec_time[self.current_index];
self.current_index += 1;
if self.current_index >= self.vec_time.len() {
self.current_index = 0;
}
return current_time;
}
return 0;
}
fn sleep(&self, _ellapsed_sleep_time: SimpleTime){}
}
impl AbstractClockMockBackend for ClockMockBackend{
fn set_time(&mut self, current_time: SimpleTime){
if self.is_mock_record {
self.vec_time.push(current_time);
}
}
fn set_is_record(&mut self, is_mock_record: bool){
if self.is_mock_record == is_mock_record {
return;
}else{
self.is_mock_record = is_mock_record;
if self.is_mock_record {
self.vec_time.resize(0, 0);
}else{
let _ = datastream_write(&String::from("clock.clockmock"), &self.vec_time);
}
self.current_index = 0;
}
}
}
impl Drop for ClockMockBackend {
fn drop(&mut self) {
if self.is_mock_record {
let _ = datastream_write(&String::from("clock.clockmock"), &self.vec_time);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
fn test_mock_record(){
let mut mock = ClockMockBackend::new(true);
mock.set_time(1);
mock.set_time(2);
mock.set_time(3);
mock.set_time(4);
mock.set_time(5);
mock.set_is_record(true);
mock.set_is_record(false);
assert_eq!(mock.now(), 1);
assert_eq!(mock.now(), 2);
assert_eq!(mock.now(), 3);
assert_eq!(mock.now(), 4);
assert_eq!(mock.now(), 5);
mock.sleep(2);
}
fn test_mock_standard(){
let mut mock = ClockMockBackend::new(false);
assert_eq!(mock.now(), 1);
assert_eq!(mock.now(), 2);
assert_eq!(mock.now(), 3);
assert_eq!(mock.now(), 4);
assert_eq!(mock.now(), 5);
mock.set_is_record(true);
mock.set_time(1);
mock.set_time(2);
mock.set_time(3);
mock.set_time(4);
mock.set_time(5);
}
#[test]
fn test_full_mock() {
test_mock_record();
test_mock_standard();
}
}