tree_test.rs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800
  1. use crate::node::script::NodeScript::*;
  2. use crate::node::script::NodeTest;
  3. use lib_ot::core::Body;
  4. use lib_ot::core::Changeset;
  5. use lib_ot::core::OperationTransform;
  6. use lib_ot::core::{NodeData, NodeDataBuilder, Path};
  7. use lib_ot::text_delta::{TextOperationBuilder, TextOperations};
  8. #[test]
  9. fn node_insert_test() {
  10. let mut test = NodeTest::new();
  11. let node_data = NodeData::new("text");
  12. let path: Path = vec![0].into();
  13. let scripts = vec![
  14. InsertNode {
  15. path: path.clone(),
  16. node_data: node_data.clone(),
  17. rev_id: 1,
  18. },
  19. AssertNode {
  20. path,
  21. expected: Some(node_data),
  22. },
  23. ];
  24. test.run_scripts(scripts);
  25. }
  26. #[test]
  27. #[should_panic]
  28. fn node_insert_with_empty_path_test() {
  29. let mut test = NodeTest::new();
  30. let scripts = vec![InsertNode {
  31. path: vec![].into(),
  32. node_data: NodeData::new("text"),
  33. rev_id: 1,
  34. }];
  35. test.run_scripts(scripts);
  36. }
  37. #[test]
  38. #[should_panic]
  39. fn node_insert_with_not_exist_path_test() {
  40. let mut test = NodeTest::new();
  41. let node_data = NodeData::new("text");
  42. let path: Path = vec![0, 0, 9].into();
  43. let scripts = vec![
  44. InsertNode {
  45. path: path.clone(),
  46. node_data: node_data.clone(),
  47. rev_id: 1,
  48. },
  49. AssertNode {
  50. path,
  51. expected: Some(node_data),
  52. },
  53. ];
  54. test.run_scripts(scripts);
  55. }
  56. #[test]
  57. // Append the node to the end of the list if the insert path is out of bounds.
  58. fn node_insert_out_of_bound_test() {
  59. let mut test = NodeTest::new();
  60. let image_a = NodeData::new("image_a");
  61. let image_b = NodeData::new("image_b");
  62. let image = NodeDataBuilder::new("image_1")
  63. .add_node_data(image_a.clone())
  64. .add_node_data(image_b.clone())
  65. .build();
  66. let text_node = NodeDataBuilder::new("text_1").add_node_data(image.clone()).build();
  67. let image_c = NodeData::new("image_c");
  68. let scripts = vec![
  69. InsertNode {
  70. path: 0.into(),
  71. node_data: text_node,
  72. rev_id: 1,
  73. },
  74. // 0:text_1
  75. // 0:image_1
  76. // 0:image_a
  77. // 1:image_b
  78. InsertNode {
  79. path: vec![0, 0, 10].into(),
  80. node_data: image_c.clone(),
  81. rev_id: 2,
  82. },
  83. // 0:text_1
  84. // 0:image_1
  85. // 0:image_a
  86. // 1:image_b
  87. // 2:image_b
  88. AssertNode {
  89. path: vec![0, 0, 2].into(),
  90. expected: Some(image_c),
  91. },
  92. AssertNode {
  93. path: vec![0, 0, 10].into(),
  94. expected: None,
  95. },
  96. ];
  97. test.run_scripts(scripts);
  98. }
  99. #[test]
  100. fn tree_insert_multiple_nodes_at_root_path_test() {
  101. let mut test = NodeTest::new();
  102. let node_1 = NodeData::new("a");
  103. let node_2 = NodeData::new("b");
  104. let node_3 = NodeData::new("c");
  105. let node_data_list = vec![node_1, node_2, node_3];
  106. let path: Path = vec![0].into();
  107. // Insert three nodes under the root
  108. let scripts = vec![
  109. // 0:a
  110. // 1:b
  111. // 2:c
  112. InsertNodes {
  113. path,
  114. node_data_list: node_data_list.clone(),
  115. rev_id: 1,
  116. },
  117. AssertNodesAtRoot {
  118. expected: node_data_list,
  119. },
  120. ];
  121. test.run_scripts(scripts);
  122. }
  123. #[test]
  124. fn tree_insert_multiple_nodes_at_root_path_test2() {
  125. let mut test = NodeTest::new();
  126. let node_1 = NodeData::new("a");
  127. let node_2 = NodeData::new("b");
  128. let node_3 = NodeData::new("c");
  129. let scripts = vec![
  130. InsertNode {
  131. path: 0.into(),
  132. node_data: node_1.clone(),
  133. rev_id: 1,
  134. },
  135. InsertNode {
  136. path: 1.into(),
  137. node_data: node_2.clone(),
  138. rev_id: 2,
  139. },
  140. InsertNode {
  141. path: 2.into(),
  142. node_data: node_3.clone(),
  143. rev_id: 3,
  144. },
  145. // 0:a
  146. // 1:b
  147. // 2:c
  148. AssertNode {
  149. path: 0.into(),
  150. expected: Some(node_1),
  151. },
  152. AssertNode {
  153. path: 1.into(),
  154. expected: Some(node_2),
  155. },
  156. AssertNode {
  157. path: 2.into(),
  158. expected: Some(node_3),
  159. },
  160. ];
  161. test.run_scripts(scripts);
  162. }
  163. #[test]
  164. fn node_insert_node_with_children_test() {
  165. let mut test = NodeTest::new();
  166. let image_1 = NodeData::new("image_a");
  167. let image_2 = NodeData::new("image_b");
  168. let image = NodeDataBuilder::new("image")
  169. .add_node_data(image_1.clone())
  170. .add_node_data(image_2.clone())
  171. .build();
  172. let node_data = NodeDataBuilder::new("text").add_node_data(image.clone()).build();
  173. let path: Path = 0.into();
  174. let scripts = vec![
  175. InsertNode {
  176. path: path.clone(),
  177. node_data: node_data.clone(),
  178. rev_id: 1,
  179. },
  180. // 0:text
  181. // 0:image
  182. // 0:image_1
  183. // 1:image_2
  184. AssertNode {
  185. path,
  186. expected: Some(node_data),
  187. },
  188. AssertNode {
  189. path: vec![0, 0].into(),
  190. expected: Some(image),
  191. },
  192. AssertNode {
  193. path: vec![0, 0, 0].into(),
  194. expected: Some(image_1),
  195. },
  196. AssertNode {
  197. path: vec![0, 0, 1].into(),
  198. expected: Some(image_2),
  199. },
  200. ];
  201. test.run_scripts(scripts);
  202. }
  203. #[test]
  204. fn node_insert_node_in_ordered_nodes_test() {
  205. let mut test = NodeTest::new();
  206. let path_1: Path = 0.into();
  207. let node_1 = NodeData::new("text_1");
  208. let path_2: Path = 1.into();
  209. let node_2_1 = NodeData::new("text_2_1");
  210. let node_2_2 = NodeData::new("text_2_2");
  211. let path_3: Path = 2.into();
  212. let node_3 = NodeData::new("text_3");
  213. let scripts = vec![
  214. InsertNode {
  215. path: path_1.clone(),
  216. node_data: node_1.clone(),
  217. rev_id: 1,
  218. },
  219. InsertNode {
  220. path: path_2.clone(),
  221. node_data: node_2_1.clone(),
  222. rev_id: 2,
  223. },
  224. InsertNode {
  225. path: path_3.clone(),
  226. node_data: node_3,
  227. rev_id: 3,
  228. },
  229. // 0:text_1
  230. // 1:text_2_1
  231. // 2:text_3
  232. InsertNode {
  233. path: path_2.clone(),
  234. node_data: node_2_2.clone(),
  235. rev_id: 4,
  236. },
  237. // 0:text_1
  238. // 1:text_2_2
  239. // 2:text_2_1
  240. // 3:text_3
  241. AssertNode {
  242. path: path_1,
  243. expected: Some(node_1),
  244. },
  245. AssertNode {
  246. path: path_2,
  247. expected: Some(node_2_2),
  248. },
  249. AssertNode {
  250. path: path_3,
  251. expected: Some(node_2_1),
  252. },
  253. AssertNumberOfChildrenAtPath {
  254. path: None,
  255. expected: 4,
  256. },
  257. ];
  258. test.run_scripts(scripts);
  259. }
  260. #[test]
  261. fn node_insert_nested_nodes_test() {
  262. let mut test = NodeTest::new();
  263. let node_data_1_1 = NodeDataBuilder::new("text_1_1").build();
  264. let node_data_1_2 = NodeDataBuilder::new("text_1_2").build();
  265. let node_data_1 = NodeDataBuilder::new("text_1")
  266. .add_node_data(node_data_1_1.clone())
  267. .add_node_data(node_data_1_2.clone())
  268. .build();
  269. let node_data_2_1 = NodeDataBuilder::new("text_2_1").build();
  270. let node_data_2_2 = NodeDataBuilder::new("text_2_2").build();
  271. let node_data_2 = NodeDataBuilder::new("text_2")
  272. .add_node_data(node_data_2_1.clone())
  273. .add_node_data(node_data_2_2.clone())
  274. .build();
  275. let scripts = vec![
  276. InsertNode {
  277. path: 0.into(),
  278. node_data: node_data_1,
  279. rev_id: 1,
  280. },
  281. InsertNode {
  282. path: 1.into(),
  283. node_data: node_data_2,
  284. rev_id: 2,
  285. },
  286. // the tree will be:
  287. // 0:text_1
  288. // 0:text_1_1
  289. // 1:text_1_2
  290. // 1:text_2
  291. // 0:text_2_1
  292. // 1:text_2_2
  293. AssertNode {
  294. path: vec![0, 0].into(),
  295. expected: Some(node_data_1_1.into()),
  296. },
  297. AssertNode {
  298. path: vec![0, 1].into(),
  299. expected: Some(node_data_1_2.into()),
  300. },
  301. AssertNode {
  302. path: vec![1, 0].into(),
  303. expected: Some(node_data_2_1.into()),
  304. },
  305. AssertNode {
  306. path: vec![1, 1].into(),
  307. expected: Some(node_data_2_2.into()),
  308. },
  309. ];
  310. test.run_scripts(scripts);
  311. }
  312. #[test]
  313. fn node_insert_node_before_existing_nested_nodes_test() {
  314. let mut test = NodeTest::new();
  315. let node_data_1_1 = NodeDataBuilder::new("text_1_1").build();
  316. let node_data_1_2 = NodeDataBuilder::new("text_1_2").build();
  317. let node_data_1 = NodeDataBuilder::new("text_1")
  318. .add_node_data(node_data_1_1.clone())
  319. .add_node_data(node_data_1_2.clone())
  320. .build();
  321. let scripts = vec![
  322. InsertNode {
  323. path: 0.into(),
  324. node_data: node_data_1,
  325. rev_id: 1,
  326. },
  327. // 0:text_1
  328. // 0:text_1_1
  329. // 1:text_1_2
  330. InsertNode {
  331. path: 0.into(),
  332. node_data: NodeDataBuilder::new("text_0").build(),
  333. rev_id: 2,
  334. },
  335. // 0:text_0
  336. // 1:text_1
  337. // 0:text_1_1
  338. // 1:text_1_2
  339. AssertNode {
  340. path: vec![1, 0].into(),
  341. expected: Some(node_data_1_1.into()),
  342. },
  343. AssertNode {
  344. path: vec![1, 1].into(),
  345. expected: Some(node_data_1_2.into()),
  346. },
  347. ];
  348. test.run_scripts(scripts);
  349. }
  350. #[test]
  351. fn node_insert_with_attributes_test() {
  352. let mut test = NodeTest::new();
  353. let path: Path = 0.into();
  354. let mut inserted_node = NodeData::new("text");
  355. inserted_node.attributes.insert("bold", true);
  356. inserted_node.attributes.insert("underline", true);
  357. let scripts = vec![
  358. InsertNode {
  359. path: path.clone(),
  360. node_data: inserted_node.clone(),
  361. rev_id: 1,
  362. },
  363. UpdateAttributes {
  364. path: path.clone(),
  365. attributes: inserted_node.attributes.clone(),
  366. },
  367. AssertNode {
  368. path,
  369. expected: Some(inserted_node),
  370. },
  371. ];
  372. test.run_scripts(scripts);
  373. }
  374. #[test]
  375. fn node_delete_test() {
  376. let mut test = NodeTest::new();
  377. let inserted_node = NodeData::new("text");
  378. let path: Path = 0.into();
  379. let scripts = vec![
  380. InsertNode {
  381. path: path.clone(),
  382. node_data: inserted_node,
  383. rev_id: 1,
  384. },
  385. DeleteNode {
  386. path: path.clone(),
  387. rev_id: 2,
  388. },
  389. AssertNode { path, expected: None },
  390. ];
  391. test.run_scripts(scripts);
  392. }
  393. #[test]
  394. fn node_delete_node_from_list_test() {
  395. let mut test = NodeTest::new();
  396. let image_a = NodeData::new("image_a");
  397. let image_b = NodeData::new("image_b");
  398. let image_1 = NodeDataBuilder::new("image_1")
  399. .add_node_data(image_a.clone())
  400. .add_node_data(image_b.clone())
  401. .build();
  402. let text_node_1 = NodeDataBuilder::new("text_1").add_node_data(image_1.clone()).build();
  403. let image_2 = NodeDataBuilder::new("image_2")
  404. .add_node_data(image_a.clone())
  405. .add_node_data(image_b.clone())
  406. .build();
  407. let text_node_2 = NodeDataBuilder::new("text_2").add_node_data(image_2.clone()).build();
  408. let scripts = vec![
  409. InsertNode {
  410. path: 0.into(),
  411. node_data: text_node_1,
  412. rev_id: 1,
  413. },
  414. InsertNode {
  415. path: 1.into(),
  416. node_data: text_node_2.clone(),
  417. rev_id: 1,
  418. },
  419. DeleteNode {
  420. path: 0.into(),
  421. rev_id: 2,
  422. },
  423. AssertNode {
  424. path: 1.into(),
  425. expected: None,
  426. },
  427. AssertNode {
  428. path: 0.into(),
  429. expected: Some(text_node_2),
  430. },
  431. AssertNode {
  432. path: vec![0, 0].into(),
  433. expected: Some(image_2),
  434. },
  435. ];
  436. test.run_scripts(scripts);
  437. }
  438. #[test]
  439. fn node_delete_nested_node_test() {
  440. let mut test = NodeTest::new();
  441. let image_a = NodeData::new("image_a");
  442. let image_b = NodeData::new("image_b");
  443. let image_1 = NodeDataBuilder::new("image_1")
  444. .add_node_data(image_a.clone())
  445. .add_node_data(image_b.clone())
  446. .build();
  447. let text_node_1 = NodeDataBuilder::new("text_1").add_node_data(image_1.clone()).build();
  448. let image_2 = NodeDataBuilder::new("image_2")
  449. .add_node_data(image_a.clone())
  450. .add_node_data(image_b.clone())
  451. .build();
  452. let text_node_2 = NodeDataBuilder::new("text_2").add_node_data(image_2.clone()).build();
  453. let scripts = vec![
  454. InsertNode {
  455. path: 0.into(),
  456. node_data: text_node_1,
  457. rev_id: 1,
  458. },
  459. InsertNode {
  460. path: 1.into(),
  461. node_data: text_node_2.clone(),
  462. rev_id: 1,
  463. },
  464. // 0:text_1
  465. // 0:image_1
  466. // 0:image_a
  467. // 1:image_b
  468. // 1:text_2
  469. // 0:image_2
  470. // 0:image_a
  471. // 1:image_b
  472. DeleteNode {
  473. path: vec![0, 0, 0].into(),
  474. rev_id: 2,
  475. },
  476. // 0:text_1
  477. // 0:image_1
  478. // 0:image_b
  479. // 1:text_2
  480. // 0:image_2
  481. // 0:image_a
  482. // 1:image_b
  483. AssertNode {
  484. path: vec![0, 0, 0].into(),
  485. expected: Some(image_b.clone()),
  486. },
  487. DeleteNode {
  488. path: vec![0, 0].into(),
  489. rev_id: 3,
  490. },
  491. // 0:text_1
  492. // 1:text_2
  493. // 0:image_2
  494. // 0:image_a
  495. // 1:image_b
  496. AssertNumberOfChildrenAtPath {
  497. path: Some(0.into()),
  498. expected: 0,
  499. },
  500. AssertNode {
  501. path: vec![0].into(),
  502. expected: Some(NodeDataBuilder::new("text_1").build()),
  503. },
  504. AssertNode {
  505. path: vec![1, 0, 0].into(),
  506. expected: Some(image_a.clone()),
  507. },
  508. AssertNode {
  509. path: vec![1, 0, 1].into(),
  510. expected: Some(image_b.clone()),
  511. },
  512. ];
  513. test.run_scripts(scripts);
  514. }
  515. #[test]
  516. fn node_delete_children_test() {
  517. let mut test = NodeTest::new();
  518. let inserted_node = NodeDataBuilder::new("text")
  519. .add_node_data(NodeDataBuilder::new("sub_text_1").build())
  520. .add_node_data(NodeDataBuilder::new("sub_text_2").build())
  521. .add_node_data(NodeDataBuilder::new("sub_text_3").build())
  522. .build();
  523. let scripts = vec![
  524. InsertNode {
  525. path: vec![0].into(),
  526. node_data: inserted_node,
  527. rev_id: 1,
  528. },
  529. AssertNode {
  530. path: vec![0, 0].into(),
  531. expected: Some(NodeDataBuilder::new("sub_text_1").build()),
  532. },
  533. AssertNode {
  534. path: vec![0, 1].into(),
  535. expected: Some(NodeDataBuilder::new("sub_text_2").build()),
  536. },
  537. AssertNode {
  538. path: vec![0, 2].into(),
  539. expected: Some(NodeDataBuilder::new("sub_text_3").build()),
  540. },
  541. AssertNumberOfChildrenAtPath {
  542. path: Some(Path(vec![0])),
  543. expected: 3,
  544. },
  545. DeleteNode {
  546. path: vec![0, 0].into(),
  547. rev_id: 2,
  548. },
  549. AssertNode {
  550. path: vec![0, 0].into(),
  551. expected: Some(NodeDataBuilder::new("sub_text_2").build()),
  552. },
  553. AssertNumberOfChildrenAtPath {
  554. path: Some(Path(vec![0])),
  555. expected: 2,
  556. },
  557. ];
  558. test.run_scripts(scripts);
  559. }
  560. #[test]
  561. fn node_reorder_sub_nodes_test() {
  562. let mut test = NodeTest::new();
  563. let image_a = NodeData::new("image_a");
  564. let image_b = NodeData::new("image_b");
  565. let child_1 = NodeDataBuilder::new("image_1")
  566. .add_node_data(image_a.clone())
  567. .add_node_data(image_b.clone())
  568. .build();
  569. let text_node_1 = NodeDataBuilder::new("text_1").add_node_data(child_1.clone()).build();
  570. let scripts = vec![
  571. InsertNode {
  572. path: 0.into(),
  573. node_data: text_node_1,
  574. rev_id: 1,
  575. },
  576. // 0:text_1
  577. // 0:image_1
  578. // 0:image_a
  579. // 1:image_b
  580. DeleteNode {
  581. path: vec![0, 0, 0].into(),
  582. rev_id: 2,
  583. },
  584. // 0:text_1
  585. // 0:image_1
  586. // 0:image_b
  587. InsertNode {
  588. path: vec![0, 0, 1].into(),
  589. node_data: image_a.clone(),
  590. rev_id: 3,
  591. },
  592. // 0:text_1
  593. // 0:image_1
  594. // 0:image_b
  595. // 1:image_a
  596. AssertNode {
  597. path: vec![0, 0, 0].into(),
  598. expected: Some(image_b.clone()),
  599. },
  600. AssertNode {
  601. path: vec![0, 0, 1].into(),
  602. expected: Some(image_a.clone()),
  603. },
  604. ];
  605. test.run_scripts(scripts);
  606. }
  607. #[test]
  608. fn node_reorder_nodes_test() {
  609. let mut test = NodeTest::new();
  610. let image_a = NodeData::new("image_a");
  611. let image_b = NodeData::new("image_b");
  612. let image_1 = NodeDataBuilder::new("image_1")
  613. .add_node_data(image_a.clone())
  614. .add_node_data(image_b.clone())
  615. .build();
  616. let text_node_1 = NodeDataBuilder::new("text_1").add_node_data(image_1.clone()).build();
  617. let image_2 = NodeDataBuilder::new("image_2")
  618. .add_node_data(image_a.clone())
  619. .add_node_data(image_b.clone())
  620. .build();
  621. let text_node_2 = NodeDataBuilder::new("text_2").add_node_data(image_2.clone()).build();
  622. let scripts = vec![
  623. InsertNode {
  624. path: 0.into(),
  625. node_data: text_node_1.clone(),
  626. rev_id: 1,
  627. },
  628. InsertNode {
  629. path: 0.into(),
  630. node_data: text_node_2.clone(),
  631. rev_id: 1,
  632. },
  633. // 0:text_1
  634. // 0:image_1
  635. // 0:image_a
  636. // 1:image_b
  637. // 1:text_2
  638. // 0:image_2
  639. // 0:image_a
  640. // 1:image_b
  641. DeleteNode {
  642. path: vec![0].into(),
  643. rev_id: 2,
  644. },
  645. InsertNode {
  646. path: vec![1].into(),
  647. node_data: text_node_1.clone(),
  648. rev_id: 3,
  649. },
  650. // 0:text_2
  651. // 0:image_2
  652. // 0:image_a
  653. // 1:image_b
  654. // 1:text_1
  655. // 0:image_1
  656. // 0:image_a
  657. // 1:image_b
  658. AssertNode {
  659. path: vec![0].into(),
  660. expected: Some(text_node_2.clone()),
  661. },
  662. AssertNode {
  663. path: vec![0, 0].into(),
  664. expected: Some(image_2.clone()),
  665. },
  666. AssertNode {
  667. path: vec![0, 0, 0].into(),
  668. expected: Some(image_a.clone()),
  669. },
  670. AssertNode {
  671. path: vec![1].into(),
  672. expected: Some(text_node_1.clone()),
  673. },
  674. AssertNode {
  675. path: vec![1, 0].into(),
  676. expected: Some(image_1.clone()),
  677. },
  678. AssertNode {
  679. path: vec![1, 0, 1].into(),
  680. expected: Some(image_b.clone()),
  681. },
  682. ];
  683. test.run_scripts(scripts);
  684. }
  685. #[test]
  686. fn node_update_body_test() {
  687. let mut test = NodeTest::new();
  688. let (initial_delta, changeset, _, expected) = make_node_delta_changeset("Hello", "AppFlowy");
  689. let node = NodeDataBuilder::new("text")
  690. .insert_body(Body::Delta(initial_delta))
  691. .build();
  692. let scripts = vec![
  693. InsertNode {
  694. path: 0.into(),
  695. node_data: node,
  696. rev_id: 1,
  697. },
  698. UpdateBody {
  699. path: 0.into(),
  700. changeset,
  701. },
  702. AssertNodeDelta {
  703. path: 0.into(),
  704. expected,
  705. },
  706. ];
  707. test.run_scripts(scripts);
  708. }
  709. #[test]
  710. fn node_inverted_body_changeset_test() {
  711. let mut test = NodeTest::new();
  712. let (initial_delta, changeset, inverted_changeset, _expected) = make_node_delta_changeset("Hello", "AppFlowy");
  713. let node = NodeDataBuilder::new("text")
  714. .insert_body(Body::Delta(initial_delta.clone()))
  715. .build();
  716. let scripts = vec![
  717. InsertNode {
  718. path: 0.into(),
  719. node_data: node,
  720. rev_id: 1,
  721. },
  722. UpdateBody {
  723. path: 0.into(),
  724. changeset,
  725. },
  726. UpdateBody {
  727. path: 0.into(),
  728. changeset: inverted_changeset,
  729. },
  730. AssertNodeDelta {
  731. path: 0.into(),
  732. expected: initial_delta,
  733. },
  734. ];
  735. test.run_scripts(scripts);
  736. }
  737. fn make_node_delta_changeset(
  738. initial_content: &str,
  739. insert_str: &str,
  740. ) -> (TextOperations, Changeset, Changeset, TextOperations) {
  741. let initial_content = initial_content.to_owned();
  742. let initial_delta = TextOperationBuilder::new().insert(&initial_content).build();
  743. let delta = TextOperationBuilder::new()
  744. .retain(initial_content.len())
  745. .insert(insert_str)
  746. .build();
  747. let inverted = delta.invert(&initial_delta);
  748. let expected = initial_delta.compose(&delta).unwrap();
  749. let changeset = Changeset::Delta {
  750. delta: delta.clone(),
  751. inverted: inverted.clone(),
  752. };
  753. let inverted_changeset = Changeset::Delta {
  754. delta: inverted,
  755. inverted: delta,
  756. };
  757. (initial_delta, changeset, inverted_changeset, expected)
  758. }