slab_tree/node/
node_mut.rs

1use crate::behaviors::RemoveBehavior;
2use crate::node::Node;
3use crate::node::NodeRef;
4use crate::tree::Tree;
5use crate::NodeId;
6
7///
8/// A mutable reference to a given `Node`'s data and its relatives.
9///
10#[derive(Debug, PartialEq)]
11pub struct NodeMut<'a, T> {
12    node_id: NodeId,
13    tree: &'a mut Tree<T>,
14}
15
16impl<'a, T> NodeMut<'a, T> {
17    pub(crate) fn new(node_id: NodeId, tree: &mut Tree<T>) -> NodeMut<T> {
18        NodeMut { node_id, tree }
19    }
20
21    ///
22    /// Returns the `NodeId` that identifies this `Node` in the tree.
23    ///
24    /// ```
25    /// use slab_tree::tree::TreeBuilder;
26    ///
27    /// let mut tree = TreeBuilder::new().with_root(1).build();
28    /// let root_id = tree.root_id().expect("root doesn't exist?");
29    /// let root = tree.root_mut().expect("root doesn't exist?");
30    ///
31    /// let root_id_again = root.node_id();
32    ///
33    /// assert_eq!(root_id_again, root_id);
34    /// ```
35    ///
36    pub fn node_id(&self) -> NodeId {
37        self.node_id
38    }
39
40    ///
41    /// Returns a mutable reference to the data contained by the given `Node`.
42    ///
43    /// ```
44    /// use slab_tree::tree::TreeBuilder;
45    ///
46    /// let mut tree = TreeBuilder::new().with_root(1).build();
47    /// let mut root = tree.root_mut().expect("root doesn't exist?");
48    ///
49    /// let data = root.data();
50    ///
51    /// assert_eq!(data, &mut 1);
52    ///
53    /// *data = 3;
54    ///
55    /// assert_eq!(data, &mut 3);
56    /// ```
57    ///
58    pub fn data(&mut self) -> &mut T {
59        if let Some(node) = self.tree.get_node_mut(self.node_id) {
60            &mut node.data
61        } else {
62            unreachable!()
63        }
64    }
65
66    ///
67    /// Returns a `NodeMut` pointing to this `Node`'s parent.  Returns a `Some`-value containing
68    /// the `NodeMut` if this `Node` has a parent; otherwise returns a `None`.
69    ///
70    /// ```
71    /// use slab_tree::tree::TreeBuilder;
72    ///
73    /// let mut tree = TreeBuilder::new().with_root(1).build();
74    /// let mut root = tree.root_mut().expect("root doesn't exist?");
75    ///
76    /// assert!(root.parent().is_none());
77    /// ```
78    ///
79    pub fn parent(&mut self) -> Option<NodeMut<T>> {
80        self.get_self_as_node()
81            .relatives
82            .parent
83            .map(move |id| NodeMut::new(id, self.tree))
84    }
85
86    ///
87    /// Returns a `NodeMut` pointing to this `Node`'s previous sibling.  Returns a `Some`-value
88    /// containing the `NodeMut` if this `Node` has a previous sibling; otherwise returns a `None`.
89    ///
90    /// ```
91    /// use slab_tree::tree::TreeBuilder;
92    ///
93    /// let mut tree = TreeBuilder::new().with_root(1).build();
94    /// let mut root = tree.root_mut().expect("root doesn't exist?");
95    ///
96    /// assert!(root.prev_sibling().is_none());
97    /// ```
98    ///
99    pub fn prev_sibling(&mut self) -> Option<NodeMut<T>> {
100        self.get_self_as_node()
101            .relatives
102            .prev_sibling
103            .map(move |id| NodeMut::new(id, self.tree))
104    }
105
106    ///
107    /// Returns a `NodeMut` pointing to this `Node`'s next sibling.  Returns a `Some`-value
108    /// containing the `NodeMut` if this `Node` has a next sibling; otherwise returns a `None`.
109    ///
110    /// ```
111    /// use slab_tree::tree::TreeBuilder;
112    ///
113    /// let mut tree = TreeBuilder::new().with_root(1).build();
114    /// let mut root = tree.root_mut().expect("root doesn't exist?");
115    ///
116    /// assert!(root.next_sibling().is_none());
117    /// ```
118    ///
119    pub fn next_sibling(&mut self) -> Option<NodeMut<T>> {
120        self.get_self_as_node()
121            .relatives
122            .next_sibling
123            .map(move |id| NodeMut::new(id, self.tree))
124    }
125
126    ///
127    /// Returns a `NodeMut` pointing to this `Node`'s first child.  Returns a `Some`-value
128    /// containing the `NodeMut` if this `Node` has a first child; otherwise returns a `None`.
129    ///
130    /// ```
131    /// use slab_tree::tree::TreeBuilder;
132    ///
133    /// let mut tree = TreeBuilder::new().with_root(1).build();
134    /// let mut root = tree.root_mut().expect("root doesn't exist?");
135    ///
136    /// assert!(root.first_child().is_none());
137    /// ```
138    ///
139    pub fn first_child(&mut self) -> Option<NodeMut<T>> {
140        self.get_self_as_node()
141            .relatives
142            .first_child
143            .map(move |id| NodeMut::new(id, self.tree))
144    }
145
146    ///
147    /// Returns a `NodeMut` pointing to this `Node`'s last child.  Returns a `Some`-value
148    /// containing the `NodeMut` if this `Node` has a last child; otherwise returns a `None`.
149    ///
150    /// ```
151    /// use slab_tree::tree::TreeBuilder;
152    ///
153    /// let mut tree = TreeBuilder::new().with_root(1).build();
154    /// let mut root = tree.root_mut().expect("root doesn't exist?");
155    ///
156    /// assert!(root.last_child().is_none());
157    /// ```
158    ///
159    pub fn last_child(&mut self) -> Option<NodeMut<T>> {
160        self.get_self_as_node()
161            .relatives
162            .last_child
163            .map(move |id| NodeMut::new(id, self.tree))
164    }
165
166    ///
167    /// Appends a new `Node` as this `Node`'s last child (and first child if it has none).
168    /// Returns a `NodeMut` pointing to the newly added `Node`.
169    ///
170    /// ```
171    /// use slab_tree::tree::TreeBuilder;
172    ///
173    /// let mut tree = TreeBuilder::new().with_root(1).build();
174    /// let mut root = tree.root_mut().expect("root doesn't exist?");
175    ///
176    /// root.append(2);
177    ///
178    /// assert!(root.first_child().is_some());
179    /// assert_eq!(root.first_child().unwrap().data(), &mut 2);
180    ///
181    /// assert!(root.last_child().is_some());
182    /// assert_eq!(root.last_child().unwrap().data(), &mut 2);
183    ///
184    /// let mut child = root.first_child().unwrap();
185    ///
186    /// assert!(child.parent().is_some());
187    /// assert_eq!(child.parent().unwrap().data(), &mut 1);
188    /// ```
189    ///
190    pub fn append(&mut self, data: T) -> NodeMut<T> {
191        let new_id = self.tree.core_tree.insert(data);
192
193        let relatives = self.tree.get_node_relatives(self.node_id);
194
195        let prev_sibling = relatives.last_child;
196        self.tree.set_parent(new_id, Some(self.node_id));
197        self.tree.set_prev_sibling(new_id, prev_sibling);
198
199        let first_child = relatives.first_child.or_else(|| Some(new_id));
200        self.tree.set_first_child(self.node_id, first_child);
201        self.tree.set_last_child(self.node_id, Some(new_id));
202
203        if let Some(node_id) = prev_sibling {
204            self.tree.set_next_sibling(node_id, Some(new_id));
205        }
206
207        NodeMut::new(new_id, self.tree)
208    }
209
210    ///
211    /// Prepends a new `Node` as this `Node`'s first child (and last child if it has none).
212    /// Returns a `NodeMut` pointing to the newly added `Node`.
213    ///
214    /// ```
215    /// use slab_tree::tree::TreeBuilder;
216    ///
217    /// let mut tree = TreeBuilder::new().with_root(1).build();
218    /// let mut root = tree.root_mut().expect("root doesn't exist?");
219    ///
220    /// root.prepend(2);
221    ///
222    /// assert!(root.first_child().is_some());
223    /// assert_eq!(root.first_child().unwrap().data(), &mut 2);
224    ///
225    /// assert!(root.last_child().is_some());
226    /// assert_eq!(root.last_child().unwrap().data(), &mut 2);
227    ///
228    /// let mut child = root.first_child().unwrap();
229    ///
230    /// assert!(child.parent().is_some());
231    /// assert_eq!(child.parent().unwrap().data(), &mut 1);
232    /// ```
233    ///
234    pub fn prepend(&mut self, data: T) -> NodeMut<T> {
235        let new_id = self.tree.core_tree.insert(data);
236
237        let relatives = self.tree.get_node_relatives(self.node_id);
238
239        let next_sibling = relatives.first_child;
240        self.tree.set_parent(new_id, Some(self.node_id));
241        self.tree.set_next_sibling(new_id, next_sibling);
242
243        let last_child = relatives.last_child.or_else(|| Some(new_id));
244        self.tree.set_first_child(self.node_id, Some(new_id));
245        self.tree.set_last_child(self.node_id, last_child);
246
247        if let Some(node_id) = next_sibling {
248            self.tree.set_prev_sibling(node_id, Some(new_id));
249        }
250
251        NodeMut::new(new_id, self.tree)
252    }
253
254    ///
255    /// Remove the first child of this `Node` and return the data that child contained.
256    /// Returns a `Some`-value if this `Node` has a child to remove; returns a `None`-value
257    /// otherwise.
258    ///
259    /// Children of the removed `Node` can either be dropped with `DropChildren` or orphaned with
260    /// `OrphanChildren`.
261    ///
262    /// ```
263    /// use slab_tree::tree::TreeBuilder;
264    /// use slab_tree::behaviors::RemoveBehavior::*;
265    ///
266    /// let mut tree = TreeBuilder::new().with_root(1).build();
267    /// let mut root = tree.root_mut().expect("root doesn't exist?");
268    /// root.append(2);
269    /// root.append(3);
270    ///
271    /// let two = root.remove_first(DropChildren);
272    ///
273    /// assert!(two.is_some());
274    /// assert_eq!(two.unwrap(), 2);
275    ///
276    /// assert!(root.first_child().is_some());
277    /// assert_eq!(root.first_child().unwrap().data(), &mut 3);
278    ///
279    /// assert!(root.last_child().is_some());
280    /// assert_eq!(root.last_child().unwrap().data(), &mut 3);
281    /// ```
282    ///
283    pub fn remove_first(&mut self, behavior: RemoveBehavior) -> Option<T> {
284        // todo: can probably simplify this
285        let relatives = self.tree.get_node_relatives(self.node_id);
286        let first = relatives.first_child;
287        let first_id = first?;
288        self.tree.remove(first_id, behavior)
289    }
290
291    ///
292    /// Remove the first child of this `Node` and return the data that child contained.
293    /// Returns a `Some`-value if this `Node` has a child to remove; returns a `None`-value
294    /// otherwise.
295    ///
296    /// Children of the removed `Node` can either be dropped with `DropChildren` or orphaned with
297    /// `OrphanChildren`.
298    ///
299    /// ```
300    /// use slab_tree::tree::TreeBuilder;
301    /// use slab_tree::behaviors::RemoveBehavior::*;
302    ///
303    /// let mut tree = TreeBuilder::new().with_root(1).build();
304    /// let mut root = tree.root_mut().expect("root doesn't exist?");
305    /// root.append(2);
306    /// root.append(3);
307    ///
308    /// let three = root.remove_last(DropChildren);
309    ///
310    /// assert!(three.is_some());
311    /// assert_eq!(three.unwrap(), 3);
312    ///
313    /// assert!(root.first_child().is_some());
314    /// assert_eq!(root.first_child().unwrap().data(), &mut 2);
315    ///
316    /// assert!(root.last_child().is_some());
317    /// assert_eq!(root.last_child().unwrap().data(), &mut 2);
318    /// ```
319    ///
320    pub fn remove_last(&mut self, behavior: RemoveBehavior) -> Option<T> {
321        // todo: can probably simplify this
322        let relatives = self.tree.get_node_relatives(self.node_id);
323        let last = relatives.last_child;
324        let last_id = last?;
325        self.tree.remove(last_id, behavior)
326    }
327
328    ///
329    /// Returns a `NodeRef` pointing to this `NodeMut`.
330    ///
331    /// ```
332    /// use slab_tree::tree::TreeBuilder;
333    ///
334    /// let mut tree = TreeBuilder::new().with_root(1).build();
335    /// let mut root = tree.root_mut().expect("root doesn't exist?");
336    /// root.append(2);
337    ///
338    /// let root = root.as_ref();
339    ///
340    /// assert_eq!(root.data(), &1);
341    /// ```
342    ///
343    pub fn as_ref(&self) -> NodeRef<T> {
344        NodeRef::new(self.node_id, self.tree)
345    }
346
347    /// Exchange positions with the next sibling.
348    ///
349    /// Returns true if swapped with a next sibling, returns false if this was
350    /// already the last sibling.
351    ///
352    /// ```
353    /// use slab_tree::tree::TreeBuilder;
354    ///
355    /// let mut tree = TreeBuilder::new().with_root(1).build();
356    /// let two_id = {
357    ///     let mut root = tree.root_mut().expect("root doesn't exist?");
358    ///     let two_id = root.append(2).node_id();
359    ///     root.append(3);
360    ///     root.append(4);
361    ///     two_id
362    /// };
363    /// assert_eq!(
364    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
365    ///         .collect::<Vec<i32>>(),
366    ///     vec![2, 3, 4]);
367    /// assert!(tree.get_mut(two_id).unwrap().swap_next_sibling());
368    /// assert_eq!(
369    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
370    ///         .collect::<Vec<i32>>(),
371    ///     vec![3, 2, 4]);
372    /// assert_eq!(
373    ///     *tree.get(two_id).unwrap().parent().unwrap().first_child().unwrap()
374    ///         .data(),
375    ///     3);
376    /// assert_eq!(
377    ///     *tree.get(two_id).unwrap().parent().unwrap().last_child().unwrap()
378    ///         .data(),
379    ///     4);
380    /// assert!(tree.get_mut(two_id).unwrap().swap_next_sibling());
381    /// assert_eq!(
382    ///   tree.root().unwrap().children().map(|child_ref| *child_ref.data())
383    ///         .collect::<Vec<i32>>(),
384    ///     vec![3, 4, 2]);
385    /// assert_eq!(
386    ///     *tree.get(two_id).unwrap().parent().unwrap().first_child().unwrap()
387    ///         .data(),
388    ///     3);
389    /// assert_eq!(
390    ///     *tree.get(two_id).unwrap().parent().unwrap().last_child().unwrap()
391    ///         .data(),
392    ///     2);
393    /// assert!(!tree.get_mut(two_id).unwrap().swap_next_sibling());
394    /// assert_eq!(
395    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
396    ///         .collect::<Vec<i32>>(),
397    ///     vec![3, 4, 2]);
398    /// assert_eq!(
399    ///     *tree.get(two_id).unwrap().parent().unwrap().first_child().unwrap()
400    ///         .data(),
401    ///     3);
402    /// assert_eq!(
403    ///     *tree.get(two_id).unwrap().parent().unwrap().last_child().unwrap()
404    ///         .data(),
405    ///     2);
406    /// ```
407    pub fn swap_next_sibling(&mut self) -> bool {
408        let node_id = self.node_id();
409        let prev_id = self.tree.get_node_prev_sibling_id(node_id);
410        let next_id = self.tree.get_node_next_sibling_id(node_id);
411        if let Some(next_id) = next_id {
412            if let Some(parent_id) = self.parent().map(|parent| parent.node_id()) {
413                let (set_first, set_last) = {
414                    let parent = self.tree.get(parent_id).unwrap();
415                    (
416                        node_id == parent.first_child().unwrap().node_id(),
417                        next_id == parent.last_child().unwrap().node_id(),
418                    )
419                };
420                if set_first {
421                    self.tree.set_first_child(parent_id, Some(next_id));
422                }
423                if set_last {
424                    self.tree.set_last_child(parent_id, Some(node_id));
425                }
426            }
427            let new_next_id = self.tree.get_node_next_sibling_id(next_id);
428            self.tree
429                .set_prev_siblings_next_sibling(node_id, Some(next_id));
430            self.tree.set_next_siblings_prev_sibling(node_id, prev_id);
431            self.tree.set_prev_sibling(node_id, Some(next_id));
432            self.tree.set_next_sibling(node_id, new_next_id);
433            self.tree
434                .set_prev_siblings_next_sibling(node_id, Some(node_id));
435            self.tree
436                .set_next_siblings_prev_sibling(node_id, Some(node_id));
437            true
438        } else {
439            false
440        }
441    }
442
443    /// Exchange positions with the previous sibling.
444    ///
445    /// Returns true if swapped with a previous sibling, returns false if this
446    /// was already the first sibling.
447    ///
448    /// ```
449    /// use slab_tree::tree::TreeBuilder;
450    ///
451    /// let mut tree = TreeBuilder::new().with_root(1).build();
452    /// let four_id = {
453    ///     let mut root = tree.root_mut().expect("root doesn't exist?");
454    ///     root.append(2);
455    ///     root.append(3);
456    ///     let four_id = root.append(4).node_id();
457    ///     four_id
458    /// };
459    /// assert_eq!(
460    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
461    ///         .collect::<Vec<i32>>(),
462    ///     vec![2, 3, 4]);
463    /// assert!(tree.get_mut(four_id).unwrap().swap_prev_sibling());
464    /// assert_eq!(
465    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
466    ///         .collect::<Vec<i32>>(),
467    ///     vec![2, 4, 3]);
468    /// assert_eq!(
469    ///     *tree.get(four_id).unwrap().parent().unwrap().first_child().unwrap()
470    ///         .data(),
471    ///     2);
472    /// assert_eq!(
473    ///     *tree.get(four_id).unwrap().parent().unwrap().last_child().unwrap()
474    ///         .data(),
475    ///     3);
476    /// assert!(tree.get_mut(four_id).unwrap().swap_prev_sibling());
477    /// assert_eq!(
478    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
479    ///         .collect::<Vec<i32>>(),
480    ///     vec![4, 2, 3]);
481    /// assert_eq!(
482    ///     *tree.get(four_id).unwrap().parent().unwrap().first_child().unwrap()
483    ///         .data(),
484    ///     4);
485    /// assert_eq!(
486    ///     *tree.get(four_id).unwrap().parent().unwrap().last_child().unwrap()
487    ///         .data(),
488    ///     3);
489    /// assert!(!tree.get_mut(four_id).unwrap().swap_prev_sibling());
490    /// assert_eq!(
491    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
492    ///         .collect::<Vec<i32>>(),
493    ///     vec![4, 2, 3]);
494    /// assert_eq!(
495    ///     *tree.get(four_id).unwrap().parent().unwrap().first_child().unwrap()
496    ///         .data(),
497    ///     4);
498    /// assert_eq!(
499    ///     *tree.get(four_id).unwrap().parent().unwrap().last_child().unwrap()
500    ///         .data(),
501    ///     3);
502    /// ```
503    pub fn swap_prev_sibling(&mut self) -> bool {
504        let node_id = self.node_id();
505        let prev_id = self.tree.get_node_prev_sibling_id(node_id);
506        let next_id = self.tree.get_node_next_sibling_id(node_id);
507        if let Some(prev_id) = prev_id {
508            if let Some(parent_id) = self.parent().map(|parent| parent.node_id()) {
509                let (set_first, set_last) = {
510                    let parent = self.tree.get(parent_id).unwrap();
511                    (
512                        prev_id == parent.first_child().unwrap().node_id(),
513                        node_id == parent.last_child().unwrap().node_id(),
514                    )
515                };
516                if set_first {
517                    self.tree.set_first_child(parent_id, Some(node_id));
518                }
519                if set_last {
520                    self.tree.set_last_child(parent_id, Some(prev_id));
521                }
522            }
523            let new_prev_id = self.tree.get_node_prev_sibling_id(prev_id);
524            self.tree.set_prev_siblings_next_sibling(node_id, next_id);
525            self.tree
526                .set_next_siblings_prev_sibling(node_id, Some(prev_id));
527            self.tree.set_prev_sibling(node_id, new_prev_id);
528            self.tree.set_next_sibling(node_id, Some(prev_id));
529            self.tree
530                .set_prev_siblings_next_sibling(node_id, Some(node_id));
531            self.tree
532                .set_next_siblings_prev_sibling(node_id, Some(node_id));
533            true
534        } else {
535            false
536        }
537    }
538
539    /// Moves this node to the last sibling position.
540    ///
541    /// Returns false if the node was already the last sibling.
542    ///
543    /// ```
544    /// use slab_tree::tree::TreeBuilder;
545    ///
546    /// let mut tree = TreeBuilder::new().with_root(1).build();
547    /// let two_id = {
548    ///     let mut root = tree.root_mut().expect("root doesn't exist?");
549    ///     let two_id = root.append(2).node_id();
550    ///     root.append(3);
551    ///     root.append(4);
552    ///     two_id
553    /// };
554    /// assert_eq!(
555    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
556    ///         .collect::<Vec<i32>>(),
557    ///     vec![2, 3, 4]);
558    /// assert!(tree.get_mut(two_id).unwrap().make_last_sibling());
559    /// assert_eq!(
560    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
561    ///         .collect::<Vec<i32>>(),
562    ///     vec![3, 4, 2]);
563    /// assert_eq!(
564    ///     *tree.get(two_id).unwrap().parent().unwrap().first_child().unwrap()
565    ///         .data(),
566    ///     3);
567    /// assert_eq!(
568    ///     *tree.get(two_id).unwrap().parent().unwrap().last_child().unwrap()
569    ///         .data(),
570    ///     2);
571    /// assert!(!tree.get_mut(two_id).unwrap().make_last_sibling());
572    /// assert_eq!(
573    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
574    ///         .collect::<Vec<i32>>(),
575    ///     vec![3, 4, 2]);
576    /// assert_eq!(
577    ///     *tree.get(two_id).unwrap().parent().unwrap().first_child().unwrap()
578    ///         .data(),
579    ///     3);
580    /// assert_eq!(
581    ///     *tree.get(two_id).unwrap().parent().unwrap().last_child().unwrap()
582    ///         .data(),
583    ///     2);
584    /// ```
585    pub fn make_last_sibling(&mut self) -> bool {
586        if let Some(parent_id) = self.parent().map(|parent| parent.node_id()) {
587            let node_id = self.node_id();
588            let prev_id = self.tree.get_node_prev_sibling_id(node_id);
589            let next_id = self.tree.get_node_next_sibling_id(node_id);
590            let last_id = self
591                .tree
592                .get(parent_id)
593                .unwrap()
594                .last_child()
595                .unwrap()
596                .node_id();
597            let first_id = self
598                .tree
599                .get(parent_id)
600                .unwrap()
601                .first_child()
602                .unwrap()
603                .node_id();
604            if node_id != last_id {
605                self.tree.set_last_child(parent_id, Some(node_id));
606                if node_id == first_id {
607                    self.tree.set_first_child(parent_id, next_id);
608                }
609                self.tree.set_next_sibling(last_id, Some(node_id));
610                self.tree.set_prev_siblings_next_sibling(node_id, next_id);
611                self.tree.set_next_siblings_prev_sibling(node_id, prev_id);
612                self.tree.set_prev_sibling(node_id, Some(last_id));
613                self.tree.set_next_sibling(node_id, None);
614                true
615            } else {
616                false
617            }
618        } else {
619            false
620        }
621    }
622
623    /// Moves this node to the first sibling position.
624    ///
625    /// Returns false if the node was already the first sibling.
626    ///
627    /// ```
628    /// use slab_tree::tree::TreeBuilder;
629    ///
630    /// let mut tree = TreeBuilder::new().with_root(1).build();
631    /// let four_id = {
632    ///     let mut root = tree.root_mut().expect("root doesn't exist?");
633    ///     root.append(2);
634    ///     root.append(3);
635    ///     root.append(4).node_id()
636    /// };
637    /// assert_eq!(
638    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
639    ///         .collect::<Vec<i32>>(),
640    ///     vec![2, 3, 4]);
641    /// assert!(tree.get_mut(four_id).unwrap().make_first_sibling());
642    /// assert_eq!(
643    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
644    ///         .collect::<Vec<i32>>(),
645    ///     vec![4, 2, 3]);
646    /// assert_eq!(
647    ///     *tree.get(four_id).unwrap().parent().unwrap().first_child().unwrap()
648    ///         .data(),
649    ///     4);
650    /// assert_eq!(
651    ///     *tree.get(four_id).unwrap().parent().unwrap().last_child().unwrap()
652    ///         .data(),
653    ///     3);
654    /// assert!(!tree.get_mut(four_id).unwrap().make_first_sibling());
655    /// assert_eq!(
656    ///     tree.root().unwrap().children().map(|child_ref| *child_ref.data())
657    ///         .collect::<Vec<i32>>(),
658    ///     vec![4, 2, 3]);
659    /// assert_eq!(
660    ///     *tree.get(four_id).unwrap().parent().unwrap().first_child().unwrap()
661    ///         .data(),
662    ///     4);
663    /// assert_eq!(
664    ///     *tree.get(four_id).unwrap().parent().unwrap().last_child().unwrap()
665    ///         .data(),
666    ///     3);
667    /// ```
668    pub fn make_first_sibling(&mut self) -> bool {
669        if let Some(parent_id) = self.parent().map(|parent| parent.node_id()) {
670            let node_id = self.node_id();
671            let prev_id = self.tree.get_node_prev_sibling_id(node_id);
672            let next_id = self.tree.get_node_next_sibling_id(node_id);
673            let first_id = self
674                .tree
675                .get(parent_id)
676                .unwrap()
677                .first_child()
678                .unwrap()
679                .node_id();
680            let last_id = self
681                .tree
682                .get(parent_id)
683                .unwrap()
684                .last_child()
685                .unwrap()
686                .node_id();
687            if node_id != first_id {
688                self.tree.set_first_child(parent_id, Some(node_id));
689                if node_id == last_id {
690                    self.tree.set_last_child(parent_id, prev_id);
691                }
692                self.tree.set_prev_sibling(first_id, Some(node_id));
693                self.tree.set_prev_siblings_next_sibling(node_id, next_id);
694                self.tree.set_next_siblings_prev_sibling(node_id, prev_id);
695                self.tree.set_next_sibling(node_id, Some(first_id));
696                self.tree.set_prev_sibling(node_id, None);
697                true
698            } else {
699                false
700            }
701        } else {
702            false
703        }
704    }
705
706    fn get_self_as_node(&self) -> &Node<T> {
707        if let Some(node) = self.tree.get_node(self.node_id) {
708            &node
709        } else {
710            unreachable!()
711        }
712    }
713}
714
715#[cfg_attr(tarpaulin, skip)]
716#[cfg(test)]
717mod node_mut_tests {
718    use crate::behaviors::RemoveBehavior::{DropChildren, OrphanChildren};
719    use crate::tree::Tree;
720
721    #[test]
722    fn node_id() {
723        let mut tree = Tree::new();
724        tree.set_root(1);
725        let root_id = tree.root_id().expect("root doesn't exist?");
726
727        let root_mut = tree.get_mut(root_id).unwrap();
728        assert_eq!(root_id, root_mut.node_id());
729    }
730
731    #[test]
732    fn data() {
733        let mut tree = Tree::new();
734        tree.set_root(1);
735        let root_id = tree.root_id().expect("root doesn't exist?");
736
737        let mut root_mut = tree.get_mut(root_id).unwrap();
738        assert_eq!(root_mut.data(), &mut 1);
739
740        *root_mut.data() = 2;
741        assert_eq!(root_mut.data(), &mut 2);
742    }
743
744    #[test]
745    fn parent() {
746        let mut tree = Tree::new();
747        tree.set_root(1);
748        let root_id = tree.root_id().expect("root doesn't exist?");
749        let mut root_mut = tree.get_mut(root_id).unwrap();
750        assert!(root_mut.parent().is_none());
751    }
752
753    #[test]
754    fn prev_sibling() {
755        let mut tree = Tree::new();
756        tree.set_root(1);
757        let root_id = tree.root_id().expect("root doesn't exist?");
758        let mut root_mut = tree.get_mut(root_id).unwrap();
759        assert!(root_mut.prev_sibling().is_none());
760    }
761
762    #[test]
763    fn next_sibling() {
764        let mut tree = Tree::new();
765        tree.set_root(1);
766        let root_id = tree.root_id().expect("root doesn't exist?");
767        let mut root_mut = tree.get_mut(root_id).unwrap();
768        assert!(root_mut.next_sibling().is_none());
769    }
770
771    #[test]
772    fn first_child() {
773        let mut tree = Tree::new();
774        tree.set_root(1);
775        let root_id = tree.root_id().expect("root doesn't exist?");
776        let mut root_mut = tree.get_mut(root_id).unwrap();
777        assert!(root_mut.first_child().is_none());
778    }
779
780    #[test]
781    fn last_child() {
782        let mut tree = Tree::new();
783        tree.set_root(1);
784        let root_id = tree.root_id().expect("root doesn't exist?");
785        let mut root_mut = tree.get_mut(root_id).unwrap();
786        assert!(root_mut.last_child().is_none());
787    }
788
789    #[test]
790    fn append_no_children_present() {
791        let mut tree = Tree::new();
792        tree.set_root(1);
793        let root_id = tree.root_id().expect("root doesn't exist?");
794
795        let mut root_mut = tree.get_mut(root_id).unwrap();
796        let new_id = root_mut.append(2).node_id();
797
798        let root_node = tree.get_node(root_id);
799        assert!(root_node.is_some());
800
801        let root_node = root_node.unwrap();
802        assert_eq!(root_node.relatives.first_child, Some(new_id));
803        assert_eq!(root_node.relatives.last_child, Some(new_id));
804
805        let new_node = tree.get_node(new_id);
806        assert!(new_node.is_some());
807
808        let new_node = new_node.unwrap();
809        assert_eq!(new_node.relatives.parent, Some(root_id));
810        assert_eq!(new_node.relatives.prev_sibling, None);
811        assert_eq!(new_node.relatives.next_sibling, None);
812        assert_eq!(new_node.relatives.first_child, None);
813        assert_eq!(new_node.relatives.last_child, None);
814
815        let root = tree.get(root_id).unwrap();
816        assert_eq!(root.data(), &1);
817
818        let new_node = root.first_child().unwrap();
819        assert_eq!(new_node.data(), &2);
820    }
821
822    #[test]
823    fn append_single_child_present() {
824        let mut tree = Tree::new();
825        tree.set_root(1);
826        let root_id = tree.root_id().expect("root doesn't exist?");
827
828        let mut root_mut = tree.get_mut(root_id).unwrap();
829        let new_id = root_mut.append(2).node_id();
830        let new_id_2 = root_mut.append(3).node_id();
831
832        let root_node = tree.get_node(root_id);
833        assert!(root_node.is_some());
834
835        let root_node = root_node.unwrap();
836        assert_eq!(root_node.relatives.first_child, Some(new_id));
837        assert_eq!(root_node.relatives.last_child, Some(new_id_2));
838
839        let new_node = tree.get_node(new_id);
840        assert!(new_node.is_some());
841
842        let new_node = new_node.unwrap();
843        assert_eq!(new_node.relatives.parent, Some(root_id));
844        assert_eq!(new_node.relatives.prev_sibling, None);
845        assert_eq!(new_node.relatives.next_sibling, Some(new_id_2));
846        assert_eq!(new_node.relatives.first_child, None);
847        assert_eq!(new_node.relatives.last_child, None);
848
849        let new_node_2 = tree.get_node(new_id_2);
850        assert!(new_node_2.is_some());
851
852        let new_node_2 = new_node_2.unwrap();
853        assert_eq!(new_node_2.relatives.parent, Some(root_id));
854        assert_eq!(new_node_2.relatives.prev_sibling, Some(new_id));
855        assert_eq!(new_node_2.relatives.next_sibling, None);
856        assert_eq!(new_node_2.relatives.first_child, None);
857        assert_eq!(new_node_2.relatives.last_child, None);
858
859        let root = tree.get(root_id).unwrap();
860        assert_eq!(root.data(), &1);
861
862        let new_node = root.first_child().unwrap();
863        assert_eq!(new_node.data(), &2);
864
865        let new_node_2 = root.last_child().unwrap();
866        assert_eq!(new_node_2.data(), &3);
867    }
868
869    #[test]
870    fn append_two_children_present() {
871        let mut tree = Tree::new();
872        tree.set_root(1);
873        let root_id = tree.root_id().expect("root doesn't exist?");
874
875        let mut root_mut = tree.get_mut(root_id).unwrap();
876        let new_id = root_mut.append(2).node_id();
877        let new_id_2 = root_mut.append(3).node_id();
878        let new_id_3 = root_mut.append(4).node_id();
879
880        let root_node = tree.get_node(root_id);
881        assert!(root_node.is_some());
882
883        let root_node = root_node.unwrap();
884        assert_eq!(root_node.relatives.first_child, Some(new_id));
885        assert_eq!(root_node.relatives.last_child, Some(new_id_3));
886
887        let new_node = tree.get_node(new_id);
888        assert!(new_node.is_some());
889
890        let new_node = new_node.unwrap();
891        assert_eq!(new_node.relatives.parent, Some(root_id));
892        assert_eq!(new_node.relatives.prev_sibling, None);
893        assert_eq!(new_node.relatives.next_sibling, Some(new_id_2));
894        assert_eq!(new_node.relatives.first_child, None);
895        assert_eq!(new_node.relatives.last_child, None);
896
897        let new_node_2 = tree.get_node(new_id_2);
898        assert!(new_node_2.is_some());
899
900        let new_node_2 = new_node_2.unwrap();
901        assert_eq!(new_node_2.relatives.parent, Some(root_id));
902        assert_eq!(new_node_2.relatives.prev_sibling, Some(new_id));
903        assert_eq!(new_node_2.relatives.next_sibling, Some(new_id_3));
904        assert_eq!(new_node_2.relatives.first_child, None);
905        assert_eq!(new_node_2.relatives.last_child, None);
906
907        let new_node_3 = tree.get_node(new_id_3);
908        assert!(new_node_3.is_some());
909
910        let new_node_3 = new_node_3.unwrap();
911        assert_eq!(new_node_3.relatives.parent, Some(root_id));
912        assert_eq!(new_node_3.relatives.prev_sibling, Some(new_id_2));
913        assert_eq!(new_node_3.relatives.next_sibling, None);
914        assert_eq!(new_node_3.relatives.first_child, None);
915        assert_eq!(new_node_3.relatives.last_child, None);
916
917        let root = tree.get(root_id).unwrap();
918        assert_eq!(root.data(), &1);
919
920        // left to right
921        let new_node = root.first_child().unwrap();
922        let new_node_2 = new_node.next_sibling().unwrap();
923        let new_node_3 = new_node_2.next_sibling().unwrap();
924        assert_eq!(new_node.data(), &2);
925        assert_eq!(new_node_2.data(), &3);
926        assert_eq!(new_node_3.data(), &4);
927
928        // right to left
929        let new_node_3 = root.last_child().unwrap();
930        let new_node_2 = new_node_3.prev_sibling().unwrap();
931        let new_node = new_node_2.prev_sibling().unwrap();
932        assert_eq!(new_node_3.data(), &4);
933        assert_eq!(new_node_2.data(), &3);
934        assert_eq!(new_node.data(), &2);
935    }
936
937    #[test]
938    fn prepend_no_children_present() {
939        let mut tree = Tree::new();
940        tree.set_root(1);
941        let root_id = tree.root_id().expect("root doesn't exist?");
942
943        let mut root_mut = tree.get_mut(root_id).unwrap();
944        let new_id = root_mut.prepend(2).node_id();
945
946        let root_node = tree.get_node(root_id);
947        assert!(root_node.is_some());
948
949        let root_node = root_node.unwrap();
950        assert_eq!(root_node.relatives.first_child, Some(new_id));
951        assert_eq!(root_node.relatives.last_child, Some(new_id));
952
953        let new_node = tree.get_node(new_id);
954        assert!(new_node.is_some());
955
956        let new_node = new_node.unwrap();
957        assert_eq!(new_node.relatives.parent, Some(root_id));
958        assert_eq!(new_node.relatives.prev_sibling, None);
959        assert_eq!(new_node.relatives.next_sibling, None);
960        assert_eq!(new_node.relatives.first_child, None);
961        assert_eq!(new_node.relatives.last_child, None);
962
963        let root = tree.get(root_id).unwrap();
964        assert_eq!(root.data(), &1);
965
966        let new_node = root.first_child().unwrap();
967        assert_eq!(new_node.data(), &2);
968    }
969
970    #[test]
971    fn prepend_single_child_present() {
972        let mut tree = Tree::new();
973        tree.set_root(1);
974        let root_id = tree.root_id().expect("root doesn't exist?");
975
976        let mut root_mut = tree.get_mut(root_id).unwrap();
977        let new_id = root_mut.prepend(2).node_id();
978        let new_id_2 = root_mut.prepend(3).node_id();
979
980        let root_node = tree.get_node(root_id);
981        assert!(root_node.is_some());
982
983        let root_node = root_node.unwrap();
984        assert_eq!(root_node.relatives.first_child, Some(new_id_2));
985        assert_eq!(root_node.relatives.last_child, Some(new_id));
986
987        let new_node = tree.get_node(new_id);
988        assert!(new_node.is_some());
989
990        let new_node = new_node.unwrap();
991        assert_eq!(new_node.relatives.parent, Some(root_id));
992        assert_eq!(new_node.relatives.prev_sibling, Some(new_id_2));
993        assert_eq!(new_node.relatives.next_sibling, None);
994        assert_eq!(new_node.relatives.first_child, None);
995        assert_eq!(new_node.relatives.last_child, None);
996
997        let new_node_2 = tree.get_node(new_id_2);
998        assert!(new_node_2.is_some());
999
1000        let new_node_2 = new_node_2.unwrap();
1001        assert_eq!(new_node_2.relatives.parent, Some(root_id));
1002        assert_eq!(new_node_2.relatives.prev_sibling, None);
1003        assert_eq!(new_node_2.relatives.next_sibling, Some(new_id));
1004        assert_eq!(new_node_2.relatives.first_child, None);
1005        assert_eq!(new_node_2.relatives.last_child, None);
1006
1007        let root = tree.get(root_id).unwrap();
1008        assert_eq!(root.data(), &1);
1009
1010        let new_node = root.first_child().unwrap();
1011        assert_eq!(new_node.data(), &3);
1012
1013        let new_node_2 = root.last_child().unwrap();
1014        assert_eq!(new_node_2.data(), &2);
1015    }
1016
1017    #[test]
1018    fn prepend_two_children_present() {
1019        let mut tree = Tree::new();
1020        tree.set_root(1);
1021        let root_id = tree.root_id().expect("root doesn't exist?");
1022
1023        let mut root_mut = tree.get_mut(root_id).unwrap();
1024        let new_id = root_mut.prepend(2).node_id();
1025        let new_id_2 = root_mut.prepend(3).node_id();
1026        let new_id_3 = root_mut.prepend(4).node_id();
1027
1028        let root_node = tree.get_node(root_id);
1029        assert!(root_node.is_some());
1030
1031        let root_node = root_node.unwrap();
1032        assert_eq!(root_node.relatives.first_child, Some(new_id_3));
1033        assert_eq!(root_node.relatives.last_child, Some(new_id));
1034
1035        let new_node = tree.get_node(new_id);
1036        assert!(new_node.is_some());
1037
1038        let new_node = new_node.unwrap();
1039        assert_eq!(new_node.relatives.parent, Some(root_id));
1040        assert_eq!(new_node.relatives.prev_sibling, Some(new_id_2));
1041        assert_eq!(new_node.relatives.next_sibling, None);
1042        assert_eq!(new_node.relatives.first_child, None);
1043        assert_eq!(new_node.relatives.last_child, None);
1044
1045        let new_node_2 = tree.get_node(new_id_2);
1046        assert!(new_node_2.is_some());
1047
1048        let new_node_2 = new_node_2.unwrap();
1049        assert_eq!(new_node_2.relatives.parent, Some(root_id));
1050        assert_eq!(new_node_2.relatives.prev_sibling, Some(new_id_3));
1051        assert_eq!(new_node_2.relatives.next_sibling, Some(new_id));
1052        assert_eq!(new_node_2.relatives.first_child, None);
1053        assert_eq!(new_node_2.relatives.last_child, None);
1054
1055        let new_node_3 = tree.get_node(new_id_3);
1056        assert!(new_node_3.is_some());
1057
1058        let new_node_3 = new_node_3.unwrap();
1059        assert_eq!(new_node_3.relatives.parent, Some(root_id));
1060        assert_eq!(new_node_3.relatives.prev_sibling, None);
1061        assert_eq!(new_node_3.relatives.next_sibling, Some(new_id_2));
1062        assert_eq!(new_node_3.relatives.first_child, None);
1063        assert_eq!(new_node_3.relatives.last_child, None);
1064
1065        let root = tree.get(root_id).unwrap();
1066        assert_eq!(root.data(), &1);
1067
1068        // left to right
1069        let new_node_3 = root.first_child().unwrap();
1070        let new_node_2 = new_node_3.next_sibling().unwrap();
1071        let new_node = new_node_2.next_sibling().unwrap();
1072        assert_eq!(new_node_3.data(), &4);
1073        assert_eq!(new_node_2.data(), &3);
1074        assert_eq!(new_node.data(), &2);
1075
1076        // right to left
1077        let new_node = root.last_child().unwrap();
1078        let new_node_2 = new_node.prev_sibling().unwrap();
1079        let new_node_3 = new_node_2.prev_sibling().unwrap();
1080        assert_eq!(new_node.data(), &2);
1081        assert_eq!(new_node_2.data(), &3);
1082        assert_eq!(new_node_3.data(), &4);
1083    }
1084
1085    #[test]
1086    fn remove_first_no_children_present() {
1087        let mut tree = Tree::new();
1088        tree.set_root(1);
1089        let root_id = tree.root_id().expect("root doesn't exist?");
1090
1091        let mut root_mut = tree.get_mut(root_id).unwrap();
1092        let first_child_data = root_mut.remove_first(DropChildren);
1093        assert_eq!(first_child_data, None);
1094
1095        let root_node = tree.get_node(root_id);
1096        assert!(root_node.is_some());
1097
1098        let root_node = root_node.unwrap();
1099        assert_eq!(root_node.relatives.first_child, None);
1100        assert_eq!(root_node.relatives.last_child, None);
1101    }
1102
1103    #[test]
1104    fn remove_first_drop_single_child_present() {
1105        let mut tree = Tree::new();
1106        tree.set_root(1);
1107        let root_id = tree.root_id().expect("root doesn't exist?");
1108
1109        let mut root_mut = tree.get_mut(root_id).unwrap();
1110        let two_id = root_mut.append(2).node_id();
1111
1112        let removed = root_mut.remove_first(DropChildren);
1113        assert_eq!(removed, Some(2));
1114
1115        let root_node = tree.get_node(root_id);
1116        assert!(root_node.is_some());
1117
1118        let root_node = root_node.unwrap();
1119        assert_eq!(root_node.relatives.first_child, None);
1120        assert_eq!(root_node.relatives.last_child, None);
1121
1122        let two = tree.get_node(two_id);
1123        assert!(two.is_none());
1124    }
1125
1126    #[test]
1127    fn remove_first_drop_two_children_present() {
1128        let mut tree = Tree::new();
1129        tree.set_root(1);
1130        let root_id = tree.root_id().expect("root doesn't exist?");
1131
1132        let mut root_mut = tree.get_mut(root_id).unwrap();
1133        root_mut.append(2);
1134        let three_id = root_mut.append(3).node_id();
1135
1136        let removed = root_mut.remove_first(DropChildren);
1137        assert_eq!(removed, Some(2));
1138
1139        let root_node = tree.get_node(root_id);
1140        assert!(root_node.is_some());
1141
1142        let root_node = root_node.unwrap();
1143        assert_eq!(root_node.relatives.first_child, Some(three_id));
1144        assert_eq!(root_node.relatives.last_child, Some(three_id));
1145
1146        let three = tree.get_node(three_id);
1147        assert!(three.is_some());
1148
1149        let three = three.unwrap();
1150        assert_eq!(three.relatives.parent, Some(root_id));
1151        assert_eq!(three.relatives.prev_sibling, None);
1152        assert_eq!(three.relatives.next_sibling, None);
1153        assert_eq!(three.relatives.first_child, None);
1154        assert_eq!(three.relatives.last_child, None);
1155    }
1156
1157    #[test]
1158    fn remove_first_drop_three_children_present() {
1159        let mut tree = Tree::new();
1160        tree.set_root(1);
1161        let root_id = tree.root_id().expect("root doesn't exist?");
1162
1163        let mut root_mut = tree.get_mut(root_id).unwrap();
1164        root_mut.append(2);
1165        let three_id = root_mut.append(3).node_id();
1166        let four_id = root_mut.append(4).node_id();
1167
1168        let removed = root_mut.remove_first(DropChildren);
1169        assert_eq!(removed, Some(2));
1170
1171        let root_node = tree.get_node(root_id);
1172        assert!(root_node.is_some());
1173
1174        let root_node = root_node.unwrap();
1175        assert_eq!(root_node.relatives.first_child, Some(three_id));
1176        assert_eq!(root_node.relatives.last_child, Some(four_id));
1177
1178        let three = tree.get_node(three_id);
1179        assert!(three.is_some());
1180
1181        let three = three.unwrap();
1182        assert_eq!(three.relatives.parent, Some(root_id));
1183        assert_eq!(three.relatives.prev_sibling, None);
1184        assert_eq!(three.relatives.next_sibling, Some(four_id));
1185        assert_eq!(three.relatives.first_child, None);
1186        assert_eq!(three.relatives.last_child, None);
1187
1188        let four = tree.get_node(four_id);
1189        assert!(four.is_some());
1190
1191        let four = four.unwrap();
1192        assert_eq!(four.relatives.parent, Some(root_id));
1193        assert_eq!(four.relatives.prev_sibling, Some(three_id));
1194        assert_eq!(four.relatives.next_sibling, None);
1195        assert_eq!(four.relatives.first_child, None);
1196        assert_eq!(four.relatives.last_child, None);
1197    }
1198
1199    #[test]
1200    fn remove_first_drop_grandchild_present() {
1201        let mut tree = Tree::new();
1202        tree.set_root(1);
1203        let root_id = tree.root_id().expect("root doesn't exist?");
1204
1205        let mut root_mut = tree.get_mut(root_id).unwrap();
1206        let three_id = root_mut.append(2).append(3).node_id();
1207
1208        let removed = root_mut.remove_first(DropChildren);
1209        assert_eq!(removed, Some(2));
1210
1211        let root_node = tree.get_node(root_id);
1212        assert!(root_node.is_some());
1213
1214        let root_node = root_node.unwrap();
1215        assert_eq!(root_node.relatives.first_child, None);
1216        assert_eq!(root_node.relatives.last_child, None);
1217
1218        let three = tree.get_node(three_id);
1219        assert!(three.is_none());
1220    }
1221
1222    #[test]
1223    fn remove_first_orphan_grandchild_present() {
1224        let mut tree = Tree::new();
1225        tree.set_root(1);
1226        let root_id = tree.root_id().expect("root doesn't exist?");
1227
1228        let mut root_mut = tree.get_mut(root_id).unwrap();
1229        let three_id = root_mut.append(2).append(3).node_id();
1230
1231        let removed = root_mut.remove_first(OrphanChildren);
1232        assert_eq!(removed, Some(2));
1233
1234        let root_node = tree.get_node(root_id);
1235        assert!(root_node.is_some());
1236
1237        let root_node = root_node.unwrap();
1238        assert_eq!(root_node.relatives.first_child, None);
1239        assert_eq!(root_node.relatives.last_child, None);
1240
1241        let three = tree.get_node(three_id);
1242        assert!(three.is_some());
1243
1244        let three = three.unwrap();
1245        assert_eq!(three.relatives.parent, None);
1246    }
1247
1248    #[test]
1249    fn remove_last_no_children_present() {
1250        let mut tree = Tree::new();
1251        tree.set_root(1);
1252        let root_id = tree.root_id().expect("root doesn't exist?");
1253
1254        let mut root_mut = tree.get_mut(root_id).unwrap();
1255        let removed = root_mut.remove_last(DropChildren);
1256        assert_eq!(removed, None);
1257
1258        let root_node = tree.get_node(root_id);
1259        assert!(root_node.is_some());
1260
1261        let root_node = root_node.unwrap();
1262        assert_eq!(root_node.relatives.first_child, None);
1263        assert_eq!(root_node.relatives.last_child, None);
1264    }
1265
1266    #[test]
1267    fn remove_last_single_child_present() {
1268        let mut tree = Tree::new();
1269        tree.set_root(1);
1270        let root_id = tree.root_id().expect("root doesn't exist?");
1271
1272        let mut root_mut = tree.get_mut(root_id).unwrap();
1273        root_mut.append(2);
1274        let removed = root_mut.remove_last(DropChildren);
1275        assert_eq!(removed, Some(2));
1276
1277        let root_node = tree.get_node(root_id);
1278        assert!(root_node.is_some());
1279
1280        let root_node = root_node.unwrap();
1281        assert_eq!(root_node.relatives.first_child, None);
1282        assert_eq!(root_node.relatives.last_child, None);
1283    }
1284
1285    #[test]
1286    fn remove_last_two_children_present() {
1287        let mut tree = Tree::new();
1288        tree.set_root(1);
1289        let root_id = tree.root_id().expect("root doesn't exist?");
1290
1291        let mut root_mut = tree.get_mut(root_id).unwrap();
1292        let two_id = root_mut.append(2).node_id();
1293        root_mut.append(3);
1294
1295        let removed = root_mut.remove_last(DropChildren);
1296        assert_eq!(removed, Some(3));
1297
1298        let root_node = tree.get_node(root_id);
1299        assert!(root_node.is_some());
1300
1301        let root_node = root_node.unwrap();
1302        assert_eq!(root_node.relatives.first_child, Some(two_id));
1303        assert_eq!(root_node.relatives.last_child, Some(two_id));
1304
1305        let two = tree.get_node(two_id);
1306        assert!(two.is_some());
1307
1308        let two = two.unwrap();
1309        assert_eq!(two.relatives.parent, Some(root_id));
1310        assert_eq!(two.relatives.prev_sibling, None);
1311        assert_eq!(two.relatives.next_sibling, None);
1312        assert_eq!(two.relatives.first_child, None);
1313        assert_eq!(two.relatives.last_child, None);
1314    }
1315
1316    #[test]
1317    fn remove_last_three_children_present() {
1318        let mut tree = Tree::new();
1319        tree.set_root(1);
1320        let root_id = tree.root_id().expect("root doesn't exist?");
1321
1322        let mut root_mut = tree.get_mut(root_id).unwrap();
1323        let two_id = root_mut.append(2).node_id();
1324        let three_id = root_mut.append(3).node_id();
1325        root_mut.append(4);
1326
1327        let removed = root_mut.remove_last(DropChildren);
1328        assert_eq!(removed, Some(4));
1329
1330        let root_node = tree.get_node(root_id);
1331        assert!(root_node.is_some());
1332
1333        let root_node = root_node.unwrap();
1334        assert_eq!(root_node.relatives.first_child, Some(two_id));
1335        assert_eq!(root_node.relatives.last_child, Some(three_id));
1336
1337        let two = tree.get_node(two_id);
1338        assert!(two.is_some());
1339
1340        let two = two.unwrap();
1341        assert_eq!(two.relatives.parent, Some(root_id));
1342        assert_eq!(two.relatives.prev_sibling, None);
1343        assert_eq!(two.relatives.next_sibling, Some(three_id));
1344        assert_eq!(two.relatives.first_child, None);
1345        assert_eq!(two.relatives.last_child, None);
1346
1347        let three = tree.get_node(three_id);
1348        assert!(three.is_some());
1349
1350        let three = three.unwrap();
1351        assert_eq!(three.relatives.parent, Some(root_id));
1352        assert_eq!(three.relatives.prev_sibling, Some(two_id));
1353        assert_eq!(three.relatives.next_sibling, None);
1354        assert_eq!(three.relatives.first_child, None);
1355        assert_eq!(three.relatives.last_child, None);
1356    }
1357
1358    #[test]
1359    fn remove_last_orphan_grandchild_present() {
1360        let mut tree = Tree::new();
1361        tree.set_root(1);
1362        let root_id = tree.root_id().expect("root doesn't exist?");
1363
1364        let mut root_mut = tree.get_mut(root_id).unwrap();
1365        let three_id = root_mut.append(2).append(3).node_id();
1366
1367        let removed = root_mut.remove_last(OrphanChildren);
1368        assert_eq!(removed, Some(2));
1369
1370        let root_node = tree.get_node(root_id);
1371        assert!(root_node.is_some());
1372
1373        let root_node = root_node.unwrap();
1374        assert_eq!(root_node.relatives.first_child, None);
1375        assert_eq!(root_node.relatives.last_child, None);
1376
1377        let three = tree.get_node(three_id);
1378        assert!(three.is_some());
1379
1380        let three = three.unwrap();
1381        assert_eq!(three.relatives.parent, None);
1382    }
1383}