all backend tests passing

This commit is contained in:
Orion Henry 2020-03-25 14:15:23 -07:00
parent 0a4e28a52d
commit 771c6bee18
5 changed files with 37 additions and 53 deletions
automerge-backend-wasm
automerge-backend/src

View file

@ -82,9 +82,10 @@ let getChanges = (backend,other) => clean(backend).getChanges(clean(other))
let getChangesForActor = (backend,actor) => clean(backend).getChangesForActor(actor)
let getMissingChanges = (backend,clock) => clean(backend).getMissingChanges(clock)
let getMissingDeps = (backend) => clean(backend).getMissingDeps()
let _elemIds = (backend,obj_id) => clean(backend)._elemIds(obj_id)
module.exports = {
init, applyChanges, applyLocalChange, getPatch,
getChanges, getChangesForActor, getMissingChanges, getMissingDeps, merge, getClock,
getHistory, getUndoStack, getRedoStack, loadChanges
getHistory, getUndoStack, getRedoStack, loadChanges, _elemIds
}

View file

@ -1,4 +1,4 @@
use automerge_backend::{ActorID, AutomergeError, Backend, Change, ChangeRequest, Clock};
use automerge_backend::{ActorID, AutomergeError, Backend, Change, ChangeRequest, Clock, OpID};
use serde::de::DeserializeOwned;
use serde::Serialize;
use wasm_bindgen::prelude::*;
@ -145,7 +145,16 @@ impl State {
self.clone()
}
#[wasm_bindgen]
#[wasm_bindgen(js_name = _elemIds)]
pub fn get_elem_ids(&self, _object_id: JsValue) -> Result<JsValue, JsValue> {
log!("elemids");
let object_id: OpID = js_to_rust(_object_id)?;
let elemids = self
.backend.get_elem_ids(&object_id);
// .map_err(automerge_error_to_js);
rust_to_js(&elemids)
}
#[wasm_bindgen(js_name = forkAt)]
pub fn fork_at(&self, _clock: JsValue) -> Result<State, JsValue> {
log!("fork_at");

View file

@ -53,13 +53,7 @@ impl Backend {
let object_id = self.obj_alias.insert_and_get(&id, &child, &obj)?;
let key =
op_set.resolve_key(&id, &object_id, key, &mut elemids, false, false)?;
let pred = op_set.get_ops(&object_id, &key).unwrap_or_else(|| {
if let Ok(opid) = key.to_opid() {
vec![opid]
} else {
vec![]
}
});
let pred = op_set.get_pred(&object_id, &key, *insert);
Operation::MakeMap {
object_id,
key,
@ -76,13 +70,7 @@ impl Backend {
let object_id = self.obj_alias.insert_and_get(&id, &child, &obj)?;
let key =
op_set.resolve_key(&id, &object_id, key, &mut elemids, false, false)?;
let pred = op_set.get_ops(&object_id, &key).unwrap_or_else(|| {
if let Ok(opid) = key.to_opid() {
vec![opid]
} else {
vec![]
}
});
let pred = op_set.get_pred(&object_id, &key, *insert);
Operation::MakeTable {
object_id,
key,
@ -99,13 +87,7 @@ impl Backend {
let object_id = self.obj_alias.insert_and_get(&id, &child, &obj)?;
let key =
op_set.resolve_key(&id, &object_id, key, &mut elemids, false, false)?;
let pred = op_set.get_ops(&object_id, &key).unwrap_or_else(|| {
if let Ok(opid) = key.to_opid() {
vec![opid]
} else {
vec![]
}
});
let pred = op_set.get_pred(&object_id, &key, *insert);
Operation::MakeList {
object_id,
key,
@ -122,13 +104,7 @@ impl Backend {
let object_id = self.obj_alias.insert_and_get(&id, &child, &obj)?;
let key =
op_set.resolve_key(&id, &object_id, key, &mut elemids, false, false)?;
let pred = op_set.get_ops(&object_id, &key).unwrap_or_else(|| {
if let Ok(opid) = key.to_opid() {
vec![opid]
} else {
vec![]
}
});
let pred = op_set.get_pred(&object_id, &key, *insert);
Operation::MakeText {
object_id,
key,
@ -140,13 +116,7 @@ impl Backend {
let object_id = self.obj_alias.get(&obj)?;
let key =
op_set.resolve_key(&id, &object_id, key, &mut elemids, false, true)?;
let pred = op_set.get_ops(&object_id, &key).unwrap_or_else(|| {
if let Ok(opid) = key.to_opid() {
vec![opid]
} else {
vec![]
}
});
let pred = op_set.get_pred(&object_id, &key, false);
Operation::Delete {
object_id,
key,
@ -168,13 +138,7 @@ impl Backend {
*insert,
false,
)?;
let pred = op_set.get_ops(&object_id, &key).unwrap_or_else(|| {
if let Ok(opid) = key.to_opid() {
vec![opid]
} else {
vec![]
}
});
let pred = op_set.get_pred(&object_id, &key, *insert);
Operation::Increment {
object_id,
key,
@ -198,13 +162,7 @@ impl Backend {
*insert,
false,
)?;
let pred = op_set.get_ops(&object_id, &key).unwrap_or_else(|| {
if let Ok(opid) = key.to_opid() {
vec![opid]
} else {
vec![]
}
});
let pred = op_set.get_pred(&object_id, &key, *insert);
Operation::Set {
object_id,
key,
@ -479,6 +437,10 @@ impl Backend {
self.op_set.get_missing_deps()
}
pub fn get_elem_ids(&self, object_id: &OpID) -> Vec<OpID> {
self.op_set.get_elem_ids(object_id)
}
pub fn merge(&mut self, remote: &Backend) -> Result<Patch, AutomergeError> {
let missing_changes = remote
.get_missing_changes(self.op_set.clock.clone())

View file

@ -370,6 +370,18 @@ impl OpSet {
})
}
pub fn get_pred(&self, object_id: &OpID, key: &Key, insert: bool) -> Vec<OpID> {
if insert {
Vec::new()
} else if let Some(ops) = self.get_ops(&object_id, &key) {
ops
} else if let Ok(opid) = key.to_opid() {
vec![opid]
} else {
Vec::new()
}
}
// FIXME - omg - this function is so bad :(
pub fn resolve_key(
&self,

View file

@ -44,7 +44,7 @@ pub enum OpID {
impl Ord for OpID {
fn cmp(&self, other: &Self) -> Ordering {
match (self, other) {
match (other, self) {
(OpID::Root, OpID::Root) => Ordering::Equal,
(_, OpID::Root) => Ordering::Greater,
(OpID::Root, _) => Ordering::Less,