123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- use crate::document::edit_script::{DocScript, DocumentTest};
- use flowy_collaboration::core::document::{Document, FlowyDoc};
- use lib_ot::{core::Interval, rich_text::RichTextAttribute};
- #[rustfmt::skip]
- // ┌─────────┐ ┌─────────┐
- // │ Server │ │ Client │
- // └─────────┘ └─────────┘
- // ┌────────────────┐ │ │ ┌────────────────┐
- // │ops: [] rev: 0 │◀┼───── ws ────┼─┤ops: [] rev: 0 │
- // └────────────────┘ │ │ └────────────────┘
- // ┌────────────────────┐ │ │ ┌────────────────────┐
- // │ops: ["abc"] rev: 1 │◀┼───── ws ────┼─│ops: ["abc"] rev: 1 │
- // └────────────────────┘ │ │ └────────────────────┘
- // ┌──────────────────────────┐ │ │ ┌──────────────────────┐
- // │ops: ["abc", "123"] rev: 2│◀┼───── ws ────┼─│ops: ["123"] rev: 2 │
- // └──────────────────────────┘ │ │ └──────────────────────┘
- // │ │
- #[actix_rt::test]
- async fn delta_sync_while_editing() {
- let test = DocumentTest::new().await;
- test.run_scripts(vec![
- DocScript::ClientConnectWS,
- DocScript::ClientOpenDoc,
- DocScript::ClientInsertText(0, "abc"),
- DocScript::ClientInsertText(3, "123"),
- DocScript::AssertClient(r#"[{"insert":"abc123\n"}]"#),
- DocScript::AssertServer(r#"[{"insert":"abc123\n"}]"#, 2),
- ])
- .await;
- }
- #[actix_rt::test]
- async fn delta_sync_multi_revs() {
- let test = DocumentTest::new().await;
- test.run_scripts(vec![
- DocScript::ClientConnectWS,
- DocScript::ClientOpenDoc,
- DocScript::ClientInsertText(0, "abc"),
- DocScript::ClientInsertText(3, "123"),
- DocScript::ClientInsertText(6, "efg"),
- DocScript::ClientInsertText(9, "456"),
- ])
- .await;
- }
- #[actix_rt::test]
- async fn delta_sync_while_editing_with_attribute() {
- let test = DocumentTest::new().await;
- test.run_scripts(vec![
- DocScript::ClientConnectWS,
- DocScript::ClientOpenDoc,
- DocScript::ClientInsertText(0, "abc"),
- DocScript::ClientFormatText(Interval::new(0, 3), RichTextAttribute::Bold(true)),
- DocScript::AssertClient(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"\n"}]"#),
- DocScript::AssertServer(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"\n"}]"#, 2),
- DocScript::ClientInsertText(3, "efg"),
- DocScript::ClientFormatText(Interval::new(3, 5), RichTextAttribute::Italic(true)),
- DocScript::AssertClient(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"ef","attributes":{"bold":true,"italic":true}},{"insert":"g","attributes":{"bold":true}},{"insert":"\n"}]"#),
- DocScript::AssertServer(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"ef","attributes":{"bold":true,"italic":true}},{"insert":"g","attributes":{"bold":true}},{"insert":"\n"}]"#, 4),
- ])
- .await;
- }
- #[rustfmt::skip]
- // ┌─────────┐ ┌─────────┐
- // │ Server │ │ Client │
- // └─────────┘ └─────────┘
- // ┌──────────────────────────┐ │ │
- // │ops: ["123", "456"] rev: 2│ │ │
- // └──────────────────────────┘ │ │
- // │ │
- // ◀── http request ─┤ Open document_test
- // │ │
- // │ │ ┌──────────────────────────┐
- // ├──http response──┼─▶│ops: ["123", "456"] rev: 2│
- // │ │ └──────────────────────────┘
- #[actix_rt::test]
- async fn delta_sync_with_http_request() {
- let test = DocumentTest::new().await;
- let mut document = Document::new::<FlowyDoc>();
- document.insert(0, "123").unwrap();
- document.insert(3, "456").unwrap();
- let json = document.to_json();
- test.run_scripts(vec![
- DocScript::ServerSaveDocument(json, 3),
- DocScript::ClientOpenDoc,
- DocScript::AssertClient(r#"[{"insert":"123456\n"}]"#),
- DocScript::AssertServer(r#"[{"insert":"123456\n"}]"#, 3),
- ])
- .await;
- }
- #[actix_rt::test]
- async fn delta_sync_with_server_push_delta() {
- let test = DocumentTest::new().await;
- let mut document = Document::new::<FlowyDoc>();
- document.insert(0, "123").unwrap();
- let json = document.to_json();
- test.run_scripts(vec![
- DocScript::ClientOpenDoc,
- DocScript::ServerSaveDocument(json, 3),
- DocScript::ClientConnectWS,
- DocScript::AssertClient(r#"[{"insert":"123\n\n"}]"#),
- DocScript::AssertServer(r#"[{"insert":"123\n\n"}]"#, 3),
- ])
- .await;
- }
- #[rustfmt::skip]
- // ┌─────────┐ ┌─────────┐
- // │ Server │ │ Client │
- // └─────────┘ └─────────┘
- // │ │
- // │ │
- // ◀── http request ─┤ Open document_test
- // │ │
- // │ │ ┌───────────────┐
- // ├──http response──┼─▶│ops: [] rev: 0 │
- // ┌───────────────────┐│ │ └───────────────┘
- // │ops: ["123"] rev: 3││ │
- // └───────────────────┘│ │ ┌────────────────────┐
- // │ │ │ops: ["abc"] rev: 1 │
- // │ │ └────────────────────┘
- // │ │
- // ◀─────────────────┤ start ws connection
- // │ │
- // ◀─────────────────┤ notify with rev: 1
- // ┌───────────────────┐ │ │
- // │ops: ["123"] rev: 3│ ├────Push Rev─────▶ transform
- // └───────────────────┘ │ │ ┌──────────────────────────┐
- // │ │ │ops: ["abc", "123"] rev: 4│
- // │ │ └──────────────────────────┘
- // │ │ ┌────────────────────────────────┐
- // compose ◀────Push Rev─────┤ │ops: ["abc", "retain 3"] rev: 4 │
- // │ │ └────────────────────────────────┘
- // ┌──────────────────────────┐ │
- // │ops: ["abc", "123"] rev: 4│ │
- // └──────────────────────────┘ │
- // │ │
- #[actix_rt::test]
- async fn delta_sync_while_local_rev_less_than_server_rev() {
- let test = DocumentTest::new().await;
- let mut document = Document::new::<FlowyDoc>();
- document.insert(0, "123").unwrap();
- let json = document.to_json();
- test.run_scripts(vec![
- DocScript::ClientOpenDoc,
- DocScript::ServerSaveDocument(json, 3),
- DocScript::ClientInsertText(0, "abc"),
- DocScript::ClientConnectWS,
- DocScript::AssertClient(r#"[{"insert":"abc\n123\n"}]"#),
- DocScript::AssertServer(r#"[{"insert":"abc\n123\n"}]"#, 4),
- ])
- .await;
- }
- #[rustfmt::skip]
- // ┌─────────┐ ┌─────────┐
- // │ Server │ │ Client │
- // └─────────┘ └─────────┘
- // ┌───────────────────┐ │ │
- // │ops: ["123"] rev: 1│ │ │
- // └───────────────────┘ │ │
- // ◀── http request ─┤ Open document_test
- // │ │
- // │ │ ┌───────────────┐
- // ├──http response──┼──▶│ops: [123] rev:│
- // │ │ └───────────────┘
- // │ │ ┌──────────────────────────────────┐
- // │ │ │ops: ["123","abc", "efg"] rev: 3 │
- // │ │ └──────────────────────────────────┘
- // ◀─────────────────┤ start ws connection
- // │ │
- // ◀─────────────────┤ call notify_open_doc with rev: 3
- // │ │
- // ├────Pull Rev─────▶
- // │ │ ┌──────────────────────────────────┐
- // compose ◀────Push Rev─────┤ │ops: ["retain 3", "abcefg"] rev: 3│
- // ┌──────────────────────────────────┐│ │ └──────────────────────────────────┘
- // │ops: ["123","abc", "efg"] rev: 3 ││ │
- // └──────────────────────────────────┘│ │
- #[actix_rt::test]
- async fn delta_sync_while_local_rev_greater_than_server_rev() {
- let test = DocumentTest::new().await;
- let mut document = Document::new::<FlowyDoc>();
- document.insert(0, "123").unwrap();
- let json = document.to_json();
- test.run_scripts(vec![
- DocScript::ServerSaveDocument(json, 1),
- DocScript::ClientOpenDoc,
- DocScript::AssertClient(r#"[{"insert":"123\n"}]"#),
- DocScript::ClientInsertText(3, "abc"),
- DocScript::ClientInsertText(6, "efg"),
- DocScript::ClientConnectWS,
- DocScript::AssertClient(r#"[{"insert":"123abcefg\n"}]"#),
- DocScript::AssertServer(r#"[{"insert":"123abcefg\n"}]"#, 3),
- ])
- .await;
- }
|