Implement new rust API for bindings and release v0.3
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 }))).unwrap();
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).unwrap();
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).unwrap();
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).unwrap();
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 remove() {
100 let mut stretch = Stretch::new();
101
102 let style2 = Style { flex_direction: FlexDirection::Column, ..Style::default() };
103
104 // Build a linear tree layout: <0> <- <1> <- <2>
105 let node2 = stretch.new_node(style2, vec![]).unwrap();
106 let node1 = stretch.new_node(Style::default(), vec![node2]).unwrap();
107 let node0 = stretch.new_node(Style::default(), vec![node1]).unwrap();
108
109 assert_eq!(stretch.children(node0).unwrap(), vec![node1]);
110
111 // Disconnect the tree: <0> <2>
112 stretch.remove(node1);
113
114 assert!(stretch.style(node1).is_err());
115
116 assert!(stretch.children(node0).unwrap().is_empty());
117 assert!(stretch.children(node2).unwrap().is_empty());
118 assert_eq!(stretch.style(node2).unwrap().flex_direction, style2.flex_direction);
119 }
120
121 #[test]
122 fn set_children() {
123 let mut stretch = Stretch::new();
124
125 let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
126 let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
127 let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
128
129 assert_eq!(stretch.child_count(node).unwrap(), 2);
130 assert_eq!(stretch.children(node).unwrap()[0], child1);
131 assert_eq!(stretch.children(node).unwrap()[1], child2);
132
133 let child3 = stretch.new_node(Style::default(), vec![]).unwrap();
134 let child4 = stretch.new_node(Style::default(), vec![]).unwrap();
135 stretch.set_children(node, vec![child3, child4]).unwrap();
136
137 assert_eq!(stretch.child_count(node).unwrap(), 2);
138 assert_eq!(stretch.children(node).unwrap()[0], child3);
139 assert_eq!(stretch.children(node).unwrap()[1], child4);
140 }
141
142 #[test]
143 fn set_style() {
144 let mut stretch = Stretch::new();
145
146 let node = stretch.new_node(Style::default(), vec![]).unwrap();
147 assert_eq!(stretch.style(node).unwrap().display, Display::Flex);
148
149 stretch.set_style(node, Style { display: Display::None, ..Style::default() }).unwrap();
150 assert_eq!(stretch.style(node).unwrap().display, Display::None);
151 }
152
153 #[test]
154 fn mark_dirty() {
155 let mut stretch = Stretch::new();
156
157 let child1 = stretch.new_node(Style::default(), vec![]).unwrap();
158 let child2 = stretch.new_node(Style::default(), vec![]).unwrap();
159 let node = stretch.new_node(Style::default(), vec![child1, child2]).unwrap();
160
161 stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
162
163 assert_eq!(stretch.dirty(child1).unwrap(), false);
164 assert_eq!(stretch.dirty(child2).unwrap(), false);
165 assert_eq!(stretch.dirty(node).unwrap(), false);
166
167 stretch.mark_dirty(node).unwrap();
168 assert_eq!(stretch.dirty(child1).unwrap(), false);
169 assert_eq!(stretch.dirty(child2).unwrap(), false);
170 assert_eq!(stretch.dirty(node).unwrap(), true);
171
172 stretch.compute_layout(node, stretch::geometry::Size::undefined()).unwrap();
173 stretch.mark_dirty(child1).unwrap();
174 assert_eq!(stretch.dirty(child1).unwrap(), true);
175 assert_eq!(stretch.dirty(child2).unwrap(), false);
176 assert_eq!(stretch.dirty(node).unwrap(), true);
177 }
178
179 #[test]
180 fn remove_last_node() {
181 let mut stretch = Stretch::new();
182
183 let parent = stretch.new_node(Style::default(), vec![]).unwrap();
184 let child = stretch.new_node(Style::default(), vec![]).unwrap();
185 stretch.add_child(parent, child).unwrap();
186
187 stretch.remove(child);
188 stretch.remove(parent);
189 }
190}