Make CompactValue internal detail of yoga::Style
(#1492)
Summary: X-link: https://github.com/facebook/react-native/pull/41776 Pull Request resolved: https://github.com/facebook/yoga/pull/1492 # Summary In preparation to replace `CompactValue`, this fully encapsulates it as an implementation detail of `yoga::Style`. The internal API now always operates on `Style::Length`, converted to `YGValue` at the public API boundary. In the next step, we can plug in a new representation within `Style`, which should enable 64 bit values, and lower memory usage. # Test Plan 1. Existing tests (inc for style, invalidation, CompactValue) pass 2. Check that constexpr `yoga::isinf()` produces same assembly under Clang as `std::isinf()` 3. Fabric Android builds 4. Yoga benchmark does style reads # Performance Checking whether a style is defined, then reading after, is a hot path, and we are doubling any space style lengths take in the stack (but not long-term on the node). After a naive move, on one system, the Yoga benchmark creating, laying out, and destroying a tree, ran about 8-10% slower in the "Huge nested flex" example. We are converting in many more cases instead of doing undefined check, but operating on accessed style values no longer needs to do the conversion multiple times. I changed the `CompactValue` conversion to YGValue/StyleLength path to check for undefined as the common case (since we always convert, instead of calling `isUndefined` directly on CompactValue. That seemed to get the difference down to ~5-6% when I was playing with it then. We can optimistically make some of this up with ValuePool giving better locality, and fix this more holistically if we reduce edge and value resolution. On another machine where I tested this, the new revision went the opposite direction, and was about 5% faster, so this isn't really a cut and dry regression, but we see different characteristics than before. # Changelog [Internal] Reviewed By: rozele Differential Revision: D51775346 fbshipit-source-id: c618af41b4882b4a227c917fcad07375806faf78
This commit is contained in:
committed by
Facebook GitHub Bot
parent
2caa8ac8cb
commit
192016a0a8
@@ -11,7 +11,7 @@
|
||||
#include <yoga/style/CompactValue.h>
|
||||
#include <cmath>
|
||||
|
||||
using facebook::yoga::CompactValue;
|
||||
using namespace facebook::yoga;
|
||||
|
||||
const auto tooSmall = nextafterf(CompactValue::LOWER_BOUND, -INFINITY);
|
||||
const auto tooLargePoints =
|
||||
@@ -20,112 +20,109 @@ const auto tooLargePercent =
|
||||
nextafterf(CompactValue::UPPER_BOUND_PERCENT, INFINITY);
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_undefined) {
|
||||
auto c = CompactValue{YGValue{12.5f, YGUnitUndefined}};
|
||||
YGValue v = c;
|
||||
ASSERT_EQ(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{-1.25, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{25, YGUnitPercent}));
|
||||
auto c = CompactValue{value::undefined()};
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_EQ(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(-1.25));
|
||||
ASSERT_NE(v, value::percent(25));
|
||||
ASSERT_TRUE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_manages_infinity_as_undefined) {
|
||||
auto c = CompactValue{
|
||||
YGValue{std::numeric_limits<float>::infinity(), YGUnitUndefined}};
|
||||
YGValue v = c;
|
||||
ASSERT_EQ(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{-1.25, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{25, YGUnitPercent}));
|
||||
auto c = CompactValue{value::points(std::numeric_limits<float>::infinity())};
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_EQ(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(-1.25));
|
||||
ASSERT_NE(v, value::percent(25));
|
||||
ASSERT_TRUE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_auto) {
|
||||
auto c = CompactValue{YGValue{0, YGUnitAuto}};
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_EQ(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{-1.25, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{25, YGUnitPercent}));
|
||||
auto c = CompactValue{value::ofAuto()};
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_EQ(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(-1.25));
|
||||
ASSERT_NE(v, value::percent(25));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_TRUE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_zero_points) {
|
||||
auto c = CompactValue{YGValue{0, YGUnitPoint}};
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_EQ(v, (YGValue{0, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{0, YGUnitPercent}));
|
||||
auto c = CompactValue{value::points(0)};
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_EQ(v, value::points(0));
|
||||
ASSERT_NE(v, value::percent(0));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_lower_bound_points) {
|
||||
auto c = CompactValue({YGValue{CompactValue::LOWER_BOUND, YGUnitPoint}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_EQ(v, (YGValue{CompactValue::LOWER_BOUND, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{CompactValue::LOWER_BOUND, YGUnitPercent}));
|
||||
auto c = CompactValue({value::points(CompactValue::LOWER_BOUND)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_EQ(v, value::points(CompactValue::LOWER_BOUND));
|
||||
ASSERT_NE(v, value::percent(CompactValue::LOWER_BOUND));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_negative_lower_bound_points) {
|
||||
auto c = CompactValue({YGValue{-CompactValue::LOWER_BOUND, YGUnitPoint}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_EQ(v, (YGValue{-CompactValue::LOWER_BOUND, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{-CompactValue::LOWER_BOUND, YGUnitPercent}));
|
||||
auto c = CompactValue({value::points(-CompactValue::LOWER_BOUND)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_EQ(v, value::points(-CompactValue::LOWER_BOUND));
|
||||
ASSERT_NE(v, value::percent(-CompactValue::LOWER_BOUND));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_clamps_smaller_than_lower_bound_points_to_zero) {
|
||||
auto c = CompactValue({YGValue{tooSmall, YGUnitPoint}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_EQ(v, (YGValue{0, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{0, YGUnitPercent}));
|
||||
auto c = CompactValue({value::points(tooSmall)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_EQ(v, value::points(0));
|
||||
ASSERT_NE(v, value::percent(0));
|
||||
}
|
||||
|
||||
TEST(
|
||||
YogaTest,
|
||||
compact_value_clamps_greater_than_negative_lower_bound_points_to_zero) {
|
||||
auto c = CompactValue({YGValue{-tooSmall, YGUnitPoint}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_EQ(v, (YGValue{0, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{0, YGUnitPercent}));
|
||||
auto c = CompactValue({value::points(-tooSmall)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_EQ(v, value::points(0));
|
||||
ASSERT_NE(v, value::percent(0));
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_upper_bound_points) {
|
||||
auto c =
|
||||
CompactValue({YGValue{CompactValue::UPPER_BOUND_POINT, YGUnitPoint}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_EQ(v, (YGValue{CompactValue::UPPER_BOUND_POINT, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{CompactValue::UPPER_BOUND_POINT, YGUnitPercent}));
|
||||
auto c = CompactValue({value::points(CompactValue::UPPER_BOUND_POINT)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_EQ(v, value::points(CompactValue::UPPER_BOUND_POINT));
|
||||
ASSERT_NE(v, value::percent(CompactValue::UPPER_BOUND_POINT));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_negative_upper_bound_points) {
|
||||
auto c =
|
||||
CompactValue({YGValue{-CompactValue::UPPER_BOUND_POINT, YGUnitPoint}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_EQ(v, (YGValue{-CompactValue::UPPER_BOUND_POINT, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{-CompactValue::UPPER_BOUND_POINT, YGUnitPercent}));
|
||||
auto c = CompactValue({value::points(-CompactValue::UPPER_BOUND_POINT)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_EQ(v, value::points(-CompactValue::UPPER_BOUND_POINT));
|
||||
ASSERT_NE(v, value::percent(-CompactValue::UPPER_BOUND_POINT));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
@@ -133,120 +130,118 @@ TEST(YogaTest, compact_value_can_represent_negative_upper_bound_points) {
|
||||
TEST(
|
||||
YogaTest,
|
||||
compact_value_clamps_greater_than__upper_bound_points_to_upper_bound) {
|
||||
auto c = CompactValue({YGValue{tooLargePoints, YGUnitPoint}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_EQ(v, (YGValue{CompactValue::UPPER_BOUND_POINT, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{CompactValue::UPPER_BOUND_POINT, YGUnitPercent}));
|
||||
auto c = CompactValue({value::points(tooLargePoints)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_EQ(v, value::points(CompactValue::UPPER_BOUND_POINT));
|
||||
ASSERT_NE(v, value::percent(CompactValue::UPPER_BOUND_POINT));
|
||||
}
|
||||
|
||||
TEST(
|
||||
YogaTest,
|
||||
compact_value_clamps_smaller_than_negative_upper_bound_points_to_upper_bound) {
|
||||
auto c = CompactValue({YGValue{-tooLargePoints, YGUnitPoint}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_EQ(v, (YGValue{-CompactValue::UPPER_BOUND_POINT, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{-CompactValue::UPPER_BOUND_POINT, YGUnitPercent}));
|
||||
auto c = CompactValue({value::points(-tooLargePoints)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_EQ(v, value::points(-CompactValue::UPPER_BOUND_POINT));
|
||||
ASSERT_NE(v, value::percent(-CompactValue::UPPER_BOUND_POINT));
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_one_point) {
|
||||
auto c = CompactValue({YGValue{1, YGUnitPoint}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_EQ(v, (YGValue{1, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{1, YGUnitPercent}));
|
||||
auto c = CompactValue({value::points(1)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_EQ(v, value::points(1));
|
||||
ASSERT_NE(v, value::percent(1));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_negative_one_point) {
|
||||
auto c = CompactValue({YGValue{-1, YGUnitPoint}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_EQ(v, (YGValue{-1, YGUnitPoint}));
|
||||
ASSERT_NE(v, (YGValue{-1, YGUnitPercent}));
|
||||
auto c = CompactValue({value::points(-1)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_EQ(v, value::points(-1));
|
||||
ASSERT_NE(v, value::percent(-1));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_zero_percent) {
|
||||
auto c = CompactValue{YGValue{0, YGUnitPercent}};
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{0, YGUnitPoint}));
|
||||
ASSERT_EQ(v, (YGValue{0, YGUnitPercent}));
|
||||
auto c = CompactValue{value::percent(0)};
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(0));
|
||||
ASSERT_EQ(v, value::percent(0));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_lower_bound_percent) {
|
||||
auto c = CompactValue({YGValue{CompactValue::LOWER_BOUND, YGUnitPercent}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{CompactValue::LOWER_BOUND, YGUnitPoint}));
|
||||
ASSERT_EQ(v, (YGValue{CompactValue::LOWER_BOUND, YGUnitPercent}));
|
||||
auto c = CompactValue({value::percent(CompactValue::LOWER_BOUND)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(CompactValue::LOWER_BOUND));
|
||||
ASSERT_EQ(v, value::percent(CompactValue::LOWER_BOUND));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_negative_lower_bound_percent) {
|
||||
auto c = CompactValue({YGValue{-CompactValue::LOWER_BOUND, YGUnitPercent}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{-CompactValue::LOWER_BOUND, YGUnitPoint}));
|
||||
ASSERT_EQ(v, (YGValue{-CompactValue::LOWER_BOUND, YGUnitPercent}));
|
||||
auto c = CompactValue({value::percent(-CompactValue::LOWER_BOUND)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(-CompactValue::LOWER_BOUND));
|
||||
ASSERT_EQ(v, value::percent(-CompactValue::LOWER_BOUND));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_clamps_smaller_than_lower_bound_percent_to_zero) {
|
||||
auto c = CompactValue({YGValue{tooSmall, YGUnitPercent}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{0, YGUnitPoint}));
|
||||
ASSERT_EQ(v, (YGValue{0, YGUnitPercent}));
|
||||
auto c = CompactValue({value::percent(tooSmall)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(0));
|
||||
ASSERT_EQ(v, value::percent(0));
|
||||
}
|
||||
|
||||
TEST(
|
||||
YogaTest,
|
||||
compact_value_clamps_greater_than_negative_lower_bound_percent_to_zero) {
|
||||
auto c = CompactValue({YGValue{-tooSmall, YGUnitPercent}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{0, YGUnitPoint}));
|
||||
ASSERT_EQ(v, (YGValue{0, YGUnitPercent}));
|
||||
auto c = CompactValue({value::percent(-tooSmall)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(0));
|
||||
ASSERT_EQ(v, value::percent(0));
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_upper_bound_percent) {
|
||||
auto c =
|
||||
CompactValue({YGValue{CompactValue::UPPER_BOUND_PERCENT, YGUnitPercent}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{CompactValue::UPPER_BOUND_PERCENT, YGUnitPoint}));
|
||||
ASSERT_EQ(v, (YGValue{CompactValue::UPPER_BOUND_PERCENT, YGUnitPercent}));
|
||||
auto c = CompactValue({value::percent(CompactValue::UPPER_BOUND_PERCENT)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(CompactValue::UPPER_BOUND_PERCENT));
|
||||
ASSERT_EQ(v, value::percent(CompactValue::UPPER_BOUND_PERCENT));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_negative_upper_bound_percent) {
|
||||
auto c = CompactValue(
|
||||
{YGValue{-CompactValue::UPPER_BOUND_PERCENT, YGUnitPercent}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{-CompactValue::UPPER_BOUND_PERCENT, YGUnitPoint}));
|
||||
ASSERT_EQ(v, (YGValue{-CompactValue::UPPER_BOUND_PERCENT, YGUnitPercent}));
|
||||
auto c = CompactValue({value::percent(-CompactValue::UPPER_BOUND_PERCENT)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(-CompactValue::UPPER_BOUND_PERCENT));
|
||||
ASSERT_EQ(v, value::percent(-CompactValue::UPPER_BOUND_PERCENT));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
@@ -254,100 +249,43 @@ TEST(YogaTest, compact_value_can_represent_negative_upper_bound_percent) {
|
||||
TEST(
|
||||
YogaTest,
|
||||
compact_value_clamps_greater_than_upper_bound_percent_to_upper_bound) {
|
||||
auto c = CompactValue({YGValue{tooLargePercent, YGUnitPercent}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{CompactValue::UPPER_BOUND_PERCENT, YGUnitPoint}));
|
||||
ASSERT_EQ(v, (YGValue{CompactValue::UPPER_BOUND_PERCENT, YGUnitPercent}));
|
||||
auto c = CompactValue({value::percent(tooLargePercent)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(CompactValue::UPPER_BOUND_PERCENT));
|
||||
ASSERT_EQ(v, value::percent(CompactValue::UPPER_BOUND_PERCENT));
|
||||
}
|
||||
|
||||
TEST(
|
||||
YogaTest,
|
||||
compact_value_clamps_smaller_than_negative_upper_bound_percent_to_upper_bound) {
|
||||
auto c = CompactValue({YGValue{-tooLargePercent, YGUnitPercent}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{-CompactValue::UPPER_BOUND_PERCENT, YGUnitPoint}));
|
||||
ASSERT_EQ(v, (YGValue{-CompactValue::UPPER_BOUND_PERCENT, YGUnitPercent}));
|
||||
auto c = CompactValue({value::percent(-tooLargePercent)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(-CompactValue::UPPER_BOUND_PERCENT));
|
||||
ASSERT_EQ(v, value::percent(-CompactValue::UPPER_BOUND_PERCENT));
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_one_percent) {
|
||||
auto c = CompactValue({YGValue{1, YGUnitPercent}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{1, YGUnitPoint}));
|
||||
ASSERT_EQ(v, (YGValue{1, YGUnitPercent}));
|
||||
auto c = CompactValue({value::percent(1)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(1));
|
||||
ASSERT_EQ(v, value::percent(1));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_can_represent_negative_one_percent) {
|
||||
auto c = CompactValue({YGValue{-1, YGUnitPercent}});
|
||||
YGValue v = c;
|
||||
ASSERT_NE(v, YGValueUndefined);
|
||||
ASSERT_NE(v, YGValueAuto);
|
||||
ASSERT_NE(v, (YGValue{-1, YGUnitPoint}));
|
||||
ASSERT_EQ(v, (YGValue{-1, YGUnitPercent}));
|
||||
auto c = CompactValue({value::percent(-1)});
|
||||
auto v = (StyleLength)c;
|
||||
ASSERT_NE(v, value::undefined());
|
||||
ASSERT_NE(v, value::ofAuto());
|
||||
ASSERT_NE(v, value::points(-1));
|
||||
ASSERT_EQ(v, value::percent(-1));
|
||||
ASSERT_FALSE(c.isUndefined());
|
||||
ASSERT_FALSE(c.isAuto());
|
||||
}
|
||||
|
||||
TEST(YogaTest, dedicated_unit_factories) {
|
||||
ASSERT_EQ(CompactValue::ofUndefined(), CompactValue(YGValueUndefined));
|
||||
ASSERT_EQ(CompactValue::ofAuto(), CompactValue(YGValueAuto));
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPoint>(-9876.5f),
|
||||
CompactValue(YGValue{-9876.5f, YGUnitPoint}));
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPercent>(123.456f),
|
||||
CompactValue(YGValue{123.456f, YGUnitPercent}));
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPoint>(YGUndefined),
|
||||
CompactValue(YGValueUndefined));
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPercent>(YGUndefined),
|
||||
CompactValue(YGValueUndefined));
|
||||
}
|
||||
|
||||
TEST(YogaTest, can_be_assigned_from_YGValue) {
|
||||
CompactValue c{};
|
||||
|
||||
YGValue v{2.0f, YGUnitPercent};
|
||||
c = v;
|
||||
ASSERT_EQ((YGValue)c, v);
|
||||
|
||||
c = YGValue{123, YGUnitPoint};
|
||||
ASSERT_EQ((YGValue)c, (YGValue{123, YGUnitPoint}));
|
||||
}
|
||||
|
||||
TEST(YogaTest, compact_value_bound_representations) {
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPoint>(CompactValue::LOWER_BOUND).repr(),
|
||||
uint32_t{0});
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPoint>(CompactValue::UPPER_BOUND_POINT).repr(),
|
||||
uint32_t{0x3fffffff});
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPercent>(CompactValue::LOWER_BOUND).repr(),
|
||||
uint32_t{0x40000000});
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPercent>(CompactValue::UPPER_BOUND_PERCENT).repr(),
|
||||
uint32_t{0x7f7fffff});
|
||||
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPoint>(-CompactValue::LOWER_BOUND).repr(),
|
||||
uint32_t{0x80000000});
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPoint>(-CompactValue::UPPER_BOUND_POINT).repr(),
|
||||
uint32_t{0xbfffffff});
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPercent>(-CompactValue::LOWER_BOUND).repr(),
|
||||
uint32_t{0xc0000000});
|
||||
ASSERT_EQ(
|
||||
CompactValue::of<YGUnitPercent>(-CompactValue::UPPER_BOUND_PERCENT)
|
||||
.repr(),
|
||||
uint32_t{0xff7fffff});
|
||||
}
|
||||
|
Reference in New Issue
Block a user