YGStyle
: wrap all fields into accessors
Summary: @public In order to encapsulate property access on `YGStyle`, as a first measure we wrap all fields with accessors. This will e.g. enable dynamic property storage and instrumentation in the future. All accessors have a `const` version that allows direct access via `const&`. For mutation, bit fields are wrapped with a custom reference object. This style allows for the least amount of changes in client code. Property access simply needs appended parens, eg `style.direction` becomes `style.direction`. Reviewed By: shergin Differential Revision: D14999096 fbshipit-source-id: fbf29f7ddab520513d4618f5e70094c4f6330b30
This commit is contained in:
committed by
Facebook Github Bot
parent
e167642672
commit
dee93017f7
246
tests/YGStyleAccessorsTest.cpp
Normal file
246
tests/YGStyleAccessorsTest.cpp
Normal file
@@ -0,0 +1,246 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its 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/YGStyle.h>
|
||||
#include <yoga/YGValue.h>
|
||||
|
||||
#include <initializer_list>
|
||||
|
||||
#define ACCESSOR_TESTS_1(NAME, X) \
|
||||
style.NAME() = X; \
|
||||
ASSERT_EQ(style.NAME(), X);
|
||||
#define ACCESSOR_TESTS_2(NAME, X, ...) \
|
||||
ACCESSOR_TESTS_1(NAME, X); \
|
||||
ACCESSOR_TESTS_1(NAME, __VA_ARGS__);
|
||||
#define ACCESSOR_TESTS_3(NAME, X, ...) \
|
||||
ACCESSOR_TESTS_1(NAME, X); \
|
||||
ACCESSOR_TESTS_2(NAME, __VA_ARGS__);
|
||||
#define ACCESSOR_TESTS_4(NAME, X, ...) \
|
||||
ACCESSOR_TESTS_1(NAME, X); \
|
||||
ACCESSOR_TESTS_3(NAME, __VA_ARGS__);
|
||||
#define ACCESSOR_TESTS_5(NAME, X, ...) \
|
||||
ACCESSOR_TESTS_1(NAME, X); \
|
||||
ACCESSOR_TESTS_4(NAME, __VA_ARGS__)
|
||||
|
||||
#define ACCESSOR_TESTS_N(a, b, c, d, e, COUNT, ...) ACCESSOR_TESTS_##COUNT
|
||||
#define ACCESSOR_TESTS(...) ACCESSOR_TESTS_N(__VA_ARGS__, 5, 4, 3, 2, 1)
|
||||
|
||||
#define INDEX_ACCESSOR_TESTS_1(NAME, IDX, X) \
|
||||
style.NAME()[IDX] = X; \
|
||||
ASSERT_EQ(style.NAME()[IDX], X);
|
||||
|
||||
#define INDEX_ACCESSOR_TESTS_2(NAME, IDX, X, Y) \
|
||||
INDEX_ACCESSOR_TESTS_1(NAME, IDX, X) \
|
||||
INDEX_ACCESSOR_TESTS_1(NAME, IDX, Y)
|
||||
|
||||
#define INDEX_ACCESSOR_TESTS_3(NAME, IDX, X, ...) \
|
||||
INDEX_ACCESSOR_TESTS_1(NAME, IDX, X) \
|
||||
INDEX_ACCESSOR_TESTS_2(NAME, IDX, __VA_ARGS__)
|
||||
|
||||
#define INDEX_ACCESSOR_TESTS_4(NAME, IDX, X, ...) \
|
||||
INDEX_ACCESSOR_TESTS_1(NAME, IDX, X) \
|
||||
INDEX_ACCESSOR_TESTS_3(NAME, IDX, __VA_ARGS__)
|
||||
|
||||
#define INDEX_ACCESSOR_TESTS_5(NAME, IDX, X, ...) \
|
||||
INDEX_ACCESSOR_TESTS_1(NAME, IDX, X) \
|
||||
INDEX_ACCESSOR_TESTS_4(NAME, IDX, __VA_ARGS__)
|
||||
|
||||
#define INDEX_ACCESSOR_TESTS_N(a, b, c, d, e, COUNT, ...) \
|
||||
INDEX_ACCESSOR_TESTS_##COUNT
|
||||
#define INDEX_ACCESSOR_TESTS(...) \
|
||||
INDEX_ACCESSOR_TESTS_N(__VA_ARGS__, 5, 4, 3, 2, 1)
|
||||
|
||||
// test macro for up to 5 values. If more are needed, extend the macros above.
|
||||
#define ACCESSOR_TEST(NAME, DEFAULT_VAL, ...) \
|
||||
TEST(YGStyle, style_##NAME##_access) { \
|
||||
auto style = YGStyle{}; \
|
||||
ASSERT_EQ(style.NAME(), DEFAULT_VAL); \
|
||||
ACCESSOR_TESTS(__VA_ARGS__)(NAME, __VA_ARGS__) \
|
||||
}
|
||||
|
||||
#define INDEX_ACCESSOR_TEST(NAME, DEFAULT_VAL, IDX, ...) \
|
||||
TEST(YGStyle, style_##NAME##_access) { \
|
||||
auto style = YGStyle{}; \
|
||||
ASSERT_EQ(style.NAME()[IDX], DEFAULT_VAL); \
|
||||
INDEX_ACCESSOR_TESTS(__VA_ARGS__)(NAME, IDX, __VA_ARGS__) \
|
||||
}
|
||||
|
||||
namespace facebook {
|
||||
namespace yoga {
|
||||
|
||||
using CompactValue = detail::CompactValue;
|
||||
|
||||
ACCESSOR_TEST(
|
||||
direction,
|
||||
YGDirectionInherit,
|
||||
YGDirectionLTR,
|
||||
YGDirectionRTL,
|
||||
YGDirectionInherit);
|
||||
|
||||
ACCESSOR_TEST(
|
||||
flexDirection,
|
||||
YGFlexDirectionColumn,
|
||||
YGFlexDirectionColumnReverse,
|
||||
YGFlexDirectionRowReverse,
|
||||
YGFlexDirectionRow)
|
||||
|
||||
ACCESSOR_TEST(
|
||||
justifyContent,
|
||||
YGJustifyFlexStart,
|
||||
YGJustifyFlexEnd,
|
||||
YGJustifySpaceAround,
|
||||
YGJustifyFlexStart,
|
||||
YGJustifySpaceEvenly)
|
||||
|
||||
ACCESSOR_TEST(
|
||||
alignContent,
|
||||
YGAlignFlexStart,
|
||||
YGAlignAuto,
|
||||
YGAlignFlexStart,
|
||||
YGAlignCenter,
|
||||
YGAlignFlexEnd,
|
||||
YGAlignStretch)
|
||||
|
||||
ACCESSOR_TEST(
|
||||
alignItems,
|
||||
YGAlignStretch,
|
||||
YGAlignFlexStart,
|
||||
YGAlignFlexEnd,
|
||||
YGAlignBaseline,
|
||||
YGAlignSpaceBetween,
|
||||
YGAlignSpaceAround)
|
||||
|
||||
ACCESSOR_TEST(
|
||||
alignSelf,
|
||||
YGAlignAuto,
|
||||
YGAlignFlexStart,
|
||||
YGAlignCenter,
|
||||
YGAlignAuto,
|
||||
YGAlignFlexEnd,
|
||||
YGAlignStretch)
|
||||
|
||||
ACCESSOR_TEST(
|
||||
positionType,
|
||||
YGPositionTypeRelative,
|
||||
YGPositionTypeAbsolute,
|
||||
YGPositionTypeRelative)
|
||||
|
||||
ACCESSOR_TEST(
|
||||
flexWrap,
|
||||
YGWrapNoWrap,
|
||||
YGWrapWrap,
|
||||
YGWrapWrapReverse,
|
||||
YGWrapNoWrap)
|
||||
|
||||
ACCESSOR_TEST(
|
||||
overflow,
|
||||
YGOverflowVisible,
|
||||
YGOverflowHidden,
|
||||
YGOverflowScroll,
|
||||
YGOverflowVisible)
|
||||
|
||||
ACCESSOR_TEST(display, YGDisplayFlex, YGDisplayNone, YGDisplayFlex)
|
||||
|
||||
ACCESSOR_TEST(
|
||||
flex,
|
||||
YGFloatOptional{},
|
||||
YGFloatOptional{123.45f},
|
||||
YGFloatOptional{-9.87f},
|
||||
YGFloatOptional{})
|
||||
|
||||
ACCESSOR_TEST(
|
||||
flexGrow,
|
||||
YGFloatOptional{},
|
||||
YGFloatOptional{123.45f},
|
||||
YGFloatOptional{-9.87f},
|
||||
YGFloatOptional{})
|
||||
|
||||
ACCESSOR_TEST(
|
||||
flexShrink,
|
||||
YGFloatOptional{},
|
||||
YGFloatOptional{123.45f},
|
||||
YGFloatOptional{-9.87f},
|
||||
YGFloatOptional{})
|
||||
|
||||
ACCESSOR_TEST(
|
||||
flexBasis,
|
||||
CompactValue::ofAuto(),
|
||||
CompactValue::ofUndefined(),
|
||||
CompactValue::ofAuto(),
|
||||
CompactValue::of<YGUnitPoint>(7777.77f),
|
||||
CompactValue::of<YGUnitPercent>(-100.0f))
|
||||
|
||||
INDEX_ACCESSOR_TEST(
|
||||
position,
|
||||
CompactValue::ofUndefined(),
|
||||
YGEdgeBottom,
|
||||
CompactValue::ofAuto(),
|
||||
CompactValue::ofUndefined(),
|
||||
CompactValue::of<YGUnitPoint>(7777.77f),
|
||||
CompactValue::of<YGUnitPercent>(-100.0f))
|
||||
|
||||
INDEX_ACCESSOR_TEST(
|
||||
margin,
|
||||
CompactValue::ofUndefined(),
|
||||
YGEdgeTop,
|
||||
CompactValue::ofAuto(),
|
||||
CompactValue::ofUndefined(),
|
||||
CompactValue::of<YGUnitPoint>(7777.77f),
|
||||
CompactValue::of<YGUnitPercent>(-100.0f))
|
||||
|
||||
INDEX_ACCESSOR_TEST(
|
||||
padding,
|
||||
CompactValue::ofUndefined(),
|
||||
YGEdgeAll,
|
||||
CompactValue::of<YGUnitPoint>(7777.77f),
|
||||
CompactValue::ofUndefined(),
|
||||
CompactValue::of<YGUnitPercent>(-100.0f))
|
||||
|
||||
INDEX_ACCESSOR_TEST(
|
||||
border,
|
||||
CompactValue::ofUndefined(),
|
||||
YGEdgeHorizontal,
|
||||
CompactValue::of<YGUnitPoint>(-7777.77f),
|
||||
CompactValue::ofUndefined())
|
||||
|
||||
INDEX_ACCESSOR_TEST(
|
||||
dimensions,
|
||||
CompactValue::ofAuto(),
|
||||
YGDimensionWidth,
|
||||
CompactValue::ofUndefined(),
|
||||
CompactValue::ofAuto(),
|
||||
CompactValue::of<YGUnitPoint>(7777.77f),
|
||||
CompactValue::of<YGUnitPercent>(-100.0f))
|
||||
|
||||
INDEX_ACCESSOR_TEST(
|
||||
minDimensions,
|
||||
CompactValue::ofUndefined(),
|
||||
YGDimensionHeight,
|
||||
CompactValue::ofAuto(),
|
||||
CompactValue::ofUndefined(),
|
||||
CompactValue::of<YGUnitPoint>(7777.77f),
|
||||
CompactValue::of<YGUnitPercent>(-100.0f))
|
||||
|
||||
INDEX_ACCESSOR_TEST(
|
||||
maxDimensions,
|
||||
CompactValue::ofUndefined(),
|
||||
YGDimensionHeight,
|
||||
CompactValue::ofAuto(),
|
||||
CompactValue::ofUndefined(),
|
||||
CompactValue::of<YGUnitPoint>(7777.77f),
|
||||
CompactValue::of<YGUnitPercent>(-100.0f))
|
||||
|
||||
ACCESSOR_TEST(
|
||||
aspectRatio,
|
||||
YGFloatOptional{},
|
||||
YGFloatOptional{-123.45f},
|
||||
YGFloatOptional{9876.5f},
|
||||
YGFloatOptional{0.0f},
|
||||
YGFloatOptional{});
|
||||
|
||||
} // namespace yoga
|
||||
} // namespace facebook
|
Reference in New Issue
Block a user