Rebase of facebook flexbox to yoga
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-third-party / yoga / YGMinMaxDimensionTest.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/YGMinMaxDimensionTest.html
9
10 #include <gtest/gtest.h>
11 #include <yoga/Yoga.h>
12
13 TEST(YogaTest, max_width) {
14   const YGConfigRef config = YGConfigNew();
15
16   const YGNodeRef root = YGNodeNewWithConfig(config);
17   YGNodeStyleSetWidth(root, 100);
18   YGNodeStyleSetHeight(root, 100);
19
20   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
21   YGNodeStyleSetMaxWidth(root_child0, 50);
22   YGNodeStyleSetHeight(root_child0, 10);
23   YGNodeInsertChild(root, root_child0, 0);
24   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
25
26   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
27   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
28   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
29   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
30
31   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
32   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
33   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
34   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
35
36   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
37
38   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
39   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
40   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
41   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
42
43   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child0));
44   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
45   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
46   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
47
48   YGNodeFreeRecursive(root);
49
50   YGConfigFree(config);
51 }
52
53 TEST(YogaTest, max_height) {
54   const YGConfigRef config = YGConfigNew();
55
56   const YGNodeRef root = YGNodeNewWithConfig(config);
57   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
58   YGNodeStyleSetWidth(root, 100);
59   YGNodeStyleSetHeight(root, 100);
60
61   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
62   YGNodeStyleSetWidth(root_child0, 10);
63   YGNodeStyleSetMaxHeight(root_child0, 50);
64   YGNodeInsertChild(root, root_child0, 0);
65   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
66
67   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
68   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
69   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
70   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
71
72   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
73   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
74   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child0));
75   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
76
77   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
78
79   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
80   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
81   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
82   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
83
84   ASSERT_FLOAT_EQ(90, YGNodeLayoutGetLeft(root_child0));
85   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
86   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child0));
87   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
88
89   YGNodeFreeRecursive(root);
90
91   YGConfigFree(config);
92 }
93
94 TEST(YogaTest, min_height) {
95   const YGConfigRef config = YGConfigNew();
96
97   const YGNodeRef root = YGNodeNewWithConfig(config);
98   YGNodeStyleSetWidth(root, 100);
99   YGNodeStyleSetHeight(root, 100);
100
101   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
102   YGNodeStyleSetFlexGrow(root_child0, 1);
103   YGNodeStyleSetMinHeight(root_child0, 60);
104   YGNodeInsertChild(root, root_child0, 0);
105
106   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
107   YGNodeStyleSetFlexGrow(root_child1, 1);
108   YGNodeInsertChild(root, root_child1, 1);
109   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
110
111   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
112   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
113   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
114   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
115
116   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
117   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
118   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
119   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0));
120
121   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
122   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetTop(root_child1));
123   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
124   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
125
126   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
127
128   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
129   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
130   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
131   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
132
133   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
134   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
135   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
136   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetHeight(root_child0));
137
138   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
139   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetTop(root_child1));
140   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
141   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child1));
142
143   YGNodeFreeRecursive(root);
144
145   YGConfigFree(config);
146 }
147
148 TEST(YogaTest, min_width) {
149   const YGConfigRef config = YGConfigNew();
150
151   const YGNodeRef root = YGNodeNewWithConfig(config);
152   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
153   YGNodeStyleSetWidth(root, 100);
154   YGNodeStyleSetHeight(root, 100);
155
156   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
157   YGNodeStyleSetFlexGrow(root_child0, 1);
158   YGNodeStyleSetMinWidth(root_child0, 60);
159   YGNodeInsertChild(root, root_child0, 0);
160
161   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
162   YGNodeStyleSetFlexGrow(root_child1, 1);
163   YGNodeInsertChild(root, root_child1, 1);
164   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
165
166   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
167   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
168   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
169   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
170
171   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
172   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
173   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child0));
174   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
175
176   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetLeft(root_child1));
177   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
178   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child1));
179   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
180
181   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
182
183   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
184   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
185   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
186   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
187
188   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetLeft(root_child0));
189   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
190   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child0));
191   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
192
193   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
194   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
195   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child1));
196   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
197
198   YGNodeFreeRecursive(root);
199
200   YGConfigFree(config);
201 }
202
203 TEST(YogaTest, justify_content_min_max) {
204   const YGConfigRef config = YGConfigNew();
205
206   const YGNodeRef root = YGNodeNewWithConfig(config);
207   YGNodeStyleSetJustifyContent(root, YGJustifyCenter);
208   YGNodeStyleSetWidth(root, 100);
209   YGNodeStyleSetMinHeight(root, 100);
210   YGNodeStyleSetMaxHeight(root, 200);
211
212   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
213   YGNodeStyleSetWidth(root_child0, 60);
214   YGNodeStyleSetHeight(root_child0, 60);
215   YGNodeInsertChild(root, root_child0, 0);
216   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
217
218   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
219   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
220   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
221   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
222
223   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
224   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root_child0));
225   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetWidth(root_child0));
226   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetHeight(root_child0));
227
228   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
229
230   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
231   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
232   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
233   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
234
235   ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child0));
236   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root_child0));
237   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetWidth(root_child0));
238   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetHeight(root_child0));
239
240   YGNodeFreeRecursive(root);
241
242   YGConfigFree(config);
243 }
244
245 TEST(YogaTest, align_items_min_max) {
246   const YGConfigRef config = YGConfigNew();
247
248   const YGNodeRef root = YGNodeNewWithConfig(config);
249   YGNodeStyleSetAlignItems(root, YGAlignCenter);
250   YGNodeStyleSetMinWidth(root, 100);
251   YGNodeStyleSetMaxWidth(root, 200);
252   YGNodeStyleSetHeight(root, 100);
253
254   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
255   YGNodeStyleSetWidth(root_child0, 60);
256   YGNodeStyleSetHeight(root_child0, 60);
257   YGNodeInsertChild(root, root_child0, 0);
258   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
259
260   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
261   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
262   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
263   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
264
265   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetLeft(root_child0));
266   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
267   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetWidth(root_child0));
268   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetHeight(root_child0));
269
270   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
271
272   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
273   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
274   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
275   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
276
277   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetLeft(root_child0));
278   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
279   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetWidth(root_child0));
280   ASSERT_FLOAT_EQ(60, YGNodeLayoutGetHeight(root_child0));
281
282   YGNodeFreeRecursive(root);
283
284   YGConfigFree(config);
285 }
286
287 TEST(YogaTest, justify_content_overflow_min_max) {
288   const YGConfigRef config = YGConfigNew();
289
290   const YGNodeRef root = YGNodeNewWithConfig(config);
291   YGNodeStyleSetJustifyContent(root, YGJustifyCenter);
292   YGNodeStyleSetMinHeight(root, 100);
293   YGNodeStyleSetMaxHeight(root, 110);
294
295   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
296   YGNodeStyleSetWidth(root_child0, 50);
297   YGNodeStyleSetHeight(root_child0, 50);
298   YGNodeInsertChild(root, root_child0, 0);
299
300   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
301   YGNodeStyleSetWidth(root_child1, 50);
302   YGNodeStyleSetHeight(root_child1, 50);
303   YGNodeInsertChild(root, root_child1, 1);
304
305   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
306   YGNodeStyleSetWidth(root_child2, 50);
307   YGNodeStyleSetHeight(root_child2, 50);
308   YGNodeInsertChild(root, root_child2, 2);
309   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
310
311   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
312   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
313   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root));
314   ASSERT_FLOAT_EQ(110, YGNodeLayoutGetHeight(root));
315
316   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
317   ASSERT_FLOAT_EQ(-20, YGNodeLayoutGetTop(root_child0));
318   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
319   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
320
321   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
322   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child1));
323   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child1));
324   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
325
326   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
327   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetTop(root_child2));
328   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child2));
329   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child2));
330
331   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
332
333   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
334   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
335   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root));
336   ASSERT_FLOAT_EQ(110, YGNodeLayoutGetHeight(root));
337
338   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
339   ASSERT_FLOAT_EQ(-20, YGNodeLayoutGetTop(root_child0));
340   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
341   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
342
343   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
344   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child1));
345   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child1));
346   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
347
348   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
349   ASSERT_FLOAT_EQ(80, YGNodeLayoutGetTop(root_child2));
350   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child2));
351   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child2));
352
353   YGNodeFreeRecursive(root);
354
355   YGConfigFree(config);
356 }
357
358 TEST(YogaTest, flex_grow_to_min) {
359   const YGConfigRef config = YGConfigNew();
360
361   const YGNodeRef root = YGNodeNewWithConfig(config);
362   YGNodeStyleSetWidth(root, 100);
363   YGNodeStyleSetMinHeight(root, 100);
364   YGNodeStyleSetMaxHeight(root, 500);
365
366   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
367   YGNodeStyleSetFlexGrow(root_child0, 1);
368   YGNodeStyleSetFlexShrink(root_child0, 1);
369   YGNodeInsertChild(root, root_child0, 0);
370
371   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
372   YGNodeStyleSetHeight(root_child1, 50);
373   YGNodeInsertChild(root, root_child1, 1);
374   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
375
376   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
377   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
378   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
379   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
380
381   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
382   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
383   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
384   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
385
386   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
387   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child1));
388   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
389   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
390
391   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
392
393   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
394   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
395   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
396   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
397
398   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
399   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
400   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
401   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
402
403   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
404   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child1));
405   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
406   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
407
408   YGNodeFreeRecursive(root);
409
410   YGConfigFree(config);
411 }
412
413 TEST(YogaTest, flex_grow_in_at_most_container) {
414   const YGConfigRef config = YGConfigNew();
415
416   const YGNodeRef root = YGNodeNewWithConfig(config);
417   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
418   YGNodeStyleSetAlignItems(root, YGAlignFlexStart);
419   YGNodeStyleSetWidth(root, 100);
420   YGNodeStyleSetHeight(root, 100);
421
422   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
423   YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
424   YGNodeInsertChild(root, root_child0, 0);
425
426   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
427   YGNodeStyleSetFlexGrow(root_child0_child0, 1);
428   YGNodeStyleSetFlexBasis(root_child0_child0, 0);
429   YGNodeInsertChild(root_child0, root_child0_child0, 0);
430   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
431
432   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
433   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
434   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
435   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
436
437   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
438   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
439   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
440   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child0));
441
442   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
443   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
444   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0));
445   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child0_child0));
446
447   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
448
449   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
450   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
451   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
452   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
453
454   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetLeft(root_child0));
455   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
456   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
457   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child0));
458
459   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
460   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
461   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0));
462   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child0_child0));
463
464   YGNodeFreeRecursive(root);
465
466   YGConfigFree(config);
467 }
468
469 TEST(YogaTest, flex_grow_child) {
470   const YGConfigRef config = YGConfigNew();
471
472   const YGNodeRef root = YGNodeNewWithConfig(config);
473   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
474
475   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
476   YGNodeStyleSetFlexGrow(root_child0, 1);
477   YGNodeStyleSetFlexBasis(root_child0, 0);
478   YGNodeStyleSetHeight(root_child0, 100);
479   YGNodeInsertChild(root, root_child0, 0);
480   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
481
482   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
483   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
484   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root));
485   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
486
487   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
488   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
489   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
490   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
491
492   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
493
494   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
495   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
496   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root));
497   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
498
499   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
500   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
501   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
502   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
503
504   YGNodeFreeRecursive(root);
505
506   YGConfigFree(config);
507 }
508
509 TEST(YogaTest, flex_grow_within_constrained_min_max_column) {
510   const YGConfigRef config = YGConfigNew();
511
512   const YGNodeRef root = YGNodeNewWithConfig(config);
513   YGNodeStyleSetMinHeight(root, 100);
514   YGNodeStyleSetMaxHeight(root, 200);
515
516   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
517   YGNodeStyleSetFlexGrow(root_child0, 1);
518   YGNodeInsertChild(root, root_child0, 0);
519
520   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
521   YGNodeStyleSetHeight(root_child1, 50);
522   YGNodeInsertChild(root, root_child1, 1);
523   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
524
525   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
526   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
527   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root));
528   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
529
530   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
531   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
532   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
533   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
534
535   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
536   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child1));
537   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1));
538   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
539
540   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
541
542   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
543   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
544   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root));
545   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
546
547   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
548   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
549   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
550   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
551
552   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
553   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child1));
554   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1));
555   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
556
557   YGNodeFreeRecursive(root);
558
559   YGConfigFree(config);
560 }
561
562 TEST(YogaTest, flex_grow_within_max_width) {
563   const YGConfigRef config = YGConfigNew();
564
565   const YGNodeRef root = YGNodeNewWithConfig(config);
566   YGNodeStyleSetWidth(root, 200);
567   YGNodeStyleSetHeight(root, 100);
568
569   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
570   YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
571   YGNodeStyleSetMaxWidth(root_child0, 100);
572   YGNodeInsertChild(root, root_child0, 0);
573
574   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
575   YGNodeStyleSetFlexGrow(root_child0_child0, 1);
576   YGNodeStyleSetHeight(root_child0_child0, 20);
577   YGNodeInsertChild(root_child0, root_child0_child0, 0);
578   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
579
580   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
581   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
582   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
583   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
584
585   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
586   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
587   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
588   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0));
589
590   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
591   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
592   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0));
593   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0_child0));
594
595   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
596
597   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
598   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
599   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
600   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
601
602   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetLeft(root_child0));
603   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
604   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
605   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0));
606
607   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
608   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
609   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0));
610   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0_child0));
611
612   YGNodeFreeRecursive(root);
613
614   YGConfigFree(config);
615 }
616
617 TEST(YogaTest, flex_grow_within_constrained_max_width) {
618   const YGConfigRef config = YGConfigNew();
619
620   const YGNodeRef root = YGNodeNewWithConfig(config);
621   YGNodeStyleSetWidth(root, 200);
622   YGNodeStyleSetHeight(root, 100);
623
624   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
625   YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
626   YGNodeStyleSetMaxWidth(root_child0, 300);
627   YGNodeInsertChild(root, root_child0, 0);
628
629   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
630   YGNodeStyleSetFlexGrow(root_child0_child0, 1);
631   YGNodeStyleSetHeight(root_child0_child0, 20);
632   YGNodeInsertChild(root_child0, root_child0_child0, 0);
633   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
634
635   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
636   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
637   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
638   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
639
640   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
641   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
642   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0));
643   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0));
644
645   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
646   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
647   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0_child0));
648   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0_child0));
649
650   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
651
652   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
653   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
654   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
655   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
656
657   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
658   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
659   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0));
660   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0));
661
662   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
663   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
664   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0_child0));
665   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0_child0));
666
667   YGNodeFreeRecursive(root);
668
669   YGConfigFree(config);
670 }
671
672 TEST(YogaTest, flex_root_ignored) {
673   const YGConfigRef config = YGConfigNew();
674
675   const YGNodeRef root = YGNodeNewWithConfig(config);
676   YGNodeStyleSetFlexGrow(root, 1);
677   YGNodeStyleSetWidth(root, 100);
678   YGNodeStyleSetMinHeight(root, 100);
679   YGNodeStyleSetMaxHeight(root, 500);
680
681   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
682   YGNodeStyleSetFlexGrow(root_child0, 1);
683   YGNodeStyleSetFlexBasis(root_child0, 200);
684   YGNodeInsertChild(root, root_child0, 0);
685
686   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
687   YGNodeStyleSetHeight(root_child1, 100);
688   YGNodeInsertChild(root, root_child1, 1);
689   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
690
691   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
692   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
693   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
694   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root));
695
696   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
697   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
698   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
699   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0));
700
701   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
702   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child1));
703   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
704   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
705
706   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
707
708   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
709   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
710   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
711   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root));
712
713   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
714   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
715   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
716   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0));
717
718   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
719   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child1));
720   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
721   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
722
723   YGNodeFreeRecursive(root);
724
725   YGConfigFree(config);
726 }
727
728 TEST(YogaTest, flex_grow_root_minimized) {
729   const YGConfigRef config = YGConfigNew();
730
731   const YGNodeRef root = YGNodeNewWithConfig(config);
732   YGNodeStyleSetWidth(root, 100);
733   YGNodeStyleSetMinHeight(root, 100);
734   YGNodeStyleSetMaxHeight(root, 500);
735
736   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
737   YGNodeStyleSetFlexGrow(root_child0, 1);
738   YGNodeStyleSetMinHeight(root_child0, 100);
739   YGNodeStyleSetMaxHeight(root_child0, 500);
740   YGNodeInsertChild(root, root_child0, 0);
741
742   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
743   YGNodeStyleSetFlexGrow(root_child0_child0, 1);
744   YGNodeStyleSetFlexBasis(root_child0_child0, 200);
745   YGNodeInsertChild(root_child0, root_child0_child0, 0);
746
747   const YGNodeRef root_child0_child1 = YGNodeNewWithConfig(config);
748   YGNodeStyleSetHeight(root_child0_child1, 100);
749   YGNodeInsertChild(root_child0, root_child0_child1, 1);
750   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
751
752   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
753   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
754   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
755   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root));
756
757   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
758   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
759   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
760   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child0));
761
762   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
763   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
764   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0));
765   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0_child0));
766
767   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
768   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child0_child1));
769   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child1));
770   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child1));
771
772   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
773
774   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
775   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
776   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
777   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root));
778
779   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
780   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
781   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
782   ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child0));
783
784   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
785   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
786   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0));
787   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0_child0));
788
789   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
790   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child0_child1));
791   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child1));
792   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child1));
793
794   YGNodeFreeRecursive(root);
795
796   YGConfigFree(config);
797 }
798
799 TEST(YogaTest, flex_grow_height_maximized) {
800   const YGConfigRef config = YGConfigNew();
801
802   const YGNodeRef root = YGNodeNewWithConfig(config);
803   YGNodeStyleSetWidth(root, 100);
804   YGNodeStyleSetHeight(root, 500);
805
806   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
807   YGNodeStyleSetFlexGrow(root_child0, 1);
808   YGNodeStyleSetMinHeight(root_child0, 100);
809   YGNodeStyleSetMaxHeight(root_child0, 500);
810   YGNodeInsertChild(root, root_child0, 0);
811
812   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
813   YGNodeStyleSetFlexGrow(root_child0_child0, 1);
814   YGNodeStyleSetFlexBasis(root_child0_child0, 200);
815   YGNodeInsertChild(root_child0, root_child0_child0, 0);
816
817   const YGNodeRef root_child0_child1 = YGNodeNewWithConfig(config);
818   YGNodeStyleSetHeight(root_child0_child1, 100);
819   YGNodeInsertChild(root_child0, root_child0_child1, 1);
820   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
821
822   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
823   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
824   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
825   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
826
827   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
828   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
829   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
830   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root_child0));
831
832   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
833   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
834   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0));
835   ASSERT_FLOAT_EQ(400, YGNodeLayoutGetHeight(root_child0_child0));
836
837   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
838   ASSERT_FLOAT_EQ(400, YGNodeLayoutGetTop(root_child0_child1));
839   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child1));
840   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child1));
841
842   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
843
844   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
845   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
846   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
847   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
848
849   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
850   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
851   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
852   ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root_child0));
853
854   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
855   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
856   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0));
857   ASSERT_FLOAT_EQ(400, YGNodeLayoutGetHeight(root_child0_child0));
858
859   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
860   ASSERT_FLOAT_EQ(400, YGNodeLayoutGetTop(root_child0_child1));
861   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child1));
862   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child1));
863
864   YGNodeFreeRecursive(root);
865
866   YGConfigFree(config);
867 }
868
869 TEST(YogaTest, flex_grow_within_constrained_min_row) {
870   const YGConfigRef config = YGConfigNew();
871
872   const YGNodeRef root = YGNodeNewWithConfig(config);
873   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
874   YGNodeStyleSetMinWidth(root, 100);
875   YGNodeStyleSetHeight(root, 100);
876
877   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
878   YGNodeStyleSetFlexGrow(root_child0, 1);
879   YGNodeInsertChild(root, root_child0, 0);
880
881   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
882   YGNodeStyleSetWidth(root_child1, 50);
883   YGNodeInsertChild(root, root_child1, 1);
884   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
885
886   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
887   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
888   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
889   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
890
891   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
892   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
893   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
894   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
895
896   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child1));
897   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
898   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child1));
899   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
900
901   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
902
903   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
904   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
905   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
906   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
907
908   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child0));
909   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
910   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
911   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
912
913   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
914   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
915   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child1));
916   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
917
918   YGNodeFreeRecursive(root);
919
920   YGConfigFree(config);
921 }
922
923 TEST(YogaTest, flex_grow_within_constrained_min_column) {
924   const YGConfigRef config = YGConfigNew();
925
926   const YGNodeRef root = YGNodeNewWithConfig(config);
927   YGNodeStyleSetMinHeight(root, 100);
928
929   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
930   YGNodeStyleSetFlexGrow(root_child0, 1);
931   YGNodeInsertChild(root, root_child0, 0);
932
933   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
934   YGNodeStyleSetHeight(root_child1, 50);
935   YGNodeInsertChild(root, root_child1, 1);
936   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
937
938   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
939   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
940   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root));
941   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
942
943   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
944   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
945   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
946   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
947
948   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
949   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child1));
950   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1));
951   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
952
953   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
954
955   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
956   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
957   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root));
958   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
959
960   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
961   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
962   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
963   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
964
965   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
966   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child1));
967   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1));
968   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
969
970   YGNodeFreeRecursive(root);
971
972   YGConfigFree(config);
973 }
974
975 TEST(YogaTest, flex_grow_within_constrained_max_row) {
976   const YGConfigRef config = YGConfigNew();
977
978   const YGNodeRef root = YGNodeNewWithConfig(config);
979   YGNodeStyleSetWidth(root, 200);
980
981   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
982   YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
983   YGNodeStyleSetMaxWidth(root_child0, 100);
984   YGNodeStyleSetHeight(root_child0, 100);
985   YGNodeInsertChild(root, root_child0, 0);
986
987   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
988   YGNodeStyleSetFlexShrink(root_child0_child0, 1);
989   YGNodeStyleSetFlexBasis(root_child0_child0, 100);
990   YGNodeInsertChild(root_child0, root_child0_child0, 0);
991
992   const YGNodeRef root_child0_child1 = YGNodeNewWithConfig(config);
993   YGNodeStyleSetWidth(root_child0_child1, 50);
994   YGNodeInsertChild(root_child0, root_child0_child1, 1);
995   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
996
997   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
998   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
999   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
1000   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1001
1002   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1003   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1004   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
1005   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
1006
1007   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
1008   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1009   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0_child0));
1010   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child0));
1011
1012   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child0_child1));
1013   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child1));
1014   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0_child1));
1015   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child1));
1016
1017   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1018
1019   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1020   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1021   ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root));
1022   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1023
1024   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetLeft(root_child0));
1025   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1026   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
1027   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
1028
1029   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child0_child0));
1030   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
1031   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0_child0));
1032   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child0));
1033
1034   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
1035   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child1));
1036   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0_child1));
1037   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0_child1));
1038
1039   YGNodeFreeRecursive(root);
1040
1041   YGConfigFree(config);
1042 }
1043
1044 TEST(YogaTest, flex_grow_within_constrained_max_column) {
1045   const YGConfigRef config = YGConfigNew();
1046
1047   const YGNodeRef root = YGNodeNewWithConfig(config);
1048   YGNodeStyleSetWidth(root, 100);
1049   YGNodeStyleSetMaxHeight(root, 100);
1050
1051   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
1052   YGNodeStyleSetFlexShrink(root_child0, 1);
1053   YGNodeStyleSetFlexBasis(root_child0, 100);
1054   YGNodeInsertChild(root, root_child0, 0);
1055
1056   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
1057   YGNodeStyleSetHeight(root_child1, 50);
1058   YGNodeInsertChild(root, root_child1, 1);
1059   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1060
1061   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1062   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1063   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
1064   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1065
1066   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1067   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1068   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
1069   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
1070
1071   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
1072   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child1));
1073   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
1074   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
1075
1076   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1077
1078   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1079   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1080   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
1081   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1082
1083   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1084   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1085   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
1086   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
1087
1088   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
1089   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child1));
1090   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
1091   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
1092
1093   YGNodeFreeRecursive(root);
1094
1095   YGConfigFree(config);
1096 }
1097
1098 TEST(YogaTest, child_min_max_width_flexing) {
1099   const YGConfigRef config = YGConfigNew();
1100
1101   const YGNodeRef root = YGNodeNewWithConfig(config);
1102   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
1103   YGNodeStyleSetWidth(root, 120);
1104   YGNodeStyleSetHeight(root, 50);
1105
1106   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
1107   YGNodeStyleSetFlexGrow(root_child0, 1);
1108   YGNodeStyleSetFlexBasis(root_child0, 0);
1109   YGNodeStyleSetMinWidth(root_child0, 60);
1110   YGNodeInsertChild(root, root_child0, 0);
1111
1112   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
1113   YGNodeStyleSetFlexGrow(root_child1, 1);
1114   YGNodeStyleSetFlexBasisPercent(root_child1, 50);
1115   YGNodeStyleSetMaxWidth(root_child1, 20);
1116   YGNodeInsertChild(root, root_child1, 1);
1117   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1118
1119   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1120   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1121   ASSERT_FLOAT_EQ(120, YGNodeLayoutGetWidth(root));
1122   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root));
1123
1124   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1125   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1126   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
1127   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
1128
1129   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetLeft(root_child1));
1130   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
1131   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child1));
1132   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
1133
1134   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1135
1136   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1137   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1138   ASSERT_FLOAT_EQ(120, YGNodeLayoutGetWidth(root));
1139   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root));
1140
1141   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetLeft(root_child0));
1142   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1143   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
1144   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
1145
1146   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
1147   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
1148   ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child1));
1149   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child1));
1150
1151   YGNodeFreeRecursive(root);
1152
1153   YGConfigFree(config);
1154 }
1155
1156 TEST(YogaTest, min_width_overrides_width) {
1157   const YGConfigRef config = YGConfigNew();
1158
1159   const YGNodeRef root = YGNodeNewWithConfig(config);
1160   YGNodeStyleSetWidth(root, 50);
1161   YGNodeStyleSetMinWidth(root, 100);
1162   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1163
1164   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1165   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1166   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
1167   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root));
1168
1169   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1170
1171   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1172   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1173   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
1174   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root));
1175
1176   YGNodeFreeRecursive(root);
1177
1178   YGConfigFree(config);
1179 }
1180
1181 TEST(YogaTest, max_width_overrides_width) {
1182   const YGConfigRef config = YGConfigNew();
1183
1184   const YGNodeRef root = YGNodeNewWithConfig(config);
1185   YGNodeStyleSetWidth(root, 200);
1186   YGNodeStyleSetMaxWidth(root, 100);
1187   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1188
1189   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1190   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1191   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
1192   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root));
1193
1194   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1195
1196   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1197   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1198   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
1199   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root));
1200
1201   YGNodeFreeRecursive(root);
1202
1203   YGConfigFree(config);
1204 }
1205
1206 TEST(YogaTest, min_height_overrides_height) {
1207   const YGConfigRef config = YGConfigNew();
1208
1209   const YGNodeRef root = YGNodeNewWithConfig(config);
1210   YGNodeStyleSetHeight(root, 50);
1211   YGNodeStyleSetMinHeight(root, 100);
1212   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1213
1214   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1215   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1216   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root));
1217   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1218
1219   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1220
1221   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1222   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1223   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root));
1224   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1225
1226   YGNodeFreeRecursive(root);
1227
1228   YGConfigFree(config);
1229 }
1230
1231 TEST(YogaTest, max_height_overrides_height) {
1232   const YGConfigRef config = YGConfigNew();
1233
1234   const YGNodeRef root = YGNodeNewWithConfig(config);
1235   YGNodeStyleSetHeight(root, 200);
1236   YGNodeStyleSetMaxHeight(root, 100);
1237   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1238
1239   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1240   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1241   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root));
1242   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1243
1244   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1245
1246   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1247   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1248   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root));
1249   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1250
1251   YGNodeFreeRecursive(root);
1252
1253   YGConfigFree(config);
1254 }
1255
1256 TEST(YogaTest, min_max_percent_no_width_height) {
1257   const YGConfigRef config = YGConfigNew();
1258
1259   const YGNodeRef root = YGNodeNewWithConfig(config);
1260   YGNodeStyleSetAlignItems(root, YGAlignFlexStart);
1261   YGNodeStyleSetWidth(root, 100);
1262   YGNodeStyleSetHeight(root, 100);
1263
1264   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
1265   YGNodeStyleSetMinWidthPercent(root_child0, 10);
1266   YGNodeStyleSetMaxWidthPercent(root_child0, 10);
1267   YGNodeStyleSetMinHeightPercent(root_child0, 10);
1268   YGNodeStyleSetMaxHeightPercent(root_child0, 10);
1269   YGNodeInsertChild(root, root_child0, 0);
1270   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
1271
1272   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1273   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1274   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
1275   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1276
1277   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
1278   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1279   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child0));
1280   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
1281
1282   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1283
1284   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1285   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1286   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
1287   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
1288
1289   ASSERT_FLOAT_EQ(90, YGNodeLayoutGetLeft(root_child0));
1290   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1291   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child0));
1292   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
1293
1294   YGNodeFreeRecursive(root);
1295
1296   YGConfigFree(config);
1297 }