1 /*
2 * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "scroll_bar_test_ng.h"
17
18 #include "test/mock/base/mock_task_executor.h"
19 #include "test/mock/core/common/mock_theme_manager.h"
20 #include "test/mock/core/pipeline/mock_pipeline_context.h"
21
22 #include "core/components_ng/pattern/linear_layout/column_model_ng.h"
23 #include "core/components_ng/pattern/scroll/scroll_model_ng.h"
24 #include "core/components_ng/pattern/scroll_bar/scroll_bar_model_ng.h"
25 #include "core/components_ng/pattern/stack/stack_model_ng.h"
26
27 namespace OHOS::Ace::NG {
28 namespace {
29 constexpr float DEFAULT_ACTIVE_WIDTH = 8.0f;
30 constexpr float DEFAULT_NORMAL_WIDTH = 4.0f;
31 constexpr float DEFAULT_TOUCH_WIDTH = 32.0f;
32 constexpr float NORMAL_WIDTH = 4.f;
33 } // namespace
34
SetUpTestSuite()35 void ScrollBarTestNg::SetUpTestSuite()
36 {
37 TestNG::SetUpTestSuite();
38 auto themeManager = AceType::MakeRefPtr<MockThemeManager>();
39 MockPipelineContext::GetCurrent()->SetThemeManager(themeManager);
40 auto themeConstants = CreateThemeConstants(THEME_PATTERN_SCROLL_BAR);
41 auto scrollBarTheme = ScrollBarTheme::Builder().Build(themeConstants);
42 scrollBarTheme->normalWidth_ = Dimension(NORMAL_WIDTH);
43 scrollBarTheme->padding_ = Edge(0.0);
44 scrollBarTheme->scrollBarMargin_ = Dimension(0.0);
45 scrollBarTheme->touchWidth_ = Dimension(DEFAULT_TOUCH_WIDTH, DimensionUnit::VP);
46 scrollBarTheme->activeWidth_ = Dimension(DEFAULT_ACTIVE_WIDTH, DimensionUnit::VP);
47 scrollBarTheme->normalWidth_ = Dimension(DEFAULT_NORMAL_WIDTH, DimensionUnit::VP);
48 EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(scrollBarTheme));
49 MockPipelineContext::GetCurrentContext()->taskExecutor_ = AceType::MakeRefPtr<MockTaskExecutor>();
50 }
51
TearDownTestSuite()52 void ScrollBarTestNg::TearDownTestSuite()
53 {
54 TestNG::TearDownTestSuite();
55 }
56
SetUp()57 void ScrollBarTestNg::SetUp() {}
58
TearDown()59 void ScrollBarTestNg::TearDown()
60 {
61 stackNode_ = nullptr;
62 scrollNode_ = nullptr;
63 scrollPattern_ = nullptr;
64 frameNode_ = nullptr;
65 pattern_ = nullptr;
66 layoutProperty_ = nullptr;
67 paintProperty_ = nullptr;
68 accessibilityProperty_ = nullptr;
69 AceApplicationInfo::GetInstance().isRightToLeft_ = false;
70 }
71
GetScrollBar()72 void ScrollBarTestNg::GetScrollBar()
73 {
74 RefPtr<UINode> element = ViewStackProcessor::GetInstance()->GetMainElementNode();
75 frameNode_ = AceType::DynamicCast<FrameNode>(element);
76 pattern_ = frameNode_->GetPattern<ScrollBarPattern>();
77 layoutProperty_ = frameNode_->GetLayoutProperty<ScrollBarLayoutProperty>();
78 paintProperty_ = frameNode_->GetPaintProperty<ScrollablePaintProperty>();
79 accessibilityProperty_ = frameNode_->GetAccessibilityProperty<ScrollBarAccessibilityProperty>();
80 }
81
CreateMainFrameNode()82 RefPtr<FrameNode> ScrollBarTestNg::CreateMainFrameNode()
83 {
84 RefPtr<UINode> element = ViewStackProcessor::GetInstance()->GetMainElementNode();
85 return AceType::DynamicCast<FrameNode>(element);
86 }
87
CreateStack(Alignment align)88 void ScrollBarTestNg::CreateStack(Alignment align)
89 {
90 StackModelNG stackModel;
91 stackModel.Create();
92 stackModel.SetAlignment(align);
93 ViewAbstract::SetWidth(CalcLength(SCROLL_WIDTH));
94 ViewAbstract::SetHeight(CalcLength(SCROLL_HEIGHT));
95 stackNode_ = CreateMainFrameNode();
96 }
97
CreateScroll(float mainSize,Axis axis)98 void ScrollBarTestNg::CreateScroll(float mainSize, Axis axis)
99 {
100 ScrollModelNG model;
101 model.Create();
102 auto scrollBarProxy = model.CreateScrollBarProxy();
103 model.SetAxis(axis);
104 model.SetDisplayMode(static_cast<int>(DisplayMode::OFF));
105 model.SetScrollBarProxy(scrollBarProxy);
106 ViewAbstract::SetWidth(CalcLength(FILL_LENGTH));
107 ViewAbstract::SetHeight(CalcLength(FILL_LENGTH));
108 scrollNode_ = CreateMainFrameNode();
109 scrollPattern_ = scrollNode_->GetPattern<ScrollPattern>();
110 CreateContent(mainSize, axis);
111 ViewStackProcessor::GetInstance()->Pop();
112 }
113
CreateContent(float mainSize,Axis axis)114 void ScrollBarTestNg::CreateContent(float mainSize, Axis axis)
115 {
116 ColumnModelNG colModel;
117 colModel.Create(Dimension(0), nullptr, "");
118 SetSize(axis, CalcLength(FILL_LENGTH), CalcLength(mainSize));
119 ViewStackProcessor::GetInstance()->Pop();
120 }
121
CreateScrollBar(bool infoflag,bool proxyFlag,Axis axis,DisplayMode displayMode)122 void ScrollBarTestNg::CreateScrollBar(bool infoflag, bool proxyFlag, Axis axis, DisplayMode displayMode)
123 {
124 auto scrollBarProxy = scrollPattern_->GetScrollBarProxy();
125 ScrollBarModelNG scrollBarModel;
126 int32_t directionValue = static_cast<int>(axis);
127 if (axis == Axis::NONE) {
128 directionValue--;
129 }
130 scrollBarModel.Create(scrollBarProxy, infoflag, proxyFlag, directionValue, static_cast<int>(displayMode));
131 GetScrollBar();
132 }
133
CreateScrollBarChild(float mainSize)134 void ScrollBarTestNg::CreateScrollBarChild(float mainSize)
135 {
136 Axis axis = layoutProperty_->GetAxisValue();
137 ColumnModelNG colModel;
138 colModel.Create(Dimension(0), nullptr, "");
139 SetSize(axis, CalcLength(SCROLL_BAR_CHILD_WIDTH), CalcLength(mainSize));
140 ViewStackProcessor::GetInstance()->Pop();
141 }
142
SetScrollContentMainSize(float mainSize)143 void ScrollBarTestNg::SetScrollContentMainSize(float mainSize)
144 {
145 auto scrollContent = GetChildFrameNode(scrollNode_, 0);
146 ViewAbstract::SetHeight(AceType::RawPtr(scrollContent), CalcLength(mainSize));
147 FlushLayoutTask(scrollNode_, true);
148 }
149
150 /**
151 * @tc.name: ScrollBarModel001
152 * @tc.desc: ScrollBarModelNG Create
153 * @tc.type: FUNC
154 */
155 HWTEST_F(ScrollBarTestNg, ScrollBarModel001, TestSize.Level1)
156 {
157 bool proxyFlag = false;
158 ScrollBarModelNG scrollBarModel;
159 auto proxy = scrollBarModel.GetScrollBarProxy(nullptr);
160 scrollBarModel.Create(proxy, true, proxyFlag, 0, 0);
161 GetScrollBar();
162 CreateDone();
163 EXPECT_EQ(pattern_->scrollBarProxy_, nullptr);
164
165 bool infoflag = false;
166 scrollBarModel.Create(proxy, infoflag, false, 0, 0);
167 GetScrollBar();
168 CreateDone();
169 EXPECT_FALSE(layoutProperty_->GetAxis().has_value());
170
171 int32_t directionValue = -1;
172 scrollBarModel.Create(proxy, true, true, directionValue, 0);
173 GetScrollBar();
174 CreateDone();
175 EXPECT_EQ(layoutProperty_->GetAxisValue(), Axis::VERTICAL);
176 directionValue = 100;
177 scrollBarModel.Create(proxy, true, true, directionValue, 0);
178 GetScrollBar();
179 CreateDone();
180 EXPECT_EQ(layoutProperty_->GetAxisValue(), Axis::VERTICAL);
181
182 int32_t stateValue = -1;
183 scrollBarModel.Create(proxy, true, true, 0, stateValue);
184 GetScrollBar();
185 CreateDone();
186 EXPECT_EQ(layoutProperty_->GetDisplayModeValue(), DisplayMode::AUTO);
187 stateValue = 100;
188 scrollBarModel.Create(proxy, true, true, 0, stateValue);
189 GetScrollBar();
190 CreateDone();
191 EXPECT_EQ(layoutProperty_->GetDisplayModeValue(), DisplayMode::AUTO);
192 }
193
194 /**
195 * @tc.name: ScrollBarModel002
196 * @tc.desc: ScrollBarModelNG GetScrollBarProxy
197 * @tc.type: FUNC
198 */
199 HWTEST_F(ScrollBarTestNg, ScrollBarModel002, TestSize.Level1)
200 {
201 ScrollBarModelNG scrollBarModel;
202 auto proxy = scrollBarModel.GetScrollBarProxy(nullptr);
203 EXPECT_NE(proxy, nullptr);
204 auto proxy2 = scrollBarModel.GetScrollBarProxy(proxy);
205 EXPECT_EQ(proxy, proxy2);
206 }
207
208 /**
209 * @tc.name: ScrollBarProxy001
210 * @tc.desc: ScrollBarProxy
211 * @tc.type: FUNC
212 */
213 HWTEST_F(ScrollBarTestNg, ScrollBarProxy001, TestSize.Level1)
214 {
215 ScrollBarModelNG scrollBarModel;
216 auto proxy = scrollBarModel.GetScrollBarProxy(nullptr);
217 CHECK_NULL_VOID(proxy);
218 auto scrollBarProxy = AceType::DynamicCast<NG::ScrollBarProxy>(proxy);
219 CHECK_NULL_VOID(scrollBarProxy);
220 ScrollableNodeInfo nodeInfo;
221 scrollBarProxy->RegisterScrollableNode(nodeInfo);
222 ASSERT_NE(scrollBarProxy, nullptr);
223 scrollBarProxy->RegisterScrollBar(nullptr);
224 scrollBarProxy->RegisterScrollBar(nullptr);
225 scrollBarProxy->RegisterNestScrollableNode(nodeInfo);
226 ASSERT_EQ(scrollBarProxy->scrollBars_.size(), 1);
227 scrollBarProxy->UnRegisterScrollBar(nullptr);
228 scrollBarProxy->UnRegisterScrollBar(nullptr);
229 ASSERT_EQ(scrollBarProxy->scrollBars_.size(), 0);
230 scrollBarProxy->RegisterScrollableNode(nodeInfo);
231 scrollBarProxy->RegisterScrollBar(nullptr);
232 scrollBarProxy->NotifyScrollableNode(0, 1, nullptr);
233 scrollBarProxy->NotifyScrollBarNode(0, 1);
234 scrollBarProxy->NotifyScrollStart();
235 scrollBarProxy->NotifyScrollStop();
236 scrollBarProxy->NotifyScrollBar();
237 scrollBarProxy->StartScrollBarAnimator();
238 scrollBarProxy->StopScrollBarAnimator();
239 scrollBarProxy->NotifySnapScroll(0, 0, 0, 0);
240 scrollBarProxy->CalcPatternOffset(0, 0, 0);
241 scrollBarProxy->SetScrollEnabled(true, nullptr);
242 }
243 } // namespace OHOS::Ace::NG