| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800 | 
							- #![cfg_attr(rustfmt, rustfmt::skip)]
 
- use crate::editor::{TestBuilder, TestOp::*};
 
- use flowy_collaboration::client_document::{NewlineDoc, PlainDoc};
 
- use lib_ot::core::{Interval, OperationTransformable, NEW_LINE, WHITESPACE, FlowyStr};
 
- use unicode_segmentation::UnicodeSegmentation;
 
- use lib_ot::rich_text::RichTextDelta;
 
- #[test]
 
- fn attributes_bold_added() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Bold(0, Interval::new(3, 5), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"123"},
 
-             {"insert":"45","attributes":{"bold":"true"}},
 
-             {"insert":"6"}
 
-             ]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bold_added_and_invert_all() {
 
-     let ops = vec![
 
-         Insert(0, "123", 0),
 
-         Bold(0, Interval::new(0, 3), true),
 
-         AssertDocJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
 
-         Bold(0, Interval::new(0, 3), false),
 
-         AssertDocJson(0, r#"[{"insert":"123"}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bold_added_and_invert_partial_suffix() {
 
-     let ops = vec![
 
-         Insert(0, "1234", 0),
 
-         Bold(0, Interval::new(0, 4), true),
 
-         AssertDocJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
 
-         Bold(0, Interval::new(2, 4), false),
 
-         AssertDocJson(0, r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bold_added_and_invert_partial_suffix2() {
 
-     let ops = vec![
 
-         Insert(0, "1234", 0),
 
-         Bold(0, Interval::new(0, 4), true),
 
-         AssertDocJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
 
-         Bold(0, Interval::new(2, 4), false),
 
-         AssertDocJson(0, r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#),
 
-         Bold(0, Interval::new(2, 4), true),
 
-         AssertDocJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bold_added_with_new_line() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Bold(0, Interval::new(0, 6), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
 
-         ),
 
-         Insert(0, "\n", 3),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123","attributes":{"bold":"true"}},{"insert":"\n"},{"insert":"456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
 
-         ),
 
-         Insert(0, "\n", 4),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123","attributes":{"bold":"true"}},{"insert":"\n\n"},{"insert":"456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
 
-         ),
 
-         Insert(0, "a", 4),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123","attributes":{"bold":"true"}},{"insert":"\na\n"},{"insert":"456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bold_added_and_invert_partial_prefix() {
 
-     let ops = vec![
 
-         Insert(0, "1234", 0),
 
-         Bold(0, Interval::new(0, 4), true),
 
-         AssertDocJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
 
-         Bold(0, Interval::new(0, 2), false),
 
-         AssertDocJson(0, r#"[{"insert":"12"},{"insert":"34","attributes":{"bold":"true"}}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bold_added_consecutive() {
 
-     let ops = vec![
 
-         Insert(0, "1234", 0),
 
-         Bold(0, Interval::new(0, 1), true),
 
-         AssertDocJson(0, r#"[{"insert":"1","attributes":{"bold":"true"}},{"insert":"234"}]"#),
 
-         Bold(0, Interval::new(1, 2), true),
 
-         AssertDocJson(0, r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bold_added_italic() {
 
-     let ops = vec![
 
-         Insert(0, "1234", 0),
 
-         Bold(0, Interval::new(0, 4), true),
 
-         Italic(0, Interval::new(0, 4), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"1234","attributes":{"italic":"true","bold":"true"}},{"insert":"\n"}]"#,
 
-         ),
 
-         Insert(0, "5678", 4),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"12345678","attributes":{"bold":"true","italic":"true"}},{"insert":"\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bold_added_italic2() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Bold(0, Interval::new(0, 6), true),
 
-         AssertDocJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
 
-         Italic(0, Interval::new(0, 2), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"12","attributes":{"italic":"true","bold":"true"}},
 
-             {"insert":"3456","attributes":{"bold":"true"}}]
 
-             "#,
 
-         ),
 
-         Italic(0, Interval::new(4, 6), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"12","attributes":{"italic":"true","bold":"true"}},
 
-             {"insert":"34","attributes":{"bold":"true"}},
 
-             {"insert":"56","attributes":{"italic":"true","bold":"true"}}]
 
-             "#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bold_added_italic3() {
 
-     let ops = vec![
 
-         Insert(0, "123456789", 0),
 
-         Bold(0, Interval::new(0, 5), true),
 
-         Italic(0, Interval::new(0, 2), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"12","attributes":{"bold":"true","italic":"true"}},
 
-             {"insert":"345","attributes":{"bold":"true"}},{"insert":"6789"}]
 
-             "#,
 
-         ),
 
-         Italic(0, Interval::new(2, 4), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
 
-             {"insert":"5","attributes":{"bold":"true"}},
 
-             {"insert":"6789"}]
 
-             "#,
 
-         ),
 
-         Bold(0, Interval::new(7, 9), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
 
-             {"insert":"5","attributes":{"bold":"true"}},
 
-             {"insert":"67"},
 
-             {"insert":"89","attributes":{"bold":"true"}}]
 
-             "#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bold_added_italic_delete() {
 
-     let ops = vec![
 
-         Insert(0, "123456789", 0),
 
-         Bold(0, Interval::new(0, 5), true),
 
-         Italic(0, Interval::new(0, 2), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"12","attributes":{"italic":"true","bold":"true"}},
 
-             {"insert":"345","attributes":{"bold":"true"}},{"insert":"6789"}]
 
-             "#,
 
-         ),
 
-         Italic(0, Interval::new(2, 4), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"1234","attributes":{"bold":"true","italic":"true"}}
 
-             ,{"insert":"5","attributes":{"bold":"true"}},{"insert":"6789"}]"#,
 
-         ),
 
-         Bold(0, Interval::new(7, 9), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
 
-             {"insert":"5","attributes":{"bold":"true"}},{"insert":"67"},
 
-             {"insert":"89","attributes":{"bold":"true"}}]
 
-             "#,
 
-         ),
 
-         Delete(0, Interval::new(0, 5)),
 
-         AssertDocJson(0, r#"[{"insert":"67"},{"insert":"89","attributes":{"bold":"true"}}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_merge_inserted_text_with_same_attribute() {
 
-     let ops = vec![
 
-         InsertBold(0, "123", Interval::new(0, 3)),
 
-         AssertDocJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
 
-         InsertBold(0, "456", Interval::new(3, 6)),
 
-         AssertDocJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_compose_attr_attributes_with_attr_attributes_test() {
 
-     let ops = vec![
 
-         InsertBold(0, "123456", Interval::new(0, 6)),
 
-         AssertDocJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
 
-         InsertBold(1, "7", Interval::new(0, 1)),
 
-         AssertDocJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
 
-         Transform(0, 1),
 
-         AssertDocJson(0, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
 
-         AssertDocJson(1, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_compose_attr_attributes_with_attr_attributes_test2() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Bold(0, Interval::new(0, 6), true),
 
-         Italic(0, Interval::new(0, 2), true),
 
-         Italic(0, Interval::new(4, 6), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"12","attributes":{"bold":"true","italic":"true"}},
 
-             {"insert":"34","attributes":{"bold":"true"}},
 
-             {"insert":"56","attributes":{"italic":"true","bold":"true"}}]
 
-             "#,
 
-         ),
 
-         InsertBold(1, "7", Interval::new(0, 1)),
 
-         AssertDocJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
 
-         Transform(0, 1),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"12","attributes":{"italic":"true","bold":"true"}},
 
-             {"insert":"34","attributes":{"bold":"true"}},
 
-             {"insert":"56","attributes":{"italic":"true","bold":"true"}},
 
-             {"insert":"7","attributes":{"bold":"true"}}]
 
-             "#,
 
-         ),
 
-         AssertDocJson(
 
-             1,
 
-             r#"[
 
-             {"insert":"12","attributes":{"italic":"true","bold":"true"}},
 
-             {"insert":"34","attributes":{"bold":"true"}},
 
-             {"insert":"56","attributes":{"italic":"true","bold":"true"}},
 
-             {"insert":"7","attributes":{"bold":"true"}}]
 
-             "#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_compose_attr_attributes_with_no_attr_attributes_test() {
 
-     let expected = r#"[{"insert":"123456","attributes":{"bold":"true"}},{"insert":"7"}]"#;
 
-     let ops = vec![
 
-         InsertBold(0, "123456", Interval::new(0, 6)),
 
-         AssertDocJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
 
-         Insert(1, "7", 0),
 
-         AssertDocJson(1, r#"[{"insert":"7"}]"#),
 
-         Transform(0, 1),
 
-         AssertDocJson(0, expected),
 
-         AssertDocJson(1, expected),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_replace_heading() {
 
-     let ops = vec![
 
-         InsertBold(0, "123456", Interval::new(0, 6)),
 
-         AssertDocJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
 
-         Delete(0, Interval::new(0, 2)),
 
-         AssertDocJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_replace_trailing() {
 
-     let ops = vec![
 
-         InsertBold(0, "123456", Interval::new(0, 6)),
 
-         AssertDocJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
 
-         Delete(0, Interval::new(5, 6)),
 
-         AssertDocJson(0, r#"[{"insert":"12345","attributes":{"bold":"true"}}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_replace_middle() {
 
-     let ops = vec![
 
-         InsertBold(0, "123456", Interval::new(0, 6)),
 
-         AssertDocJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
 
-         Delete(0, Interval::new(0, 2)),
 
-         AssertDocJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
 
-         Delete(0, Interval::new(2, 4)),
 
-         AssertDocJson(0, r#"[{"insert":"34","attributes":{"bold":"true"}}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_replace_all() {
 
-     let ops = vec![
 
-         InsertBold(0, "123456", Interval::new(0, 6)),
 
-         AssertDocJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
 
-         Delete(0, Interval::new(0, 6)),
 
-         AssertDocJson(0, r#"[]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_replace_with_text() {
 
-     let ops = vec![
 
-         InsertBold(0, "123456", Interval::new(0, 6)),
 
-         AssertDocJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
 
-         Replace(0, Interval::new(0, 3), "ab"),
 
-         AssertDocJson(0, r#"[{"insert":"ab"},{"insert":"456","attributes":{"bold":"true"}}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<PlainDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_header_insert_newline_at_middle() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Header(0, Interval::new(0, 6), 1),
 
-         AssertDocJson(0, r#"[{"insert":"123456"},{"insert":"\n","attributes":{"header":1}}]"#),
 
-         Insert(0, "\n", 3),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123"},{"insert":"\n","attributes":{"header":1}},{"insert":"456"},{"insert":"\n","attributes":{"header":1}}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_header_insert_double_newline_at_middle() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Header(0, Interval::new(0, 6), 1),
 
-         Insert(0, "\n", 3),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123"},{"insert":"\n","attributes":{"header":1}},{"insert":"456"},{"insert":"\n","attributes":{"header":1}}]"#,
 
-         ),
 
-         Insert(0, "\n", 4),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123"},{"insert":"\n\n","attributes":{"header":1}},{"insert":"456"},{"insert":"\n","attributes":{"header":1}}]"#,
 
-         ),
 
-         Insert(0, "\n", 4),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123"},{"insert":"\n\n","attributes":{"header":1}},{"insert":"\n456"},{"insert":"\n","attributes":{"header":1}}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_header_insert_newline_at_trailing() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Header(0, Interval::new(0, 6), 1),
 
-         Insert(0, "\n", 6),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123456"},{"insert":"\n","attributes":{"header":1}},{"insert":"\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_header_insert_double_newline_at_trailing() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Header(0, Interval::new(0, 6), 1),
 
-         Insert(0, "\n", 6),
 
-         Insert(0, "\n", 7),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123456"},{"insert":"\n","attributes":{"header":1}},{"insert":"\n\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_link_added() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Link(0, Interval::new(0, 6), "https://appflowy.io"),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_link_format_with_bold() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Link(0, Interval::new(0, 6), "https://appflowy.io"),
 
-         Bold(0, Interval::new(0, 3), true),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"123","attributes":{"bold":"true","link":"https://appflowy.io"}},
 
-             {"insert":"456","attributes":{"link":"https://appflowy.io"}},
 
-             {"insert":"\n"}]
 
-             "#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_link_insert_char_at_head() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Link(0, Interval::new(0, 6), "https://appflowy.io"),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
 
-         ),
 
-         Insert(0, "a", 0),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"a"},{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_link_insert_char_at_middle() {
 
-     let ops = vec![
 
-         Insert(0, "1256", 0),
 
-         Link(0, Interval::new(0, 4), "https://appflowy.io"),
 
-         Insert(0, "34", 2),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_link_insert_char_at_trailing() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Link(0, Interval::new(0, 6), "https://appflowy.io"),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
 
-         ),
 
-         Insert(0, "a", 6),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"a\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_link_insert_newline_at_middle() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Link(0, Interval::new(0, 6), "https://appflowy.io"),
 
-         Insert(0, NEW_LINE, 3),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"},{"insert":"456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_link_auto_format() {
 
-     let site = "https://appflowy.io";
 
-     let ops = vec![
 
-         Insert(0, site, 0),
 
-         AssertDocJson(0, r#"[{"insert":"https://appflowy.io\n"}]"#),
 
-         Insert(0, WHITESPACE, site.len()),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"https://appflowy.io","attributes":{"link":"https://appflowy.io/"}},{"insert":" \n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_link_auto_format_exist() {
 
-     let site = "https://appflowy.io";
 
-     let ops = vec![
 
-         Insert(0, site, 0),
 
-         Link(0, Interval::new(0, site.len()), site),
 
-         Insert(0, WHITESPACE, site.len()),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"https://appflowy.io","attributes":{"link":"https://appflowy.io/"}},{"insert":" \n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_link_auto_format_exist2() {
 
-     let site = "https://appflowy.io";
 
-     let ops = vec![
 
-         Insert(0, site, 0),
 
-         Link(0, Interval::new(0, site.len() / 2), site),
 
-         Insert(0, WHITESPACE, site.len()),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"https://a","attributes":{"link":"https://appflowy.io"}},{"insert":"ppflowy.io \n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bullet_added() {
 
-     let ops = vec![
 
-         Insert(0, "12", 0),
 
-         Bullet(0, Interval::new(0, 1), true),
 
-         AssertDocJson(0, r#"[{"insert":"12"},{"insert":"\n","attributes":{"list":"bullet"}}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bullet_added_2() {
 
-     let ops = vec![
 
-         Insert(0, "1", 0),
 
-         Bullet(0, Interval::new(0, 1), true),
 
-         AssertDocJson(0, r#"[{"insert":"1"},{"insert":"\n","attributes":{"list":"bullet"}}]"#),
 
-         Insert(0, NEW_LINE, 1),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"1"},{"insert":"\n\n","attributes":{"list":"bullet"}}]"#,
 
-         ),
 
-         Insert(0, "2", 2),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"1"},{"insert":"\n","attributes":{"list":"bullet"}},{"insert":"2"},{"insert":"\n","attributes":{"list":"bullet"}}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bullet_remove_partial() {
 
-     let ops = vec![
 
-         Insert(0, "1", 0),
 
-         Bullet(0, Interval::new(0, 1), true),
 
-         Insert(0, NEW_LINE, 1),
 
-         Insert(0, "2", 2),
 
-         Bullet(0, Interval::new(2, 3), false),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"1"},{"insert":"\n","attributes":{"list":"bullet"}},{"insert":"2\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_bullet_auto_exit() {
 
-     let ops = vec![
 
-         Insert(0, "1", 0),
 
-         Bullet(0, Interval::new(0, 1), true),
 
-         Insert(0, NEW_LINE, 1),
 
-         Insert(0, NEW_LINE, 2),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"1"},{"insert":"\n","attributes":{"list":"bullet"}},{"insert":"\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_preserve_block_when_insert_newline_inside() {
 
-     let ops = vec![
 
-         Insert(0, "12", 0),
 
-         Bullet(0, Interval::new(0, 2), true),
 
-         Insert(0, NEW_LINE, 2),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"12"},{"insert":"\n\n","attributes":{"list":"bullet"}}]"#,
 
-         ),
 
-         Insert(0, "34", 3),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"12"},{"insert":"\n","attributes":{"list":"bullet"}},
 
-             {"insert":"34"},{"insert":"\n","attributes":{"list":"bullet"}}
 
-             ]"#,
 
-         ),
 
-         Insert(0, NEW_LINE, 3),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"12"},{"insert":"\n\n","attributes":{"list":"bullet"}},
 
-             {"insert":"34"},{"insert":"\n","attributes":{"list":"bullet"}}
 
-             ]"#,
 
-         ),
 
-         Insert(0, "ab", 3),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[
 
-             {"insert":"12"},{"insert":"\n","attributes":{"list":"bullet"}},
 
-             {"insert":"ab"},{"insert":"\n","attributes":{"list":"bullet"}},
 
-             {"insert":"34"},{"insert":"\n","attributes":{"list":"bullet"}}
 
-             ]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_preserve_header_format_on_merge() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Header(0, Interval::new(0, 6), 1),
 
-         Insert(0, NEW_LINE, 3),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123"},{"insert":"\n","attributes":{"header":1}},{"insert":"456"},{"insert":"\n","attributes":{"header":1}}]"#,
 
-         ),
 
-         Delete(0, Interval::new(3, 4)),
 
-         AssertDocJson(0, r#"[{"insert":"123456"},{"insert":"\n","attributes":{"header":1}}]"#),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_format_emoji() {
 
-     let emoji_s = "👋 ";
 
-     let s: FlowyStr = emoji_s.into();
 
-     let len = s.utf16_size();
 
-     assert_eq!(3, len);
 
-     assert_eq!(2, s.graphemes(true).count());
 
-     
 
-     let ops = vec![
 
-         Insert(0, emoji_s, 0),
 
-         AssertDocJson(0, r#"[{"insert":"👋 \n"}]"#),
 
-         Header(0, Interval::new(0, len), 1),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"👋 "},{"insert":"\n","attributes":{"header":1}}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn attributes_preserve_list_format_on_merge() {
 
-     let ops = vec![
 
-         Insert(0, "123456", 0),
 
-         Bullet(0, Interval::new(0, 6), true),
 
-         Insert(0, NEW_LINE, 3),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123"},{"insert":"\n","attributes":{"list":"bullet"}},{"insert":"456"},{"insert":"\n","attributes":{"list":"bullet"}}]"#,
 
-         ),
 
-         Delete(0, Interval::new(3, 4)),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"123456"},{"insert":"\n","attributes":{"list":"bullet"}}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
- #[test]
 
- fn delta_compose() {
 
-     let mut delta = RichTextDelta::from_json(r#"[{"insert":"\n"}]"#).unwrap();
 
-     let deltas = vec![
 
-         RichTextDelta::from_json(r#"[{"retain":1,"attributes":{"list":"unchecked"}}]"#).unwrap(),
 
-         RichTextDelta::from_json(r#"[{"insert":"a"}]"#).unwrap(),
 
-         RichTextDelta::from_json(r#"[{"retain":1},{"insert":"\n","attributes":{"list":"unchecked"}}]"#).unwrap(),
 
-         RichTextDelta::from_json(r#"[{"retain":2},{"retain":1,"attributes":{"list":""}}]"#).unwrap(),
 
-     ];
 
-     for d in deltas {
 
-         delta = delta.compose(&d).unwrap();
 
-     }
 
-     assert_eq!(
 
-         delta.to_delta_str(),
 
-         r#"[{"insert":"a"},{"insert":"\n","attributes":{"list":"unchecked"}},{"insert":"\n"}]"#
 
-     );
 
-     let ops = vec![
 
-         AssertDocJson(0, r#"[{"insert":"\n"}]"#),
 
-         Insert(0, "a", 0),
 
-         AssertDocJson(0, r#"[{"insert":"a\n"}]"#),
 
-         Bullet(0, Interval::new(0, 1), true),
 
-         AssertDocJson(0, r#"[{"insert":"a"},{"insert":"\n","attributes":{"list":"bullet"}}]"#),
 
-         Insert(0, NEW_LINE, 1),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"a"},{"insert":"\n\n","attributes":{"list":"bullet"}}]"#,
 
-         ),
 
-         Insert(0, NEW_LINE, 2),
 
-         AssertDocJson(
 
-             0,
 
-             r#"[{"insert":"a"},{"insert":"\n","attributes":{"list":"bullet"}},{"insert":"\n"}]"#,
 
-         ),
 
-     ];
 
-     TestBuilder::new().run_scripts::<NewlineDoc>(ops);
 
- }
 
 
  |