Skip to content

Commit c4e8b38

Browse files
Bartlomiej Bloniarzfacebook-github-bot
authored andcommitted
Add AnimatedProps unit tests (#56216)
Summary: Added gtests for the `AnimatedProps` `cloneProp` function, covering typed prop application to view props. ## Changelog: [Internal][Added] - Added unit tests for AnimatedProps Differential Revision: D97951286
1 parent e26c6d4 commit c4e8b38

1 file changed

Lines changed: 174 additions & 0 deletions

File tree

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
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+
#include <gtest/gtest.h>
9+
#include <react/renderer/animationbackend/AnimatedProps.h>
10+
#include <react/renderer/components/view/BaseViewProps.h>
11+
#include <react/renderer/graphics/Transform.h>
12+
13+
using namespace facebook::react;
14+
15+
// ============================================================================
16+
// cloneProp Tests - Simple Float Props
17+
// ============================================================================
18+
19+
TEST(AnimatedPropsTest, clonePropAppliesOpacity) {
20+
BaseViewProps viewProps;
21+
AnimatedProp<Float> prop{OPACITY, 0.5f};
22+
cloneProp(viewProps, prop);
23+
EXPECT_FLOAT_EQ(viewProps.opacity, 0.5f);
24+
}
25+
26+
TEST(AnimatedPropsTest, clonePropAppliesShadowOpacity) {
27+
BaseViewProps viewProps;
28+
AnimatedProp<Float> prop{SHADOW_OPACITY, 0.8f};
29+
cloneProp(viewProps, prop);
30+
EXPECT_FLOAT_EQ(viewProps.shadowOpacity, 0.8f);
31+
}
32+
33+
TEST(AnimatedPropsTest, clonePropAppliesShadowRadius) {
34+
BaseViewProps viewProps;
35+
AnimatedProp<Float> prop{SHADOW_RADIUS, 5.0f};
36+
cloneProp(viewProps, prop);
37+
EXPECT_FLOAT_EQ(viewProps.shadowRadius, 5.0f);
38+
}
39+
40+
TEST(AnimatedPropsTest, clonePropAppliesOutlineWidth) {
41+
BaseViewProps viewProps;
42+
AnimatedProp<Float> prop{OUTLINE_WIDTH, 2.0f};
43+
cloneProp(viewProps, prop);
44+
EXPECT_FLOAT_EQ(viewProps.outlineWidth, 2.0f);
45+
}
46+
47+
TEST(AnimatedPropsTest, clonePropAppliesOutlineOffset) {
48+
BaseViewProps viewProps;
49+
AnimatedProp<Float> prop{OUTLINE_OFFSET, 3.0f};
50+
cloneProp(viewProps, prop);
51+
EXPECT_FLOAT_EQ(viewProps.outlineOffset, 3.0f);
52+
}
53+
54+
// ============================================================================
55+
// cloneProp Tests - Transform Props
56+
// ============================================================================
57+
58+
TEST(AnimatedPropsTest, clonePropAppliesTransform) {
59+
BaseViewProps viewProps;
60+
Transform transform = Transform::Identity();
61+
transform = transform * Transform::Translate(10.0f, 20.0f, 0.0f);
62+
AnimatedProp<Transform> prop{TRANSFORM, transform};
63+
cloneProp(viewProps, prop);
64+
EXPECT_EQ(viewProps.transform, transform);
65+
}
66+
67+
TEST(AnimatedPropsTest, clonePropAppliesTransformOrigin) {
68+
BaseViewProps viewProps;
69+
TransformOrigin origin{
70+
.xy =
71+
{ValueUnit(50.0f, UnitType::Percent),
72+
ValueUnit(25.0f, UnitType::Percent)},
73+
.z = 10.0f};
74+
AnimatedProp<TransformOrigin> prop{TRANSFORM_ORIGIN, origin};
75+
cloneProp(viewProps, prop);
76+
EXPECT_EQ(viewProps.transformOrigin, origin);
77+
}
78+
79+
// ============================================================================
80+
// cloneProp Tests - Color Props
81+
// ============================================================================
82+
83+
TEST(AnimatedPropsTest, clonePropAppliesBackgroundColor) {
84+
BaseViewProps viewProps;
85+
auto color =
86+
colorFromComponents({.red = 255, .green = 0, .blue = 0, .alpha = 255});
87+
AnimatedProp<SharedColor> prop{BACKGROUND_COLOR, color};
88+
cloneProp(viewProps, prop);
89+
EXPECT_EQ(viewProps.backgroundColor, color);
90+
}
91+
92+
TEST(AnimatedPropsTest, clonePropAppliesShadowColor) {
93+
BaseViewProps viewProps;
94+
auto color =
95+
colorFromComponents({.red = 0, .green = 0, .blue = 0, .alpha = 128});
96+
AnimatedProp<SharedColor> prop{SHADOW_COLOR, color};
97+
cloneProp(viewProps, prop);
98+
EXPECT_EQ(viewProps.shadowColor, color);
99+
}
100+
101+
TEST(AnimatedPropsTest, clonePropAppliesOutlineColor) {
102+
BaseViewProps viewProps;
103+
auto color =
104+
colorFromComponents({.red = 0, .green = 255, .blue = 0, .alpha = 255});
105+
AnimatedProp<SharedColor> prop{OUTLINE_COLOR, color};
106+
cloneProp(viewProps, prop);
107+
EXPECT_EQ(viewProps.outlineColor, color);
108+
}
109+
110+
// ============================================================================
111+
// cloneProp Tests - Z-Index and Optional Props
112+
// ============================================================================
113+
114+
TEST(AnimatedPropsTest, clonePropAppliesZIndex) {
115+
BaseViewProps viewProps;
116+
AnimatedProp<std::optional<int>> prop{Z_INDEX, 5};
117+
cloneProp(viewProps, prop);
118+
EXPECT_TRUE(viewProps.zIndex.has_value());
119+
EXPECT_EQ(viewProps.zIndex.value(), 5);
120+
}
121+
122+
TEST(AnimatedPropsTest, clonePropAppliesNulloptZIndex) {
123+
BaseViewProps viewProps;
124+
viewProps.zIndex = 10;
125+
AnimatedProp<std::optional<int>> prop{Z_INDEX, std::nullopt};
126+
cloneProp(viewProps, prop);
127+
EXPECT_FALSE(viewProps.zIndex.has_value());
128+
}
129+
130+
// ============================================================================
131+
// cloneProp Tests - Shadow Props
132+
// ============================================================================
133+
134+
TEST(AnimatedPropsTest, clonePropAppliesShadowOffset) {
135+
BaseViewProps viewProps;
136+
facebook::react::Size offset{.width = 5.0f, .height = 10.0f};
137+
AnimatedProp<facebook::react::Size> prop{SHADOW_OFFSET, offset};
138+
cloneProp(viewProps, prop);
139+
EXPECT_FLOAT_EQ(viewProps.shadowOffset.width, 5.0f);
140+
EXPECT_FLOAT_EQ(viewProps.shadowOffset.height, 10.0f);
141+
}
142+
// ============================================================================
143+
// Multiple cloneProp Applications
144+
// ============================================================================
145+
146+
TEST(AnimatedPropsTest, multipleClonePropCallsAccumulate) {
147+
BaseViewProps viewProps;
148+
149+
AnimatedProp<Float> opacityProp{OPACITY, 0.5f};
150+
cloneProp(viewProps, opacityProp);
151+
152+
AnimatedProp<Float> shadowProp{SHADOW_OPACITY, 0.8f};
153+
cloneProp(viewProps, shadowProp);
154+
155+
AnimatedProp<std::optional<int>> zIndexProp{Z_INDEX, 99};
156+
cloneProp(viewProps, zIndexProp);
157+
158+
EXPECT_FLOAT_EQ(viewProps.opacity, 0.5f);
159+
EXPECT_FLOAT_EQ(viewProps.shadowOpacity, 0.8f);
160+
EXPECT_TRUE(viewProps.zIndex.has_value());
161+
EXPECT_EQ(viewProps.zIndex.value(), 99);
162+
}
163+
164+
TEST(AnimatedPropsTest, clonePropOverwritesPreviousValue) {
165+
BaseViewProps viewProps;
166+
167+
AnimatedProp<Float> prop1{OPACITY, 0.5f};
168+
cloneProp(viewProps, prop1);
169+
EXPECT_FLOAT_EQ(viewProps.opacity, 0.5f);
170+
171+
AnimatedProp<Float> prop2{OPACITY, 0.9f};
172+
cloneProp(viewProps, prop2);
173+
EXPECT_FLOAT_EQ(viewProps.opacity, 0.9f);
174+
}

0 commit comments

Comments
 (0)