use bytes::Bytes;
use proptest::prelude::*;
use seerdb::DB;
use tempfile::TempDir;
proptest! {
#[test]
fn prop_put_then_get_returns_same_value(
key in prop::collection::vec(any::<u8>(), 1..64),
value in prop::collection::vec(any::<u8>(), 0..1024),
) {
let temp_dir = TempDir::new().unwrap();
let db = DB::open(temp_dir.path()).unwrap();
db.put(&key, &value).unwrap();
let result = db.get(&key).unwrap();
prop_assert_eq!(result, Some(Bytes::from(value)));
}
#[test]
fn prop_delete_then_get_returns_none(
key in prop::collection::vec(any::<u8>(), 1..64),
value in prop::collection::vec(any::<u8>(), 0..1024),
) {
let temp_dir = TempDir::new().unwrap();
let db = DB::open(temp_dir.path()).unwrap();
db.put(&key, &value).unwrap();
db.delete(&key).unwrap();
let result = db.get(&key).unwrap();
prop_assert_eq!(result, None);
}
#[test]
fn prop_get_nonexistent_returns_none(
key in prop::collection::vec(any::<u8>(), 1..64),
) {
let temp_dir = TempDir::new().unwrap();
let db = DB::open(temp_dir.path()).unwrap();
let result = db.get(&key).unwrap();
prop_assert_eq!(result, None);
}
#[test]
fn prop_overwrite_preserves_latest(
key in prop::collection::vec(any::<u8>(), 1..64),
value1 in prop::collection::vec(any::<u8>(), 0..512),
value2 in prop::collection::vec(any::<u8>(), 0..512),
) {
let temp_dir = TempDir::new().unwrap();
let db = DB::open(temp_dir.path()).unwrap();
db.put(&key, &value1).unwrap();
db.put(&key, &value2).unwrap();
let result = db.get(&key).unwrap();
prop_assert_eq!(result, Some(Bytes::from(value2)));
}
#[test]
fn prop_flush_preserves_data(
keys in prop::collection::vec(
prop::collection::vec(any::<u8>(), 1..64),
1..20
),
values in prop::collection::vec(
prop::collection::vec(any::<u8>(), 0..512),
1..20
),
) {
let temp_dir = TempDir::new().unwrap();
let db = DB::open(temp_dir.path()).unwrap();
for (key, value) in keys.iter().zip(values.iter()) {
db.put(key, value).unwrap();
}
db.flush().unwrap();
for (key, value) in keys.iter().zip(values.iter()) {
let result = db.get(key).unwrap();
prop_assert_eq!(result, Some(Bytes::from(value.clone())));
}
}
#[test]
fn prop_reopen_preserves_persisted_data(
keys in prop::collection::vec(
prop::collection::vec(any::<u8>(), 1..64),
1..10
),
values in prop::collection::vec(
prop::collection::vec(any::<u8>(), 0..512),
1..10
),
) {
let temp_dir = TempDir::new().unwrap();
let db_path = temp_dir.path();
{
let db = DB::open(db_path).unwrap();
for (key, value) in keys.iter().zip(values.iter()) {
db.put(key, value).unwrap();
}
db.flush().unwrap();
}
let db = DB::open(db_path).unwrap();
for (key, value) in keys.iter().zip(values.iter()) {
let result = db.get(key).unwrap();
prop_assert_eq!(result, Some(Bytes::from(value.clone())));
}
}
#[test]
fn prop_empty_value_is_valid(
key in prop::collection::vec(any::<u8>(), 1..64),
) {
let temp_dir = TempDir::new().unwrap();
let db = DB::open(temp_dir.path()).unwrap();
db.put(&key, []).unwrap();
let result = db.get(&key).unwrap();
prop_assert_eq!(result, Some(Bytes::from(vec![])));
}
#[test]
fn prop_binary_data_works(
key in prop::collection::vec(any::<u8>(), 1..64),
value in prop::collection::vec(any::<u8>(), 0..512),
) {
let temp_dir = TempDir::new().unwrap();
let db = DB::open(temp_dir.path()).unwrap();
db.put(&key, &value).unwrap();
let result = db.get(&key).unwrap();
prop_assert_eq!(result, Some(Bytes::from(value)));
}
}