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 "window_manager_service.h"
18
19 using namespace testing;
20 using namespace testing::ext;
21
22 namespace OHOS {
23 namespace Rosen {
24 using ConfigItem = WindowManagerConfig::ConfigItem;
25 const std::string XML_STR = R"(<?xml version='1.0' encoding="utf-8"?>
26 <Configs>
27 <!--decor enable is true means app main window show decoration-->
28 <decor enable="false"></decor>
29 <!--max number of main window that could be shown on display-->
30 <maxAppWindowNumber>100</maxAppWindowNumber>
31 <!--maximum number of windows supported by unified rendering -->
32 <maxUniRenderAppWindowNumber>99</maxUniRenderAppWindowNumber>
33 <!--minimizeByOther enable is true means fullscreen window will be minmized by other fullscreen window-->
34 <minimizeByOther enable="true"></minimizeByOther>
35 <!--window mdoe change hot zones config, fullscreen primary secondary-->
36 <modeChangeHotZones>50 50 50</modeChangeHotZones>
37 <!--stretchable enable is true means all window be stretchable-->
38 <stretchable enable="false"></stretchable>
39 <!--exit split screen mode ratio config-->
40 <exitSplitRatios>0.1 0.9</exitSplitRatios>
41 <!--split screen ratios config-->
42 <splitRatios>0.5 0.33 0.67</splitRatios>
43 <!--default window mode config-->
44 <defaultWindowMode>1</defaultWindowMode>
45 <!--window animation config-->
46 <windowAnimation>
47 <timing>
48 <!--duration of animation when add/remove window, unit is ms-->
49 <duration>350</duration>
50 <!--timing curve of animation, config it as below:
51 name=ease, easeIn, easeOut, easeInOut, default, linear,
52 spring, interactiveSpring, cubic(float float float float)-->
53 <curve name="easeOut"></curve>
54 </timing>
55 <!--scaleX and scaleY of animation start state-->
56 <scale>0.7 0.7</scale>
57 <!--rotation of animation start state, 4 numbers is axis and angle-->
58 <rotation>0 0 1 0</rotation>
59 <!--translateX and translateY of animation start state-->
60 <translate>0 0</translate>
61 <!--opacity of animation start state-->
62 <opacity>0</opacity>
63 </windowAnimation>
64 <!--keyboard animation config-->
65 <keyboardAnimation>
66 <timing>
67 <!--duration of animation when add keyboard, unit is ms-->
68 <durationIn>500</durationIn>
69 <!--duration of animation when remove keyboard, unit is ms-->
70 <durationOut>300</durationOut>
71 <!--friction curve-->
72 <curve name="cubic">0.2 0.0 0.2 1.0</curve>
73 </timing>
74 </keyboardAnimation>
75 <!--enable/disable remote animation-->
76 <remoteAnimation enable="true"></remoteAnimation>
77 <!--window effect config-->
78 <windowEffect>
79 <appWindows>
80 <cornerRadius>
81 <!--off: no corner, defaultCornerRadiusXS: 4vp, defaultCornerRadiusS: 8vp-->
82 <!--defaultCornerRadiusM: 12vp, defaultCornerRadiusL: 16vp, defaultCornerRadiusXL: 24vp-->
83 <fullScreen>off</fullScreen>
84 <split>off</split>
85 <float>off</float>
86 </cornerRadius>
87 <shadow>
88 <focused>
89 <elevation>0</elevation>
90 <color>#000000</color>
91 <offsetX>0</offsetX>
92 <offsetY>0</offsetY>
93 <alpha>0</alpha>
94 </focused>
95 <unfocused>
96 <elevation>0</elevation>
97 <color>#000000</color>
98 <offsetX>0</offsetX>
99 <offsetY>0</offsetY>
100 <alpha>0</alpha>
101 </unfocused>
102 </shadow>
103 </appWindows>
104 </windowEffect>
105 </Configs>
106 )";
107
108 class WindowManagerConfigTest : public testing::Test {
109 public:
110 static void SetUpTestCase();
111 static void TearDownTestCase();
112 virtual void SetUp() override;
113 virtual void TearDown() override;
114 ConfigItem ReadConfig(const std::string& xmlStr);
115 };
116
SetUpTestCase()117 void WindowManagerConfigTest::SetUpTestCase()
118 {
119 }
120
TearDownTestCase()121 void WindowManagerConfigTest::TearDownTestCase()
122 {
123 }
124
SetUp()125 void WindowManagerConfigTest::SetUp()
126 {
127 }
128
TearDown()129 void WindowManagerConfigTest::TearDown()
130 {
131 }
132
ReadConfig(const std::string & xmlStr)133 ConfigItem WindowManagerConfigTest::ReadConfig(const std::string& xmlStr)
134 {
135 ConfigItem config;
136 xmlDocPtr docPtr = xmlParseMemory(xmlStr.c_str(), xmlStr.length() + 1);
137 if (docPtr == nullptr) {
138 return config;
139 }
140
141 xmlNodePtr rootPtr = xmlDocGetRootElement(docPtr);
142 if (rootPtr == nullptr || rootPtr->name == nullptr ||
143 xmlStrcmp(rootPtr->name, reinterpret_cast<const xmlChar*>("Configs"))) {
144 xmlFreeDoc(docPtr);
145 return config;
146 }
147
148 std::map<std::string, ConfigItem> configMap;
149 config.SetValue(configMap);
150 WindowManagerConfig::ReadConfig(rootPtr, *config.mapValue_);
151 xmlFreeDoc(docPtr);
152 return config;
153 }
154 namespace {
155 /**
156 * @tc.name: AnimationConfig
157 * @tc.desc: animation config test
158 * @tc.type: FUNC
159 * @tc.require issueI5N26H
160 */
161 HWTEST_F(WindowManagerConfigTest, AnimationConfig, Function | SmallTest | Level2)
162 {
163 WindowManagerConfig::config_ = ReadConfig(XML_STR);
164 WindowManagerService::GetInstance().ConfigureWindowManagerService();
165 ConfigItem item = WindowManagerConfig::config_["windowAnimation"];
166 ASSERT_EQ(true, item.IsMap());
167 item = WindowManagerConfig::config_["windowAnimation"]["timing"]["duration"];
168 ASSERT_EQ(true, item.IsInts());
169 auto value = *item.intsValue_;
170 ASSERT_EQ(true, value.size() == 1);
171 ASSERT_EQ(350, value[0]);
172 item = WindowManagerConfig::config_["windowAnimation"]["timing"]["curve"].GetProp("name");
173 ASSERT_EQ(true, item.IsString());
174 ASSERT_EQ("easeOut", item.stringValue_);
175 item = WindowManagerConfig::config_["windowAnimation"]["scale"];
176 ASSERT_EQ(true, item.IsFloats());
177 ASSERT_EQ(true, item.floatsValue_->size() == 2);
178 item = WindowManagerConfig::config_["windowAnimation"]["rotation"];
179 ASSERT_EQ(true, item.IsFloats());
180 ASSERT_EQ(true, item.floatsValue_->size() == 4);
181 item = WindowManagerConfig::config_["windowAnimation"]["translate"];
182 ASSERT_EQ(true, item.IsFloats());
183 ASSERT_EQ(true, item.floatsValue_->size() == 2);
184 item = WindowManagerConfig::config_["windowAnimation"]["opacity"];
185 ASSERT_EQ(true, item.IsFloats());
186 ASSERT_EQ(true, item.floatsValue_->size() == 1);
187 }
188
189 /**
190 * @tc.name: maxAppWindowNumber
191 * @tc.desc: maxAppWindowNumber test
192 * @tc.type: FUNC
193 */
194 HWTEST_F(WindowManagerConfigTest, MaxAppWindowNumber, Function | SmallTest | Level2)
195 {
196 std::string xmlStr = "<?xml version='1.0' encoding=\"utf-8\"?>"
197 "<Configs>"
198 "<maxAppWindowNumber>0</maxAppWindowNumber>"
199 "</Configs>";
200 WindowManagerConfig::config_ = ReadConfig(xmlStr);
201 WindowManagerService::GetInstance().ConfigureWindowManagerService();
202 ASSERT_EQ(true, WindowManagerService::GetInstance().windowRoot_->maxAppWindowNumber_ == 100);
203
204 xmlStr = "<?xml version='1.0' encoding=\"utf-8\"?>"
205 "<Configs>"
206 "<maxAppWindowNumber>-2</maxAppWindowNumber>"
207 "</Configs>";
208 WindowManagerConfig::config_ = ReadConfig(xmlStr);
209 WindowManagerService::GetInstance().ConfigureWindowManagerService();
210 ASSERT_EQ(true, WindowManagerService::GetInstance().windowRoot_->maxAppWindowNumber_ == 100);
211
212 xmlStr = "<?xml version='1.0' encoding=\"utf-8\"?>"
213 "<Configs>"
214 "<maxAppWindowNumber>4</maxAppWindowNumber>"
215 "</Configs>";
216 WindowManagerConfig::config_ = ReadConfig(xmlStr);
217 WindowManagerService::GetInstance().ConfigureWindowManagerService();
218 ASSERT_EQ(true, WindowManagerService::GetInstance().windowRoot_->maxAppWindowNumber_ == 4);
219
220 xmlStr = "<?xml version='1.0' encoding=\"utf-8\"?>"
221 "<Configs>"
222 "<maxAppWindowNumber>1000</maxAppWindowNumber>"
223 "</Configs>";
224 WindowManagerConfig::config_ = ReadConfig(xmlStr);
225 WindowManagerService::GetInstance().ConfigureWindowManagerService();
226 ASSERT_EQ(true, WindowManagerService::GetInstance().windowRoot_->maxAppWindowNumber_ == 1000);
227 }
228
229 /**
230 * @tc.name: decor
231 * @tc.desc: set decor true and false.
232 * @tc.type: FUNC
233 */
234 HWTEST_F(WindowManagerConfigTest, Decor, Function | SmallTest | Level2)
235 {
236 std::string xmlStr = "<?xml version='1.0' encoding=\"utf-8\"?>"
237 "<Configs>"
238 "<decor enable=\"true\"/>"
239 "</Configs>";
240 WindowManagerConfig::config_ = ReadConfig(xmlStr);
241 WindowManagerService::GetInstance().ConfigureWindowManagerService();
242 ASSERT_EQ(true, WindowManagerService::GetInstance().systemConfig_.isSystemDecorEnable_);
243
244 xmlStr = "<?xml version='1.0' encoding=\"utf-8\"?>"
245 "<Configs>"
246 "<decor enable=\"false\"/>"
247 "</Configs>";
248 WindowManagerConfig::config_ = ReadConfig(xmlStr);
249 WindowManagerService::GetInstance().ConfigureWindowManagerService();
250 ASSERT_EQ(false, WindowManagerService::GetInstance().systemConfig_.isSystemDecorEnable_);
251 }
252 } // namespace
253 } // namespace Rosen
254 } // namespace OHOS