Summary: Pull Request resolved: https://github.com/facebook/yoga/pull/1721 X-link: https://github.com/facebook/react-native/pull/46938 The private internals of how we store styles needed to change a bit to support 3 new keyword values. Right now the only other keyword that can be stored is `auto`. As a result there isn't much fancy logic to support storing this and its just stored as a specific type inside of `StyleValueHandle`. There are only 3 bits for types (8 values), so it is not sustainable to just stuff every keyword in there. So the change writes the keyword as a value with a new `keyword` `Type`. I chose not to put `auto` in there even though it is a keyword since it is a hot path, I did not want to regress perf when I did not need to. I also make a new `StyleSizeValue` class to store size values - so values for `width`, `height`, etc. This way these new keywords are kept specific to sizes and we will not be able to create, for example, a margin: `max-content`. Changelog: [Internal] Reviewed By: NickGerleman Differential Revision: D63927512 fbshipit-source-id: 7285469d37ac4b05226183b56275c77f0c06996c
147 lines
3.9 KiB
C++
147 lines
3.9 KiB
C++
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#include <gtest/gtest.h>
|
|
#include <yoga/style/StyleValuePool.h>
|
|
|
|
namespace facebook::yoga {
|
|
|
|
TEST(StyleValuePool, undefined_at_init) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handle;
|
|
|
|
EXPECT_TRUE(handle.isUndefined());
|
|
EXPECT_FALSE(handle.isDefined());
|
|
EXPECT_EQ(pool.getLength(handle), StyleLength::undefined());
|
|
EXPECT_EQ(pool.getNumber(handle), FloatOptional{});
|
|
}
|
|
|
|
TEST(StyleValuePool, auto_at_init) {
|
|
StyleValuePool pool;
|
|
auto handle = StyleValueHandle::ofAuto();
|
|
|
|
EXPECT_TRUE(handle.isAuto());
|
|
EXPECT_EQ(pool.getLength(handle), StyleLength::ofAuto());
|
|
}
|
|
|
|
TEST(StyleValuePool, store_small_int_points) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handle;
|
|
|
|
pool.store(handle, StyleLength::points(10));
|
|
|
|
EXPECT_EQ(pool.getLength(handle), StyleLength::points(10));
|
|
}
|
|
|
|
TEST(StyleValuePool, store_small_negative_int_points) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handle;
|
|
|
|
pool.store(handle, StyleLength::points(-10));
|
|
|
|
EXPECT_EQ(pool.getLength(handle), StyleLength::points(-10));
|
|
}
|
|
|
|
TEST(StyleValuePool, store_small_int_percent) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handle;
|
|
|
|
pool.store(handle, StyleLength::percent(10));
|
|
|
|
EXPECT_EQ(pool.getLength(handle), StyleLength::percent(10));
|
|
}
|
|
|
|
TEST(StyleValuePool, store_large_int_percent) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handle;
|
|
|
|
pool.store(handle, StyleLength::percent(262144));
|
|
|
|
EXPECT_EQ(pool.getLength(handle), StyleLength::percent(262144));
|
|
}
|
|
|
|
TEST(StyleValuePool, store_large_int_after_small_int) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handle;
|
|
|
|
pool.store(handle, StyleLength::percent(10));
|
|
pool.store(handle, StyleLength::percent(262144));
|
|
|
|
EXPECT_EQ(pool.getLength(handle), StyleLength::percent(262144));
|
|
}
|
|
|
|
TEST(StyleValuePool, store_small_int_after_large_int) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handle;
|
|
|
|
pool.store(handle, StyleLength::percent(262144));
|
|
pool.store(handle, StyleLength::percent(10));
|
|
|
|
EXPECT_EQ(pool.getLength(handle), StyleLength::percent(10));
|
|
}
|
|
|
|
TEST(StyleValuePool, store_small_int_number) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handle;
|
|
|
|
pool.store(handle, FloatOptional{10.0f});
|
|
|
|
EXPECT_EQ(pool.getNumber(handle), FloatOptional{10.0f});
|
|
}
|
|
|
|
TEST(StyleValuePool, store_undefined) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handle;
|
|
|
|
pool.store(handle, StyleLength::undefined());
|
|
|
|
EXPECT_TRUE(handle.isUndefined());
|
|
EXPECT_FALSE(handle.isDefined());
|
|
EXPECT_EQ(pool.getLength(handle), StyleLength::undefined());
|
|
}
|
|
|
|
TEST(StyleValuePool, store_undefined_after_small_int) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handle;
|
|
|
|
pool.store(handle, StyleLength::points(10));
|
|
pool.store(handle, StyleLength::undefined());
|
|
|
|
EXPECT_TRUE(handle.isUndefined());
|
|
EXPECT_FALSE(handle.isDefined());
|
|
EXPECT_EQ(pool.getLength(handle), StyleLength::undefined());
|
|
}
|
|
|
|
TEST(StyleValuePool, store_undefined_after_large_int) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handle;
|
|
|
|
pool.store(handle, StyleLength::points(262144));
|
|
pool.store(handle, StyleLength::undefined());
|
|
|
|
EXPECT_TRUE(handle.isUndefined());
|
|
EXPECT_FALSE(handle.isDefined());
|
|
EXPECT_EQ(pool.getLength(handle), StyleLength::undefined());
|
|
}
|
|
|
|
TEST(StyleValuePool, store_keywords) {
|
|
StyleValuePool pool;
|
|
StyleValueHandle handleMaxContent;
|
|
StyleValueHandle handleFitContent;
|
|
StyleValueHandle handleStretch;
|
|
|
|
pool.store(handleMaxContent, StyleSizeLength::ofMaxContent());
|
|
pool.store(handleFitContent, StyleSizeLength::ofFitContent());
|
|
pool.store(handleStretch, StyleSizeLength::ofStretch());
|
|
|
|
EXPECT_EQ(pool.getSize(handleMaxContent), StyleSizeLength::ofMaxContent());
|
|
EXPECT_EQ(pool.getSize(handleFitContent), StyleSizeLength::ofFitContent());
|
|
EXPECT_EQ(pool.getSize(handleStretch), StyleSizeLength::ofStretch());
|
|
}
|
|
|
|
} // namespace facebook::yoga
|