use proptest_derive::Arbitrary;
use super::*;
use proptest::prelude::*;
#[derive(Debug, Clone, Copy, Arbitrary)]
enum DequeOps<T> {
PushFront(T),
PopFront,
PushBack(T),
PopBack,
}
proptest! {
#[test]
fn test_push_pop(ref ops in proptest::collection::vec(any::<DequeOps<i32>>(), 0..100)) {
let mut devec = DeVec::new();
for &op in ops.iter() {
match op {
DequeOps::PushFront(item) => devec.push_front(item),
DequeOps::PopFront => { let _ = devec.pop_front(); },
DequeOps::PushBack(item) => devec.push_back(item),
DequeOps::PopBack => { let _ = devec.pop_back(); },
}
}
}
#[test]
fn test_push_pop_string(ref ops in proptest::collection::vec(any::<DequeOps<String>>(), 0..100)) {
let mut devec = DeVec::new();
for op in ops.iter() {
match op {
DequeOps::PushFront(item) => devec.push_front(item),
DequeOps::PopFront => { let _ = devec.pop_front(); },
DequeOps::PushBack(item) => devec.push_back(item),
DequeOps::PopBack => { let _ = devec.pop_back(); },
}
}
}
#[test]
fn test_push_front_back_ops(ref ops in proptest::collection::vec(any::<DequeOps<i32>>(), 0..100)) {
let mut devec = DeVec::new();
let mut model_deque = std::collections::VecDeque::new();
for &op in ops.iter() {
match op {
DequeOps::PushFront(item) => devec.push_front(item),
DequeOps::PopFront => { let _ = devec.pop_front(); },
DequeOps::PushBack(item) => devec.push_back(item),
DequeOps::PopBack => { let _ = devec.pop_back(); },
}
match op {
DequeOps::PushFront(item) => model_deque.push_front(item),
DequeOps::PopFront => { let _ = model_deque.pop_front(); },
DequeOps::PushBack(item) => model_deque.push_back(item),
DequeOps::PopBack => { let _ = model_deque.pop_back(); },
}
}
let model_slice = model_deque.make_contiguous();
prop_assert_eq!(&*devec, model_slice);
}
#[test]
fn test_push_front_back_ops_string(ref ops in proptest::collection::vec(any::<DequeOps<String>>(), 0..100)) {
let mut devec = DeVec::new();
let mut model_deque = std::collections::VecDeque::new();
for op in ops.iter() {
match op {
DequeOps::PushFront(item) => devec.push_front(item.clone()),
DequeOps::PopFront => { let _ = devec.pop_front(); },
DequeOps::PushBack(item) => devec.push_back(item.clone()),
DequeOps::PopBack => { let _ = devec.pop_back(); },
}
match op {
DequeOps::PushFront(item) => model_deque.push_front(item.clone()),
DequeOps::PopFront => { let _ = model_deque.pop_front(); },
DequeOps::PushBack(item) => model_deque.push_back(item.clone()),
DequeOps::PopBack => { let _ = model_deque.pop_back(); },
}
}
let model_slice = model_deque.make_contiguous();
prop_assert_eq!(&*devec, model_slice);
}
}