| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | use crate::node::script::{edit_node_delta, make_node_delta_changeset};use lib_ot::core::{  AttributeEntry, Changeset, NodeDataBuilder, NodeOperation, Transaction, TransactionBuilder,};use lib_ot::text_delta::DeltaTextOperationBuilder;#[test]fn transaction_compose_update_after_insert_test() {  let (initial_delta, changeset, _) = make_node_delta_changeset("Hello", " world");  let node_data = NodeDataBuilder::new("text")    .insert_delta(initial_delta)    .build();  // Modify the same path, the operations will be merged after composing if possible.  let mut transaction_a = TransactionBuilder::new()    .insert_node_at_path(0, node_data)    .build();  let transaction_b = TransactionBuilder::new()    .update_node_at_path(0, changeset)    .build();  transaction_a.compose(transaction_b).unwrap();  // The operations are merged into one operation  assert_eq!(transaction_a.operations.len(), 1);  assert_eq!(    transaction_a.to_json().unwrap(),    r#"{"operations":[{"op":"insert","path":[0],"nodes":[{"type":"text","body":{"delta":[{"insert":"Hello world"}]}}]}]}"#  );}#[test]fn transaction_compose_multiple_update_test() {  let (initial_delta, changeset_1, final_delta) = make_node_delta_changeset("Hello", " world");  let mut transaction = TransactionBuilder::new()    .insert_node_at_path(      0,      NodeDataBuilder::new("text")        .insert_delta(initial_delta)        .build(),    )    .build();  let (changeset_2, _) = edit_node_delta(    &final_delta,    DeltaTextOperationBuilder::new()      .retain(final_delta.utf16_target_len)      .insert("😁")      .build(),  );  let mut other_transaction = Transaction::new();  // the following two update operations will be merged into one  let update_1 = TransactionBuilder::new()    .update_node_at_path(0, changeset_1)    .build();  other_transaction.compose(update_1).unwrap();  let update_2 = TransactionBuilder::new()    .update_node_at_path(0, changeset_2)    .build();  other_transaction.compose(update_2).unwrap();  let inverted = Transaction::from_operations(other_transaction.operations.inverted());  // the update operation will be merged into insert operation  transaction.compose(other_transaction).unwrap();  assert_eq!(transaction.operations.len(), 1);  assert_eq!(    transaction.to_json().unwrap(),    r#"{"operations":[{"op":"insert","path":[0],"nodes":[{"type":"text","body":{"delta":[{"insert":"Hello world😁"}]}}]}]}"#  );  transaction.compose(inverted).unwrap();  assert_eq!(    transaction.to_json().unwrap(),    r#"{"operations":[{"op":"insert","path":[0],"nodes":[{"type":"text","body":{"delta":[{"insert":"Hello"}]}}]}]}"#  );}#[test]fn transaction_compose_multiple_attribute_test() {  let delta = DeltaTextOperationBuilder::new().insert("Hello").build();  let node = NodeDataBuilder::new("text").insert_delta(delta).build();  let insert_operation = NodeOperation::Insert {    path: 0.into(),    nodes: vec![node],  };  let mut transaction = Transaction::new();  transaction.push_operation(insert_operation);  let new_attribute = AttributeEntry::new("subtype", "bulleted-list");  let update_operation = NodeOperation::Update {    path: 0.into(),    changeset: Changeset::Attributes {      new: new_attribute.clone().into(),      old: Default::default(),    },  };  transaction.push_operation(update_operation);  assert_eq!(    transaction.to_json().unwrap(),    r#"{"operations":[{"op":"insert","path":[0],"nodes":[{"type":"text","body":{"delta":[{"insert":"Hello"}]}}]},{"op":"update","path":[0],"changeset":{"attributes":{"new":{"subtype":"bulleted-list"},"old":{}}}}]}"#  );  let old_attribute = new_attribute;  let new_attribute = AttributeEntry::new("subtype", "number-list");  transaction.push_operation(NodeOperation::Update {    path: 0.into(),    changeset: Changeset::Attributes {      new: new_attribute.into(),      old: old_attribute.into(),    },  });  assert_eq!(    transaction.to_json().unwrap(),    r#"{"operations":[{"op":"insert","path":[0],"nodes":[{"type":"text","body":{"delta":[{"insert":"Hello"}]}}]},{"op":"update","path":[0],"changeset":{"attributes":{"new":{"subtype":"number-list"},"old":{"subtype":"bulleted-list"}}}}]}"#  );}
 |