Rebase of facebook flexbox to yoga
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-third-party / yoga / YGRoundingTest.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/YGRoundingTest.html
9
10 #include <gtest/gtest.h>
11 #include <yoga/Yoga.h>
12
13 TEST(YogaTest, rounding_flex_basis_flex_grow_row_width_of_100) {
14   const YGConfigRef config = YGConfigNew();
15
16   const YGNodeRef root = YGNodeNewWithConfig(config);
17   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
18   YGNodeStyleSetWidth(root, 100);
19   YGNodeStyleSetHeight(root, 100);
20
21   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
22   YGNodeStyleSetFlexGrow(root_child0, 1);
23   YGNodeInsertChild(root, root_child0, 0);
24
25   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
26   YGNodeStyleSetFlexGrow(root_child1, 1);
27   YGNodeInsertChild(root, root_child1, 1);
28
29   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
30   YGNodeStyleSetFlexGrow(root_child2, 1);
31   YGNodeInsertChild(root, root_child2, 2);
32   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
33
34   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
35   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
36   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
37   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
38
39   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
40   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
41   ASSERT_FLOAT_EQ(33, YGNodeLayoutGetWidth(root_child0));
42   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
43
44   ASSERT_FLOAT_EQ(33, YGNodeLayoutGetLeft(root_child1));
45   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
46   ASSERT_FLOAT_EQ(34, YGNodeLayoutGetWidth(root_child1));
47   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
48
49   ASSERT_FLOAT_EQ(67, YGNodeLayoutGetLeft(root_child2));
50   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
51   ASSERT_FLOAT_EQ(33, YGNodeLayoutGetWidth(root_child2));
52   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
53
54   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
55
56   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
57   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
58   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
59   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
60
61   ASSERT_FLOAT_EQ(67, YGNodeLayoutGetLeft(root_child0));
62   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
63   ASSERT_FLOAT_EQ(33, YGNodeLayoutGetWidth(root_child0));
64   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
65
66   ASSERT_FLOAT_EQ(33, YGNodeLayoutGetLeft(root_child1));
67   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
68   ASSERT_FLOAT_EQ(34, YGNodeLayoutGetWidth(root_child1));
69   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
70
71   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
72   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
73   ASSERT_FLOAT_EQ(33, YGNodeLayoutGetWidth(root_child2));
74   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
75
76   YGNodeFreeRecursive(root);
77
78   YGConfigFree(config);
79 }
80
81 TEST(YogaTest, rounding_flex_basis_flex_grow_row_prime_number_width) {
82   const YGConfigRef config = YGConfigNew();
83
84   const YGNodeRef root = YGNodeNewWithConfig(config);
85   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
86   YGNodeStyleSetWidth(root, 113);
87   YGNodeStyleSetHeight(root, 100);
88
89   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
90   YGNodeStyleSetFlexGrow(root_child0, 1);
91   YGNodeInsertChild(root, root_child0, 0);
92
93   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
94   YGNodeStyleSetFlexGrow(root_child1, 1);
95   YGNodeInsertChild(root, root_child1, 1);
96
97   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
98   YGNodeStyleSetFlexGrow(root_child2, 1);
99   YGNodeInsertChild(root, root_child2, 2);
100
101   const YGNodeRef root_child3 = YGNodeNewWithConfig(config);
102   YGNodeStyleSetFlexGrow(root_child3, 1);
103   YGNodeInsertChild(root, root_child3, 3);
104
105   const YGNodeRef root_child4 = YGNodeNewWithConfig(config);
106   YGNodeStyleSetFlexGrow(root_child4, 1);
107   YGNodeInsertChild(root, root_child4, 4);
108   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
109
110   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
111   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
112   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetWidth(root));
113   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
114
115   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
116   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
117   ASSERT_FLOAT_EQ(23, YGNodeLayoutGetWidth(root_child0));
118   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
119
120   ASSERT_FLOAT_EQ(23, YGNodeLayoutGetLeft(root_child1));
121   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
122   ASSERT_FLOAT_EQ(22, YGNodeLayoutGetWidth(root_child1));
123   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
124
125   ASSERT_FLOAT_EQ(45, YGNodeLayoutGetLeft(root_child2));
126   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
127   ASSERT_FLOAT_EQ(23, YGNodeLayoutGetWidth(root_child2));
128   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
129
130   ASSERT_FLOAT_EQ(68, YGNodeLayoutGetLeft(root_child3));
131   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child3));
132   ASSERT_FLOAT_EQ(22, YGNodeLayoutGetWidth(root_child3));
133   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3));
134
135   ASSERT_FLOAT_EQ(90, YGNodeLayoutGetLeft(root_child4));
136   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
137   ASSERT_FLOAT_EQ(23, YGNodeLayoutGetWidth(root_child4));
138   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4));
139
140   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
141
142   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
143   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
144   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetWidth(root));
145   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
146
147   ASSERT_FLOAT_EQ(90, YGNodeLayoutGetLeft(root_child0));
148   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
149   ASSERT_FLOAT_EQ(23, YGNodeLayoutGetWidth(root_child0));
150   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
151
152   ASSERT_FLOAT_EQ(68, YGNodeLayoutGetLeft(root_child1));
153   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
154   ASSERT_FLOAT_EQ(22, YGNodeLayoutGetWidth(root_child1));
155   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
156
157   ASSERT_FLOAT_EQ(45, YGNodeLayoutGetLeft(root_child2));
158   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
159   ASSERT_FLOAT_EQ(23, YGNodeLayoutGetWidth(root_child2));
160   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
161
162   ASSERT_FLOAT_EQ(23, YGNodeLayoutGetLeft(root_child3));
163   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child3));
164   ASSERT_FLOAT_EQ(22, YGNodeLayoutGetWidth(root_child3));
165   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3));
166
167   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child4));
168   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child4));
169   ASSERT_FLOAT_EQ(23, YGNodeLayoutGetWidth(root_child4));
170   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4));
171
172   YGNodeFreeRecursive(root);
173
174   YGConfigFree(config);
175 }
176
177 TEST(YogaTest, rounding_flex_basis_flex_shrink_row) {
178   const YGConfigRef config = YGConfigNew();
179
180   const YGNodeRef root = YGNodeNewWithConfig(config);
181   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
182   YGNodeStyleSetWidth(root, 101);
183   YGNodeStyleSetHeight(root, 100);
184
185   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
186   YGNodeStyleSetFlexShrink(root_child0, 1);
187   YGNodeStyleSetFlexBasis(root_child0, 100);
188   YGNodeInsertChild(root, root_child0, 0);
189
190   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
191   YGNodeStyleSetFlexBasis(root_child1, 25);
192   YGNodeInsertChild(root, root_child1, 1);
193
194   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
195   YGNodeStyleSetFlexBasis(root_child2, 25);
196   YGNodeInsertChild(root, root_child2, 2);
197   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
198
199   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
200   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
201   ASSERT_FLOAT_EQ(101, YGNodeLayoutGetWidth(root));
202   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
203
204   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
205   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
206   ASSERT_FLOAT_EQ(51, YGNodeLayoutGetWidth(root_child0));
207   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
208
209   ASSERT_FLOAT_EQ(51, YGNodeLayoutGetLeft(root_child1));
210   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
211   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetWidth(root_child1));
212   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
213
214   ASSERT_FLOAT_EQ(76, YGNodeLayoutGetLeft(root_child2));
215   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
216   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetWidth(root_child2));
217   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
218
219   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
220
221   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
222   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
223   ASSERT_FLOAT_EQ(101, YGNodeLayoutGetWidth(root));
224   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
225
226   ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child0));
227   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
228   ASSERT_FLOAT_EQ(51, YGNodeLayoutGetWidth(root_child0));
229   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
230
231   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetLeft(root_child1));
232   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
233   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetWidth(root_child1));
234   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
235
236   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
237   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
238   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetWidth(root_child2));
239   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
240
241   YGNodeFreeRecursive(root);
242
243   YGConfigFree(config);
244 }
245
246 TEST(YogaTest, rounding_flex_basis_overrides_main_size) {
247   const YGConfigRef config = YGConfigNew();
248
249   const YGNodeRef root = YGNodeNewWithConfig(config);
250   YGNodeStyleSetWidth(root, 100);
251   YGNodeStyleSetHeight(root, 113);
252
253   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
254   YGNodeStyleSetFlexGrow(root_child0, 1);
255   YGNodeStyleSetFlexBasis(root_child0, 50);
256   YGNodeStyleSetHeight(root_child0, 20);
257   YGNodeInsertChild(root, root_child0, 0);
258
259   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
260   YGNodeStyleSetFlexGrow(root_child1, 1);
261   YGNodeStyleSetHeight(root_child1, 10);
262   YGNodeInsertChild(root, root_child1, 1);
263
264   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
265   YGNodeStyleSetFlexGrow(root_child2, 1);
266   YGNodeStyleSetHeight(root_child2, 10);
267   YGNodeInsertChild(root, root_child2, 2);
268   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
269
270   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
271   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
272   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
273   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetHeight(root));
274
275   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
276   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
277   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
278   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetHeight(root_child0));
279
280   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
281   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetTop(root_child1));
282   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
283   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetHeight(root_child1));
284
285   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
286   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
287   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
288   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child2));
289
290   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
291
292   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
293   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
294   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
295   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetHeight(root));
296
297   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
298   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
299   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
300   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetHeight(root_child0));
301
302   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
303   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetTop(root_child1));
304   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
305   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetHeight(root_child1));
306
307   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
308   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
309   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
310   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child2));
311
312   YGNodeFreeRecursive(root);
313
314   YGConfigFree(config);
315 }
316
317 TEST(YogaTest, rounding_total_fractial) {
318   const YGConfigRef config = YGConfigNew();
319
320   const YGNodeRef root = YGNodeNewWithConfig(config);
321   YGNodeStyleSetWidth(root, 87.4f);
322   YGNodeStyleSetHeight(root, 113.4f);
323
324   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
325   YGNodeStyleSetFlexGrow(root_child0, 0.7f);
326   YGNodeStyleSetFlexBasis(root_child0, 50.3f);
327   YGNodeStyleSetHeight(root_child0, 20.3f);
328   YGNodeInsertChild(root, root_child0, 0);
329
330   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
331   YGNodeStyleSetFlexGrow(root_child1, 1.6f);
332   YGNodeStyleSetHeight(root_child1, 10);
333   YGNodeInsertChild(root, root_child1, 1);
334
335   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
336   YGNodeStyleSetFlexGrow(root_child2, 1.1f);
337   YGNodeStyleSetHeight(root_child2, 10.7f);
338   YGNodeInsertChild(root, root_child2, 2);
339   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
340
341   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
342   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
343   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root));
344   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetHeight(root));
345
346   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
347   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
348   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child0));
349   ASSERT_FLOAT_EQ(59, YGNodeLayoutGetHeight(root_child0));
350
351   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
352   ASSERT_FLOAT_EQ(59, YGNodeLayoutGetTop(root_child1));
353   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child1));
354   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child1));
355
356   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
357   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
358   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child2));
359   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child2));
360
361   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
362
363   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
364   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
365   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root));
366   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetHeight(root));
367
368   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
369   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
370   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child0));
371   ASSERT_FLOAT_EQ(59, YGNodeLayoutGetHeight(root_child0));
372
373   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
374   ASSERT_FLOAT_EQ(59, YGNodeLayoutGetTop(root_child1));
375   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child1));
376   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child1));
377
378   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
379   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
380   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child2));
381   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child2));
382
383   YGNodeFreeRecursive(root);
384
385   YGConfigFree(config);
386 }
387
388 TEST(YogaTest, rounding_total_fractial_nested) {
389   const YGConfigRef config = YGConfigNew();
390
391   const YGNodeRef root = YGNodeNewWithConfig(config);
392   YGNodeStyleSetWidth(root, 87.4f);
393   YGNodeStyleSetHeight(root, 113.4f);
394
395   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
396   YGNodeStyleSetFlexGrow(root_child0, 0.7f);
397   YGNodeStyleSetFlexBasis(root_child0, 50.3f);
398   YGNodeStyleSetHeight(root_child0, 20.3f);
399   YGNodeInsertChild(root, root_child0, 0);
400
401   const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
402   YGNodeStyleSetFlexGrow(root_child0_child0, 1);
403   YGNodeStyleSetFlexBasis(root_child0_child0, 0.3f);
404   YGNodeStyleSetPosition(root_child0_child0, YGEdgeBottom, 13.3f);
405   YGNodeStyleSetHeight(root_child0_child0, 9.9f);
406   YGNodeInsertChild(root_child0, root_child0_child0, 0);
407
408   const YGNodeRef root_child0_child1 = YGNodeNewWithConfig(config);
409   YGNodeStyleSetFlexGrow(root_child0_child1, 4);
410   YGNodeStyleSetFlexBasis(root_child0_child1, 0.3f);
411   YGNodeStyleSetPosition(root_child0_child1, YGEdgeTop, 13.3f);
412   YGNodeStyleSetHeight(root_child0_child1, 1.1f);
413   YGNodeInsertChild(root_child0, root_child0_child1, 1);
414
415   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
416   YGNodeStyleSetFlexGrow(root_child1, 1.6f);
417   YGNodeStyleSetHeight(root_child1, 10);
418   YGNodeInsertChild(root, root_child1, 1);
419
420   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
421   YGNodeStyleSetFlexGrow(root_child2, 1.1f);
422   YGNodeStyleSetHeight(root_child2, 10.7f);
423   YGNodeInsertChild(root, root_child2, 2);
424   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
425
426   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
427   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
428   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root));
429   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetHeight(root));
430
431   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
432   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
433   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child0));
434   ASSERT_FLOAT_EQ(59, YGNodeLayoutGetHeight(root_child0));
435
436   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
437   ASSERT_FLOAT_EQ(-13, YGNodeLayoutGetTop(root_child0_child0));
438   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child0_child0));
439   ASSERT_FLOAT_EQ(12, YGNodeLayoutGetHeight(root_child0_child0));
440
441   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
442   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetTop(root_child0_child1));
443   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child0_child1));
444   ASSERT_FLOAT_EQ(47, YGNodeLayoutGetHeight(root_child0_child1));
445
446   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
447   ASSERT_FLOAT_EQ(59, YGNodeLayoutGetTop(root_child1));
448   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child1));
449   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child1));
450
451   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
452   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
453   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child2));
454   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child2));
455
456   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
457
458   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
459   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
460   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root));
461   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetHeight(root));
462
463   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
464   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
465   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child0));
466   ASSERT_FLOAT_EQ(59, YGNodeLayoutGetHeight(root_child0));
467
468   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
469   ASSERT_FLOAT_EQ(-13, YGNodeLayoutGetTop(root_child0_child0));
470   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child0_child0));
471   ASSERT_FLOAT_EQ(12, YGNodeLayoutGetHeight(root_child0_child0));
472
473   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child1));
474   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetTop(root_child0_child1));
475   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child0_child1));
476   ASSERT_FLOAT_EQ(47, YGNodeLayoutGetHeight(root_child0_child1));
477
478   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
479   ASSERT_FLOAT_EQ(59, YGNodeLayoutGetTop(root_child1));
480   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child1));
481   ASSERT_FLOAT_EQ(30, YGNodeLayoutGetHeight(root_child1));
482
483   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
484   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
485   ASSERT_FLOAT_EQ(87, YGNodeLayoutGetWidth(root_child2));
486   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child2));
487
488   YGNodeFreeRecursive(root);
489
490   YGConfigFree(config);
491 }
492
493 TEST(YogaTest, rounding_fractial_input_1) {
494   const YGConfigRef config = YGConfigNew();
495
496   const YGNodeRef root = YGNodeNewWithConfig(config);
497   YGNodeStyleSetWidth(root, 100);
498   YGNodeStyleSetHeight(root, 113.4f);
499
500   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
501   YGNodeStyleSetFlexGrow(root_child0, 1);
502   YGNodeStyleSetFlexBasis(root_child0, 50);
503   YGNodeStyleSetHeight(root_child0, 20);
504   YGNodeInsertChild(root, root_child0, 0);
505
506   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
507   YGNodeStyleSetFlexGrow(root_child1, 1);
508   YGNodeStyleSetHeight(root_child1, 10);
509   YGNodeInsertChild(root, root_child1, 1);
510
511   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
512   YGNodeStyleSetFlexGrow(root_child2, 1);
513   YGNodeStyleSetHeight(root_child2, 10);
514   YGNodeInsertChild(root, root_child2, 2);
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(100, YGNodeLayoutGetWidth(root));
520   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetHeight(root));
521
522   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
523   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
524   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
525   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetHeight(root_child0));
526
527   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
528   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetTop(root_child1));
529   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
530   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetHeight(root_child1));
531
532   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
533   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
534   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
535   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child2));
536
537   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
538
539   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
540   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
541   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
542   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetHeight(root));
543
544   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
545   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
546   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
547   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetHeight(root_child0));
548
549   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
550   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetTop(root_child1));
551   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
552   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetHeight(root_child1));
553
554   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
555   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
556   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
557   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child2));
558
559   YGNodeFreeRecursive(root);
560
561   YGConfigFree(config);
562 }
563
564 TEST(YogaTest, rounding_fractial_input_2) {
565   const YGConfigRef config = YGConfigNew();
566
567   const YGNodeRef root = YGNodeNewWithConfig(config);
568   YGNodeStyleSetWidth(root, 100);
569   YGNodeStyleSetHeight(root, 113.6f);
570
571   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
572   YGNodeStyleSetFlexGrow(root_child0, 1);
573   YGNodeStyleSetFlexBasis(root_child0, 50);
574   YGNodeStyleSetHeight(root_child0, 20);
575   YGNodeInsertChild(root, root_child0, 0);
576
577   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
578   YGNodeStyleSetFlexGrow(root_child1, 1);
579   YGNodeStyleSetHeight(root_child1, 10);
580   YGNodeInsertChild(root, root_child1, 1);
581
582   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
583   YGNodeStyleSetFlexGrow(root_child2, 1);
584   YGNodeStyleSetHeight(root_child2, 10);
585   YGNodeInsertChild(root, root_child2, 2);
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(114, YGNodeLayoutGetHeight(root));
592
593   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
594   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
595   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
596   ASSERT_FLOAT_EQ(65, YGNodeLayoutGetHeight(root_child0));
597
598   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
599   ASSERT_FLOAT_EQ(65, YGNodeLayoutGetTop(root_child1));
600   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
601   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child1));
602
603   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
604   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
605   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
606   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetHeight(root_child2));
607
608   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
609
610   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
611   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
612   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
613   ASSERT_FLOAT_EQ(114, YGNodeLayoutGetHeight(root));
614
615   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
616   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
617   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
618   ASSERT_FLOAT_EQ(65, YGNodeLayoutGetHeight(root_child0));
619
620   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
621   ASSERT_FLOAT_EQ(65, YGNodeLayoutGetTop(root_child1));
622   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
623   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child1));
624
625   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
626   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
627   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
628   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetHeight(root_child2));
629
630   YGNodeFreeRecursive(root);
631
632   YGConfigFree(config);
633 }
634
635 TEST(YogaTest, rounding_fractial_input_3) {
636   const YGConfigRef config = YGConfigNew();
637
638   const YGNodeRef root = YGNodeNewWithConfig(config);
639   YGNodeStyleSetPosition(root, YGEdgeTop, 0.3f);
640   YGNodeStyleSetWidth(root, 100);
641   YGNodeStyleSetHeight(root, 113.4f);
642
643   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
644   YGNodeStyleSetFlexGrow(root_child0, 1);
645   YGNodeStyleSetFlexBasis(root_child0, 50);
646   YGNodeStyleSetHeight(root_child0, 20);
647   YGNodeInsertChild(root, root_child0, 0);
648
649   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
650   YGNodeStyleSetFlexGrow(root_child1, 1);
651   YGNodeStyleSetHeight(root_child1, 10);
652   YGNodeInsertChild(root, root_child1, 1);
653
654   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
655   YGNodeStyleSetFlexGrow(root_child2, 1);
656   YGNodeStyleSetHeight(root_child2, 10);
657   YGNodeInsertChild(root, root_child2, 2);
658   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
659
660   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
661   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
662   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
663   ASSERT_FLOAT_EQ(114, YGNodeLayoutGetHeight(root));
664
665   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
666   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
667   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
668   ASSERT_FLOAT_EQ(65, YGNodeLayoutGetHeight(root_child0));
669
670   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
671   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetTop(root_child1));
672   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
673   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child1));
674
675   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
676   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
677   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
678   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetHeight(root_child2));
679
680   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
681
682   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
683   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
684   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
685   ASSERT_FLOAT_EQ(114, YGNodeLayoutGetHeight(root));
686
687   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
688   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
689   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
690   ASSERT_FLOAT_EQ(65, YGNodeLayoutGetHeight(root_child0));
691
692   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
693   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetTop(root_child1));
694   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
695   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child1));
696
697   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
698   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
699   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
700   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetHeight(root_child2));
701
702   YGNodeFreeRecursive(root);
703
704   YGConfigFree(config);
705 }
706
707 TEST(YogaTest, rounding_fractial_input_4) {
708   const YGConfigRef config = YGConfigNew();
709
710   const YGNodeRef root = YGNodeNewWithConfig(config);
711   YGNodeStyleSetPosition(root, YGEdgeTop, 0.7f);
712   YGNodeStyleSetWidth(root, 100);
713   YGNodeStyleSetHeight(root, 113.4f);
714
715   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
716   YGNodeStyleSetFlexGrow(root_child0, 1);
717   YGNodeStyleSetFlexBasis(root_child0, 50);
718   YGNodeStyleSetHeight(root_child0, 20);
719   YGNodeInsertChild(root, root_child0, 0);
720
721   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
722   YGNodeStyleSetFlexGrow(root_child1, 1);
723   YGNodeStyleSetHeight(root_child1, 10);
724   YGNodeInsertChild(root, root_child1, 1);
725
726   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
727   YGNodeStyleSetFlexGrow(root_child2, 1);
728   YGNodeStyleSetHeight(root_child2, 10);
729   YGNodeInsertChild(root, root_child2, 2);
730   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
731
732   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
733   ASSERT_FLOAT_EQ(1, YGNodeLayoutGetTop(root));
734   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
735   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetHeight(root));
736
737   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
738   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
739   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
740   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetHeight(root_child0));
741
742   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
743   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetTop(root_child1));
744   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
745   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetHeight(root_child1));
746
747   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
748   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
749   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
750   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child2));
751
752   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
753
754   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
755   ASSERT_FLOAT_EQ(1, YGNodeLayoutGetTop(root));
756   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
757   ASSERT_FLOAT_EQ(113, YGNodeLayoutGetHeight(root));
758
759   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
760   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
761   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
762   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetHeight(root_child0));
763
764   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
765   ASSERT_FLOAT_EQ(64, YGNodeLayoutGetTop(root_child1));
766   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1));
767   ASSERT_FLOAT_EQ(25, YGNodeLayoutGetHeight(root_child1));
768
769   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
770   ASSERT_FLOAT_EQ(89, YGNodeLayoutGetTop(root_child2));
771   ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
772   ASSERT_FLOAT_EQ(24, YGNodeLayoutGetHeight(root_child2));
773
774   YGNodeFreeRecursive(root);
775
776   YGConfigFree(config);
777 }
778
779 TEST(YogaTest, rounding_inner_node_controversy_horizontal) {
780   const YGConfigRef config = YGConfigNew();
781
782   const YGNodeRef root = YGNodeNewWithConfig(config);
783   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
784   YGNodeStyleSetWidth(root, 320);
785
786   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
787   YGNodeStyleSetFlexGrow(root_child0, 1);
788   YGNodeStyleSetHeight(root_child0, 10);
789   YGNodeInsertChild(root, root_child0, 0);
790
791   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
792   YGNodeStyleSetFlexGrow(root_child1, 1);
793   YGNodeStyleSetHeight(root_child1, 10);
794   YGNodeInsertChild(root, root_child1, 1);
795
796   const YGNodeRef root_child1_child0 = YGNodeNewWithConfig(config);
797   YGNodeStyleSetFlexGrow(root_child1_child0, 1);
798   YGNodeStyleSetHeight(root_child1_child0, 10);
799   YGNodeInsertChild(root_child1, root_child1_child0, 0);
800
801   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
802   YGNodeStyleSetFlexGrow(root_child2, 1);
803   YGNodeStyleSetHeight(root_child2, 10);
804   YGNodeInsertChild(root, root_child2, 2);
805   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
806
807   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
808   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
809   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetWidth(root));
810   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root));
811
812   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
813   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
814   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetWidth(root_child0));
815   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
816
817   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetLeft(root_child1));
818   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
819   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetWidth(root_child1));
820   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child1));
821
822   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child0));
823   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1_child0));
824   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetWidth(root_child1_child0));
825   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child1_child0));
826
827   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetLeft(root_child2));
828   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
829   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetWidth(root_child2));
830   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child2));
831
832   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
833
834   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
835   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
836   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetWidth(root));
837   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root));
838
839   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetLeft(root_child0));
840   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
841   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetWidth(root_child0));
842   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
843
844   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetLeft(root_child1));
845   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
846   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetWidth(root_child1));
847   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child1));
848
849   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child0));
850   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1_child0));
851   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetWidth(root_child1_child0));
852   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child1_child0));
853
854   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
855   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
856   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetWidth(root_child2));
857   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child2));
858
859   YGNodeFreeRecursive(root);
860
861   YGConfigFree(config);
862 }
863
864 TEST(YogaTest, rounding_inner_node_controversy_vertical) {
865   const YGConfigRef config = YGConfigNew();
866
867   const YGNodeRef root = YGNodeNewWithConfig(config);
868   YGNodeStyleSetHeight(root, 320);
869
870   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
871   YGNodeStyleSetFlexGrow(root_child0, 1);
872   YGNodeStyleSetWidth(root_child0, 10);
873   YGNodeInsertChild(root, root_child0, 0);
874
875   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
876   YGNodeStyleSetFlexGrow(root_child1, 1);
877   YGNodeStyleSetWidth(root_child1, 10);
878   YGNodeInsertChild(root, root_child1, 1);
879
880   const YGNodeRef root_child1_child0 = YGNodeNewWithConfig(config);
881   YGNodeStyleSetFlexGrow(root_child1_child0, 1);
882   YGNodeStyleSetWidth(root_child1_child0, 10);
883   YGNodeInsertChild(root_child1, root_child1_child0, 0);
884
885   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
886   YGNodeStyleSetFlexGrow(root_child2, 1);
887   YGNodeStyleSetWidth(root_child2, 10);
888   YGNodeInsertChild(root, root_child2, 2);
889   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
890
891   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
892   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
893   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root));
894   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetHeight(root));
895
896   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
897   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
898   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child0));
899   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetHeight(root_child0));
900
901   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
902   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetTop(root_child1));
903   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child1));
904   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetHeight(root_child1));
905
906   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child0));
907   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1_child0));
908   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child1_child0));
909   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetHeight(root_child1_child0));
910
911   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
912   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetTop(root_child2));
913   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child2));
914   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetHeight(root_child2));
915
916   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
917
918   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
919   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
920   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root));
921   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetHeight(root));
922
923   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
924   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
925   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child0));
926   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetHeight(root_child0));
927
928   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
929   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetTop(root_child1));
930   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child1));
931   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetHeight(root_child1));
932
933   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child0));
934   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1_child0));
935   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child1_child0));
936   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetHeight(root_child1_child0));
937
938   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
939   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetTop(root_child2));
940   ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child2));
941   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetHeight(root_child2));
942
943   YGNodeFreeRecursive(root);
944
945   YGConfigFree(config);
946 }
947
948 TEST(YogaTest, rounding_inner_node_controversy_combined) {
949   const YGConfigRef config = YGConfigNew();
950
951   const YGNodeRef root = YGNodeNewWithConfig(config);
952   YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
953   YGNodeStyleSetWidth(root, 640);
954   YGNodeStyleSetHeight(root, 320);
955
956   const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
957   YGNodeStyleSetFlexGrow(root_child0, 1);
958   YGNodeStyleSetHeightPercent(root_child0, 100);
959   YGNodeInsertChild(root, root_child0, 0);
960
961   const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
962   YGNodeStyleSetFlexGrow(root_child1, 1);
963   YGNodeStyleSetHeightPercent(root_child1, 100);
964   YGNodeInsertChild(root, root_child1, 1);
965
966   const YGNodeRef root_child1_child0 = YGNodeNewWithConfig(config);
967   YGNodeStyleSetFlexGrow(root_child1_child0, 1);
968   YGNodeStyleSetWidthPercent(root_child1_child0, 100);
969   YGNodeInsertChild(root_child1, root_child1_child0, 0);
970
971   const YGNodeRef root_child1_child1 = YGNodeNewWithConfig(config);
972   YGNodeStyleSetFlexGrow(root_child1_child1, 1);
973   YGNodeStyleSetWidthPercent(root_child1_child1, 100);
974   YGNodeInsertChild(root_child1, root_child1_child1, 1);
975
976   const YGNodeRef root_child1_child1_child0 = YGNodeNewWithConfig(config);
977   YGNodeStyleSetFlexGrow(root_child1_child1_child0, 1);
978   YGNodeStyleSetWidthPercent(root_child1_child1_child0, 100);
979   YGNodeInsertChild(root_child1_child1, root_child1_child1_child0, 0);
980
981   const YGNodeRef root_child1_child2 = YGNodeNewWithConfig(config);
982   YGNodeStyleSetFlexGrow(root_child1_child2, 1);
983   YGNodeStyleSetWidthPercent(root_child1_child2, 100);
984   YGNodeInsertChild(root_child1, root_child1_child2, 2);
985
986   const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
987   YGNodeStyleSetFlexGrow(root_child2, 1);
988   YGNodeStyleSetHeightPercent(root_child2, 100);
989   YGNodeInsertChild(root, root_child2, 2);
990   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
991
992   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
993   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
994   ASSERT_FLOAT_EQ(640, YGNodeLayoutGetWidth(root));
995   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetHeight(root));
996
997   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
998   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
999   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetWidth(root_child0));
1000   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetHeight(root_child0));
1001
1002   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetLeft(root_child1));
1003   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
1004   ASSERT_FLOAT_EQ(214, YGNodeLayoutGetWidth(root_child1));
1005   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetHeight(root_child1));
1006
1007   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child0));
1008   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1_child0));
1009   ASSERT_FLOAT_EQ(214, YGNodeLayoutGetWidth(root_child1_child0));
1010   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetHeight(root_child1_child0));
1011
1012   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child1));
1013   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetTop(root_child1_child1));
1014   ASSERT_FLOAT_EQ(214, YGNodeLayoutGetWidth(root_child1_child1));
1015   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetHeight(root_child1_child1));
1016
1017   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child1_child0));
1018   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1_child1_child0));
1019   ASSERT_FLOAT_EQ(214, YGNodeLayoutGetWidth(root_child1_child1_child0));
1020   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetHeight(root_child1_child1_child0));
1021
1022   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child2));
1023   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetTop(root_child1_child2));
1024   ASSERT_FLOAT_EQ(214, YGNodeLayoutGetWidth(root_child1_child2));
1025   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetHeight(root_child1_child2));
1026
1027   ASSERT_FLOAT_EQ(427, YGNodeLayoutGetLeft(root_child2));
1028   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
1029   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetWidth(root_child2));
1030   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetHeight(root_child2));
1031
1032   YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
1033
1034   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
1035   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
1036   ASSERT_FLOAT_EQ(640, YGNodeLayoutGetWidth(root));
1037   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetHeight(root));
1038
1039   ASSERT_FLOAT_EQ(427, YGNodeLayoutGetLeft(root_child0));
1040   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
1041   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetWidth(root_child0));
1042   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetHeight(root_child0));
1043
1044   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetLeft(root_child1));
1045   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
1046   ASSERT_FLOAT_EQ(214, YGNodeLayoutGetWidth(root_child1));
1047   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetHeight(root_child1));
1048
1049   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child0));
1050   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1_child0));
1051   ASSERT_FLOAT_EQ(214, YGNodeLayoutGetWidth(root_child1_child0));
1052   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetHeight(root_child1_child0));
1053
1054   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child1));
1055   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetTop(root_child1_child1));
1056   ASSERT_FLOAT_EQ(214, YGNodeLayoutGetWidth(root_child1_child1));
1057   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetHeight(root_child1_child1));
1058
1059   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child1_child0));
1060   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1_child1_child0));
1061   ASSERT_FLOAT_EQ(214, YGNodeLayoutGetWidth(root_child1_child1_child0));
1062   ASSERT_FLOAT_EQ(106, YGNodeLayoutGetHeight(root_child1_child1_child0));
1063
1064   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child2));
1065   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetTop(root_child1_child2));
1066   ASSERT_FLOAT_EQ(214, YGNodeLayoutGetWidth(root_child1_child2));
1067   ASSERT_FLOAT_EQ(107, YGNodeLayoutGetHeight(root_child1_child2));
1068
1069   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
1070   ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
1071   ASSERT_FLOAT_EQ(213, YGNodeLayoutGetWidth(root_child2));
1072   ASSERT_FLOAT_EQ(320, YGNodeLayoutGetHeight(root_child2));
1073
1074   YGNodeFreeRecursive(root);
1075
1076   YGConfigFree(config);
1077 }