| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 | use crate::node::script::NodeScript::*;use crate::node::script::NodeTest;use lib_ot::core::{AttributeEntry, Changeset, NodeData, OperationTransform};use lib_ot::text_delta::DeltaTextOperationBuilder;#[test]fn changeset_delta_compose_delta_test() {  // delta 1  let delta_1 = DeltaTextOperationBuilder::new()    .insert("Hello world")    .build();  let inverted_1 = delta_1.inverted();  let mut changeset_1 = Changeset::Delta {    delta: delta_1.clone(),    inverted: inverted_1,  };  // delta 2  let delta_2 = DeltaTextOperationBuilder::new()    .retain(delta_1.utf16_target_len)    .insert("!")    .build();  let inverted_2 = delta_2.inverted();  let changeset_2 = Changeset::Delta {    delta: delta_2,    inverted: inverted_2,  };  // compose  changeset_1.compose(&changeset_2).unwrap();  if let Changeset::Delta { delta, inverted } = changeset_1 {    assert_eq!(delta.content().unwrap(), "Hello world!");    let new_delta = delta.compose(&inverted).unwrap();    assert_eq!(new_delta.content().unwrap(), "");  }}#[test]fn operation_compose_delta_changeset_then_invert_test() {  let delta = DeltaTextOperationBuilder::new()    .insert("Hello world")    .build();  let inverted = delta.inverted();  let changeset = Changeset::Delta {    delta: delta.clone(),    inverted: inverted.clone(),  };  let mut test = NodeTest::new();  let text_node = NodeData::new("text");  let scripts = vec![    InsertNode {      path: 0.into(),      node_data: text_node,      rev_id: 1,    },    UpdateBody {      path: 0.into(),      changeset: changeset.clone(),    },    AssertNodeDelta {      path: 0.into(),      expected: delta.clone(),    },    UpdateBody {      path: 0.into(),      changeset: changeset.inverted(),    },    AssertNodeDelta {      path: 0.into(),      expected: delta.compose(&inverted).unwrap(),    },  ];  test.run_scripts(scripts);}#[test]fn operation_compose_multiple_delta_changeset_then_invert_test() {  // delta 1  let delta_1 = DeltaTextOperationBuilder::new()    .insert("Hello world")    .build();  let inverted_1 = delta_1.inverted();  let changeset_1 = Changeset::Delta {    delta: delta_1.clone(),    inverted: inverted_1,  };  // delta 2  let delta_2 = DeltaTextOperationBuilder::new()    .retain(delta_1.utf16_target_len)    .insert("!")    .build();  let inverted_2 = delta_2.inverted();  let changeset_2 = Changeset::Delta {    delta: delta_2.clone(),    inverted: inverted_2,  };  // delta 3  let delta_3 = DeltaTextOperationBuilder::new()    .retain(delta_2.utf16_target_len)    .insert("AppFlowy")    .build();  let inverted_3 = delta_3.inverted();  let changeset_3 = Changeset::Delta {    delta: delta_3.clone(),    inverted: inverted_3,  };  let mut test = NodeTest::new();  let text_node = NodeData::new("text");  let scripts = vec![    InsertNode {      path: 0.into(),      node_data: text_node,      rev_id: 1,    },    UpdateBody {      path: 0.into(),      changeset: changeset_1.clone(),    },    UpdateBody {      path: 0.into(),      changeset: changeset_2.clone(),    },    UpdateBody {      path: 0.into(),      changeset: changeset_3.clone(),    },    AssertNodeDelta {      path: 0.into(),      expected: delta_1        .compose(&delta_2)        .unwrap()        .compose(&delta_3)        .unwrap(),    },    UpdateBody {      path: 0.into(),      changeset: changeset_3.inverted(),    },    AssertNodeDeltaContent {      path: 0.into(),      expected: r#"Hello world!"#,    },    UpdateBody {      path: 0.into(),      changeset: changeset_2.inverted(),    },    AssertNodeDeltaContent {      path: 0.into(),      expected: r#"Hello world"#,    },    UpdateBody {      path: 0.into(),      changeset: changeset_1.inverted(),    },    AssertNodeDeltaContent {      path: 0.into(),      expected: r#""#,    },  ];  test.run_scripts(scripts);}#[test]#[should_panic]fn changeset_delta_compose_attributes_test() {  // delta 1  let delta = DeltaTextOperationBuilder::new()    .insert("Hello world")    .build();  let inverted = delta.inverted();  let mut delta_changeset = Changeset::Delta { delta, inverted };  // attributes  let attribute_changeset = Changeset::Attributes {    new: Default::default(),    old: Default::default(),  };  // compose  delta_changeset.compose(&attribute_changeset).unwrap();}#[test]fn changeset_attributes_compose_attributes_test() {  // attributes  let mut changeset_1 = Changeset::Attributes {    new: AttributeEntry::new("bold", true).into(),    old: Default::default(),  };  let changeset_2 = Changeset::Attributes {    new: AttributeEntry::new("Italic", true).into(),    old: Default::default(),  };  // compose  changeset_1.compose(&changeset_2).unwrap();  if let Changeset::Attributes { new, old: _ } = changeset_1 {    assert_eq!(new, AttributeEntry::new("Italic", true).into());  }}
 |