#[macro_use(model, create, len, push_back, push_front, pop_back, pop_front, first, last, try_range, try_iter, contains, remove)] extern crate ohmers; extern crate redis; extern crate rustc_serialize; use ohmers::{Ohmer, List}; use rustc_serialize::Encodable; model!(derive { Clone } Task { payload: String = "".to_string(); }); model!(derive { Clone } Queue { name: String = "".to_string(); tasks: List = List::new(); }); #[test] fn test_list() { let client = redis::Client::open("redis://127.0.0.1/").unwrap(); let q1 = create!(Queue { name: "q1".to_string(), }, &client).unwrap(); let q2 = create!(Queue { name: "q2".to_string(), }, &client).unwrap(); let t1 = create!(Task { payload: "t1".to_string(), }, &client).unwrap(); let t2 = create!(Task { payload: "t2".to_string(), }, &client).unwrap(); let t3 = create!(Task { payload: "t3".to_string(), }, &client).unwrap(); let t4 = create!(Task { payload: "t4".to_string(), }, &client).unwrap(); q1.tasks.push_back("tasks", &q1, &t1, &client).unwrap(); assert_eq!(q1.tasks.len("tasks", &q1, &client).unwrap(), 1); q1.tasks.push_back("tasks", &q1, &t2, &client).unwrap(); assert_eq!(q1.tasks.len("tasks", &q1, &client).unwrap(), 2); q1.tasks.push_back("tasks", &q1, &t3, &client).unwrap(); assert_eq!(q1.tasks.len("tasks", &q1, &client).unwrap(), 3); q2.tasks.push_back("tasks", &q2, &t1, &client).unwrap(); q2.tasks.push_back("tasks", &q2, &t2, &client).unwrap(); q2.tasks.push_back("tasks", &q2, &t3, &client).unwrap(); assert_eq!(q1.tasks.pop_back("tasks", &q1, &client).unwrap(), Some(t3.clone())); assert_eq!(q1.tasks.len("tasks", &q1, &client).unwrap(), 2); assert_eq!(q1.tasks.pop_front("tasks", &q1, &client).unwrap(), Some(t1.clone())); q1.tasks.push_front("tasks", &q1, &t1, &client).unwrap(); assert_eq!(q1.tasks.last("tasks", &q1, &client).unwrap(), Some(t2.clone())); assert_eq!(q1.tasks.pop_back("tasks", &q1, &client).unwrap(), Some(t2.clone())); assert_eq!(q1.tasks.first("tasks", &q1, &client).unwrap(), Some(t1.clone())); assert_eq!(q1.tasks.pop_front("tasks", &q1, &client).unwrap(), Some(t1.clone())); assert_eq!(q1.tasks.first("tasks", &q1, &client).unwrap(), None); assert_eq!(q1.tasks.last("tasks", &q1, &client).unwrap(), None); assert_eq!(q1.tasks.pop_front("tasks", &q1, &client).unwrap(), None); assert_eq!(q1.tasks.pop_back("tasks", &q1, &client).unwrap(), None); assert_eq!(q1.tasks.len("tasks", &q1, &client).unwrap(), 0); assert_eq!( q2.tasks.try_range("tasks", &q2, 0, 1, &client).unwrap().collect::>(), vec![ t1.clone(), t2.clone(), ] ); assert_eq!( q2.tasks.try_iter("tasks", &q2, &client).unwrap().collect::>(), vec![ t1.clone(), t2.clone(), t3.clone(), ] ); assert!(q2.tasks.contains("tasks", &q2, &t1, &client).unwrap()); assert!(q2.tasks.contains("tasks", &q2, &t2, &client).unwrap()); assert!(q2.tasks.contains("tasks", &q2, &t3, &client).unwrap()); assert!(!q2.tasks.contains("tasks", &q2, &t4, &client).unwrap()); q2.tasks.push_back("tasks", &q2, &t1, &client).unwrap(); assert_eq!(q2.tasks.remove("tasks", &q2, &t1, &client).unwrap(), 2); assert_eq!(q2.tasks.remove("tasks", &q2, &t1, &client).unwrap(), 0); assert_eq!(q2.tasks.remove("tasks", &q2, &t2, &client).unwrap(), 1); assert_eq!(q2.tasks.len("tasks", &q2, &client).unwrap(), 1); assert_eq!(q2.tasks.remove("tasks", &q2, &t3, &client).unwrap(), 1); assert_eq!(q2.tasks.len("tasks", &q2, &client).unwrap(), 0); assert_eq!(q2.tasks.remove("tasks", &q2, &t3, &client).unwrap(), 0); } #[test] fn test_list_macros() { let client = redis::Client::open("redis://127.0.0.1/").unwrap(); let q1 = create!(Queue { name: "q1".to_string(), }, &client).unwrap(); let q2 = create!(Queue { name: "q2".to_string(), }, &client).unwrap(); let t1 = create!(Task { payload: "t1".to_string(), }, &client).unwrap(); let t2 = create!(Task { payload: "t2".to_string(), }, &client).unwrap(); let t3 = create!(Task { payload: "t3".to_string(), }, &client).unwrap(); let t4 = create!(Task { payload: "t4".to_string(), }, &client).unwrap(); push_back!(q1.tasks, t1, client).unwrap(); assert_eq!(len!(q1.tasks, &client).unwrap(), 1); push_back!(q1.tasks, t2, client).unwrap(); assert_eq!(len!(q1.tasks, &client).unwrap(), 2); push_back!(q1.tasks, t3, client).unwrap(); assert_eq!(len!(q1.tasks, &client).unwrap(), 3); push_back!(q2.tasks, t1, client).unwrap(); push_back!(q2.tasks, t2, client).unwrap(); push_back!(q2.tasks, t3, client).unwrap(); assert_eq!(pop_back!(q1.tasks, client).unwrap(), Some(t3.clone())); assert_eq!(len!(q1.tasks, &client).unwrap(), 2); assert_eq!(pop_front!(q1.tasks, client).unwrap(), Some(t1.clone())); push_front!(q1.tasks, t1, client).unwrap(); assert_eq!(last!(q1.tasks, client).unwrap(), Some(t2.clone())); assert_eq!(pop_back!(q1.tasks, client).unwrap(), Some(t2.clone())); assert_eq!(first!(q1.tasks, client).unwrap(), Some(t1.clone())); assert_eq!(pop_front!(q1.tasks, client).unwrap(), Some(t1.clone())); assert_eq!(first!(q1.tasks, client).unwrap(), None); assert_eq!(last!(q1.tasks, client).unwrap(), None); assert_eq!(pop_front!(q1.tasks, client).unwrap(), None); assert_eq!(pop_back!(q1.tasks, client).unwrap(), None); assert_eq!(len!(q1.tasks, &client).unwrap(), 0); assert_eq!( try_range!(q2.tasks[0 => 1], client).unwrap().collect::>(), vec![ t1.clone(), t2.clone(), ] ); assert_eq!( try_iter!(q2.tasks, client).unwrap().collect::>(), vec![ t1.clone(), t2.clone(), t3.clone(), ] ); assert!(contains!(q2.tasks, t1, client).unwrap()); assert!(contains!(q2.tasks, t2, client).unwrap()); assert!(contains!(q2.tasks, t3, client).unwrap()); assert!(!contains!(q2.tasks, t4, client).unwrap()); push_back!(q2.tasks, t1, client).unwrap(); assert_eq!(remove!(q2.tasks, t1, &client).unwrap(), 2); assert_eq!(remove!(q2.tasks, t1, &client).unwrap(), 0); assert_eq!(remove!(q2.tasks, t2, &client).unwrap(), 1); assert_eq!(len!(q2.tasks, &client).unwrap(), 1); assert_eq!(remove!(q2.tasks, t3, &client).unwrap(), 1); assert_eq!(len!(q2.tasks, &client).unwrap(), 0); assert_eq!(remove!(q2.tasks, t3, &client).unwrap(), 0); }