1/*
2 * Copyright (c) 2022 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 <gtest/gtest.h>
17#include "minimize_app.h"
18
19using namespace testing;
20using namespace testing::ext;
21
22namespace OHOS {
23namespace Rosen {
24class MinimizeAppTest : public testing::Test {
25public:
26    static void SetUpTestCase();
27    static void TearDownTestCase();
28    virtual void SetUp() override;
29    virtual void TearDown() override;
30
31    sptr<WindowProperty> CreateWindowProperty(uint32_t windowId);
32};
33
34void MinimizeAppTest::SetUpTestCase()
35{
36}
37
38void MinimizeAppTest::TearDownTestCase()
39{
40}
41
42void MinimizeAppTest::SetUp()
43{
44}
45
46void MinimizeAppTest::TearDown()
47{
48}
49
50sptr<WindowProperty> MinimizeAppTest::CreateWindowProperty(uint32_t windowId)
51{
52    sptr<WindowProperty> property = new WindowProperty();
53    property->SetWindowId(windowId);
54    return property;
55}
56namespace {
57/**
58 * @tc.name: MinimizeAppTest01
59 * @tc.desc: add and excute
60 * @tc.type: FUNC
61 */
62HWTEST_F(MinimizeAppTest, MinimizeAppTest01, Function | SmallTest | Level2)
63{
64    sptr<WindowNode> node1 = new WindowNode(CreateWindowProperty(1));
65    sptr<WindowNode> node2 = new WindowNode(CreateWindowProperty(2));
66    sptr<WindowNode> node3 = new WindowNode(CreateWindowProperty(3));
67    sptr<WindowNode> node4 = new WindowNode(CreateWindowProperty(4));
68    sptr<WindowNode> node5 = new WindowNode(CreateWindowProperty(5));
69    sptr<WindowNode> node6 = new WindowNode(CreateWindowProperty(6));
70    sptr<WindowNode> node7 = new WindowNode(CreateWindowProperty(7));
71    sptr<WindowNode> node8 = new WindowNode(CreateWindowProperty(8));
72    sptr<WindowNode> node9 = new WindowNode(CreateWindowProperty(9));
73
74    sptr<WindowNode> node10 = new WindowNode();
75    sptr<WindowNode> node11 = nullptr;
76    sptr<WindowNode> conflictNode = new WindowNode(CreateWindowProperty(2));
77
78    MinimizeApp::AddNeedMinimizeApp(node1, MinimizeReason::MINIMIZE_BUTTON);
79    MinimizeApp::AddNeedMinimizeApp(node2, MinimizeReason::MINIMIZE_ALL);
80    MinimizeApp::AddNeedMinimizeApp(node3, MinimizeReason::LAYOUT_TILE);
81    MinimizeApp::AddNeedMinimizeApp(node4, MinimizeReason::LAYOUT_CASCADE);
82    MinimizeApp::AddNeedMinimizeApp(node5, MinimizeReason::MAX_APP_COUNT);
83    MinimizeApp::AddNeedMinimizeApp(node6, MinimizeReason::SPLIT_REPLACE);
84    MinimizeApp::AddNeedMinimizeApp(node7, MinimizeReason::SPLIT_QUIT);
85    MinimizeApp::AddNeedMinimizeApp(node8, MinimizeReason::GESTURE_ANIMATION);
86    MinimizeApp::AddNeedMinimizeApp(node9, MinimizeReason::OTHER_WINDOW);
87    MinimizeApp::AddNeedMinimizeApp(conflictNode, MinimizeReason::MINIMIZE_ALL);
88
89    ASSERT_EQ(true, MinimizeApp::IsNodeNeedMinimize(node1));
90    ASSERT_EQ(true, MinimizeApp::IsNodeNeedMinimize(node2));
91    ASSERT_EQ(true, MinimizeApp::IsNodeNeedMinimize(node3));
92    ASSERT_EQ(true, MinimizeApp::IsNodeNeedMinimize(node4));
93    ASSERT_EQ(true, MinimizeApp::IsNodeNeedMinimize(node5));
94    ASSERT_EQ(true, MinimizeApp::IsNodeNeedMinimize(node6));
95    ASSERT_EQ(true, MinimizeApp::IsNodeNeedMinimize(node7));
96    ASSERT_EQ(true, MinimizeApp::IsNodeNeedMinimize(node8));
97    ASSERT_EQ(true, MinimizeApp::IsNodeNeedMinimize(node9));
98
99    ASSERT_EQ(false, MinimizeApp::IsNodeNeedMinimize(node10));
100    ASSERT_EQ(false, MinimizeApp::IsNodeNeedMinimize(node11));
101    ASSERT_EQ(false, MinimizeApp::IsNodeNeedMinimize(conflictNode));
102
103    MinimizeApp::ExecuteMinimizeTargetReasons(MinimizeReason::SPLIT_REPLACE);
104    MinimizeApp::ExecuteMinimizeAll();
105}
106/**
107 * @tc.name: MinimizeAppTest02
108 * @tc.desc: add, find and clear
109 * @tc.type: FUNC
110 */
111HWTEST_F(MinimizeAppTest, MinimizeAppTest02, Function | SmallTest | Level2)
112{
113    sptr<WindowNode> node1 = new WindowNode();
114
115    MinimizeApp::AddNeedMinimizeApp(node1, MinimizeReason::MINIMIZE_ALL);
116
117    auto getNodes = MinimizeApp::GetNeedMinimizeAppNodesWithReason(MinimizeReason::MINIMIZE_ALL);
118    ASSERT_EQ(node1, getNodes[0]);
119
120    MinimizeApp::ClearNodesWithReason(MinimizeReason::MINIMIZE_ALL);
121}
122/**
123 * @tc.name: MinimizeAppTest03
124 * @tc.desc: add and find
125 * @tc.type: FUNC
126 */
127HWTEST_F(MinimizeAppTest, MinimizeAppTest03, Function | SmallTest | Level2)
128{
129    MinimizeApp::SetMinimizedByOtherConfig(false);
130    sptr<WindowNode> node1 = new WindowNode();
131
132    MinimizeApp::AddNeedMinimizeApp(node1, MinimizeReason::OTHER_WINDOW);
133    ASSERT_EQ(false, MinimizeApp::IsNodeNeedMinimize(node1));
134    MinimizeApp::SetMinimizedByOtherConfig(true);
135
136    MinimizeApp::ClearNodesWithReason(MinimizeReason::OTHER_WINDOW);
137}
138/**
139 * @tc.name: MinimizeAppTest04
140 * @tc.desc: add and recover
141 * @tc.type: FUNC
142 */
143HWTEST_F(MinimizeAppTest, MinimizeAppTest04, Function | SmallTest | Level2)
144{
145    sptr<WindowNode> node1 = new WindowNode();
146    MinimizeApp::AddNeedMinimizeApp(node1, MinimizeReason::LAYOUT_TILE);
147
148    ASSERT_EQ(node1, MinimizeApp::GetRecoverdNodeFromMinimizeList());
149    ASSERT_EQ(nullptr, MinimizeApp::GetRecoverdNodeFromMinimizeList());
150
151    MinimizeApp::ClearNodesWithReason(MinimizeReason::LAYOUT_TILE);
152}
153/**
154 * @tc.name: MinimizeAppTest05
155 * @tc.desc: insert nullptr to needMinimizeAppNodes_
156 * @tc.type: FUNC
157 */
158HWTEST_F(MinimizeAppTest, MinimizeAppTest05, Function | SmallTest | Level2)
159{
160    MinimizeApp::needMinimizeAppNodes_[MinimizeReason::MINIMIZE_ALL].emplace_back(nullptr);
161    auto getNodes = MinimizeApp::GetNeedMinimizeAppNodesWithReason(MinimizeReason::MINIMIZE_ALL);
162    ASSERT_EQ(nullptr, getNodes[0].promote());
163
164    sptr<WindowNode> node1 = new WindowNode();
165    MinimizeApp::AddNeedMinimizeApp(node1, MinimizeReason::MINIMIZE_ALL);
166    auto getNodes2 = MinimizeApp::GetNeedMinimizeAppNodesWithReason(MinimizeReason::MINIMIZE_ALL);
167    ASSERT_EQ(node1, getNodes2[1]);
168
169    MinimizeApp::ClearNodesWithReason(MinimizeReason::MINIMIZE_ALL);
170}
171/**
172 * @tc.name: IsNodeNeedMinimizeWithReason
173 * @tc.desc: check node need minimize or not
174 * @tc.type: FUNC
175 */
176HWTEST_F(MinimizeAppTest, IsNodeNeedMinimizeWithReason01, Function | SmallTest | Level2)
177{
178    ASSERT_EQ(false, MinimizeApp::IsNodeNeedMinimizeWithReason(nullptr, MinimizeReason::MINIMIZE_ALL));
179
180    sptr<WindowNode> node1 = new WindowNode();
181    sptr<WindowNode> node2 = new WindowNode();
182    MinimizeApp::AddNeedMinimizeApp(node1, MinimizeReason::MINIMIZE_BUTTON);
183    MinimizeApp::AddNeedMinimizeApp(node2, MinimizeReason::MINIMIZE_ALL);
184
185    ASSERT_EQ(false, MinimizeApp::IsNodeNeedMinimizeWithReason(node1, MinimizeReason::GESTURE_ANIMATION));
186    ASSERT_EQ(false, MinimizeApp::IsNodeNeedMinimizeWithReason(node1, MinimizeReason::MINIMIZE_ALL));
187    ASSERT_EQ(true, MinimizeApp::IsNodeNeedMinimizeWithReason(node1, MinimizeReason::MINIMIZE_BUTTON));
188
189    MinimizeApp::ClearNodesWithReason(MinimizeReason::MINIMIZE_ALL);
190    MinimizeApp::ClearNodesWithReason(MinimizeReason::MINIMIZE_BUTTON);
191}
192/**
193 * @tc.name: ClearNodesWithReason
194 * @tc.desc: clear node with reason
195 * @tc.type: FUNC
196 */
197HWTEST_F(MinimizeAppTest, ClearNodesWithReason01, Function | SmallTest | Level2)
198{
199    sptr<WindowNode> node1 = new WindowNode();
200    sptr<WindowNode> node2 = new WindowNode();
201    MinimizeApp::AddNeedMinimizeApp(node1, MinimizeReason::MINIMIZE_BUTTON);
202    MinimizeApp::AddNeedMinimizeApp(node2, MinimizeReason::MINIMIZE_ALL);
203
204    MinimizeApp::ClearNodesWithReason(MinimizeReason::MINIMIZE_ALL);
205    ASSERT_EQ(0, MinimizeApp::GetNeedMinimizeAppNodesWithReason(MinimizeReason::MINIMIZE_ALL).size());
206    MinimizeApp::ClearNodesWithReason(MinimizeReason::GESTURE_ANIMATION);
207    ASSERT_EQ(1, MinimizeApp::GetNeedMinimizeAppNodesWithReason(MinimizeReason::MINIMIZE_BUTTON).size());
208}
209/**
210 * @tc.name: GetRecoverdNodeFromMinimizeList
211 * @tc.desc: Get recoverd node from list
212 * @tc.type: FUNC
213 */
214HWTEST_F(MinimizeAppTest, GetRecoverdNodeFromMinimizeList01, Function | SmallTest | Level2)
215{
216    sptr<WindowNode> node1 = new WindowNode();
217    MinimizeApp::AddNeedMinimizeApp(node1, MinimizeReason::MINIMIZE_BUTTON);
218
219    ASSERT_EQ(nullptr, MinimizeApp::GetRecoverdNodeFromMinimizeList());
220    MinimizeApp::ClearNodesWithReason(MinimizeReason::MINIMIZE_BUTTON);
221}
222/**
223 * @tc.name: IsNodeNeedMinimize
224 * @tc.desc: check node need minize or not
225 * @tc.type: FUNC
226 */
227HWTEST_F(MinimizeAppTest, IsNodeNeedMinimize01, Function | SmallTest | Level2)
228{
229    ASSERT_EQ(false, MinimizeApp::IsNodeNeedMinimize(nullptr));
230}
231/**
232 * @tc.name: ExecuteMinimizeTargetReasons
233 * @tc.desc: Execute Minimize With TargetReason
234 * @tc.type: FUNC
235 */
236HWTEST_F(MinimizeAppTest, ExecuteMinimizeTargetReasons01, Function | SmallTest | Level2)
237{
238    sptr<WindowNode> node1 = new WindowNode();
239    MinimizeApp::AddNeedMinimizeApp(node1, MinimizeReason::MINIMIZE_BUTTON);
240
241    MinimizeApp::ExecuteMinimizeTargetReasons(MinimizeReason::MINIMIZE_BUTTON);
242    ASSERT_EQ(0, MinimizeApp::GetNeedMinimizeAppNodesWithReason(MinimizeReason::MINIMIZE_BUTTON).size());
243
244    MinimizeApp::AddNeedMinimizeApp(node1, MinimizeReason::MINIMIZE_BUTTON);
245    MinimizeApp::ExecuteMinimizeTargetReasons(MinimizeReason::GESTURE_ANIMATION);
246    ASSERT_EQ(1, MinimizeApp::GetNeedMinimizeAppNodesWithReason(MinimizeReason::MINIMIZE_BUTTON).size());
247}
248}
249}
250}
251