tree_test.rs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  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 node_delete_node_from_list_test() {
  334. let mut test = NodeTest::new();
  335. let image_a = NodeData::new("image_a");
  336. let image_b = NodeData::new("image_b");
  337. let image_1 = NodeDataBuilder::new("image_1")
  338. .add_node_data(image_a.clone())
  339. .add_node_data(image_b.clone())
  340. .build();
  341. let text_node_1 = NodeDataBuilder::new("text_1")
  342. .add_node_data(image_1)
  343. .build();
  344. let image_2 = NodeDataBuilder::new("image_2")
  345. .add_node_data(image_a)
  346. .add_node_data(image_b)
  347. .build();
  348. let text_node_2 = NodeDataBuilder::new("text_2")
  349. .add_node_data(image_2.clone())
  350. .build();
  351. let scripts = vec![
  352. InsertNode {
  353. path: 0.into(),
  354. node_data: text_node_1,
  355. rev_id: 1,
  356. },
  357. InsertNode {
  358. path: 1.into(),
  359. node_data: text_node_2.clone(),
  360. rev_id: 2,
  361. },
  362. DeleteNode {
  363. path: 0.into(),
  364. rev_id: 3,
  365. },
  366. AssertNode {
  367. path: 1.into(),
  368. expected: None,
  369. },
  370. AssertNode {
  371. path: 0.into(),
  372. expected: Some(text_node_2),
  373. },
  374. AssertNode {
  375. path: vec![0, 0].into(),
  376. expected: Some(image_2),
  377. },
  378. ];
  379. test.run_scripts(scripts);
  380. }
  381. #[test]
  382. fn node_delete_nested_node_test() {
  383. let mut test = NodeTest::new();
  384. let image_a = NodeData::new("image_a");
  385. let image_b = NodeData::new("image_b");
  386. let image_1 = NodeDataBuilder::new("image_1")
  387. .add_node_data(image_a.clone())
  388. .add_node_data(image_b.clone())
  389. .build();
  390. let text_node_1 = NodeDataBuilder::new("text_1")
  391. .add_node_data(image_1)
  392. .build();
  393. let image_2 = NodeDataBuilder::new("image_2")
  394. .add_node_data(image_a.clone())
  395. .add_node_data(image_b.clone())
  396. .build();
  397. let text_node_2 = NodeDataBuilder::new("text_2")
  398. .add_node_data(image_2)
  399. .build();
  400. let scripts = vec![
  401. InsertNode {
  402. path: 0.into(),
  403. node_data: text_node_1,
  404. rev_id: 1,
  405. },
  406. InsertNode {
  407. path: 1.into(),
  408. node_data: text_node_2,
  409. rev_id: 2,
  410. },
  411. // 0:text_1
  412. // 0:image_1
  413. // 0:image_a
  414. // 1:image_b
  415. // 1:text_2
  416. // 0:image_2
  417. // 0:image_a
  418. // 1:image_b
  419. DeleteNode {
  420. path: vec![0, 0, 0].into(),
  421. rev_id: 3,
  422. },
  423. // 0:text_1
  424. // 0:image_1
  425. // 0:image_b
  426. // 1:text_2
  427. // 0:image_2
  428. // 0:image_a
  429. // 1:image_b
  430. AssertNode {
  431. path: vec![0, 0, 0].into(),
  432. expected: Some(image_b.clone()),
  433. },
  434. DeleteNode {
  435. path: vec![0, 0].into(),
  436. rev_id: 4,
  437. },
  438. // 0:text_1
  439. // 1:text_2
  440. // 0:image_2
  441. // 0:image_a
  442. // 1:image_b
  443. AssertNumberOfChildrenAtPath {
  444. path: Some(0.into()),
  445. expected: 0,
  446. },
  447. AssertNode {
  448. path: vec![0].into(),
  449. expected: Some(NodeDataBuilder::new("text_1").build()),
  450. },
  451. AssertNode {
  452. path: vec![1, 0, 0].into(),
  453. expected: Some(image_a),
  454. },
  455. AssertNode {
  456. path: vec![1, 0, 1].into(),
  457. expected: Some(image_b),
  458. },
  459. ];
  460. test.run_scripts(scripts);
  461. }
  462. #[test]
  463. fn node_delete_children_test() {
  464. let mut test = NodeTest::new();
  465. let inserted_node = NodeDataBuilder::new("text")
  466. .add_node_data(NodeDataBuilder::new("sub_text_1").build())
  467. .add_node_data(NodeDataBuilder::new("sub_text_2").build())
  468. .add_node_data(NodeDataBuilder::new("sub_text_3").build())
  469. .build();
  470. let scripts = vec![
  471. InsertNode {
  472. path: vec![0].into(),
  473. node_data: inserted_node,
  474. rev_id: 1,
  475. },
  476. AssertNode {
  477. path: vec![0, 0].into(),
  478. expected: Some(NodeDataBuilder::new("sub_text_1").build()),
  479. },
  480. AssertNode {
  481. path: vec![0, 1].into(),
  482. expected: Some(NodeDataBuilder::new("sub_text_2").build()),
  483. },
  484. AssertNode {
  485. path: vec![0, 2].into(),
  486. expected: Some(NodeDataBuilder::new("sub_text_3").build()),
  487. },
  488. AssertNumberOfChildrenAtPath {
  489. path: Some(Path(vec![0])),
  490. expected: 3,
  491. },
  492. DeleteNode {
  493. path: vec![0, 0].into(),
  494. rev_id: 2,
  495. },
  496. AssertNode {
  497. path: vec![0, 0].into(),
  498. expected: Some(NodeDataBuilder::new("sub_text_2").build()),
  499. },
  500. AssertNumberOfChildrenAtPath {
  501. path: Some(Path(vec![0])),
  502. expected: 2,
  503. },
  504. ];
  505. test.run_scripts(scripts);
  506. }
  507. #[test]
  508. fn node_reorder_sub_nodes_test() {
  509. let mut test = NodeTest::new();
  510. let image_a = NodeData::new("image_a");
  511. let image_b = NodeData::new("image_b");
  512. let child_1 = NodeDataBuilder::new("image_1")
  513. .add_node_data(image_a.clone())
  514. .add_node_data(image_b.clone())
  515. .build();
  516. let text_node_1 = NodeDataBuilder::new("text_1")
  517. .add_node_data(child_1)
  518. .build();
  519. let scripts = vec![
  520. InsertNode {
  521. path: 0.into(),
  522. node_data: text_node_1,
  523. rev_id: 1,
  524. },
  525. // 0:text_1
  526. // 0:image_1
  527. // 0:image_a
  528. // 1:image_b
  529. DeleteNode {
  530. path: vec![0, 0, 0].into(),
  531. rev_id: 2,
  532. },
  533. // 0:text_1
  534. // 0:image_1
  535. // 0:image_b
  536. InsertNode {
  537. path: vec![0, 0, 1].into(),
  538. node_data: image_a.clone(),
  539. rev_id: 3,
  540. },
  541. // 0:text_1
  542. // 0:image_1
  543. // 0:image_b
  544. // 1:image_a
  545. AssertNode {
  546. path: vec![0, 0, 0].into(),
  547. expected: Some(image_b),
  548. },
  549. AssertNode {
  550. path: vec![0, 0, 1].into(),
  551. expected: Some(image_a),
  552. },
  553. ];
  554. test.run_scripts(scripts);
  555. }
  556. #[test]
  557. fn node_reorder_nodes_test() {
  558. let mut test = NodeTest::new();
  559. let image_a = NodeData::new("image_a");
  560. let image_b = NodeData::new("image_b");
  561. let image_1 = NodeDataBuilder::new("image_1")
  562. .add_node_data(image_a.clone())
  563. .add_node_data(image_b.clone())
  564. .build();
  565. let text_node_1 = NodeDataBuilder::new("text_1")
  566. .add_node_data(image_1.clone())
  567. .build();
  568. let image_2 = NodeDataBuilder::new("image_2")
  569. .add_node_data(image_a.clone())
  570. .add_node_data(image_b.clone())
  571. .build();
  572. let text_node_2 = NodeDataBuilder::new("text_2")
  573. .add_node_data(image_2.clone())
  574. .build();
  575. let scripts = vec![
  576. InsertNode {
  577. path: 0.into(),
  578. node_data: text_node_1.clone(),
  579. rev_id: 1,
  580. },
  581. InsertNode {
  582. path: 0.into(),
  583. node_data: text_node_2.clone(),
  584. rev_id: 1,
  585. },
  586. // 0:text_1
  587. // 0:image_1
  588. // 0:image_a
  589. // 1:image_b
  590. // 1:text_2
  591. // 0:image_2
  592. // 0:image_a
  593. // 1:image_b
  594. DeleteNode {
  595. path: vec![0].into(),
  596. rev_id: 3,
  597. },
  598. AssertNode {
  599. path: vec![0].into(),
  600. expected: Some(text_node_2.clone()),
  601. },
  602. InsertNode {
  603. path: vec![1].into(),
  604. node_data: text_node_1.clone(),
  605. rev_id: 4,
  606. },
  607. // 0:text_2
  608. // 0:image_2
  609. // 0:image_a
  610. // 1:image_b
  611. // 1:text_1
  612. // 0:image_1
  613. // 0:image_a
  614. // 1:image_b
  615. AssertNode {
  616. path: vec![0].into(),
  617. expected: Some(text_node_2),
  618. },
  619. AssertNode {
  620. path: vec![0, 0].into(),
  621. expected: Some(image_2),
  622. },
  623. AssertNode {
  624. path: vec![0, 0, 0].into(),
  625. expected: Some(image_a),
  626. },
  627. AssertNode {
  628. path: vec![1].into(),
  629. expected: Some(text_node_1),
  630. },
  631. AssertNode {
  632. path: vec![1, 0].into(),
  633. expected: Some(image_1),
  634. },
  635. AssertNode {
  636. path: vec![1, 0, 1].into(),
  637. expected: Some(image_b),
  638. },
  639. ];
  640. test.run_scripts(scripts);
  641. }
  642. #[test]
  643. fn node_update_body_test() {
  644. let mut test = NodeTest::new();
  645. let (initial_delta, changeset, expected) = make_node_delta_changeset("Hello", "AppFlowy");
  646. let node = NodeDataBuilder::new("text")
  647. .insert_delta(initial_delta)
  648. .build();
  649. let scripts = vec![
  650. InsertNode {
  651. path: 0.into(),
  652. node_data: node,
  653. rev_id: 1,
  654. },
  655. UpdateBody {
  656. path: 0.into(),
  657. changeset,
  658. },
  659. AssertNodeDelta {
  660. path: 0.into(),
  661. expected,
  662. },
  663. ];
  664. test.run_scripts(scripts);
  665. }
  666. #[test]
  667. fn node_inverted_body_changeset_test() {
  668. let mut test = NodeTest::new();
  669. let (initial_delta, changeset, _expected) = make_node_delta_changeset("Hello", "AppFlowy");
  670. let node = NodeDataBuilder::new("text")
  671. .insert_delta(initial_delta.clone())
  672. .build();
  673. let scripts = vec![
  674. InsertNode {
  675. path: 0.into(),
  676. node_data: node,
  677. rev_id: 1,
  678. },
  679. UpdateBody {
  680. path: 0.into(),
  681. changeset: changeset.clone(),
  682. },
  683. UpdateBody {
  684. path: 0.into(),
  685. changeset: changeset.inverted(),
  686. },
  687. AssertNodeDelta {
  688. path: 0.into(),
  689. expected: initial_delta,
  690. },
  691. ];
  692. test.run_scripts(scripts);
  693. }