1 /*
2 * SPDX-License-Identifier: Apache-2.0
3 * Copyright (c) 2025 Huawei Device Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include "gtest/gtest.h"
17
18 #define private public
19 #define protected public
20 #include "test/mock/core/common/mock_resource_adapter.h"
21 #include "test/mock/core/common/mock_theme_manager.h"
22 #include "test/mock/core/pipeline/mock_pipeline_context.h"
23 #include "test/mock/core/render/mock_render_context.h"
24 #include "test/unittest/core/event/focus_core/focus_creatbox_test.h"
25 #include "test/unittest/core/pattern/test_ng.h"
26
27 #include "base/log/log_wrapper.h"
28 #include "core/components/container_modal/container_modal_constants.h"
29 #include "core/components/theme/theme_constants.h"
30 #include "core/components_ng/base/ui_node.h"
31 #include "core/components_ng/base/view_stack_processor.h"
32 #include "core/components_ng/event/focus_box.h"
33 #include "core/components_ng/event/focus_hub.h"
34 #include "core/components_ng/manager/focus/focus_manager.h"
35 #include "core/components_ng/pattern/button/button_pattern.h"
36 #include "core/components_ng/pattern/container_modal/container_modal_pattern.h"
37 #include "core/components_ng/pattern/container_modal/container_modal_theme.h"
38 #include "core/components_ng/pattern/container_modal/container_modal_view.h"
39 #include "core/components_ng/pattern/image/image_layout_property.h"
40 #include "core/components_ng/pattern/image/image_pattern.h"
41 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h"
42 #include "core/components_ng/pattern/pattern.h"
43 #include "core/components_ng/pattern/root/root_pattern.h"
44 #include "core/components_ng/pattern/stack/stack_pattern.h"
45 #include "core/components_ng/pattern/text/text_pattern.h"
46 #include "core/components_ng/pattern/text_picker/textpicker_column_pattern.h"
47 #include "core/pipeline_ng/pipeline_context.h"
48
49 using namespace testing;
50 using namespace testing::ext;
51 namespace OHOS::Ace::NG {
52 NG::FocusBoxStyle styleType;
53
54 const std::vector<FocusCreatBoxTestCase> FOCUS_Creat_Box_CASES = {
55 // case1
56 FocusCreatBoxTestCase(FocusBoxPolyMorPhismStyle { true, true, true },
57 FocusBoxStyleType { FocusStyleType::NONE, FocusStyleType::NONE, FocusStyleType::NONE },
58 FocusBoxDependence { true, true }),
59 // case2
60 FocusCreatBoxTestCase(FocusBoxPolyMorPhismStyle { true, true, true },
61 FocusBoxStyleType { FocusStyleType::NONE, FocusStyleType::NONE, FocusStyleType::NONE },
62 FocusBoxDependence { true, false }),
63 // case3
64 FocusCreatBoxTestCase(FocusBoxPolyMorPhismStyle { true, true, true },
65 FocusBoxStyleType { FocusStyleType::NONE, FocusStyleType::NONE, FocusStyleType::NONE },
66 FocusBoxDependence { false, true }),
67 // case4
68 FocusCreatBoxTestCase(FocusBoxPolyMorPhismStyle { true, true, true },
69 FocusBoxStyleType { FocusStyleType::NONE, FocusStyleType::NONE, FocusStyleType::NONE },
70 FocusBoxDependence { false, false }),
71 };
72
SetUpTestSuite()73 void FocusCreatBoxTestNG::SetUpTestSuite()
74 {
75 MockPipelineContext::SetUp();
76 GTEST_LOG_(INFO) << "FocusCreatBoxTestNG SetUpTestCase";
77 }
78
TearDownTestSuite()79 void FocusCreatBoxTestNG::TearDownTestSuite()
80 {
81 MockPipelineContext::TearDown();
82 GTEST_LOG_(INFO) << "FocusCreatBoxTestNG TearDownTestCase";
83 }
CreatNode()84 RefPtr<FrameNode> FocusCreatBoxTestNG::CreatNode()
85 {
86 auto node = CreateNodeWithFocusPattern("node", FocusType::NODE, true);
87 EXPECT_NE(node, nullptr);
88 node->UpdateInspectorId("NODE");
89 return node;
90 }
FocusPolyMorPhismStyle(bool testCase,const RefPtr<FocusHub> & focusHub)91 void FocusCreatBoxTestNG::FocusPolyMorPhismStyle(bool testCase, const RefPtr<FocusHub>& focusHub)
92 {
93 styleType.strokeColor = Color::RED;
94 if (testCase) {
95 focusHub->GetFocusBox().SetStyle(styleType);
96 auto style = focusHub->GetFocusBox().GetStyle().value();
97 EXPECT_EQ(style.strokeColor, Color::RED);
98 }
99 }
SetDependence(bool testCase,const RefPtr<FocusHub> & focusHub)100 void FocusCreatBoxTestNG::SetDependence(bool testCase, const RefPtr<FocusHub>& focusHub)
101 {
102 if (testCase) {
103 focusHub->SetFocusDependence(FocusDependence::SELF);
104 } else {
105 focusHub->SetFocusDependence(FocusDependence::AUTO);
106 }
107 }
InitFocusCreatBox()108 void FocusCreatBoxTestNG::InitFocusCreatBox()
109 {
110 for (const auto& testCase : FOCUS_Creat_Box_CASES) {
111 auto rootNode = CreateRootNode();
112 auto rootNodeFocusHub = rootNode->GetOrCreateFocusHub();
113 EXPECT_NE(rootNodeFocusHub, nullptr);
114
115 auto nodeA = CreatNode();
116 auto focusHubA = nodeA->GetOrCreateFocusHub();
117 focusHubA->SetFocusStyleType(testCase.focusStyleType.focusAStyleType);
118
119 auto nodeB = CreatNode();
120 auto focusHubB = nodeB->GetOrCreateFocusHub();
121 focusHubB->SetFocusStyleType(testCase.focusStyleType.focusBStyleType);
122
123 auto nodeC = CreatNode();
124 auto focusHubC = nodeC->GetOrCreateFocusHub();
125 focusHubC->SetFocusStyleType(testCase.focusStyleType.focusCStyleType);
126
127 FocusPolyMorPhismStyle(testCase.style.isAFocusBoxStyle, focusHubA);
128 FocusPolyMorPhismStyle(testCase.style.isBFocusBoxStyle, focusHubB);
129 FocusPolyMorPhismStyle(testCase.style.isCFocusBoxStyle, focusHubC);
130
131 rootNode->AddChild(nodeA);
132 nodeA->AddChild(nodeB);
133 nodeB->AddChild(nodeC);
134
135 SetDependence(testCase.isDependence.isADependence, focusHubA);
136 SetDependence(testCase.isDependence.isBDependence, focusHubB);
137
138 focusHubA->RequestFocusImmediately();
139 focusHubB->RequestFocusImmediately();
140 focusHubC->RequestFocusImmediately();
141 if ((testCase.isDependence.isADependence && testCase.isDependence.isBDependence) ||
142 (testCase.isDependence.isADependence && !testCase.isDependence.isBDependence)) {
143 rootNodeFocusHub->lastWeakFocusNode_ = AceType::WeakClaim(AceType::RawPtr(focusHubA));
144 auto res = rootNodeFocusHub->PaintAllFocusState();
145 EXPECT_TRUE(res);
146 EXPECT_EQ(focusManager_->GetLastFocusStateNode(), focusHubA);
147 }
148 if (!testCase.isDependence.isADependence && testCase.isDependence.isBDependence) {
149 rootNodeFocusHub->lastWeakFocusNode_ = AceType::WeakClaim(AceType::RawPtr(focusHubA));
150 focusHubA->lastWeakFocusNode_ = AceType::WeakClaim(AceType::RawPtr(focusHubB));
151 auto res = rootNodeFocusHub->PaintAllFocusState();
152 EXPECT_TRUE(res);
153 ASSERT_EQ(focusManager_->GetLastFocusStateNode(), focusHubB);
154 }
155 if (!testCase.isDependence.isADependence && !testCase.isDependence.isBDependence) {
156 rootNodeFocusHub->lastWeakFocusNode_ = AceType::WeakClaim(AceType::RawPtr(focusHubA));
157 focusHubA->lastWeakFocusNode_ = AceType::WeakClaim(AceType::RawPtr(focusHubB));
158 focusHubB->lastWeakFocusNode_ = AceType::WeakClaim(AceType::RawPtr(focusHubC));
159 auto res = rootNodeFocusHub->PaintAllFocusState();
160 EXPECT_TRUE(res);
161 EXPECT_EQ(focusManager_->GetLastFocusStateNode(), focusHubC);
162 }
163 }
164 }
165
166 HWTEST_F(FocusCreatBoxTestNG, FocusCreatBoxTestNG001, TestSize.Level1)
167 {
168 bool initResult = InitFocusTestBaseNG();
169 EXPECT_TRUE(initResult);
170 InitFocusCreatBox();
171 }
172 } // namespace OHOS::Ace::NG
173