2021-12-08 09:33:22 +00:00
|
|
|
use crate::{helper::ViewTest, FlowySDKTest};
|
2021-12-09 11:01:58 +00:00
|
|
|
use flowy_document::services::doc::{edit::ClientDocEditor, revision::RevisionIterator};
|
2021-12-09 13:39:53 +00:00
|
|
|
use flowy_document_infra::entities::{
|
|
|
|
doc::DocIdentifier,
|
|
|
|
ws::{WsDocumentData, WsDocumentDataBuilder},
|
|
|
|
};
|
2021-12-09 11:01:58 +00:00
|
|
|
use lib_ot::{
|
|
|
|
core::Interval,
|
2021-12-09 13:39:53 +00:00
|
|
|
revision::{RevState, RevType, Revision, RevisionRange},
|
2021-12-09 11:01:58 +00:00
|
|
|
rich_text::RichTextDelta,
|
|
|
|
};
|
2021-12-09 13:39:53 +00:00
|
|
|
use std::{str::FromStr, sync::Arc};
|
2021-12-09 03:00:05 +00:00
|
|
|
use tokio::time::{sleep, Duration};
|
2021-12-08 09:33:22 +00:00
|
|
|
|
2021-12-09 13:39:53 +00:00
|
|
|
pub enum EditorScript {
|
|
|
|
InsertText(&'static str, usize),
|
|
|
|
Delete(Interval),
|
|
|
|
Replace(Interval, &'static str),
|
|
|
|
Undo(),
|
|
|
|
Redo(),
|
|
|
|
SimulatePushRevisionMessageWithDelta(RichTextDelta),
|
|
|
|
SimulatePullRevisionMessage(RevisionRange),
|
|
|
|
SimulateAckedMessage(i64),
|
|
|
|
AssertRevisionState(i64, RevState),
|
|
|
|
AssertNextSendingRevision(Option<i64>),
|
|
|
|
AssertCurrentRevId(i64),
|
|
|
|
AssertJson(&'static str),
|
|
|
|
}
|
|
|
|
|
2021-12-08 09:33:22 +00:00
|
|
|
pub struct EditorTest {
|
|
|
|
pub sdk: FlowySDKTest,
|
2021-12-09 03:00:05 +00:00
|
|
|
pub editor: Arc<ClientDocEditor>,
|
2021-12-08 09:33:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl EditorTest {
|
|
|
|
pub async fn new() -> Self {
|
|
|
|
let sdk = FlowySDKTest::setup();
|
|
|
|
let _ = sdk.init_user().await;
|
2021-12-09 03:00:05 +00:00
|
|
|
let test = ViewTest::new(&sdk).await;
|
|
|
|
let doc_identifier: DocIdentifier = test.view.id.clone().into();
|
|
|
|
let editor = sdk.flowy_document.open(doc_identifier).await.unwrap();
|
|
|
|
Self { sdk, editor }
|
2021-12-08 09:33:22 +00:00
|
|
|
}
|
|
|
|
|
2021-12-09 03:00:05 +00:00
|
|
|
pub async fn run_scripts(mut self, scripts: Vec<EditorScript>) {
|
|
|
|
for script in scripts {
|
|
|
|
self.run_script(script).await;
|
|
|
|
}
|
|
|
|
|
2021-12-09 11:01:58 +00:00
|
|
|
sleep(Duration::from_secs(5)).await;
|
2021-12-09 03:00:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
async fn run_script(&mut self, script: EditorScript) {
|
|
|
|
let rev_manager = self.editor.rev_manager();
|
|
|
|
let cache = rev_manager.revision_cache();
|
2021-12-09 11:01:58 +00:00
|
|
|
let _memory_cache = cache.memory_cache();
|
|
|
|
let _disk_cache = cache.dish_cache();
|
|
|
|
let doc_id = self.editor.doc_id.clone();
|
2021-12-09 03:00:05 +00:00
|
|
|
|
|
|
|
match script {
|
|
|
|
EditorScript::InsertText(s, offset) => {
|
|
|
|
self.editor.insert(offset, s).await.unwrap();
|
|
|
|
},
|
|
|
|
EditorScript::Delete(interval) => {
|
|
|
|
self.editor.delete(interval).await.unwrap();
|
|
|
|
},
|
|
|
|
EditorScript::Replace(interval, s) => {
|
|
|
|
self.editor.replace(interval, s).await.unwrap();
|
|
|
|
},
|
|
|
|
EditorScript::Undo() => {
|
|
|
|
self.editor.undo().await.unwrap();
|
|
|
|
},
|
|
|
|
EditorScript::Redo() => {
|
|
|
|
self.editor.redo().await.unwrap();
|
|
|
|
},
|
2021-12-09 11:01:58 +00:00
|
|
|
EditorScript::AssertRevisionState(rev_id, state) => {
|
|
|
|
let record = cache.query_revision(rev_id).await.unwrap();
|
|
|
|
assert_eq!(record.state, state);
|
|
|
|
},
|
|
|
|
EditorScript::AssertCurrentRevId(rev_id) => {
|
2021-12-09 03:00:05 +00:00
|
|
|
assert_eq!(self.editor.rev_manager().rev_id(), rev_id);
|
|
|
|
},
|
2021-12-09 11:01:58 +00:00
|
|
|
EditorScript::AssertNextSendingRevision(rev_id) => {
|
|
|
|
let next_revision = cache.next().await.unwrap();
|
|
|
|
if rev_id.is_none() {
|
|
|
|
assert_eq!(next_revision.is_none(), true);
|
|
|
|
}
|
|
|
|
|
|
|
|
let next_revision = next_revision.unwrap();
|
|
|
|
assert_eq!(next_revision.revision.rev_id, rev_id.unwrap());
|
|
|
|
},
|
2021-12-09 13:39:53 +00:00
|
|
|
EditorScript::SimulatePushRevisionMessageWithDelta(delta) => {
|
|
|
|
let local_base_rev_id = rev_manager.rev_id();
|
|
|
|
let local_rev_id = local_base_rev_id + 1;
|
|
|
|
let revision = Revision::new(
|
|
|
|
local_base_rev_id,
|
|
|
|
local_rev_id,
|
|
|
|
delta.to_bytes().to_vec(),
|
|
|
|
&doc_id,
|
|
|
|
RevType::Remote,
|
|
|
|
);
|
|
|
|
let data = WsDocumentDataBuilder::build_push_rev_message(&doc_id, revision);
|
|
|
|
self.send_ws_message(data).await;
|
|
|
|
},
|
2021-12-09 11:01:58 +00:00
|
|
|
EditorScript::SimulatePullRevisionMessage(_range) => {},
|
|
|
|
EditorScript::SimulateAckedMessage(i64) => {
|
|
|
|
let data = WsDocumentDataBuilder::build_acked_message(&doc_id, i64);
|
2021-12-09 13:39:53 +00:00
|
|
|
self.send_ws_message(data).await;
|
2021-12-09 11:01:58 +00:00
|
|
|
},
|
2021-12-09 03:00:05 +00:00
|
|
|
EditorScript::AssertJson(expected) => {
|
|
|
|
let expected_delta: RichTextDelta = serde_json::from_str(expected).unwrap();
|
|
|
|
let delta = self.editor.doc_delta().await.unwrap();
|
|
|
|
|
|
|
|
if expected_delta != delta {
|
|
|
|
eprintln!("✅ expect: {}", expected,);
|
|
|
|
eprintln!("❌ receive: {}", delta.to_json());
|
|
|
|
}
|
|
|
|
assert_eq!(expected_delta, delta);
|
|
|
|
},
|
|
|
|
}
|
2021-12-08 09:33:22 +00:00
|
|
|
}
|
2021-12-08 13:51:06 +00:00
|
|
|
|
2021-12-09 13:39:53 +00:00
|
|
|
async fn send_ws_message(&self, data: WsDocumentData) {
|
|
|
|
self.editor.handle_ws_message(data).await.unwrap();
|
|
|
|
sleep(Duration::from_millis(200)).await;
|
|
|
|
}
|
2021-12-08 13:51:06 +00:00
|
|
|
}
|