use proptest::prelude::*;
use synadb::{Atom, SynaDB};
use tempfile::tempdir;
fn arb_atom() -> impl Strategy<Value = Atom> {
prop_oneof![
1 => Just(Atom::Null),
10 => any::<f64>().prop_filter("filter NaN", |f| !f.is_nan()).prop_map(Atom::Float),
10 => any::<i64>().prop_map(Atom::Int),
10 => ".{0,100}".prop_map(|s: String| Atom::Text(s)),
10 => prop::collection::vec(any::<u8>(), 0..1000).prop_map(Atom::Bytes),
]
}
fn arb_key() -> impl Strategy<Value = String> {
".{1,100}".prop_filter("non-empty key", |s: &String| !s.is_empty())
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(100))]
#[test]
fn prop_write_read_roundtrip(key in arb_key(), atom in arb_atom()) {
let dir = tempdir().expect("failed to create temp dir");
let db_path = dir.path().join("test.db");
let mut db = SynaDB::new(&db_path).expect("failed to create db");
db.append(&key, atom.clone()).expect("append should succeed");
let result = db.get(&key).expect("get should succeed");
prop_assert!(result.is_some(), "key should exist after write");
prop_assert_eq!(result.unwrap(), atom, "read value should equal written value");
}
#[test]
fn prop_last_write_wins(
key in arb_key(),
atoms in prop::collection::vec(arb_atom(), 2..10)
) {
let dir = tempdir().expect("failed to create temp dir");
let db_path = dir.path().join("test.db");
let mut db = SynaDB::new(&db_path).expect("failed to create db");
for atom in &atoms {
db.append(&key, atom.clone()).expect("append should succeed");
}
let result = db.get(&key).expect("get should succeed");
let expected = atoms.last().unwrap();
prop_assert!(result.is_some(), "key should exist after writes");
prop_assert_eq!(result.unwrap(), expected.clone(), "should return last written value");
}
}