aboutsummaryrefslogtreecommitdiffstats
path: root/src/document/store.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/document/store.rs')
-rw-r--r--src/document/store.rs70
1 files changed, 54 insertions, 16 deletions
diff --git a/src/document/store.rs b/src/document/store.rs
index dff0cfb..c6c428c 100644
--- a/src/document/store.rs
+++ b/src/document/store.rs
@@ -1071,6 +1071,7 @@ fn nested<T>(
#[cfg(test)]
mod tests {
use super::*;
+ use crate::document::testing::try_change;
use serde_json::json;
fn path(at: &str) -> Vec<String> {
@@ -1080,7 +1081,10 @@ mod tests {
#[test]
fn paths_go_through_lists() {
let mut doc = AutoCommit::new();
- write_path(&mut doc, &path("list"), &json!(["b", {"k": 1}, "d"])).unwrap();
+ try_change(&mut doc, |doc| {
+ write_path(doc, &path("list"), &json!(["b", {"k": 1}, "d"]))
+ })
+ .unwrap();
assert_eq!(read_path(&doc, &path("list/0")).unwrap(), Some(json!("b")));
assert_eq!(read_path(&doc, &path("list/1/k")).unwrap(), Some(json!(1)));
// Not an index, or past the end: nothing.
@@ -1088,18 +1092,27 @@ mod tests {
assert_eq!(read_path(&doc, &path(missing)).unwrap(), None, "{missing}");
}
// Replaced, and appended at the end; past it, nothing.
- write_path(&mut doc, &path("list/0"), &json!("a")).unwrap();
- write_path(&mut doc, &path("list/3"), &json!("e")).unwrap();
- write_path(&mut doc, &path("list/1/k"), &json!(2)).unwrap();
+ try_change(&mut doc, |doc| {
+ write_path(doc, &path("list/0"), &json!("a"))
+ })
+ .unwrap();
+ try_change(&mut doc, |doc| {
+ write_path(doc, &path("list/3"), &json!("e"))
+ })
+ .unwrap();
+ try_change(&mut doc, |doc| {
+ write_path(doc, &path("list/1/k"), &json!(2))
+ })
+ .unwrap();
assert!(matches!(
- write_path(&mut doc, &path("list/9"), &json!(0)),
+ try_change(&mut doc, |doc| write_path(doc, &path("list/9"), &json!(0))),
Err(StoreError::NotFound)
));
assert_eq!(
read_path(&doc, &path("list")).unwrap(),
Some(json!(["a", {"k": 2}, "d", "e"]))
);
- delete_path(&mut doc, &path("list/2"), false).unwrap();
+ try_change(&mut doc, |doc| delete_path(doc, &path("list/2"), false)).unwrap();
assert_eq!(
read_path(&doc, &path("list")).unwrap(),
Some(json!(["a", {"k": 2}, "e"]))
@@ -1113,8 +1126,14 @@ mod tests {
#[test]
fn negative_indexes_count_from_the_end() {
let mut doc = AutoCommit::new();
- write_path(&mut doc, &path("list"), &json!(["a", "b"])).unwrap();
- write_path(&mut doc, &path("map"), &json!({"-1": "a key"})).unwrap();
+ try_change(&mut doc, |doc| {
+ write_path(doc, &path("list"), &json!(["a", "b"]))
+ })
+ .unwrap();
+ try_change(&mut doc, |doc| {
+ write_path(doc, &path("map"), &json!({"-1": "a key"}))
+ })
+ .unwrap();
assert_eq!(
positive_path(&doc, &path("list/-1"), false).unwrap(),
Some(path("list/1"))
@@ -1135,28 +1154,47 @@ mod tests {
#[test]
fn inserts_into_lists() {
let mut doc = AutoCommit::new();
- write_path(&mut doc, &path("list"), &json!(["b", "d"])).unwrap();
- insert_path(&mut doc, &path("list/0"), &json!("a")).unwrap();
- insert_path(&mut doc, &path("list/2"), &json!("c")).unwrap();
- insert_path(&mut doc, &path("list/4"), &json!({"e": 5})).unwrap();
+ try_change(&mut doc, |doc| {
+ write_path(doc, &path("list"), &json!(["b", "d"]))
+ })
+ .unwrap();
+ try_change(&mut doc, |doc| {
+ insert_path(doc, &path("list/0"), &json!("a"))
+ })
+ .unwrap();
+ try_change(&mut doc, |doc| {
+ insert_path(doc, &path("list/2"), &json!("c"))
+ })
+ .unwrap();
+ try_change(&mut doc, |doc| {
+ insert_path(doc, &path("list/4"), &json!({"e": 5}))
+ })
+ .unwrap();
assert_eq!(
read_path(&doc, &path("list")).unwrap(),
Some(json!(["a", "b", "c", "d", {"e": 5}]))
);
assert!(matches!(
- insert_path(&mut doc, &path("list/6"), &json!(1)),
+ try_change(&mut doc, |doc| insert_path(doc, &path("list/6"), &json!(1))),
Err(StoreError::PastTheEnd {
index: 6,
length: 5
})
));
- write_path(&mut doc, &path("map"), &json!({"k": 1})).unwrap();
+ try_change(&mut doc, |doc| {
+ write_path(doc, &path("map"), &json!({"k": 1}))
+ })
+ .unwrap();
assert!(matches!(
- insert_path(&mut doc, &path("map/0"), &json!(1)),
+ try_change(&mut doc, |doc| insert_path(doc, &path("map/0"), &json!(1))),
Err(StoreError::NotAList)
));
assert!(matches!(
- insert_path(&mut doc, &path("nothing/0"), &json!(1)),
+ try_change(&mut doc, |doc| insert_path(
+ doc,
+ &path("nothing/0"),
+ &json!(1)
+ )),
Err(StoreError::NotFound)
));
}