passes.rs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. use dioxus::prelude::*;
  2. use dioxus_native_core::node::NodeType;
  3. use dioxus_native_core::prelude::*;
  4. use std::any::TypeId;
  5. use std::sync::{Arc, Mutex};
  6. fn create_blank_element() -> NodeType {
  7. NodeType::Element(ElementNode {
  8. tag: "div".to_owned(),
  9. namespace: None,
  10. attributes: HashMap::new(),
  11. listeners: HashMap::new(),
  12. })
  13. }
  14. #[test]
  15. fn node_pass() {
  16. #[derive(Debug, Default, Clone, PartialEq)]
  17. struct Number(i32);
  18. impl Pass for Number {
  19. type ChildDependencies = ();
  20. type NodeDependencies = ();
  21. type ParentDependencies = ();
  22. const NODE_MASK: NodeMaskBuilder = NodeMaskBuilder::new();
  23. fn pass<'a>(
  24. &mut self,
  25. node_view: NodeView,
  26. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  27. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  28. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  29. context: &SendAnyMap,
  30. ) -> bool {
  31. self.0 += 1;
  32. true
  33. }
  34. fn create<'a>(
  35. node_view: NodeView<()>,
  36. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  37. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  38. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  39. context: &SendAnyMap,
  40. ) -> Self {
  41. let mut myself = Self::default();
  42. myself.pass(node_view, node, parent, children, context);
  43. myself
  44. }
  45. }
  46. let mut tree: RealDom = RealDom::new(Box::new([Number::to_type_erased()]));
  47. tree.update_state(SendAnyMap::new(), false);
  48. assert_eq!(tree.get(tree.root_id()).unwrap().get(), Some(&Number(1)));
  49. // mark the node as dirty
  50. tree.get_mut(tree.root_id()).unwrap().get_mut::<Number>();
  51. tree.update_state(SendAnyMap::new(), false);
  52. assert_eq!(tree.get(tree.root_id()).unwrap().get(), Some(&Number(2)));
  53. }
  54. #[test]
  55. fn dependant_node_pass() {
  56. #[derive(Debug, Default, Clone, PartialEq)]
  57. struct AddNumber(i32);
  58. impl Pass for AddNumber {
  59. type ChildDependencies = ();
  60. type NodeDependencies = (SubtractNumber,);
  61. type ParentDependencies = ();
  62. const NODE_MASK: NodeMaskBuilder = NodeMaskBuilder::new();
  63. fn pass<'a>(
  64. &mut self,
  65. node_view: NodeView,
  66. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  67. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  68. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  69. context: &SendAnyMap,
  70. ) -> bool {
  71. self.0 += 1;
  72. true
  73. }
  74. fn create<'a>(
  75. node_view: NodeView<()>,
  76. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  77. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  78. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  79. context: &SendAnyMap,
  80. ) -> Self {
  81. let mut myself = Self::default();
  82. myself.pass(node_view, node, parent, children, context);
  83. myself
  84. }
  85. }
  86. #[derive(Debug, Default, Clone, PartialEq)]
  87. struct SubtractNumber(i32);
  88. impl Pass for SubtractNumber {
  89. type ChildDependencies = ();
  90. type NodeDependencies = ();
  91. type ParentDependencies = ();
  92. const NODE_MASK: NodeMaskBuilder = NodeMaskBuilder::new();
  93. fn pass<'a>(
  94. &mut self,
  95. node_view: NodeView,
  96. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  97. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  98. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  99. context: &SendAnyMap,
  100. ) -> bool {
  101. self.0 -= 1;
  102. true
  103. }
  104. fn create<'a>(
  105. node_view: NodeView<()>,
  106. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  107. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  108. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  109. context: &SendAnyMap,
  110. ) -> Self {
  111. let mut myself = Self::default();
  112. myself.pass(node_view, node, parent, children, context);
  113. myself
  114. }
  115. }
  116. let mut tree: RealDom = RealDom::new(Box::new([
  117. AddNumber::to_type_erased(),
  118. SubtractNumber::to_type_erased(),
  119. ]));
  120. tree.update_state(SendAnyMap::new(), false);
  121. let root = tree.get(tree.root_id()).unwrap();
  122. assert_eq!(root.get(), Some(&AddNumber(1)));
  123. assert_eq!(root.get(), Some(&SubtractNumber(-1)));
  124. // mark the subtract state as dirty, it should update the add state
  125. tree.get_mut(tree.root_id())
  126. .unwrap()
  127. .get_mut::<SubtractNumber>();
  128. tree.update_state(SendAnyMap::new(), false);
  129. let root = tree.get(tree.root_id()).unwrap();
  130. assert_eq!(root.get(), Some(&AddNumber(2)));
  131. assert_eq!(root.get(), Some(&SubtractNumber(-2)));
  132. // mark the add state as dirty, it should ~not~ update the subtract state
  133. tree.get_mut(tree.root_id()).unwrap().get_mut::<AddNumber>();
  134. tree.update_state(SendAnyMap::new(), false);
  135. let root = tree.get(tree.root_id()).unwrap();
  136. assert_eq!(root.get(), Some(&AddNumber(3)));
  137. assert_eq!(root.get(), Some(&SubtractNumber(-2)));
  138. }
  139. #[test]
  140. fn independant_node_pass() {
  141. #[derive(Debug, Default, Clone, PartialEq)]
  142. struct AddNumber(i32);
  143. impl Pass for AddNumber {
  144. type ChildDependencies = ();
  145. type NodeDependencies = ();
  146. type ParentDependencies = ();
  147. const NODE_MASK: NodeMaskBuilder = NodeMaskBuilder::new();
  148. fn pass<'a>(
  149. &mut self,
  150. node_view: NodeView,
  151. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  152. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  153. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  154. context: &SendAnyMap,
  155. ) -> bool {
  156. self.0 += 1;
  157. true
  158. }
  159. fn create<'a>(
  160. node_view: NodeView<()>,
  161. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  162. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  163. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  164. context: &SendAnyMap,
  165. ) -> Self {
  166. let mut myself = Self::default();
  167. myself.pass(node_view, node, parent, children, context);
  168. myself
  169. }
  170. }
  171. #[derive(Debug, Default, Clone, PartialEq)]
  172. struct SubtractNumber(i32);
  173. impl Pass for SubtractNumber {
  174. type ChildDependencies = ();
  175. type NodeDependencies = ();
  176. type ParentDependencies = ();
  177. const NODE_MASK: NodeMaskBuilder = NodeMaskBuilder::new();
  178. fn pass<'a>(
  179. &mut self,
  180. node_view: NodeView,
  181. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  182. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  183. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  184. context: &SendAnyMap,
  185. ) -> bool {
  186. self.0 -= 1;
  187. true
  188. }
  189. fn create<'a>(
  190. node_view: NodeView<()>,
  191. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  192. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  193. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  194. context: &SendAnyMap,
  195. ) -> Self {
  196. let mut myself = Self::default();
  197. myself.pass(node_view, node, parent, children, context);
  198. myself
  199. }
  200. }
  201. let mut tree: RealDom = RealDom::new(Box::new([
  202. AddNumber::to_type_erased(),
  203. SubtractNumber::to_type_erased(),
  204. ]));
  205. tree.update_state(SendAnyMap::new(), false);
  206. let root = tree.get(tree.root_id()).unwrap();
  207. assert_eq!(root.get(), Some(&AddNumber(1)));
  208. assert_eq!(root.get(), Some(&SubtractNumber(-1)));
  209. // mark the subtract state as dirty, it should ~not~ update the add state
  210. tree.get_mut(tree.root_id())
  211. .unwrap()
  212. .get_mut::<SubtractNumber>();
  213. tree.update_state(SendAnyMap::new(), false);
  214. let root = tree.get(tree.root_id()).unwrap();
  215. assert_eq!(root.get(), Some(&AddNumber(1)));
  216. assert_eq!(root.get(), Some(&SubtractNumber(-2)));
  217. // mark the add state as dirty, it should ~not~ update the subtract state
  218. tree.get_mut(tree.root_id()).unwrap().get_mut::<AddNumber>();
  219. tree.update_state(SendAnyMap::new(), false);
  220. let root = tree.get(tree.root_id()).unwrap();
  221. assert_eq!(root.get(), Some(&AddNumber(2)));
  222. assert_eq!(root.get(), Some(&SubtractNumber(-2)));
  223. }
  224. #[test]
  225. fn down_pass() {
  226. #[derive(Debug, Clone, PartialEq)]
  227. struct AddNumber(i32);
  228. impl Default for AddNumber {
  229. fn default() -> Self {
  230. Self(1)
  231. }
  232. }
  233. impl Pass for AddNumber {
  234. type ChildDependencies = ();
  235. type NodeDependencies = ();
  236. type ParentDependencies = (AddNumber,);
  237. const NODE_MASK: NodeMaskBuilder = NodeMaskBuilder::new();
  238. fn pass<'a>(
  239. &mut self,
  240. node_view: NodeView,
  241. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  242. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  243. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  244. context: &SendAnyMap,
  245. ) -> bool {
  246. if let Some((parent,)) = parent {
  247. *self.0 += *parent.0;
  248. }
  249. true
  250. }
  251. }
  252. let mut tree: RealDom = RealDom::new(Box::new([AddNumber::to_type_erased()]));
  253. let parent = tree.root_id();
  254. let child1 = tree.create_node(create_blank_element(), true);
  255. tree.add_child(parent, child1);
  256. let grandchild1 = tree.create_node(create_blank_element(), true);
  257. tree.add_child(child1, grandchild1);
  258. let child2 = tree.create_node(create_blank_element(), true);
  259. tree.add_child(parent, child2);
  260. let grandchild2 = tree.create_node(create_blank_element(), true);
  261. tree.add_child(child2, grandchild2);
  262. tree.dirty_nodes
  263. .insert(TypeId::of::<AddNumber>(), NodeId(0));
  264. tree.update_state(SendAnyMap::new(), false);
  265. assert_eq!(tree.get(tree.root_id()).unwrap().state.add_number.0, 1);
  266. assert_eq!(tree.get(child1).unwrap().state.add_number.0, 2);
  267. assert_eq!(tree.get(grandchild1).unwrap().state.add_number.0, 3);
  268. assert_eq!(tree.get(child2).unwrap().state.add_number.0, 2);
  269. assert_eq!(tree.get(grandchild2).unwrap().state.add_number.0, 3);
  270. }
  271. // #[test]
  272. // fn dependant_down_pass() {
  273. // // 0
  274. // let mut tree = Tree::new(1);
  275. // let parent = tree.root_id();
  276. // // 1
  277. // let child1 = tree.create_node(1);
  278. // tree.add_child(parent, child1);
  279. // // 2
  280. // let grandchild1 = tree.create_node(1);
  281. // tree.add_child(child1, grandchild1);
  282. // // 3
  283. // let child2 = tree.create_node(1);
  284. // tree.add_child(parent, child2);
  285. // // 4
  286. // let grandchild2 = tree.create_node(1);
  287. // tree.add_child(child2, grandchild2);
  288. // struct AddPass;
  289. // impl Pass for AddPass {
  290. // fn pass_id(&self) -> PassId {
  291. // PassId(0)
  292. // }
  293. // fn dependancies(&self) -> &'static [PassId] {
  294. // &[PassId(1)]
  295. // }
  296. // fn dependants(&self) -> &'static [PassId] {
  297. // &[]
  298. // }
  299. // fn mask(&self) -> MemberMask {
  300. // MemberMask(0)
  301. // }
  302. // }
  303. // impl DownwardPass<i32> for AddPass {
  304. // fn pass(&self, node: &mut i32, parent: Option<&mut i32>, _: &SendAnyMap) -> PassReturn {
  305. // if let Some(parent) = parent {
  306. // *node += *parent;
  307. // } else {
  308. // }
  309. // PassReturn {
  310. // progress: true,
  311. // mark_dirty: true,
  312. // }
  313. // }
  314. // }
  315. // struct SubtractPass;
  316. // impl Pass for SubtractPass {
  317. // fn pass_id(&self) -> PassId {
  318. // PassId(1)
  319. // }
  320. // fn dependancies(&self) -> &'static [PassId] {
  321. // &[]
  322. // }
  323. // fn dependants(&self) -> &'static [PassId] {
  324. // &[PassId(0)]
  325. // }
  326. // fn mask(&self) -> MemberMask {
  327. // MemberMask(0)
  328. // }
  329. // }
  330. // impl DownwardPass<i32> for SubtractPass {
  331. // fn pass(&self, node: &mut i32, parent: Option<&mut i32>, _: &SendAnyMap) -> PassReturn {
  332. // if let Some(parent) = parent {
  333. // *node -= *parent;
  334. // } else {
  335. // }
  336. // PassReturn {
  337. // progress: true,
  338. // mark_dirty: true,
  339. // }
  340. // }
  341. // }
  342. // let add_pass = AnyPass::Downward(&AddPass);
  343. // let subtract_pass = AnyPass::Downward(&SubtractPass);
  344. // let passes = vec![&add_pass, &subtract_pass];
  345. // let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  346. // dirty_nodes.insert(PassId(1), tree.root_id());
  347. // resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  348. // // Tree before:
  349. // // 1=\
  350. // // 1=\
  351. // // 1
  352. // // 1=\
  353. // // 1
  354. // // Tree after subtract:
  355. // // 1=\
  356. // // 0=\
  357. // // 1
  358. // // 0=\
  359. // // 1
  360. // // Tree after add:
  361. // // 1=\
  362. // // 1=\
  363. // // 2
  364. // // 1=\
  365. // // 2
  366. // assert_eq!(tree.get(tree.root_id()).unwrap(), &1);
  367. // assert_eq!(tree.get(child1).unwrap(), &1);
  368. // assert_eq!(tree.get(grandchild1).unwrap(), &2);
  369. // assert_eq!(tree.get(child2).unwrap(), &1);
  370. // assert_eq!(tree.get(grandchild2).unwrap(), &2);
  371. // }
  372. // #[test]
  373. // fn up_pass() {
  374. // // Tree before:
  375. // // 0=\
  376. // // 0=\
  377. // // 1
  378. // // 0=\
  379. // // 1
  380. // // Tree after:
  381. // // 2=\
  382. // // 1=\
  383. // // 1
  384. // // 1=\
  385. // // 1
  386. // let mut tree = Tree::new(0);
  387. // let parent = tree.root_id();
  388. // let child1 = tree.create_node(0);
  389. // tree.add_child(parent, child1);
  390. // let grandchild1 = tree.create_node(1);
  391. // tree.add_child(child1, grandchild1);
  392. // let child2 = tree.create_node(0);
  393. // tree.add_child(parent, child2);
  394. // let grandchild2 = tree.create_node(1);
  395. // tree.add_child(child2, grandchild2);
  396. // struct AddPass;
  397. // impl Pass for AddPass {
  398. // fn pass_id(&self) -> PassId {
  399. // PassId(0)
  400. // }
  401. // fn dependancies(&self) -> &'static [PassId] {
  402. // &[]
  403. // }
  404. // fn dependants(&self) -> &'static [PassId] {
  405. // &[]
  406. // }
  407. // fn mask(&self) -> MemberMask {
  408. // MemberMask(0)
  409. // }
  410. // }
  411. // impl UpwardPass<i32> for AddPass {
  412. // fn pass<'a>(
  413. // &self,
  414. // node: &mut i32,
  415. // children: &mut dyn Iterator<Item = &'a mut i32>,
  416. // _: &SendAnyMap,
  417. // ) -> PassReturn {
  418. // *node += children.map(|i| *i).sum::<i32>();
  419. // PassReturn {
  420. // progress: true,
  421. // mark_dirty: true,
  422. // }
  423. // }
  424. // }
  425. // let add_pass = AnyPass::Upward(&AddPass);
  426. // let passes = vec![&add_pass];
  427. // let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  428. // dirty_nodes.insert(PassId(0), grandchild1);
  429. // dirty_nodes.insert(PassId(0), grandchild2);
  430. // resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  431. // assert_eq!(tree.get(tree.root_id()).unwrap(), &2);
  432. // assert_eq!(tree.get(child1).unwrap(), &1);
  433. // assert_eq!(tree.get(grandchild1).unwrap(), &1);
  434. // assert_eq!(tree.get(child2).unwrap(), &1);
  435. // assert_eq!(tree.get(grandchild2).unwrap(), &1);
  436. // }
  437. // #[test]
  438. // fn dependant_up_pass() {
  439. // // 0
  440. // let mut tree = Tree::new(0);
  441. // let parent = tree.root_id();
  442. // // 1
  443. // let child1 = tree.create_node(0);
  444. // tree.add_child(parent, child1);
  445. // // 2
  446. // let grandchild1 = tree.create_node(1);
  447. // tree.add_child(child1, grandchild1);
  448. // // 3
  449. // let child2 = tree.create_node(0);
  450. // tree.add_child(parent, child2);
  451. // // 4
  452. // let grandchild2 = tree.create_node(1);
  453. // tree.add_child(child2, grandchild2);
  454. // struct AddPass;
  455. // impl Pass for AddPass {
  456. // fn pass_id(&self) -> PassId {
  457. // PassId(0)
  458. // }
  459. // fn dependancies(&self) -> &'static [PassId] {
  460. // &[PassId(1)]
  461. // }
  462. // fn dependants(&self) -> &'static [PassId] {
  463. // &[]
  464. // }
  465. // fn mask(&self) -> MemberMask {
  466. // MemberMask(0)
  467. // }
  468. // }
  469. // impl UpwardPass<i32> for AddPass {
  470. // fn pass<'a>(
  471. // &self,
  472. // node: &mut i32,
  473. // children: &mut dyn Iterator<Item = &'a mut i32>,
  474. // _: &SendAnyMap,
  475. // ) -> PassReturn {
  476. // *node += children.map(|i| *i).sum::<i32>();
  477. // PassReturn {
  478. // progress: true,
  479. // mark_dirty: true,
  480. // }
  481. // }
  482. // }
  483. // struct SubtractPass;
  484. // impl Pass for SubtractPass {
  485. // fn pass_id(&self) -> PassId {
  486. // PassId(1)
  487. // }
  488. // fn dependancies(&self) -> &'static [PassId] {
  489. // &[]
  490. // }
  491. // fn dependants(&self) -> &'static [PassId] {
  492. // &[PassId(0)]
  493. // }
  494. // fn mask(&self) -> MemberMask {
  495. // MemberMask(0)
  496. // }
  497. // }
  498. // impl UpwardPass<i32> for SubtractPass {
  499. // fn pass<'a>(
  500. // &self,
  501. // node: &mut i32,
  502. // children: &mut dyn Iterator<Item = &'a mut i32>,
  503. // _: &SendAnyMap,
  504. // ) -> PassReturn {
  505. // *node -= children.map(|i| *i).sum::<i32>();
  506. // PassReturn {
  507. // progress: true,
  508. // mark_dirty: true,
  509. // }
  510. // }
  511. // }
  512. // let add_pass = AnyPass::Upward(&AddPass);
  513. // let subtract_pass = AnyPass::Upward(&SubtractPass);
  514. // let passes = vec![&add_pass, &subtract_pass];
  515. // let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  516. // dirty_nodes.insert(PassId(1), grandchild1);
  517. // dirty_nodes.insert(PassId(1), grandchild2);
  518. // resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  519. // // Tree before:
  520. // // 0=\
  521. // // 0=\
  522. // // 1
  523. // // 0=\
  524. // // 1
  525. // // Tree after subtract:
  526. // // 2=\
  527. // // -1=\
  528. // // 1
  529. // // -1=\
  530. // // 1
  531. // // Tree after add:
  532. // // 2=\
  533. // // 0=\
  534. // // 1
  535. // // 0=\
  536. // // 1
  537. // assert_eq!(tree.get(tree.root_id()).unwrap(), &2);
  538. // assert_eq!(tree.get(child1).unwrap(), &0);
  539. // assert_eq!(tree.get(grandchild1).unwrap(), &1);
  540. // assert_eq!(tree.get(child2).unwrap(), &0);
  541. // assert_eq!(tree.get(grandchild2).unwrap(), &1);
  542. // }