1#[cfg(test)]
2mod node {
3 use stretch::geometry::*;
4 use stretch::node::Stretch;
5 use stretch::style::*;
6
7 #[test]
8 fn children() {
9 let mut stretch = Stretch::new();
10 let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
11 let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
12 let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
13
14 assert_eq!(stretch.child_count(node).unwrap(), 2);
15 assert_eq!(stretch.children(node).unwrap()[0], child1);
16 assert_eq!(stretch.children(node).unwrap()[1], child2);
17 }
18
19 #[test]
20 fn set_measure() {
21 let mut stretch = Stretch::new();
22 let node = stretch.new_leaf(Style::default(), Box::new(|_| Ok(Size { width: 200.0, height: 200.0 })));
23 stretch.compute_layout(node, Size::undefined()).unwrap();
24 assert_eq!(stretch.layout(node).unwrap().size.width, 200.0);
25
26 stretch.set_measure(node, Some(Box::new(|_| Ok(Size { width: 100.0, height: 100.0 })))).unwrap();
27 stretch.compute_layout(node, Size::undefined()).unwrap();
28 assert_eq!(stretch.layout(node).unwrap().size.width, 100.0);
29 }
30
31 #[test]
32 fn add_child() {
33 let mut stretch = Stretch::new();
34 let node = stretch.new_node(Style::default(), vec![]).unwrap();
35 assert_eq!(stretch.child_count(node).unwrap(), 0);
36
37 let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
38 stretch.add_child(node, child1).unwrap();
39 assert_eq!(stretch.child_count(node).unwrap(), 1);
40
41 let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
42 stretch.add_child(node, child2);
43 assert_eq!(stretch.child_count(node).unwrap(), 2);
44 }
45
46 #[test]
47 fn remove_child() {
48 let mut stretch = Stretch::new();
49
50 let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
51 let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
52
53 let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
54 assert_eq!(stretch.child_count(node).unwrap(), 2);
55
56 stretch.remove_child(node, child1);
57 assert_eq!(stretch.child_count(node).unwrap(), 1);
58 assert_eq!(stretch.children(node).unwrap()[0], child2);
59
60 stretch.remove_child(node, child2);
61 assert_eq!(stretch.child_count(node).unwrap(), 0);
62 }
63
64 #[test]
65 fn remove_child_at_index() {
66 let mut stretch = Stretch::new();
67
68 let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
69 let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
70
71 let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
72 assert_eq!(stretch.child_count(node).unwrap(), 2);
73
74 stretch.remove_child_at_index(node, 0).unwrap();
75 assert_eq!(stretch.child_count(node).unwrap(), 1);
76 assert_eq!(stretch.children(node).unwrap()[0], child2);
77
78 stretch.remove_child_at_index(node, 0).unwrap();
79 assert_eq!(stretch.child_count(node).unwrap(), 0);
80 }
81
82 #[test]
83 fn replace_child_at_index() {
84 let mut stretch = Stretch::new();
85
86 let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
87 let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
88
89 let node = stretch.new_node(Style::default(), vec![child1]).unwrap();
90 assert_eq!(stretch.child_count(node).unwrap(), 1);
91 assert_eq!(stretch.children(node).unwrap()[0], child1);
92
93 stretch.replace_child_at_index(node, 0, child2).unwrap();
94 assert_eq!(stretch.child_count(node).unwrap(), 1);
95 assert_eq!(stretch.children(node).unwrap()[0], child2);
96 }
97
98 #[test]
99 fn removesaaa() {
100 let mut stretch = Stretch::new();
101
102 let style2 = Style {
103 flex_direction: FlexDirection::Column,
104 ..Style::default()
105 };
106
107 // Build a linear tree layout: <0> <- <1> <- <2>
108 let node2 = stretch.new_node(style2, vec![]).unwrap();
109 let node1 = stretch.new_node(Style::default(), vec![node2]).unwrap();
110 let node0 = stretch.new_node(Style::default(), vec![node1]).unwrap();
111
112 assert_eq!(stretch.children(node0).unwrap(), vec![node1]);
113
114 // Disconnect the tree: <0> <2>
115 stretch.remove(node1);
116
117 assert!(stretch.style(node1).is_err());
118
119 assert!(stretch.children(node0).unwrap().is_empty());
120 assert!(stretch.children(node2).unwrap().is_empty());
121 assert_eq!(stretch.style(node2).unwrap().flex_direction, style2.flex_direction);
122 }
123
124 #[test]
125 fn set_children() {
126 let mut stretch = Stretch::new();
127
128 let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
129 let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
130 let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
131
132 assert_eq!(stretch.child_count(node).unwrap(), 2);
133 assert_eq!(stretch.children(node).unwrap()[0], child1);
134 assert_eq!(stretch.children(node).unwrap()[1], child2);
135
136 let child3 = stretch.new_node(Style::default(), vec![]).unwrap();
137 let child4 = stretch.new_node(Style::default(), vec![]).unwrap();
138 stretch.set_children(node, vec![child3, child4]);
139
140 assert_eq!(stretch.child_count(node).unwrap(), 2);
141 assert_eq!(stretch.children(node).unwrap()[0], child3);
142 assert_eq!(stretch.children(node).unwrap()[1], child4);
143 }
144
145 #[test]
146 fn set_style() {
147 let mut stretch = Stretch::new();
148
149 let node = stretch.new_node(Style::default(), vec![]).unwrap();
150 assert_eq!(stretch.style(node).unwrap().display, Display::Flex);
151
152 stretch.set_style(node, Style { display: Display::None, ..Style::default() }).unwrap();
153 assert_eq!(stretch.style(node).unwrap().display, Display::None);
154 }
155
156 #[test]
157 fn mark_dirty() {
158 let mut stretch = Stretch::new();
159
160 let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
161 let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
162 let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
163
164 stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
165
166 assert_eq!(stretch.dirty(child1).unwrap(), false);
167 assert_eq!(stretch.dirty(child2).unwrap(), false);
168 assert_eq!(stretch.dirty(node).unwrap(), false);
169
170 stretch.mark_dirty(node);
171 assert_eq!(stretch.dirty(child1).unwrap(), false);
172 assert_eq!(stretch.dirty(child2).unwrap(), false);
173 assert_eq!(stretch.dirty(node).unwrap(), true);
174
175 stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
176 stretch.mark_dirty(child1);
177 assert_eq!(stretch.dirty(child1).unwrap(), true);
178 assert_eq!(stretch.dirty(child2).unwrap(), false);
179 assert_eq!(stretch.dirty(node).unwrap(), true);
180 }
181}