mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
fix tests bugs
This commit is contained in:
parent
c667ee0f36
commit
481f158a4a
@ -16,14 +16,12 @@ use crate::{
|
|||||||
pub struct Document {
|
pub struct Document {
|
||||||
data: Delta,
|
data: Delta,
|
||||||
history: History,
|
history: History,
|
||||||
rev_id_counter: u64,
|
rev_id_counter: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Document {
|
impl Document {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
let mut delta = Delta::new();
|
let delta = Delta::new();
|
||||||
delta.insert("\n", Attributes::Empty);
|
|
||||||
|
|
||||||
Document {
|
Document {
|
||||||
data: delta,
|
data: delta,
|
||||||
history: History::new(),
|
history: History::new(),
|
||||||
@ -74,7 +72,7 @@ impl Document {
|
|||||||
Some(undo_delta) => {
|
Some(undo_delta) => {
|
||||||
let composed_delta = self.data.compose(&undo_delta)?;
|
let composed_delta = self.data.compose(&undo_delta)?;
|
||||||
let redo_delta = undo_delta.invert(&self.data);
|
let redo_delta = undo_delta.invert(&self.data);
|
||||||
let result = UndoResult::success(composed_delta.target_len as u64);
|
let result = UndoResult::success(composed_delta.target_len as usize);
|
||||||
self.data = composed_delta;
|
self.data = composed_delta;
|
||||||
self.history.add_redo(redo_delta);
|
self.history.add_redo(redo_delta);
|
||||||
|
|
||||||
@ -88,7 +86,7 @@ impl Document {
|
|||||||
None => Err(ErrorBuilder::new(RedoFail).build()),
|
None => Err(ErrorBuilder::new(RedoFail).build()),
|
||||||
Some(redo_delta) => {
|
Some(redo_delta) => {
|
||||||
let new_delta = self.data.compose(&redo_delta)?;
|
let new_delta = self.data.compose(&redo_delta)?;
|
||||||
let result = UndoResult::success(new_delta.target_len as u64);
|
let result = UndoResult::success(new_delta.target_len as usize);
|
||||||
let undo_delta = redo_delta.invert(&self.data);
|
let undo_delta = redo_delta.invert(&self.data);
|
||||||
self.data = new_delta;
|
self.data = new_delta;
|
||||||
self.history.add_undo(undo_delta);
|
self.history.add_undo(undo_delta);
|
||||||
@ -98,7 +96,7 @@ impl Document {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn delete(&mut self, interval: Interval) -> Result<(), OTError> {
|
pub fn delete(&mut self, interval: Interval) -> Result<(), OTError> {
|
||||||
let delete = OpBuilder::delete(interval.size() as u64).build();
|
let delete = OpBuilder::delete(interval.size()).build();
|
||||||
self.update_with_op(delete, interval)
|
self.update_with_op(delete, interval)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +118,7 @@ impl Document {
|
|||||||
intervals.into_iter().for_each(|i| {
|
intervals.into_iter().for_each(|i| {
|
||||||
let attributes = self.data.get_attributes(i);
|
let attributes = self.data.get_attributes(i);
|
||||||
log::debug!("prefix attribute: {:?}, interval: {:?}", attributes, i);
|
log::debug!("prefix attribute: {:?}, interval: {:?}", attributes, i);
|
||||||
new_delta.retain(i.size() as u64, attributes);
|
new_delta.retain(i.size() as usize, attributes);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,7 +131,7 @@ impl Document {
|
|||||||
intervals.into_iter().for_each(|i| {
|
intervals.into_iter().for_each(|i| {
|
||||||
let attributes = self.data.get_attributes(i);
|
let attributes = self.data.get_attributes(i);
|
||||||
log::debug!("suffix attribute: {:?}, interval: {:?}", attributes, i);
|
log::debug!("suffix attribute: {:?}, interval: {:?}", attributes, i);
|
||||||
new_delta.retain(i.size() as u64, attributes);
|
new_delta.retain(i.size() as usize, attributes);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,7 +168,7 @@ impl Document {
|
|||||||
};
|
};
|
||||||
|
|
||||||
log::debug!("new attributes: {:?}", new_attributes);
|
log::debug!("new attributes: {:?}", new_attributes);
|
||||||
let retain = OpBuilder::retain(interval.size() as u64)
|
let retain = OpBuilder::retain(interval.size())
|
||||||
.attributes(new_attributes)
|
.attributes(new_attributes)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ use crate::core::Delta;
|
|||||||
const MAX_UNDOS: usize = 20;
|
const MAX_UNDOS: usize = 20;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct RevId(pub u64);
|
pub struct RevId(pub usize);
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Revision {
|
pub struct Revision {
|
||||||
@ -18,7 +18,7 @@ impl Revision {
|
|||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct UndoResult {
|
pub struct UndoResult {
|
||||||
success: bool,
|
success: bool,
|
||||||
len: u64,
|
len: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UndoResult {
|
impl UndoResult {
|
||||||
@ -29,7 +29,7 @@ impl UndoResult {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn success(len: u64) -> Self { UndoResult { success: true, len } }
|
pub fn success(len: usize) -> Self { UndoResult { success: true, len } }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
@ -81,7 +81,7 @@ impl Delta {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn delete(&mut self, n: u64) {
|
pub fn delete(&mut self, n: usize) {
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -122,7 +122,7 @@ impl Delta {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn retain(&mut self, n: u64, attrs: Attributes) {
|
pub fn retain(&mut self, n: usize, attrs: Attributes) {
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -201,10 +201,10 @@ impl Delta {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
(Some(Operation::Insert(insert)), Some(Operation::Delete(o_num))) => {
|
(Some(Operation::Insert(insert)), Some(Operation::Delete(o_num))) => {
|
||||||
match (num_chars(insert.as_bytes()) as u64).cmp(o_num) {
|
match (num_chars(insert.as_bytes()) as usize).cmp(o_num) {
|
||||||
Ordering::Less => {
|
Ordering::Less => {
|
||||||
next_op2 = Some(
|
next_op2 = Some(
|
||||||
OpBuilder::delete(*o_num - num_chars(insert.as_bytes()) as u64)
|
OpBuilder::delete(*o_num - num_chars(insert.as_bytes()) as usize)
|
||||||
.attributes(insert.attributes.clone())
|
.attributes(insert.attributes.clone())
|
||||||
.build(),
|
.build(),
|
||||||
);
|
);
|
||||||
@ -523,12 +523,12 @@ impl Delta {
|
|||||||
Operation::Retain(_) => {
|
Operation::Retain(_) => {
|
||||||
match op.has_attribute() {
|
match op.has_attribute() {
|
||||||
true => inverted_from_other(&mut inverted, op, index, index + len),
|
true => inverted_from_other(&mut inverted, op, index, index + len),
|
||||||
false => inverted.retain(len as u64, op.get_attributes()),
|
false => inverted.retain(len as usize, op.get_attributes()),
|
||||||
}
|
}
|
||||||
index += len;
|
index += len;
|
||||||
},
|
},
|
||||||
Operation::Insert(_) => {
|
Operation::Insert(_) => {
|
||||||
inverted.delete(len as u64);
|
inverted.delete(len as usize);
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -554,9 +554,9 @@ impl Delta {
|
|||||||
let mut ops_iter = self.ops.iter();
|
let mut ops_iter = self.ops.iter();
|
||||||
let mut next_op = ops_iter.next();
|
let mut next_op = ops_iter.next();
|
||||||
|
|
||||||
if offset < interval.end && next_op.is_some() {
|
while offset < interval.end && next_op.is_some() {
|
||||||
let op = next_op.take().unwrap();
|
let op = next_op.take().unwrap();
|
||||||
let len = op.length() as usize;
|
let len = offset + op.length() as usize;
|
||||||
// log::info!("{:?}", op);
|
// log::info!("{:?}", op);
|
||||||
while offset < len {
|
while offset < len {
|
||||||
if offset < interval.start {
|
if offset < interval.start {
|
||||||
@ -564,7 +564,7 @@ impl Delta {
|
|||||||
} else {
|
} else {
|
||||||
if interval.contains(offset) {
|
if interval.contains(offset) {
|
||||||
ops.push(op.shrink_to_interval(interval));
|
ops.push(op.shrink_to_interval(interval));
|
||||||
offset += max(op.length() as usize, interval.size());
|
offset += min(op.length() as usize, interval.size());
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -13,9 +13,9 @@ impl OpBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn retain(n: u64) -> OpBuilder { OpBuilder::new(Operation::Retain(n.into())) }
|
pub fn retain(n: usize) -> OpBuilder { OpBuilder::new(Operation::Retain(n.into())) }
|
||||||
|
|
||||||
pub fn delete(n: u64) -> OpBuilder { OpBuilder::new(Operation::Delete(n)) }
|
pub fn delete(n: usize) -> OpBuilder { OpBuilder::new(Operation::Delete(n)) }
|
||||||
|
|
||||||
pub fn insert(s: &str) -> OpBuilder { OpBuilder::new(Operation::Insert(s.into())) }
|
pub fn insert(s: &str) -> OpBuilder { OpBuilder::new(Operation::Insert(s.into())) }
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ use std::{
|
|||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub enum Operation {
|
pub enum Operation {
|
||||||
Delete(u64),
|
Delete(usize),
|
||||||
Retain(Retain),
|
Retain(Retain),
|
||||||
Insert(Insert),
|
Insert(Insert),
|
||||||
}
|
}
|
||||||
@ -59,7 +59,7 @@ impl Operation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn length(&self) -> u64 {
|
pub fn length(&self) -> usize {
|
||||||
match self {
|
match self {
|
||||||
Operation::Delete(n) => *n,
|
Operation::Delete(n) => *n,
|
||||||
Operation::Retain(r) => r.n,
|
Operation::Retain(r) => r.n,
|
||||||
@ -71,10 +71,13 @@ impl Operation {
|
|||||||
|
|
||||||
pub fn shrink_to_interval(&self, interval: Interval) -> Operation {
|
pub fn shrink_to_interval(&self, interval: Interval) -> Operation {
|
||||||
match self {
|
match self {
|
||||||
Operation::Delete(_) => Operation::Delete(interval.size() as u64),
|
Operation::Delete(n) => {
|
||||||
|
//
|
||||||
|
OpBuilder::delete(min(*n, interval.size())).build()
|
||||||
|
},
|
||||||
Operation::Retain(retain) => {
|
Operation::Retain(retain) => {
|
||||||
//
|
//
|
||||||
OpBuilder::retain(interval.size() as u64)
|
OpBuilder::retain(min(retain.n, interval.size()))
|
||||||
.attributes(retain.attributes.clone())
|
.attributes(retain.attributes.clone())
|
||||||
.build()
|
.build()
|
||||||
},
|
},
|
||||||
@ -120,13 +123,13 @@ impl fmt::Display for Operation {
|
|||||||
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
|
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
|
||||||
pub struct Retain {
|
pub struct Retain {
|
||||||
#[serde(rename(serialize = "retain", deserialize = "retain"))]
|
#[serde(rename(serialize = "retain", deserialize = "retain"))]
|
||||||
pub n: u64,
|
pub n: usize,
|
||||||
#[serde(skip_serializing_if = "is_empty")]
|
#[serde(skip_serializing_if = "is_empty")]
|
||||||
pub attributes: Attributes,
|
pub attributes: Attributes,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Retain {
|
impl Retain {
|
||||||
pub fn merge_or_new_op(&mut self, n: u64, attributes: Attributes) -> Option<Operation> {
|
pub fn merge_or_new_op(&mut self, n: usize, attributes: Attributes) -> Option<Operation> {
|
||||||
log::debug!(
|
log::debug!(
|
||||||
"merge_retain_or_new_op: {:?}, {:?}",
|
"merge_retain_or_new_op: {:?}, {:?}",
|
||||||
self.attributes,
|
self.attributes,
|
||||||
@ -153,8 +156,8 @@ impl Retain {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::convert::From<u64> for Retain {
|
impl std::convert::From<usize> for Retain {
|
||||||
fn from(n: u64) -> Self {
|
fn from(n: usize) -> Self {
|
||||||
Retain {
|
Retain {
|
||||||
n,
|
n,
|
||||||
attributes: Attributes::default(),
|
attributes: Attributes::default(),
|
||||||
@ -163,7 +166,7 @@ impl std::convert::From<u64> for Retain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Deref for Retain {
|
impl Deref for Retain {
|
||||||
type Target = u64;
|
type Target = usize;
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target { &self.n }
|
fn deref(&self) -> &Self::Target { &self.n }
|
||||||
}
|
}
|
||||||
@ -186,7 +189,7 @@ impl Insert {
|
|||||||
|
|
||||||
pub fn chars(&self) -> Chars<'_> { self.s.chars() }
|
pub fn chars(&self) -> Chars<'_> { self.s.chars() }
|
||||||
|
|
||||||
pub fn num_chars(&self) -> u64 { num_chars(self.s.as_bytes()) as _ }
|
pub fn num_chars(&self) -> usize { num_chars(self.s.as_bytes()) as _ }
|
||||||
|
|
||||||
pub fn merge_or_new_op(&mut self, s: &str, attributes: Attributes) -> Option<Operation> {
|
pub fn merge_or_new_op(&mut self, s: &str, attributes: Attributes) -> Option<Operation> {
|
||||||
match &attributes {
|
match &attributes {
|
||||||
|
@ -59,7 +59,7 @@ impl<'de> Deserialize<'de> for Operation {
|
|||||||
if operation.is_some() {
|
if operation.is_some() {
|
||||||
return Err(de::Error::duplicate_field("operation"));
|
return Err(de::Error::duplicate_field("operation"));
|
||||||
}
|
}
|
||||||
let i: u64 = map.next_value()?;
|
let i: usize = map.next_value()?;
|
||||||
operation = Some(Operation::Retain(i.into()));
|
operation = Some(Operation::Retain(i.into()));
|
||||||
},
|
},
|
||||||
"insert" => {
|
"insert" => {
|
||||||
|
@ -190,10 +190,10 @@ impl Rng {
|
|||||||
delta.insert(&self.gen_string(i), Attributes::Empty);
|
delta.insert(&self.gen_string(i), Attributes::Empty);
|
||||||
},
|
},
|
||||||
f if f < 0.4 => {
|
f if f < 0.4 => {
|
||||||
delta.delete(i as u64);
|
delta.delete(i);
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
delta.retain(i as u64, Attributes::Empty);
|
delta.retain(i, Attributes::Empty);
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,13 +52,17 @@ fn delta_invert_attribute_delta_with_no_attribute_delta2() {
|
|||||||
Italic(0, Interval::new(2, 4), true),
|
Italic(0, Interval::new(2, 4), true),
|
||||||
AssertOpsJson(
|
AssertOpsJson(
|
||||||
0,
|
0,
|
||||||
r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":{"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"}}]"#,
|
r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":
|
||||||
|
{"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"
|
||||||
|
}}]"#,
|
||||||
),
|
),
|
||||||
Insert(1, "abc", 0),
|
Insert(1, "abc", 0),
|
||||||
Invert(0, 1),
|
Invert(0, 1),
|
||||||
AssertOpsJson(
|
AssertOpsJson(
|
||||||
0,
|
0,
|
||||||
r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":{"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"}}]"#,
|
r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":
|
||||||
|
{"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"
|
||||||
|
}}]"#,
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
OpTester::new().run_script(ops);
|
OpTester::new().run_script(ops);
|
||||||
@ -91,7 +95,9 @@ fn delta_invert_no_attribute_delta_with_attribute_delta2() {
|
|||||||
Italic(1, Interval::new(1, 3), true),
|
Italic(1, Interval::new(1, 3), true),
|
||||||
AssertOpsJson(
|
AssertOpsJson(
|
||||||
1,
|
1,
|
||||||
r#"[{"insert":"a","attributes":{"bold":"true"}},{"insert":"bc","attributes":{"bold":"true","italic":"true"}},{"insert":"d","attributes":{"bold":"true"}}]"#,
|
r#"[{"insert":"a","attributes":{"bold":"true"}},{"insert":"bc","attributes":
|
||||||
|
{"bold":"true","italic":"true"}},{"insert":"d","attributes":{"bold":"true"
|
||||||
|
}}]"#,
|
||||||
),
|
),
|
||||||
Invert(0, 1),
|
Invert(0, 1),
|
||||||
AssertOpsJson(0, r#"[{"insert":"123"}]"#),
|
AssertOpsJson(0, r#"[{"insert":"123"}]"#),
|
||||||
@ -109,7 +115,9 @@ fn delta_invert_attribute_delta_with_attribute_delta() {
|
|||||||
Italic(0, Interval::new(2, 4), true),
|
Italic(0, Interval::new(2, 4), true),
|
||||||
AssertOpsJson(
|
AssertOpsJson(
|
||||||
0,
|
0,
|
||||||
r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":{"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"}}]"#,
|
r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":
|
||||||
|
{"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"
|
||||||
|
}}]"#,
|
||||||
),
|
),
|
||||||
Insert(1, "abc", 0),
|
Insert(1, "abc", 0),
|
||||||
Bold(1, Interval::new(0, 3), true),
|
Bold(1, Interval::new(0, 3), true),
|
||||||
@ -117,12 +125,16 @@ fn delta_invert_attribute_delta_with_attribute_delta() {
|
|||||||
Italic(1, Interval::new(1, 3), true),
|
Italic(1, Interval::new(1, 3), true),
|
||||||
AssertOpsJson(
|
AssertOpsJson(
|
||||||
1,
|
1,
|
||||||
r#"[{"insert":"a","attributes":{"bold":"true"}},{"insert":"bc","attributes":{"bold":"true","italic":"true"}},{"insert":"d","attributes":{"bold":"true"}}]"#,
|
r#"[{"insert":"a","attributes":{"bold":"true"}},{"insert":"bc","attributes":
|
||||||
|
{"bold":"true","italic":"true"}},{"insert":"d","attributes":{"bold":"true"
|
||||||
|
}}]"#,
|
||||||
),
|
),
|
||||||
Invert(0, 1),
|
Invert(0, 1),
|
||||||
AssertOpsJson(
|
AssertOpsJson(
|
||||||
0,
|
0,
|
||||||
r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":{"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"}}]"#,
|
r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":
|
||||||
|
{"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"
|
||||||
|
}}]"#,
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
OpTester::new().run_script(ops);
|
OpTester::new().run_script(ops);
|
||||||
@ -138,7 +150,7 @@ fn delta_get_ops_in_interval_1() {
|
|||||||
delta.add(insert_b.clone());
|
delta.add(insert_b.clone());
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
delta.ops_in_interval(Interval::new(0, 3)),
|
delta.ops_in_interval(Interval::new(0, 4)),
|
||||||
vec![delta.ops.last().unwrap().clone()]
|
vec![delta.ops.last().unwrap().clone()]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ fn apply() {
|
|||||||
delta_a.insert(&s, Attributes::Empty);
|
delta_a.insert(&s, Attributes::Empty);
|
||||||
|
|
||||||
let mut delta_b = Delta::default();
|
let mut delta_b = Delta::default();
|
||||||
delta_b.retain(s.len() as u64, Attributes::Empty);
|
delta_b.retain(s.len(), Attributes::Empty);
|
||||||
delta_b.insert("appflowy", Attributes::Empty);
|
delta_b.insert("appflowy", Attributes::Empty);
|
||||||
|
|
||||||
let after_a = delta_a.apply("").unwrap();
|
let after_a = delta_a.apply("").unwrap();
|
||||||
@ -69,7 +69,7 @@ fn base_len_test() {
|
|||||||
delta_a.insert("c", Attributes::Empty);
|
delta_a.insert("c", Attributes::Empty);
|
||||||
|
|
||||||
let s = "hello world,".to_owned();
|
let s = "hello world,".to_owned();
|
||||||
delta_a.delete(s.len() as u64);
|
delta_a.delete(s.len());
|
||||||
let after_a = delta_a.apply(&s).unwrap();
|
let after_a = delta_a.apply(&s).unwrap();
|
||||||
|
|
||||||
delta_a.insert("d", Attributes::Empty);
|
delta_a.insert("d", Attributes::Empty);
|
||||||
|
@ -4,13 +4,20 @@ use crate::helper::{TestOp::*, *};
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn delta_undo_insert() {
|
fn delta_undo_insert() {
|
||||||
let ops = vec![Insert(0, "123", 0), Undo(0), AssertOpsJson(0, r#"[]"#)];
|
let ops = vec![
|
||||||
|
//
|
||||||
|
Insert(0, "\n", 0),
|
||||||
|
Insert(0, "123", 0),
|
||||||
|
Undo(0),
|
||||||
|
AssertOpsJson(0, r#"[{"insert":"\n"}]"#),
|
||||||
|
];
|
||||||
OpTester::new().run_script(ops);
|
OpTester::new().run_script(ops);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn delta_undo_insert2() {
|
fn delta_undo_insert2() {
|
||||||
let ops = vec![
|
let ops = vec![
|
||||||
|
Insert(0, "\n", 0),
|
||||||
Insert(0, "123", 0),
|
Insert(0, "123", 0),
|
||||||
Insert(0, "456", 0),
|
Insert(0, "456", 0),
|
||||||
Undo(0),
|
Undo(0),
|
||||||
@ -24,6 +31,7 @@ fn delta_undo_insert2() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn delta_redo_insert() {
|
fn delta_redo_insert() {
|
||||||
let ops = vec![
|
let ops = vec![
|
||||||
|
Insert(0, "\n", 0),
|
||||||
Insert(0, "123", 0),
|
Insert(0, "123", 0),
|
||||||
AssertOpsJson(0, r#"[{"insert":"123\n"}]"#),
|
AssertOpsJson(0, r#"[{"insert":"123\n"}]"#),
|
||||||
Undo(0),
|
Undo(0),
|
||||||
@ -37,6 +45,7 @@ fn delta_redo_insert() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn delta_redo_insert2() {
|
fn delta_redo_insert2() {
|
||||||
let ops = vec![
|
let ops = vec![
|
||||||
|
Insert(0, "\n", 0),
|
||||||
Insert(0, "123", 0),
|
Insert(0, "123", 0),
|
||||||
Insert(0, "456", 3),
|
Insert(0, "456", 3),
|
||||||
AssertStr(0, "123456\n"),
|
AssertStr(0, "123456\n"),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user