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