Merge "Add new layouting support for TextLabel and ImageView." into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-third-party / yoga / YGFlexWrapTest.cpp
1 /**
2  * Copyright (c) 2014-present, Facebook, Inc.
3  *
4  * This source code is licensed under the MIT license found in the
5  * LICENSE file in the root directory of this source tree.
6  */
7
8 // @Generated by gentest/gentest.rb from gentest/fixtures/YGFlexWrapTest.html
9
10 #include <gtest/gtest.h>
11 #include <yoga/Yoga.h>
12
13 TEST(YogaTest, wrap_column) {
14   const YGConfigRef config = YGConfigNew();
15
16   const YGNodeRef root = YGNodeNewWithConfig(config);
17   YGNodeStyleSetFlexWrap(root, YGWrapWrap);
18   YGNodeStyleSetHeight(root, 100);
19
20   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
21   YGNodeStyleSetWidth(root_child0, 30);
22   YGNodeStyleSetHeight(root_child0, 30);
23   YGNodeInsertChild(root, root_child0, 0);
24
25   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
26   YGNodeStyleSetWidth(root_child1, 30);
27   YGNodeStyleSetHeight(root_child1, 30);
28   YGNodeInsertChild(root, root_child1, 1);
29
30   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
31   YGNodeStyleSetWidth(root_child2, 30);
32   YGNodeStyleSetHeight(root_child2, 30);
33   YGNodeInsertChild(root, root_child2, 2);
34
35   const YGNodeRef root_child3 = YGNodeNewWithConfig(config);
36   YGNodeStyleSetWidth(root_child3, 30);
37   YGNodeStyleSetHeight(root_child3, 30);
38   YGNodeInsertChild(root, root_child3, 3);
39   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
40
41   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
42   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
43   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetWidth(root));
44   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
45
46   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
47   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
48   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
49   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child0));
50
51   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
52   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child1));
53   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
54   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child1));
55
56   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
57   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child2));
58   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
59   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
60
61   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child3));
62   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child3));
63   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
64   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child3));
65
66   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
67
68   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
69   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
70   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetWidth(root));
71   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
72
73   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child0));
74   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
75   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
76   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child0));
77
78   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child1));
79   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child1));
80   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
81   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child1));
82
83   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child2));
84   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child2));
85   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
86   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
87
88   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
89   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child3));
90   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
91   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child3));
92
93   YGNodeFreeRecursive(root);
94
95   YGConfigFree(config);
96 }
97
98 TEST(YogaTest, wrap_row) {
99   const YGConfigRef config = YGConfigNew();
100
101   const YGNodeRef root = YGNodeNewWithConfig(config);
102   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
103   YGNodeStyleSetFlexWrap(root, YGWrapWrap);
104   YGNodeStyleSetWidth(root, 100);
105
106   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
107   YGNodeStyleSetWidth(root_child0, 30);
108   YGNodeStyleSetHeight(root_child0, 30);
109   YGNodeInsertChild(root, root_child0, 0);
110
111   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
112   YGNodeStyleSetWidth(root_child1, 30);
113   YGNodeStyleSetHeight(root_child1, 30);
114   YGNodeInsertChild(root, root_child1, 1);
115
116   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
117   YGNodeStyleSetWidth(root_child2, 30);
118   YGNodeStyleSetHeight(root_child2, 30);
119   YGNodeInsertChild(root, root_child2, 2);
120
121   const YGNodeRef root_child3 = YGNodeNewWithConfig(config);
122   YGNodeStyleSetWidth(root_child3, 30);
123   YGNodeStyleSetHeight(root_child3, 30);
124   YGNodeInsertChild(root, root_child3, 3);
125   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
126
127   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
128   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
129   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
130   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetHeight(root));
131
132   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
133   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
134   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
135   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child0));
136
137   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child1));
138   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
139   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
140   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child1));
141
142   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetLeft(root_child2));
143   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
144   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
145   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
146
147   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
148   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child3));
149   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
150   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child3));
151
152   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
153
154   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
155   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
156   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
157   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetHeight(root));
158
159   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child0));
160   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
161   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
162   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child0));
163
164   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1));
165   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
166   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
167   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child1));
168
169   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child2));
170   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
171   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
172   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
173
174   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child3));
175   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child3));
176   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
177   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child3));
178
179   YGNodeFreeRecursive(root);
180
181   YGConfigFree(config);
182 }
183
184 TEST(YogaTest, wrap_row_align_items_flex_end) {
185   const YGConfigRef config = YGConfigNew();
186
187   const YGNodeRef root = YGNodeNewWithConfig(config);
188   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
189   YGNodeStyleSetAlignItems(root, YGAlignFlexEnd);
190   YGNodeStyleSetFlexWrap(root, YGWrapWrap);
191   YGNodeStyleSetWidth(root, 100);
192
193   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
194   YGNodeStyleSetWidth(root_child0, 30);
195   YGNodeStyleSetHeight(root_child0, 10);
196   YGNodeInsertChild(root, root_child0, 0);
197
198   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
199   YGNodeStyleSetWidth(root_child1, 30);
200   YGNodeStyleSetHeight(root_child1, 20);
201   YGNodeInsertChild(root, root_child1, 1);
202
203   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
204   YGNodeStyleSetWidth(root_child2, 30);
205   YGNodeStyleSetHeight(root_child2, 30);
206   YGNodeInsertChild(root, root_child2, 2);
207
208   const YGNodeRef root_child3 = YGNodeNewWithConfig(config);
209   YGNodeStyleSetWidth(root_child3, 30);
210   YGNodeStyleSetHeight(root_child3, 30);
211   YGNodeInsertChild(root, root_child3, 3);
212   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
213
214   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
215   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
216   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
217   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetHeight(root));
218
219   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
220   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root_child0));
221   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
222   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
223
224   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child1));
225   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1));
226   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
227   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
228
229   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetLeft(root_child2));
230   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
231   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
232   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
233
234   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
235   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child3));
236   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
237   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child3));
238
239   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
240
241   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
242   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
243   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
244   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetHeight(root));
245
246   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child0));
247   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root_child0));
248   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
249   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
250
251   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1));
252   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1));
253   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
254   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
255
256   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child2));
257   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
258   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
259   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
260
261   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child3));
262   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child3));
263   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
264   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child3));
265
266   YGNodeFreeRecursive(root);
267
268   YGConfigFree(config);
269 }
270
271 TEST(YogaTest, wrap_row_align_items_center) {
272   const YGConfigRef config = YGConfigNew();
273
274   const YGNodeRef root = YGNodeNewWithConfig(config);
275   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
276   YGNodeStyleSetAlignItems(root, YGAlignCenter);
277   YGNodeStyleSetFlexWrap(root, YGWrapWrap);
278   YGNodeStyleSetWidth(root, 100);
279
280   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
281   YGNodeStyleSetWidth(root_child0, 30);
282   YGNodeStyleSetHeight(root_child0, 10);
283   YGNodeInsertChild(root, root_child0, 0);
284
285   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
286   YGNodeStyleSetWidth(root_child1, 30);
287   YGNodeStyleSetHeight(root_child1, 20);
288   YGNodeInsertChild(root, root_child1, 1);
289
290   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
291   YGNodeStyleSetWidth(root_child2, 30);
292   YGNodeStyleSetHeight(root_child2, 30);
293   YGNodeInsertChild(root, root_child2, 2);
294
295   const YGNodeRef root_child3 = YGNodeNewWithConfig(config);
296   YGNodeStyleSetWidth(root_child3, 30);
297   YGNodeStyleSetHeight(root_child3, 30);
298   YGNodeInsertChild(root, root_child3, 3);
299   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
300
301   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
302   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
303   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
304   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetHeight(root));
305
306   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
307   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0));
308   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
309   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
310
311   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child1));
312   ASSERT_FLOAT_EQ(5, YGNodeLayoutGetTop(root_child1));
313   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
314   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
315
316   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetLeft(root_child2));
317   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
318   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
319   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
320
321   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
322   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child3));
323   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
324   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child3));
325
326   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
327
328   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
329   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
330   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
331   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetHeight(root));
332
333   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child0));
334   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0));
335   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
336   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
337
338   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1));
339   ASSERT_FLOAT_EQ(5, YGNodeLayoutGetTop(root_child1));
340   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
341   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
342
343   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child2));
344   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
345   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
346   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
347
348   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child3));
349   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child3));
350   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
351   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child3));
352
353   YGNodeFreeRecursive(root);
354
355   YGConfigFree(config);
356 }
357
358 TEST(YogaTest, flex_wrap_children_with_min_main_overriding_flex_basis) {
359   const YGConfigRef config = YGConfigNew();
360
361   const YGNodeRef root = YGNodeNewWithConfig(config);
362   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
363   YGNodeStyleSetFlexWrap(root, YGWrapWrap);
364   YGNodeStyleSetWidth(root, 100);
365
366   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
367   YGNodeStyleSetFlexBasis(root_child0, 50);
368   YGNodeStyleSetMinWidth(root_child0, 55);
369   YGNodeStyleSetHeight(root_child0, 50);
370   YGNodeInsertChild(root, root_child0, 0);
371
372   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
373   YGNodeStyleSetFlexBasis(root_child1, 50);
374   YGNodeStyleSetMinWidth(root_child1, 55);
375   YGNodeStyleSetHeight(root_child1, 50);
376   YGNodeInsertChild(root, root_child1, 1);
377   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
378
379   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
380   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
381   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
382   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
383
384   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
385   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
386   ASSERT_FLOAT_EQ(55, YGNodeLayoutGetWidth(root_child0));
387   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
388
389   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
390   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child1));
391   ASSERT_FLOAT_EQ(55, YGNodeLayoutGetWidth(root_child1));
392   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
393
394   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
395
396   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
397   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
398   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
399   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
400
401   ASSERT_FLOAT_EQ(45, YGNodeLayoutGetLeft(root_child0));
402   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
403   ASSERT_FLOAT_EQ(55, YGNodeLayoutGetWidth(root_child0));
404   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
405
406   ASSERT_FLOAT_EQ(45, YGNodeLayoutGetLeft(root_child1));
407   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child1));
408   ASSERT_FLOAT_EQ(55, YGNodeLayoutGetWidth(root_child1));
409   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
410
411   YGNodeFreeRecursive(root);
412
413   YGConfigFree(config);
414 }
415
416 TEST(YogaTest, flex_wrap_wrap_to_child_height) {
417   const YGConfigRef config = YGConfigNew();
418
419   const YGNodeRef root = YGNodeNewWithConfig(config);
420
421   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
422   YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
423   YGNodeStyleSetAlignItems(root_child0, YGAlignFlexStart);
424   YGNodeStyleSetFlexWrap(root_child0, YGWrapWrap);
425   YGNodeInsertChild(root, root_child0, 0);
426
427   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
428   YGNodeStyleSetWidth(root_child0_child0, 100);
429   YGNodeInsertChild(root_child0, root_child0_child0, 0);
430
431   const YGNodeRef root_child0_child0_child0 = YGNodeNewWithConfig(config);
432   YGNodeStyleSetWidth(root_child0_child0_child0, 100);
433   YGNodeStyleSetHeight(root_child0_child0_child0, 100);
434   YGNodeInsertChild(root_child0_child0, root_child0_child0_child0, 0);
435
436   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
437   YGNodeStyleSetWidth(root_child1, 100);
438   YGNodeStyleSetHeight(root_child1, 100);
439   YGNodeInsertChild(root, root_child1, 1);
440   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
441
442   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
443   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
444   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
445   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root));
446
447   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
448   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
449   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
450   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
451
452   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
453   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
454   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0));
455   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child0));
456
457   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0));
458   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0));
459   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0_child0));
460   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child0_child0));
461
462   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
463   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetTop(root_child1));
464   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
465   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
466
467   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
468
469   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
470   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
471   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
472   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root));
473
474   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
475   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
476   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
477   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
478
479   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
480   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
481   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0));
482   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child0));
483
484   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0));
485   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0));
486   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0_child0));
487   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child0_child0));
488
489   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
490   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetTop(root_child1));
491   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
492   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
493
494   YGNodeFreeRecursive(root);
495
496   YGConfigFree(config);
497 }
498
499 TEST(YogaTest, flex_wrap_align_stretch_fits_one_row) {
500   const YGConfigRef config = YGConfigNew();
501
502   const YGNodeRef root = YGNodeNewWithConfig(config);
503   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
504   YGNodeStyleSetFlexWrap(root, YGWrapWrap);
505   YGNodeStyleSetWidth(root, 150);
506   YGNodeStyleSetHeight(root, 100);
507
508   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
509   YGNodeStyleSetWidth(root_child0, 50);
510   YGNodeInsertChild(root, root_child0, 0);
511
512   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
513   YGNodeStyleSetWidth(root_child1, 50);
514   YGNodeInsertChild(root, root_child1, 1);
515   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
516
517   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
518   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
519   ASSERT_FLOAT_EQ(150, YGNodeLayoutGetWidth(root));
520   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
521
522   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
523   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
524   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
525   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
526
527   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child1));
528   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
529   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child1));
530   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
531
532   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
533
534   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
535   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
536   ASSERT_FLOAT_EQ(150, YGNodeLayoutGetWidth(root));
537   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
538
539   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetLeft(root_child0));
540   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
541   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
542   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
543
544   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child1));
545   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
546   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child1));
547   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
548
549   YGNodeFreeRecursive(root);
550
551   YGConfigFree(config);
552 }
553
554 TEST(YogaTest, wrap_reverse_row_align_content_flex_start) {
555   const YGConfigRef config = YGConfigNew();
556
557   const YGNodeRef root = YGNodeNewWithConfig(config);
558   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
559   YGNodeStyleSetFlexWrap(root, YGWrapWrapReverse);
560   YGNodeStyleSetWidth(root, 100);
561
562   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
563   YGNodeStyleSetWidth(root_child0, 30);
564   YGNodeStyleSetHeight(root_child0, 10);
565   YGNodeInsertChild(root, root_child0, 0);
566
567   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
568   YGNodeStyleSetWidth(root_child1, 30);
569   YGNodeStyleSetHeight(root_child1, 20);
570   YGNodeInsertChild(root, root_child1, 1);
571
572   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
573   YGNodeStyleSetWidth(root_child2, 30);
574   YGNodeStyleSetHeight(root_child2, 30);
575   YGNodeInsertChild(root, root_child2, 2);
576
577   const YGNodeRef root_child3 = YGNodeNewWithConfig(config);
578   YGNodeStyleSetWidth(root_child3, 30);
579   YGNodeStyleSetHeight(root_child3, 40);
580   YGNodeInsertChild(root, root_child3, 3);
581
582   const YGNodeRef root_child4 = YGNodeNewWithConfig(config);
583   YGNodeStyleSetWidth(root_child4, 30);
584   YGNodeStyleSetHeight(root_child4, 50);
585   YGNodeInsertChild(root, root_child4, 4);
586   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
587
588   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
589   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
590   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
591   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root));
592
593   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
594   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetTop(root_child0));
595   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
596   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
597
598   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child1));
599   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child1));
600   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
601   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
602
603   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetLeft(root_child2));
604   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child2));
605   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
606   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
607
608   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
609   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child3));
610   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
611   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
612
613   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child4));
614   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
615   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
616   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
617
618   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
619
620   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
621   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
622   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
623   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root));
624
625   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child0));
626   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetTop(root_child0));
627   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
628   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
629
630   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1));
631   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child1));
632   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
633   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
634
635   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child2));
636   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child2));
637   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
638   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
639
640   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child3));
641   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child3));
642   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
643   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
644
645   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child4));
646   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
647   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
648   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
649
650   YGNodeFreeRecursive(root);
651
652   YGConfigFree(config);
653 }
654
655 TEST(YogaTest, wrap_reverse_row_align_content_center) {
656   const YGConfigRef config = YGConfigNew();
657
658   const YGNodeRef root = YGNodeNewWithConfig(config);
659   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
660   YGNodeStyleSetAlignContent(root, YGAlignCenter);
661   YGNodeStyleSetFlexWrap(root, YGWrapWrapReverse);
662   YGNodeStyleSetWidth(root, 100);
663
664   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
665   YGNodeStyleSetWidth(root_child0, 30);
666   YGNodeStyleSetHeight(root_child0, 10);
667   YGNodeInsertChild(root, root_child0, 0);
668
669   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
670   YGNodeStyleSetWidth(root_child1, 30);
671   YGNodeStyleSetHeight(root_child1, 20);
672   YGNodeInsertChild(root, root_child1, 1);
673
674   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
675   YGNodeStyleSetWidth(root_child2, 30);
676   YGNodeStyleSetHeight(root_child2, 30);
677   YGNodeInsertChild(root, root_child2, 2);
678
679   const YGNodeRef root_child3 = YGNodeNewWithConfig(config);
680   YGNodeStyleSetWidth(root_child3, 30);
681   YGNodeStyleSetHeight(root_child3, 40);
682   YGNodeInsertChild(root, root_child3, 3);
683
684   const YGNodeRef root_child4 = YGNodeNewWithConfig(config);
685   YGNodeStyleSetWidth(root_child4, 30);
686   YGNodeStyleSetHeight(root_child4, 50);
687   YGNodeInsertChild(root, root_child4, 4);
688   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
689
690   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
691   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
692   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
693   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root));
694
695   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
696   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetTop(root_child0));
697   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
698   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
699
700   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child1));
701   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child1));
702   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
703   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
704
705   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetLeft(root_child2));
706   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child2));
707   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
708   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
709
710   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
711   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child3));
712   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
713   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
714
715   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child4));
716   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
717   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
718   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
719
720   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
721
722   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
723   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
724   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
725   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root));
726
727   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child0));
728   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetTop(root_child0));
729   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
730   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
731
732   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1));
733   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child1));
734   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
735   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
736
737   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child2));
738   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child2));
739   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
740   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
741
742   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child3));
743   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child3));
744   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
745   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
746
747   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child4));
748   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
749   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
750   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
751
752   YGNodeFreeRecursive(root);
753
754   YGConfigFree(config);
755 }
756
757 TEST(YogaTest, wrap_reverse_row_single_line_different_size) {
758   const YGConfigRef config = YGConfigNew();
759
760   const YGNodeRef root = YGNodeNewWithConfig(config);
761   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
762   YGNodeStyleSetFlexWrap(root, YGWrapWrapReverse);
763   YGNodeStyleSetWidth(root, 300);
764
765   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
766   YGNodeStyleSetWidth(root_child0, 30);
767   YGNodeStyleSetHeight(root_child0, 10);
768   YGNodeInsertChild(root, root_child0, 0);
769
770   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
771   YGNodeStyleSetWidth(root_child1, 30);
772   YGNodeStyleSetHeight(root_child1, 20);
773   YGNodeInsertChild(root, root_child1, 1);
774
775   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
776   YGNodeStyleSetWidth(root_child2, 30);
777   YGNodeStyleSetHeight(root_child2, 30);
778   YGNodeInsertChild(root, root_child2, 2);
779
780   const YGNodeRef root_child3 = YGNodeNewWithConfig(config);
781   YGNodeStyleSetWidth(root_child3, 30);
782   YGNodeStyleSetHeight(root_child3, 40);
783   YGNodeInsertChild(root, root_child3, 3);
784
785   const YGNodeRef root_child4 = YGNodeNewWithConfig(config);
786   YGNodeStyleSetWidth(root_child4, 30);
787   YGNodeStyleSetHeight(root_child4, 50);
788   YGNodeInsertChild(root, root_child4, 4);
789   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
790
791   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
792   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
793   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root));
794   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root));
795
796   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
797   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetTop(root_child0));
798   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
799   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
800
801   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child1));
802   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child1));
803   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
804   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
805
806   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetLeft(root_child2));
807   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root_child2));
808   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
809   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
810
811   ASSERT_FLOAT_EQ(90, YGNodeLayoutGetLeft(root_child3));
812   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child3));
813   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
814   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
815
816   ASSERT_FLOAT_EQ(120, YGNodeLayoutGetLeft(root_child4));
817   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
818   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
819   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
820
821   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
822
823   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
824   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
825   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root));
826   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root));
827
828   ASSERT_FLOAT_EQ(270, YGNodeLayoutGetLeft(root_child0));
829   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetTop(root_child0));
830   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
831   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
832
833   ASSERT_FLOAT_EQ(240, YGNodeLayoutGetLeft(root_child1));
834   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child1));
835   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
836   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
837
838   ASSERT_FLOAT_EQ(210, YGNodeLayoutGetLeft(root_child2));
839   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root_child2));
840   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
841   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
842
843   ASSERT_FLOAT_EQ(180, YGNodeLayoutGetLeft(root_child3));
844   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child3));
845   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
846   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
847
848   ASSERT_FLOAT_EQ(150, YGNodeLayoutGetLeft(root_child4));
849   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
850   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
851   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
852
853   YGNodeFreeRecursive(root);
854
855   YGConfigFree(config);
856 }
857
858 TEST(YogaTest, wrap_reverse_row_align_content_stretch) {
859   const YGConfigRef config = YGConfigNew();
860
861   const YGNodeRef root = YGNodeNewWithConfig(config);
862   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
863   YGNodeStyleSetAlignContent(root, YGAlignStretch);
864   YGNodeStyleSetFlexWrap(root, YGWrapWrapReverse);
865   YGNodeStyleSetWidth(root, 100);
866
867   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
868   YGNodeStyleSetWidth(root_child0, 30);
869   YGNodeStyleSetHeight(root_child0, 10);
870   YGNodeInsertChild(root, root_child0, 0);
871
872   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
873   YGNodeStyleSetWidth(root_child1, 30);
874   YGNodeStyleSetHeight(root_child1, 20);
875   YGNodeInsertChild(root, root_child1, 1);
876
877   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
878   YGNodeStyleSetWidth(root_child2, 30);
879   YGNodeStyleSetHeight(root_child2, 30);
880   YGNodeInsertChild(root, root_child2, 2);
881
882   const YGNodeRef root_child3 = YGNodeNewWithConfig(config);
883   YGNodeStyleSetWidth(root_child3, 30);
884   YGNodeStyleSetHeight(root_child3, 40);
885   YGNodeInsertChild(root, root_child3, 3);
886
887   const YGNodeRef root_child4 = YGNodeNewWithConfig(config);
888   YGNodeStyleSetWidth(root_child4, 30);
889   YGNodeStyleSetHeight(root_child4, 50);
890   YGNodeInsertChild(root, root_child4, 4);
891   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
892
893   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
894   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
895   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
896   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root));
897
898   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
899   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetTop(root_child0));
900   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
901   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
902
903   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child1));
904   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child1));
905   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
906   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
907
908   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetLeft(root_child2));
909   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child2));
910   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
911   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
912
913   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
914   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child3));
915   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
916   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
917
918   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child4));
919   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
920   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
921   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
922
923   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
924
925   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
926   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
927   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
928   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root));
929
930   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child0));
931   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetTop(root_child0));
932   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
933   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
934
935   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1));
936   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child1));
937   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
938   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
939
940   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child2));
941   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child2));
942   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
943   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
944
945   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child3));
946   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child3));
947   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
948   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
949
950   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child4));
951   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
952   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
953   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
954
955   YGNodeFreeRecursive(root);
956
957   YGConfigFree(config);
958 }
959
960 TEST(YogaTest, wrap_reverse_row_align_content_space_around) {
961   const YGConfigRef config = YGConfigNew();
962
963   const YGNodeRef root = YGNodeNewWithConfig(config);
964   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
965   YGNodeStyleSetAlignContent(root, YGAlignSpaceAround);
966   YGNodeStyleSetFlexWrap(root, YGWrapWrapReverse);
967   YGNodeStyleSetWidth(root, 100);
968
969   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
970   YGNodeStyleSetWidth(root_child0, 30);
971   YGNodeStyleSetHeight(root_child0, 10);
972   YGNodeInsertChild(root, root_child0, 0);
973
974   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
975   YGNodeStyleSetWidth(root_child1, 30);
976   YGNodeStyleSetHeight(root_child1, 20);
977   YGNodeInsertChild(root, root_child1, 1);
978
979   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
980   YGNodeStyleSetWidth(root_child2, 30);
981   YGNodeStyleSetHeight(root_child2, 30);
982   YGNodeInsertChild(root, root_child2, 2);
983
984   const YGNodeRef root_child3 = YGNodeNewWithConfig(config);
985   YGNodeStyleSetWidth(root_child3, 30);
986   YGNodeStyleSetHeight(root_child3, 40);
987   YGNodeInsertChild(root, root_child3, 3);
988
989   const YGNodeRef root_child4 = YGNodeNewWithConfig(config);
990   YGNodeStyleSetWidth(root_child4, 30);
991   YGNodeStyleSetHeight(root_child4, 50);
992   YGNodeInsertChild(root, root_child4, 4);
993   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
994
995   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
996   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
997   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
998   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root));
999
1000   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1001   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetTop(root_child0));
1002   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
1003   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
1004
1005   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child1));
1006   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child1));
1007   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
1008   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
1009
1010   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetLeft(root_child2));
1011   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child2));
1012   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
1013   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
1014
1015   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
1016   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child3));
1017   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
1018   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
1019
1020   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child4));
1021   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
1022   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
1023   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
1024
1025   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1026
1027   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1028   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1029   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
1030   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root));
1031
1032   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child0));
1033   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetTop(root_child0));
1034   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
1035   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
1036
1037   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1));
1038   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child1));
1039   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
1040   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
1041
1042   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child2));
1043   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child2));
1044   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
1045   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
1046
1047   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child3));
1048   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child3));
1049   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
1050   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
1051
1052   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child4));
1053   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
1054   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
1055   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
1056
1057   YGNodeFreeRecursive(root);
1058
1059   YGConfigFree(config);
1060 }
1061
1062 TEST(YogaTest, wrap_reverse_column_fixed_size) {
1063   const YGConfigRef config = YGConfigNew();
1064
1065   const YGNodeRef root = YGNodeNewWithConfig(config);
1066   YGNodeStyleSetAlignItems(root, YGAlignCenter);
1067   YGNodeStyleSetFlexWrap(root, YGWrapWrapReverse);
1068   YGNodeStyleSetWidth(root, 200);
1069   YGNodeStyleSetHeight(root, 100);
1070
1071   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
1072   YGNodeStyleSetWidth(root_child0, 30);
1073   YGNodeStyleSetHeight(root_child0, 10);
1074   YGNodeInsertChild(root, root_child0, 0);
1075
1076   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
1077   YGNodeStyleSetWidth(root_child1, 30);
1078   YGNodeStyleSetHeight(root_child1, 20);
1079   YGNodeInsertChild(root, root_child1, 1);
1080
1081   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
1082   YGNodeStyleSetWidth(root_child2, 30);
1083   YGNodeStyleSetHeight(root_child2, 30);
1084   YGNodeInsertChild(root, root_child2, 2);
1085
1086   const YGNodeRef root_child3 = YGNodeNewWithConfig(config);
1087   YGNodeStyleSetWidth(root_child3, 30);
1088   YGNodeStyleSetHeight(root_child3, 40);
1089   YGNodeInsertChild(root, root_child3, 3);
1090
1091   const YGNodeRef root_child4 = YGNodeNewWithConfig(config);
1092   YGNodeStyleSetWidth(root_child4, 30);
1093   YGNodeStyleSetHeight(root_child4, 50);
1094   YGNodeInsertChild(root, root_child4, 4);
1095   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1096
1097   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1098   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1099   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
1100   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1101
1102   ASSERT_FLOAT_EQ(170, YGNodeLayoutGetLeft(root_child0));
1103   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1104   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
1105   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
1106
1107   ASSERT_FLOAT_EQ(170, YGNodeLayoutGetLeft(root_child1));
1108   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1));
1109   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
1110   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
1111
1112   ASSERT_FLOAT_EQ(170, YGNodeLayoutGetLeft(root_child2));
1113   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child2));
1114   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
1115   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
1116
1117   ASSERT_FLOAT_EQ(170, YGNodeLayoutGetLeft(root_child3));
1118   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child3));
1119   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
1120   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
1121
1122   ASSERT_FLOAT_EQ(140, YGNodeLayoutGetLeft(root_child4));
1123   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
1124   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
1125   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
1126
1127   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1128
1129   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1130   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1131   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
1132   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1133
1134   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1135   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1136   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child0));
1137   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
1138
1139   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
1140   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1));
1141   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child1));
1142   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
1143
1144   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
1145   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child2));
1146   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2));
1147   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child2));
1148
1149   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
1150   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetTop(root_child3));
1151   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child3));
1152   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child3));
1153
1154   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child4));
1155   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
1156   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child4));
1157   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child4));
1158
1159   YGNodeFreeRecursive(root);
1160
1161   YGConfigFree(config);
1162 }
1163
1164 TEST(YogaTest, wrapped_row_within_align_items_center) {
1165   const YGConfigRef config = YGConfigNew();
1166
1167   const YGNodeRef root = YGNodeNewWithConfig(config);
1168   YGNodeStyleSetAlignItems(root, YGAlignCenter);
1169   YGNodeStyleSetWidth(root, 200);
1170   YGNodeStyleSetHeight(root, 200);
1171
1172   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
1173   YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
1174   YGNodeStyleSetFlexWrap(root_child0, YGWrapWrap);
1175   YGNodeInsertChild(root, root_child0, 0);
1176
1177   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
1178   YGNodeStyleSetWidth(root_child0_child0, 150);
1179   YGNodeStyleSetHeight(root_child0_child0, 80);
1180   YGNodeInsertChild(root_child0, root_child0_child0, 0);
1181
1182   const YGNodeRef root_child0_child1 = YGNodeNewWithConfig(config);
1183   YGNodeStyleSetWidth(root_child0_child1, 80);
1184   YGNodeStyleSetHeight(root_child0_child1, 80);
1185   YGNodeInsertChild(root_child0, root_child0_child1, 1);
1186   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1187
1188   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1189   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1190   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
1191   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root));
1192
1193   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1194   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1195   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0));
1196   ASSERT_FLOAT_EQ(160, YGNodeLayoutGetHeight(root_child0));
1197
1198   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
1199   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1200   ASSERT_FLOAT_EQ(150, YGNodeLayoutGetWidth(root_child0_child0));
1201   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child0));
1202
1203   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
1204   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetTop(root_child0_child1));
1205   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child0_child1));
1206   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child1));
1207
1208   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1209
1210   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1211   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1212   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
1213   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root));
1214
1215   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1216   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1217   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0));
1218   ASSERT_FLOAT_EQ(160, YGNodeLayoutGetHeight(root_child0));
1219
1220   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child0_child0));
1221   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1222   ASSERT_FLOAT_EQ(150, YGNodeLayoutGetWidth(root_child0_child0));
1223   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child0));
1224
1225   ASSERT_FLOAT_EQ(120, YGNodeLayoutGetLeft(root_child0_child1));
1226   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetTop(root_child0_child1));
1227   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child0_child1));
1228   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child1));
1229
1230   YGNodeFreeRecursive(root);
1231
1232   YGConfigFree(config);
1233 }
1234
1235 TEST(YogaTest, wrapped_row_within_align_items_flex_start) {
1236   const YGConfigRef config = YGConfigNew();
1237
1238   const YGNodeRef root = YGNodeNewWithConfig(config);
1239   YGNodeStyleSetAlignItems(root, YGAlignFlexStart);
1240   YGNodeStyleSetWidth(root, 200);
1241   YGNodeStyleSetHeight(root, 200);
1242
1243   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
1244   YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
1245   YGNodeStyleSetFlexWrap(root_child0, YGWrapWrap);
1246   YGNodeInsertChild(root, root_child0, 0);
1247
1248   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
1249   YGNodeStyleSetWidth(root_child0_child0, 150);
1250   YGNodeStyleSetHeight(root_child0_child0, 80);
1251   YGNodeInsertChild(root_child0, root_child0_child0, 0);
1252
1253   const YGNodeRef root_child0_child1 = YGNodeNewWithConfig(config);
1254   YGNodeStyleSetWidth(root_child0_child1, 80);
1255   YGNodeStyleSetHeight(root_child0_child1, 80);
1256   YGNodeInsertChild(root_child0, root_child0_child1, 1);
1257   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1258
1259   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1260   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1261   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
1262   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root));
1263
1264   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1265   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1266   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0));
1267   ASSERT_FLOAT_EQ(160, YGNodeLayoutGetHeight(root_child0));
1268
1269   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
1270   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1271   ASSERT_FLOAT_EQ(150, YGNodeLayoutGetWidth(root_child0_child0));
1272   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child0));
1273
1274   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
1275   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetTop(root_child0_child1));
1276   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child0_child1));
1277   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child1));
1278
1279   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1280
1281   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1282   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1283   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
1284   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root));
1285
1286   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1287   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1288   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0));
1289   ASSERT_FLOAT_EQ(160, YGNodeLayoutGetHeight(root_child0));
1290
1291   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child0_child0));
1292   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1293   ASSERT_FLOAT_EQ(150, YGNodeLayoutGetWidth(root_child0_child0));
1294   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child0));
1295
1296   ASSERT_FLOAT_EQ(120, YGNodeLayoutGetLeft(root_child0_child1));
1297   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetTop(root_child0_child1));
1298   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child0_child1));
1299   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child1));
1300
1301   YGNodeFreeRecursive(root);
1302
1303   YGConfigFree(config);
1304 }
1305
1306 TEST(YogaTest, wrapped_row_within_align_items_flex_end) {
1307   const YGConfigRef config = YGConfigNew();
1308
1309   const YGNodeRef root = YGNodeNewWithConfig(config);
1310   YGNodeStyleSetAlignItems(root, YGAlignFlexEnd);
1311   YGNodeStyleSetWidth(root, 200);
1312   YGNodeStyleSetHeight(root, 200);
1313
1314   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
1315   YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
1316   YGNodeStyleSetFlexWrap(root_child0, YGWrapWrap);
1317   YGNodeInsertChild(root, root_child0, 0);
1318
1319   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
1320   YGNodeStyleSetWidth(root_child0_child0, 150);
1321   YGNodeStyleSetHeight(root_child0_child0, 80);
1322   YGNodeInsertChild(root_child0, root_child0_child0, 0);
1323
1324   const YGNodeRef root_child0_child1 = YGNodeNewWithConfig(config);
1325   YGNodeStyleSetWidth(root_child0_child1, 80);
1326   YGNodeStyleSetHeight(root_child0_child1, 80);
1327   YGNodeInsertChild(root_child0, root_child0_child1, 1);
1328   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1329
1330   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1331   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1332   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
1333   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root));
1334
1335   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1336   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1337   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0));
1338   ASSERT_FLOAT_EQ(160, YGNodeLayoutGetHeight(root_child0));
1339
1340   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
1341   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1342   ASSERT_FLOAT_EQ(150, YGNodeLayoutGetWidth(root_child0_child0));
1343   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child0));
1344
1345   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
1346   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetTop(root_child0_child1));
1347   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child0_child1));
1348   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child1));
1349
1350   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1351
1352   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1353   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1354   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
1355   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root));
1356
1357   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1358   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1359   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0));
1360   ASSERT_FLOAT_EQ(160, YGNodeLayoutGetHeight(root_child0));
1361
1362   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child0_child0));
1363   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1364   ASSERT_FLOAT_EQ(150, YGNodeLayoutGetWidth(root_child0_child0));
1365   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child0));
1366
1367   ASSERT_FLOAT_EQ(120, YGNodeLayoutGetLeft(root_child0_child1));
1368   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetTop(root_child0_child1));
1369   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child0_child1));
1370   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0_child1));
1371
1372   YGNodeFreeRecursive(root);
1373
1374   YGConfigFree(config);
1375 }
1376
1377 TEST(YogaTest, wrapped_column_max_height) {
1378   const YGConfigRef config = YGConfigNew();
1379
1380   const YGNodeRef root = YGNodeNewWithConfig(config);
1381   YGNodeStyleSetJustifyContent(root, YGJustifyCenter);
1382   YGNodeStyleSetAlignContent(root, YGAlignCenter);
1383   YGNodeStyleSetAlignItems(root, YGAlignCenter);
1384   YGNodeStyleSetFlexWrap(root, YGWrapWrap);
1385   YGNodeStyleSetWidth(root, 700);
1386   YGNodeStyleSetHeight(root, 500);
1387
1388   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
1389   YGNodeStyleSetWidth(root_child0, 100);
1390   YGNodeStyleSetHeight(root_child0, 500);
1391   YGNodeStyleSetMaxHeight(root_child0, 200);
1392   YGNodeInsertChild(root, root_child0, 0);
1393
1394   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
1395   YGNodeStyleSetMargin(root_child1, YGEdgeLeft, 20);
1396   YGNodeStyleSetMargin(root_child1, YGEdgeTop, 20);
1397   YGNodeStyleSetMargin(root_child1, YGEdgeRight, 20);
1398   YGNodeStyleSetMargin(root_child1, YGEdgeBottom, 20);
1399   YGNodeStyleSetWidth(root_child1, 200);
1400   YGNodeStyleSetHeight(root_child1, 200);
1401   YGNodeInsertChild(root, root_child1, 1);
1402
1403   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
1404   YGNodeStyleSetWidth(root_child2, 100);
1405   YGNodeStyleSetHeight(root_child2, 100);
1406   YGNodeInsertChild(root, root_child2, 2);
1407   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1408
1409   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1410   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1411   ASSERT_FLOAT_EQ(700, YGNodeLayoutGetWidth(root));
1412   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
1413
1414   ASSERT_FLOAT_EQ(250, YGNodeLayoutGetLeft(root_child0));
1415   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child0));
1416   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
1417   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0));
1418
1419   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetLeft(root_child1));
1420   ASSERT_FLOAT_EQ(250, YGNodeLayoutGetTop(root_child1));
1421   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child1));
1422   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child1));
1423
1424   ASSERT_FLOAT_EQ(420, YGNodeLayoutGetLeft(root_child2));
1425   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child2));
1426   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
1427   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
1428
1429   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1430
1431   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1432   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1433   ASSERT_FLOAT_EQ(700, YGNodeLayoutGetWidth(root));
1434   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
1435
1436   ASSERT_FLOAT_EQ(350, YGNodeLayoutGetLeft(root_child0));
1437   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child0));
1438   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
1439   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0));
1440
1441   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetLeft(root_child1));
1442   ASSERT_FLOAT_EQ(250, YGNodeLayoutGetTop(root_child1));
1443   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child1));
1444   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child1));
1445
1446   ASSERT_FLOAT_EQ(180, YGNodeLayoutGetLeft(root_child2));
1447   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child2));
1448   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
1449   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
1450
1451   YGNodeFreeRecursive(root);
1452
1453   YGConfigFree(config);
1454 }
1455
1456 TEST(YogaTest, wrapped_column_max_height_flex) {
1457   const YGConfigRef config = YGConfigNew();
1458
1459   const YGNodeRef root = YGNodeNewWithConfig(config);
1460   YGNodeStyleSetJustifyContent(root, YGJustifyCenter);
1461   YGNodeStyleSetAlignContent(root, YGAlignCenter);
1462   YGNodeStyleSetAlignItems(root, YGAlignCenter);
1463   YGNodeStyleSetFlexWrap(root, YGWrapWrap);
1464   YGNodeStyleSetWidth(root, 700);
1465   YGNodeStyleSetHeight(root, 500);
1466
1467   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
1468   YGNodeStyleSetFlexGrow(root_child0, 1);
1469   YGNodeStyleSetFlexShrink(root_child0, 1);
1470   YGNodeStyleSetFlexBasisPercent(root_child0, 0);
1471   YGNodeStyleSetWidth(root_child0, 100);
1472   YGNodeStyleSetHeight(root_child0, 500);
1473   YGNodeStyleSetMaxHeight(root_child0, 200);
1474   YGNodeInsertChild(root, root_child0, 0);
1475
1476   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
1477   YGNodeStyleSetFlexGrow(root_child1, 1);
1478   YGNodeStyleSetFlexShrink(root_child1, 1);
1479   YGNodeStyleSetFlexBasisPercent(root_child1, 0);
1480   YGNodeStyleSetMargin(root_child1, YGEdgeLeft, 20);
1481   YGNodeStyleSetMargin(root_child1, YGEdgeTop, 20);
1482   YGNodeStyleSetMargin(root_child1, YGEdgeRight, 20);
1483   YGNodeStyleSetMargin(root_child1, YGEdgeBottom, 20);
1484   YGNodeStyleSetWidth(root_child1, 200);
1485   YGNodeStyleSetHeight(root_child1, 200);
1486   YGNodeInsertChild(root, root_child1, 1);
1487
1488   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
1489   YGNodeStyleSetWidth(root_child2, 100);
1490   YGNodeStyleSetHeight(root_child2, 100);
1491   YGNodeInsertChild(root, root_child2, 2);
1492   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1493
1494   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1495   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1496   ASSERT_FLOAT_EQ(700, YGNodeLayoutGetWidth(root));
1497   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
1498
1499   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetLeft(root_child0));
1500   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1501   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
1502   ASSERT_FLOAT_EQ(180, YGNodeLayoutGetHeight(root_child0));
1503
1504   ASSERT_FLOAT_EQ(250, YGNodeLayoutGetLeft(root_child1));
1505   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child1));
1506   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child1));
1507   ASSERT_FLOAT_EQ(180, YGNodeLayoutGetHeight(root_child1));
1508
1509   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetLeft(root_child2));
1510   ASSERT_FLOAT_EQ(400, YGNodeLayoutGetTop(root_child2));
1511   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
1512   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
1513
1514   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1515
1516   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1517   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1518   ASSERT_FLOAT_EQ(700, YGNodeLayoutGetWidth(root));
1519   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
1520
1521   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetLeft(root_child0));
1522   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1523   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
1524   ASSERT_FLOAT_EQ(180, YGNodeLayoutGetHeight(root_child0));
1525
1526   ASSERT_FLOAT_EQ(250, YGNodeLayoutGetLeft(root_child1));
1527   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child1));
1528   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child1));
1529   ASSERT_FLOAT_EQ(180, YGNodeLayoutGetHeight(root_child1));
1530
1531   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetLeft(root_child2));
1532   ASSERT_FLOAT_EQ(400, YGNodeLayoutGetTop(root_child2));
1533   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
1534   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
1535
1536   YGNodeFreeRecursive(root);
1537
1538   YGConfigFree(config);
1539 }
1540
1541 TEST(YogaTest, wrap_nodes_with_content_sizing_overflowing_margin) {
1542   const YGConfigRef config = YGConfigNew();
1543
1544   const YGNodeRef root = YGNodeNewWithConfig(config);
1545   YGNodeStyleSetWidth(root, 500);
1546   YGNodeStyleSetHeight(root, 500);
1547
1548   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
1549   YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
1550   YGNodeStyleSetFlexWrap(root_child0, YGWrapWrap);
1551   YGNodeStyleSetWidth(root_child0, 85);
1552   YGNodeInsertChild(root, root_child0, 0);
1553
1554   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
1555   YGNodeInsertChild(root_child0, root_child0_child0, 0);
1556
1557   const YGNodeRef root_child0_child0_child0 = YGNodeNewWithConfig(config);
1558   YGNodeStyleSetWidth(root_child0_child0_child0, 40);
1559   YGNodeStyleSetHeight(root_child0_child0_child0, 40);
1560   YGNodeInsertChild(root_child0_child0, root_child0_child0_child0, 0);
1561
1562   const YGNodeRef root_child0_child1 = YGNodeNewWithConfig(config);
1563   YGNodeStyleSetMargin(root_child0_child1, YGEdgeRight, 10);
1564   YGNodeInsertChild(root_child0, root_child0_child1, 1);
1565
1566   const YGNodeRef root_child0_child1_child0 = YGNodeNewWithConfig(config);
1567   YGNodeStyleSetWidth(root_child0_child1_child0, 40);
1568   YGNodeStyleSetHeight(root_child0_child1_child0, 40);
1569   YGNodeInsertChild(root_child0_child1, root_child0_child1_child0, 0);
1570   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1571
1572   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1573   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1574   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetWidth(root));
1575   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
1576
1577   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1578   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1579   ASSERT_FLOAT_EQ(85, YGNodeLayoutGetWidth(root_child0));
1580   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0));
1581
1582   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
1583   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1584   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child0));
1585   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child0));
1586
1587   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0));
1588   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0));
1589   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child0_child0));
1590   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child0_child0));
1591
1592   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
1593   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetTop(root_child0_child1));
1594   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child1));
1595   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child1));
1596
1597   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1_child0));
1598   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child1_child0));
1599   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child1_child0));
1600   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child1_child0));
1601
1602   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1603
1604   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1605   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1606   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetWidth(root));
1607   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
1608
1609   ASSERT_FLOAT_EQ(415, YGNodeLayoutGetLeft(root_child0));
1610   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1611   ASSERT_FLOAT_EQ(85, YGNodeLayoutGetWidth(root_child0));
1612   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0));
1613
1614   ASSERT_FLOAT_EQ(45, YGNodeLayoutGetLeft(root_child0_child0));
1615   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1616   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child0));
1617   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child0));
1618
1619   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0));
1620   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0));
1621   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child0_child0));
1622   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child0_child0));
1623
1624   ASSERT_FLOAT_EQ(35, YGNodeLayoutGetLeft(root_child0_child1));
1625   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetTop(root_child0_child1));
1626   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child1));
1627   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child1));
1628
1629   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1_child0));
1630   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child1_child0));
1631   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child1_child0));
1632   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child1_child0));
1633
1634   YGNodeFreeRecursive(root);
1635
1636   YGConfigFree(config);
1637 }
1638
1639 TEST(YogaTest, wrap_nodes_with_content_sizing_margin_cross) {
1640   const YGConfigRef config = YGConfigNew();
1641
1642   const YGNodeRef root = YGNodeNewWithConfig(config);
1643   YGNodeStyleSetWidth(root, 500);
1644   YGNodeStyleSetHeight(root, 500);
1645
1646   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
1647   YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
1648   YGNodeStyleSetFlexWrap(root_child0, YGWrapWrap);
1649   YGNodeStyleSetWidth(root_child0, 70);
1650   YGNodeInsertChild(root, root_child0, 0);
1651
1652   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
1653   YGNodeInsertChild(root_child0, root_child0_child0, 0);
1654
1655   const YGNodeRef root_child0_child0_child0 = YGNodeNewWithConfig(config);
1656   YGNodeStyleSetWidth(root_child0_child0_child0, 40);
1657   YGNodeStyleSetHeight(root_child0_child0_child0, 40);
1658   YGNodeInsertChild(root_child0_child0, root_child0_child0_child0, 0);
1659
1660   const YGNodeRef root_child0_child1 = YGNodeNewWithConfig(config);
1661   YGNodeStyleSetMargin(root_child0_child1, YGEdgeTop, 10);
1662   YGNodeInsertChild(root_child0, root_child0_child1, 1);
1663
1664   const YGNodeRef root_child0_child1_child0 = YGNodeNewWithConfig(config);
1665   YGNodeStyleSetWidth(root_child0_child1_child0, 40);
1666   YGNodeStyleSetHeight(root_child0_child1_child0, 40);
1667   YGNodeInsertChild(root_child0_child1, root_child0_child1_child0, 0);
1668   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1669
1670   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1671   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1672   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetWidth(root));
1673   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
1674
1675   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1676   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1677   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetWidth(root_child0));
1678   ASSERT_FLOAT_EQ(90, YGNodeLayoutGetHeight(root_child0));
1679
1680   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
1681   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1682   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child0));
1683   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child0));
1684
1685   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0));
1686   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0));
1687   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child0_child0));
1688   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child0_child0));
1689
1690   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
1691   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child0_child1));
1692   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child1));
1693   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child1));
1694
1695   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1_child0));
1696   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child1_child0));
1697   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child1_child0));
1698   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child1_child0));
1699
1700   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1701
1702   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1703   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1704   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetWidth(root));
1705   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
1706
1707   ASSERT_FLOAT_EQ(430, YGNodeLayoutGetLeft(root_child0));
1708   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1709   ASSERT_FLOAT_EQ(70, YGNodeLayoutGetWidth(root_child0));
1710   ASSERT_FLOAT_EQ(90, YGNodeLayoutGetHeight(root_child0));
1711
1712   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child0_child0));
1713   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1714   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child0));
1715   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child0));
1716
1717   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0));
1718   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0));
1719   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child0_child0));
1720   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child0_child0));
1721
1722   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetLeft(root_child0_child1));
1723   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child0_child1));
1724   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child1));
1725   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child1));
1726
1727   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1_child0));
1728   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child1_child0));
1729   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0_child1_child0));
1730   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetHeight(root_child0_child1_child0));
1731
1732   YGNodeFreeRecursive(root);
1733
1734   YGConfigFree(config);
1735 }