#[cfg(test)]
mod tests {
use super::*;
#[test]
fn should_create_an_event_works_test() {
let t = SystemTime::now();
let e = Event::new("Product_Added".to_string(), t);
assert_eq!(e.to_str(), format!("Product_Added [{:?}]", t));
}
#[test]
fn should_create_an_eventqueue_works_test() {
let mut event_queue = EventQueue::new();
assert_eq!(event_queue.count(), 0);
let event_1 = Event::new("Product_Created".to_string(), SystemTime::now());
event_queue.enqueue(event_1);
let event_2 = Event::new("Basket_Refreshed".to_string(), SystemTime::now());
event_queue.enqueue(event_2);
let event_3 = Event::new("Product_Added".to_string(), SystemTime::now());
event_queue.enqueue(event_3);
assert_eq!(event_queue.count(), 3);
}
#[test]
fn should_dequeue_fn_works_test() {
let mut event_queue = EventQueue::new();
let event_1 = Event::new("Product_Created".to_string(), SystemTime::now());
event_queue.enqueue(event_1);
let event_2 = Event::new("Basket_Refreshed".to_string(), SystemTime::now());
event_queue.enqueue(event_2);
let some_event = event_queue.dequeue();
assert_eq!(some_event.name, "Product_Created");
assert_eq!(event_queue.count(), 1);
let other_event = event_queue.dequeue();
assert_eq!(other_event.name, "Basket_Refreshed");
assert_eq!(event_queue.count(), 0);
}
#[test]
fn should_peek_fn_works_test() {
let mut event_queue = EventQueue::new();
let event_1 = Event::new("Product_Created".to_string(), SystemTime::now());
event_queue.enqueue(event_1);
let event_2 = Event::new("Basket_Refreshed".to_string(), SystemTime::now());
event_queue.enqueue(event_2);
let e = event_queue.peek();
assert_eq!(e.unwrap().name, "Product_Created");
event_queue.dequeue();
event_queue.dequeue();
assert_eq!(event_queue.peek(), None);
}
#[test]
#[should_panic]
fn should_dequeue_fn_panic_test() {
let mut event_queue = EventQueue::new();
let event_1 = Event::new("Product_Created".to_string(), SystemTime::now());
event_queue.enqueue(event_1);
event_queue.dequeue();
event_queue.dequeue();
}
}
use std::time::SystemTime;
#[derive(Debug, PartialEq)]
pub struct Event {
pub name: String,
pub time: SystemTime,
}
impl Event {
pub fn new(n: String, t: SystemTime) -> Self {
Event { name: n, time: t }
}
pub fn to_str(&self) -> String {
format!("{} [{:?}]", self.name, self.time)
}
}
pub struct EventQueue {
pub events: Vec<Event>,
}
impl EventQueue {
pub fn new() -> Self {
EventQueue { events: Vec::new() }
}
pub fn enqueue(&mut self, e: Event) {
self.events.push(e)
}
pub fn dequeue(&mut self) -> Event {
self.events.remove(0)
}
pub fn count(&self) -> usize {
self.events.len()
}
pub fn peek(&self) -> Option<&Event> {
let e = self.events.first();
match e {
Some(_) => e,
_ => None,
}
}
}