2019-06-06 19:36:56 -07:00
|
|
|
/*
|
2022-10-04 13:59:32 -07:00
|
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
2017-07-26 19:22:03 -07:00
|
|
|
*
|
2019-10-15 10:30:08 -07:00
|
|
|
* This source code is licensed under the MIT license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree.
|
2017-07-26 19:22:03 -07:00
|
|
|
*/
|
2019-10-15 10:30:08 -07:00
|
|
|
|
2017-07-26 19:22:03 -07:00
|
|
|
#include <gtest/gtest.h>
|
2023-09-13 20:12:55 -07:00
|
|
|
#include <yoga/Yoga.h>
|
2017-07-26 19:22:03 -07:00
|
|
|
|
2024-12-30 12:38:48 -08:00
|
|
|
#include <cmath>
|
|
|
|
|
2017-07-26 19:22:03 -07:00
|
|
|
TEST(YogaTest, rounding_value) {
|
|
|
|
// Test that whole numbers are rounded to whole despite ceil/floor flags
|
|
|
|
ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(6.000001, 2.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(6.000001, 2.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(6.000001, 2.0, false, true));
|
|
|
|
ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(5.999999, 2.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(5.999999, 2.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(5.999999, 2.0, false, true));
|
2018-10-11 18:17:14 -07:00
|
|
|
// Same tests for negative numbers
|
|
|
|
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-6.000001, 2.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-6.000001, 2.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-6.000001, 2.0, false, true));
|
|
|
|
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-5.999999, 2.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-5.999999, 2.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-5.999999, 2.0, false, true));
|
2017-07-26 19:22:03 -07:00
|
|
|
|
2019-03-25 05:37:36 -07:00
|
|
|
// Test that numbers with fraction are rounded correctly accounting for
|
|
|
|
// ceil/floor flags
|
2017-07-26 19:22:03 -07:00
|
|
|
ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(6.01, 2.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(6.5, YGRoundValueToPixelGrid(6.01, 2.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(6.01, 2.0, false, true));
|
|
|
|
ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(5.99, 2.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(5.99, 2.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(5.5, YGRoundValueToPixelGrid(5.99, 2.0, false, true));
|
2018-10-11 18:17:14 -07:00
|
|
|
// Same tests for negative numbers
|
|
|
|
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-6.01, 2.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-6.01, 2.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(-6.5, YGRoundValueToPixelGrid(-6.01, 2.0, false, true));
|
|
|
|
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-5.99, 2.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(-5.5, YGRoundValueToPixelGrid(-5.99, 2.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-5.99, 2.0, false, true));
|
2024-12-30 12:38:48 -08:00
|
|
|
|
|
|
|
// Rounding up/down halfway values is as expected for both positive and
|
|
|
|
// negative numbers
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.5, 1.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.4, 1.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.6, 1.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.499999, 1.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.500001, 1.0, false, false));
|
|
|
|
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.5001, 1.0, false, false));
|
|
|
|
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.5, 1.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.4, 1.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.6, 1.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.499999, 1.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.500001, 1.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.5001, 1.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.00001, 1.0, true, false));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3, 1.0, true, false));
|
|
|
|
|
|
|
|
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.5, 1.0, false, true));
|
|
|
|
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.4, 1.0, false, true));
|
|
|
|
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.6, 1.0, false, true));
|
|
|
|
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.499999, 1.0, false, true));
|
|
|
|
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.500001, 1.0, false, true));
|
|
|
|
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.5001, 1.0, false, true));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.00001, 1.0, false, true));
|
|
|
|
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3, 1.0, false, true));
|
|
|
|
|
|
|
|
// NAN is treated as expected:
|
|
|
|
ASSERT_TRUE(std::isnan(YGRoundValueToPixelGrid(
|
|
|
|
std::numeric_limits<double>::quiet_NaN(), 1.5, false, false)));
|
|
|
|
ASSERT_TRUE(std::isnan(YGRoundValueToPixelGrid(
|
|
|
|
1.5, std::numeric_limits<double>::quiet_NaN(), false, false)));
|
|
|
|
ASSERT_TRUE(std::isnan(YGRoundValueToPixelGrid(
|
|
|
|
std::numeric_limits<double>::quiet_NaN(),
|
|
|
|
std::numeric_limits<double>::quiet_NaN(),
|
|
|
|
false,
|
|
|
|
false)));
|
2018-10-11 18:17:14 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static YGSize measureText(
|
2023-09-11 19:51:40 -07:00
|
|
|
YGNodeConstRef /*node*/,
|
2023-05-11 09:43:36 -07:00
|
|
|
float /*width*/,
|
|
|
|
YGMeasureMode /*widthMode*/,
|
|
|
|
float /*height*/,
|
|
|
|
YGMeasureMode /*heightMode*/) {
|
2023-01-09 13:59:19 -08:00
|
|
|
return YGSize{10, 10};
|
2018-10-11 18:17:14 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Regression test for https://github.com/facebook/yoga/issues/824
|
|
|
|
TEST(YogaTest, consistent_rounding_during_repeated_layouts) {
|
2024-07-03 17:30:10 -07:00
|
|
|
YGConfigRef config = YGConfigNew();
|
2018-10-11 18:17:14 -07:00
|
|
|
YGConfigSetPointScaleFactor(config, 2);
|
|
|
|
|
2024-07-03 17:30:10 -07:00
|
|
|
YGNodeRef root = YGNodeNewWithConfig(config);
|
2023-01-09 13:59:19 -08:00
|
|
|
YGNodeStyleSetMargin(root, YGEdgeTop, -1.49f);
|
2018-10-11 18:17:14 -07:00
|
|
|
YGNodeStyleSetWidth(root, 500);
|
|
|
|
YGNodeStyleSetHeight(root, 500);
|
|
|
|
|
2024-07-03 17:30:10 -07:00
|
|
|
YGNodeRef node0 = YGNodeNewWithConfig(config);
|
2018-10-11 18:17:14 -07:00
|
|
|
YGNodeInsertChild(root, node0, 0);
|
|
|
|
|
2024-07-03 17:30:10 -07:00
|
|
|
YGNodeRef node1 = YGNodeNewWithConfig(config);
|
2018-10-11 18:17:14 -07:00
|
|
|
YGNodeSetMeasureFunc(node1, measureText);
|
|
|
|
YGNodeInsertChild(node0, node1, 0);
|
|
|
|
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
// Dirty the tree so YGRoundToPixelGrid runs again
|
2023-09-13 20:12:55 -07:00
|
|
|
YGNodeStyleSetMargin(root, YGEdgeLeft, (float)(i + 1));
|
2018-10-11 18:17:14 -07:00
|
|
|
|
|
|
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
|
|
|
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(node1));
|
|
|
|
}
|
|
|
|
|
|
|
|
YGNodeFreeRecursive(root);
|
|
|
|
|
|
|
|
YGConfigFree(config);
|
2017-07-26 19:22:03 -07:00
|
|
|
}
|
2023-09-13 14:11:25 -07:00
|
|
|
|
|
|
|
TEST(YogaTest, per_node_point_scale_factor) {
|
2024-07-03 17:30:10 -07:00
|
|
|
YGConfigRef config1 = YGConfigNew();
|
2023-09-13 14:11:25 -07:00
|
|
|
YGConfigSetPointScaleFactor(config1, 2);
|
|
|
|
|
2024-07-03 17:30:10 -07:00
|
|
|
YGConfigRef config2 = YGConfigNew();
|
2023-09-13 14:11:25 -07:00
|
|
|
YGConfigSetPointScaleFactor(config2, 1);
|
|
|
|
|
2024-07-03 17:30:10 -07:00
|
|
|
YGConfigRef config3 = YGConfigNew();
|
2023-09-13 14:11:25 -07:00
|
|
|
YGConfigSetPointScaleFactor(config3, 0.5f);
|
|
|
|
|
2024-07-03 17:30:10 -07:00
|
|
|
YGNodeRef root = YGNodeNewWithConfig(config1);
|
2023-09-13 14:11:25 -07:00
|
|
|
YGNodeStyleSetWidth(root, 11.5);
|
|
|
|
YGNodeStyleSetHeight(root, 11.5);
|
|
|
|
|
2024-07-03 17:30:10 -07:00
|
|
|
YGNodeRef node0 = YGNodeNewWithConfig(config2);
|
2023-09-13 14:11:25 -07:00
|
|
|
YGNodeStyleSetWidth(node0, 9.5);
|
|
|
|
YGNodeStyleSetHeight(node0, 9.5);
|
|
|
|
YGNodeInsertChild(root, node0, 0);
|
|
|
|
|
2024-07-03 17:30:10 -07:00
|
|
|
YGNodeRef node1 = YGNodeNewWithConfig(config3);
|
2023-09-13 14:11:25 -07:00
|
|
|
YGNodeStyleSetWidth(node1, 7);
|
|
|
|
YGNodeStyleSetHeight(node1, 7);
|
|
|
|
YGNodeInsertChild(node0, node1, 0);
|
|
|
|
|
|
|
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
|
|
|
|
|
|
|
ASSERT_EQ(YGNodeLayoutGetWidth(root), 11.5);
|
|
|
|
ASSERT_EQ(YGNodeLayoutGetHeight(root), 11.5);
|
|
|
|
|
|
|
|
ASSERT_EQ(YGNodeLayoutGetWidth(node0), 10);
|
|
|
|
ASSERT_EQ(YGNodeLayoutGetHeight(node0), 10);
|
|
|
|
|
|
|
|
ASSERT_EQ(YGNodeLayoutGetWidth(node1), 8);
|
|
|
|
ASSERT_EQ(YGNodeLayoutGetHeight(node1), 8);
|
|
|
|
|
|
|
|
YGNodeFreeRecursive(root);
|
|
|
|
|
|
|
|
YGConfigFree(config1);
|
|
|
|
YGConfigFree(config2);
|
|
|
|
YGConfigFree(config3);
|
|
|
|
}
|
2025-05-08 16:16:02 -07:00
|
|
|
|
|
|
|
TEST(YogaTest, raw_layout_dimensions) {
|
|
|
|
YGConfigRef config = YGConfigNew();
|
|
|
|
YGConfigSetPointScaleFactor(config, 0.5f);
|
|
|
|
|
|
|
|
YGNodeRef root = YGNodeNewWithConfig(config);
|
|
|
|
YGNodeStyleSetWidth(root, 11.5f);
|
|
|
|
YGNodeStyleSetHeight(root, 9.5f);
|
|
|
|
|
|
|
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
|
|
|
|
|
|
|
ASSERT_EQ(YGNodeLayoutGetWidth(root), 12.0f);
|
|
|
|
ASSERT_EQ(YGNodeLayoutGetHeight(root), 10.0f);
|
|
|
|
ASSERT_EQ(YGNodeLayoutGetRawWidth(root), 11.5f);
|
|
|
|
ASSERT_EQ(YGNodeLayoutGetRawHeight(root), 9.5f);
|
|
|
|
|
|
|
|
YGNodeFreeRecursive(root);
|
|
|
|
|
|
|
|
YGConfigFree(config);
|
|
|
|
}
|