tree_test.rs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708
  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").add_node_data(image.clone()).build();
  107. let path: Path = 0.into();
  108. let scripts = vec![
  109. InsertNode {
  110. path: path.clone(),
  111. node_data: node_data.clone(),
  112. rev_id: 1,
  113. },
  114. // 0:text
  115. // 0:image
  116. // 0:image_1
  117. // 1:image_2
  118. AssertNode {
  119. path,
  120. expected: Some(node_data),
  121. },
  122. AssertNode {
  123. path: vec![0, 0].into(),
  124. expected: Some(image),
  125. },
  126. AssertNode {
  127. path: vec![0, 0, 0].into(),
  128. expected: Some(image_1),
  129. },
  130. AssertNode {
  131. path: vec![0, 0, 1].into(),
  132. expected: Some(image_2),
  133. },
  134. ];
  135. test.run_scripts(scripts);
  136. }
  137. #[test]
  138. fn node_insert_node_in_ordered_nodes_test() {
  139. let mut test = NodeTest::new();
  140. let path_1: Path = 0.into();
  141. let node_1 = NodeData::new("text_1");
  142. let path_2: Path = 1.into();
  143. let node_2_1 = NodeData::new("text_2_1");
  144. let node_2_2 = NodeData::new("text_2_2");
  145. let path_3: Path = 2.into();
  146. let node_3 = NodeData::new("text_3");
  147. let scripts = vec![
  148. InsertNode {
  149. path: path_1.clone(),
  150. node_data: node_1.clone(),
  151. rev_id: 1,
  152. },
  153. InsertNode {
  154. path: path_2.clone(),
  155. node_data: node_2_1.clone(),
  156. rev_id: 2,
  157. },
  158. InsertNode {
  159. path: path_3.clone(),
  160. node_data: node_3,
  161. rev_id: 3,
  162. },
  163. // 0:text_1
  164. // 1:text_2_1
  165. // 2:text_3
  166. InsertNode {
  167. path: path_2.clone(),
  168. node_data: node_2_2.clone(),
  169. rev_id: 4,
  170. },
  171. // 0:text_1
  172. // 1:text_2_2
  173. // 2:text_2_1
  174. // 3:text_3
  175. AssertNode {
  176. path: path_1,
  177. expected: Some(node_1),
  178. },
  179. AssertNode {
  180. path: path_2,
  181. expected: Some(node_2_2),
  182. },
  183. AssertNode {
  184. path: path_3,
  185. expected: Some(node_2_1),
  186. },
  187. AssertNumberOfChildrenAtPath {
  188. path: None,
  189. expected: 4,
  190. },
  191. ];
  192. test.run_scripts(scripts);
  193. }
  194. #[test]
  195. fn node_insert_nested_nodes_test() {
  196. let mut test = NodeTest::new();
  197. let node_data_1_1 = NodeDataBuilder::new("text_1_1").build();
  198. let node_data_1_2 = NodeDataBuilder::new("text_1_2").build();
  199. let node_data_1 = NodeDataBuilder::new("text_1")
  200. .add_node_data(node_data_1_1.clone())
  201. .add_node_data(node_data_1_2.clone())
  202. .build();
  203. let node_data_2_1 = NodeDataBuilder::new("text_2_1").build();
  204. let node_data_2_2 = NodeDataBuilder::new("text_2_2").build();
  205. let node_data_2 = NodeDataBuilder::new("text_2")
  206. .add_node_data(node_data_2_1.clone())
  207. .add_node_data(node_data_2_2.clone())
  208. .build();
  209. let scripts = vec![
  210. InsertNode {
  211. path: 0.into(),
  212. node_data: node_data_1,
  213. rev_id: 1,
  214. },
  215. InsertNode {
  216. path: 1.into(),
  217. node_data: node_data_2,
  218. rev_id: 2,
  219. },
  220. // the tree will be:
  221. // 0:text_1
  222. // 0:text_1_1
  223. // 1:text_1_2
  224. // 1:text_2
  225. // 0:text_2_1
  226. // 1:text_2_2
  227. AssertNode {
  228. path: vec![0, 0].into(),
  229. expected: Some(node_data_1_1),
  230. },
  231. AssertNode {
  232. path: vec![0, 1].into(),
  233. expected: Some(node_data_1_2),
  234. },
  235. AssertNode {
  236. path: vec![1, 0].into(),
  237. expected: Some(node_data_2_1),
  238. },
  239. AssertNode {
  240. path: vec![1, 1].into(),
  241. expected: Some(node_data_2_2),
  242. },
  243. ];
  244. test.run_scripts(scripts);
  245. }
  246. #[test]
  247. fn node_insert_node_before_existing_nested_nodes_test() {
  248. let mut test = NodeTest::new();
  249. let node_data_1_1 = NodeDataBuilder::new("text_1_1").build();
  250. let node_data_1_2 = NodeDataBuilder::new("text_1_2").build();
  251. let node_data_1 = NodeDataBuilder::new("text_1")
  252. .add_node_data(node_data_1_1.clone())
  253. .add_node_data(node_data_1_2.clone())
  254. .build();
  255. let scripts = vec![
  256. InsertNode {
  257. path: 0.into(),
  258. node_data: node_data_1,
  259. rev_id: 1,
  260. },
  261. // 0:text_1
  262. // 0:text_1_1
  263. // 1:text_1_2
  264. InsertNode {
  265. path: 0.into(),
  266. node_data: NodeDataBuilder::new("text_0").build(),
  267. rev_id: 2,
  268. },
  269. // 0:text_0
  270. // 1:text_1
  271. // 0:text_1_1
  272. // 1:text_1_2
  273. AssertNode {
  274. path: vec![1, 0].into(),
  275. expected: Some(node_data_1_1),
  276. },
  277. AssertNode {
  278. path: vec![1, 1].into(),
  279. expected: Some(node_data_1_2),
  280. },
  281. ];
  282. test.run_scripts(scripts);
  283. }
  284. #[test]
  285. fn node_insert_with_attributes_test() {
  286. let mut test = NodeTest::new();
  287. let path: Path = 0.into();
  288. let mut inserted_node = NodeData::new("text");
  289. inserted_node.attributes.insert("bold", true);
  290. inserted_node.attributes.insert("underline", true);
  291. let scripts = vec![
  292. InsertNode {
  293. path: path.clone(),
  294. node_data: inserted_node.clone(),
  295. rev_id: 1,
  296. },
  297. UpdateAttributes {
  298. path: path.clone(),
  299. attributes: inserted_node.attributes.clone(),
  300. },
  301. AssertNode {
  302. path,
  303. expected: Some(inserted_node),
  304. },
  305. ];
  306. test.run_scripts(scripts);
  307. }
  308. #[test]
  309. fn node_delete_test() {
  310. let mut test = NodeTest::new();
  311. let inserted_node = NodeData::new("text");
  312. let path: Path = 0.into();
  313. let scripts = vec![
  314. InsertNode {
  315. path: path.clone(),
  316. node_data: inserted_node,
  317. rev_id: 1,
  318. },
  319. DeleteNode {
  320. path: path.clone(),
  321. rev_id: 2,
  322. },
  323. AssertNode { path, expected: None },
  324. ];
  325. test.run_scripts(scripts);
  326. }
  327. #[test]
  328. fn node_delete_node_from_list_test() {
  329. let mut test = NodeTest::new();
  330. let image_a = NodeData::new("image_a");
  331. let image_b = NodeData::new("image_b");
  332. let image_1 = NodeDataBuilder::new("image_1")
  333. .add_node_data(image_a.clone())
  334. .add_node_data(image_b.clone())
  335. .build();
  336. let text_node_1 = NodeDataBuilder::new("text_1").add_node_data(image_1).build();
  337. let image_2 = NodeDataBuilder::new("image_2")
  338. .add_node_data(image_a)
  339. .add_node_data(image_b)
  340. .build();
  341. let text_node_2 = NodeDataBuilder::new("text_2").add_node_data(image_2.clone()).build();
  342. let scripts = vec![
  343. InsertNode {
  344. path: 0.into(),
  345. node_data: text_node_1,
  346. rev_id: 1,
  347. },
  348. InsertNode {
  349. path: 1.into(),
  350. node_data: text_node_2.clone(),
  351. rev_id: 2,
  352. },
  353. DeleteNode {
  354. path: 0.into(),
  355. rev_id: 3,
  356. },
  357. AssertNode {
  358. path: 1.into(),
  359. expected: None,
  360. },
  361. AssertNode {
  362. path: 0.into(),
  363. expected: Some(text_node_2),
  364. },
  365. AssertNode {
  366. path: vec![0, 0].into(),
  367. expected: Some(image_2),
  368. },
  369. ];
  370. test.run_scripts(scripts);
  371. }
  372. #[test]
  373. fn node_delete_nested_node_test() {
  374. let mut test = NodeTest::new();
  375. let image_a = NodeData::new("image_a");
  376. let image_b = NodeData::new("image_b");
  377. let image_1 = NodeDataBuilder::new("image_1")
  378. .add_node_data(image_a.clone())
  379. .add_node_data(image_b.clone())
  380. .build();
  381. let text_node_1 = NodeDataBuilder::new("text_1").add_node_data(image_1).build();
  382. let image_2 = NodeDataBuilder::new("image_2")
  383. .add_node_data(image_a.clone())
  384. .add_node_data(image_b.clone())
  385. .build();
  386. let text_node_2 = NodeDataBuilder::new("text_2").add_node_data(image_2).build();
  387. let scripts = vec![
  388. InsertNode {
  389. path: 0.into(),
  390. node_data: text_node_1,
  391. rev_id: 1,
  392. },
  393. InsertNode {
  394. path: 1.into(),
  395. node_data: text_node_2,
  396. rev_id: 2,
  397. },
  398. // 0:text_1
  399. // 0:image_1
  400. // 0:image_a
  401. // 1:image_b
  402. // 1:text_2
  403. // 0:image_2
  404. // 0:image_a
  405. // 1:image_b
  406. DeleteNode {
  407. path: vec![0, 0, 0].into(),
  408. rev_id: 3,
  409. },
  410. // 0:text_1
  411. // 0:image_1
  412. // 0:image_b
  413. // 1:text_2
  414. // 0:image_2
  415. // 0:image_a
  416. // 1:image_b
  417. AssertNode {
  418. path: vec![0, 0, 0].into(),
  419. expected: Some(image_b.clone()),
  420. },
  421. DeleteNode {
  422. path: vec![0, 0].into(),
  423. rev_id: 4,
  424. },
  425. // 0:text_1
  426. // 1:text_2
  427. // 0:image_2
  428. // 0:image_a
  429. // 1:image_b
  430. AssertNumberOfChildrenAtPath {
  431. path: Some(0.into()),
  432. expected: 0,
  433. },
  434. AssertNode {
  435. path: vec![0].into(),
  436. expected: Some(NodeDataBuilder::new("text_1").build()),
  437. },
  438. AssertNode {
  439. path: vec![1, 0, 0].into(),
  440. expected: Some(image_a),
  441. },
  442. AssertNode {
  443. path: vec![1, 0, 1].into(),
  444. expected: Some(image_b),
  445. },
  446. ];
  447. test.run_scripts(scripts);
  448. }
  449. #[test]
  450. fn node_delete_children_test() {
  451. let mut test = NodeTest::new();
  452. let inserted_node = NodeDataBuilder::new("text")
  453. .add_node_data(NodeDataBuilder::new("sub_text_1").build())
  454. .add_node_data(NodeDataBuilder::new("sub_text_2").build())
  455. .add_node_data(NodeDataBuilder::new("sub_text_3").build())
  456. .build();
  457. let scripts = vec![
  458. InsertNode {
  459. path: vec![0].into(),
  460. node_data: inserted_node,
  461. rev_id: 1,
  462. },
  463. AssertNode {
  464. path: vec![0, 0].into(),
  465. expected: Some(NodeDataBuilder::new("sub_text_1").build()),
  466. },
  467. AssertNode {
  468. path: vec![0, 1].into(),
  469. expected: Some(NodeDataBuilder::new("sub_text_2").build()),
  470. },
  471. AssertNode {
  472. path: vec![0, 2].into(),
  473. expected: Some(NodeDataBuilder::new("sub_text_3").build()),
  474. },
  475. AssertNumberOfChildrenAtPath {
  476. path: Some(Path(vec![0])),
  477. expected: 3,
  478. },
  479. DeleteNode {
  480. path: vec![0, 0].into(),
  481. rev_id: 2,
  482. },
  483. AssertNode {
  484. path: vec![0, 0].into(),
  485. expected: Some(NodeDataBuilder::new("sub_text_2").build()),
  486. },
  487. AssertNumberOfChildrenAtPath {
  488. path: Some(Path(vec![0])),
  489. expected: 2,
  490. },
  491. ];
  492. test.run_scripts(scripts);
  493. }
  494. #[test]
  495. fn node_reorder_sub_nodes_test() {
  496. let mut test = NodeTest::new();
  497. let image_a = NodeData::new("image_a");
  498. let image_b = NodeData::new("image_b");
  499. let child_1 = NodeDataBuilder::new("image_1")
  500. .add_node_data(image_a.clone())
  501. .add_node_data(image_b.clone())
  502. .build();
  503. let text_node_1 = NodeDataBuilder::new("text_1").add_node_data(child_1).build();
  504. let scripts = vec![
  505. InsertNode {
  506. path: 0.into(),
  507. node_data: text_node_1,
  508. rev_id: 1,
  509. },
  510. // 0:text_1
  511. // 0:image_1
  512. // 0:image_a
  513. // 1:image_b
  514. DeleteNode {
  515. path: vec![0, 0, 0].into(),
  516. rev_id: 2,
  517. },
  518. // 0:text_1
  519. // 0:image_1
  520. // 0:image_b
  521. InsertNode {
  522. path: vec![0, 0, 1].into(),
  523. node_data: image_a.clone(),
  524. rev_id: 3,
  525. },
  526. // 0:text_1
  527. // 0:image_1
  528. // 0:image_b
  529. // 1:image_a
  530. AssertNode {
  531. path: vec![0, 0, 0].into(),
  532. expected: Some(image_b),
  533. },
  534. AssertNode {
  535. path: vec![0, 0, 1].into(),
  536. expected: Some(image_a),
  537. },
  538. ];
  539. test.run_scripts(scripts);
  540. }
  541. #[test]
  542. fn node_reorder_nodes_test() {
  543. let mut test = NodeTest::new();
  544. let image_a = NodeData::new("image_a");
  545. let image_b = NodeData::new("image_b");
  546. let image_1 = NodeDataBuilder::new("image_1")
  547. .add_node_data(image_a.clone())
  548. .add_node_data(image_b.clone())
  549. .build();
  550. let text_node_1 = NodeDataBuilder::new("text_1").add_node_data(image_1.clone()).build();
  551. let image_2 = NodeDataBuilder::new("image_2")
  552. .add_node_data(image_a.clone())
  553. .add_node_data(image_b.clone())
  554. .build();
  555. let text_node_2 = NodeDataBuilder::new("text_2").add_node_data(image_2.clone()).build();
  556. let scripts = vec![
  557. InsertNode {
  558. path: 0.into(),
  559. node_data: text_node_1.clone(),
  560. rev_id: 1,
  561. },
  562. InsertNode {
  563. path: 0.into(),
  564. node_data: text_node_2.clone(),
  565. rev_id: 1,
  566. },
  567. // 0:text_1
  568. // 0:image_1
  569. // 0:image_a
  570. // 1:image_b
  571. // 1:text_2
  572. // 0:image_2
  573. // 0:image_a
  574. // 1:image_b
  575. DeleteNode {
  576. path: vec![0].into(),
  577. rev_id: 3,
  578. },
  579. AssertNode {
  580. path: vec![0].into(),
  581. expected: Some(text_node_2.clone()),
  582. },
  583. InsertNode {
  584. path: vec![1].into(),
  585. node_data: text_node_1.clone(),
  586. rev_id: 4,
  587. },
  588. // 0:text_2
  589. // 0:image_2
  590. // 0:image_a
  591. // 1:image_b
  592. // 1:text_1
  593. // 0:image_1
  594. // 0:image_a
  595. // 1:image_b
  596. AssertNode {
  597. path: vec![0].into(),
  598. expected: Some(text_node_2),
  599. },
  600. AssertNode {
  601. path: vec![0, 0].into(),
  602. expected: Some(image_2),
  603. },
  604. AssertNode {
  605. path: vec![0, 0, 0].into(),
  606. expected: Some(image_a),
  607. },
  608. AssertNode {
  609. path: vec![1].into(),
  610. expected: Some(text_node_1),
  611. },
  612. AssertNode {
  613. path: vec![1, 0].into(),
  614. expected: Some(image_1),
  615. },
  616. AssertNode {
  617. path: vec![1, 0, 1].into(),
  618. expected: Some(image_b),
  619. },
  620. ];
  621. test.run_scripts(scripts);
  622. }
  623. #[test]
  624. fn node_update_body_test() {
  625. let mut test = NodeTest::new();
  626. let (initial_delta, changeset, expected) = make_node_delta_changeset("Hello", "AppFlowy");
  627. let node = NodeDataBuilder::new("text").insert_delta(initial_delta).build();
  628. let scripts = vec![
  629. InsertNode {
  630. path: 0.into(),
  631. node_data: node,
  632. rev_id: 1,
  633. },
  634. UpdateBody {
  635. path: 0.into(),
  636. changeset,
  637. },
  638. AssertNodeDelta {
  639. path: 0.into(),
  640. expected,
  641. },
  642. ];
  643. test.run_scripts(scripts);
  644. }
  645. #[test]
  646. fn node_inverted_body_changeset_test() {
  647. let mut test = NodeTest::new();
  648. let (initial_delta, changeset, _expected) = make_node_delta_changeset("Hello", "AppFlowy");
  649. let node = NodeDataBuilder::new("text").insert_delta(initial_delta.clone()).build();
  650. let scripts = vec![
  651. InsertNode {
  652. path: 0.into(),
  653. node_data: node,
  654. rev_id: 1,
  655. },
  656. UpdateBody {
  657. path: 0.into(),
  658. changeset: changeset.clone(),
  659. },
  660. UpdateBody {
  661. path: 0.into(),
  662. changeset: changeset.inverted(),
  663. },
  664. AssertNodeDelta {
  665. path: 0.into(),
  666. expected: initial_delta,
  667. },
  668. ];
  669. test.run_scripts(scripts);
  670. }