tree_test.rs 17 KB

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