1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License.
5e0dac50fSopenharmony_ci * You may obtain a copy of the License at
6e0dac50fSopenharmony_ci *
7e0dac50fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0dac50fSopenharmony_ci *
9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and
13e0dac50fSopenharmony_ci * limitations under the License.
14e0dac50fSopenharmony_ci */
15e0dac50fSopenharmony_ci
16e0dac50fSopenharmony_ci#include <gtest/gtest.h>
17e0dac50fSopenharmony_ci
18e0dac50fSopenharmony_ci#include "surface_draw.h"
19e0dac50fSopenharmony_ci#include "display.h"
20e0dac50fSopenharmony_ci#include "display_info.h"
21e0dac50fSopenharmony_ci#include "display_manager.h"
22e0dac50fSopenharmony_ci#include "display_manager_proxy.h"
23e0dac50fSopenharmony_ci#include "window_impl.h"
24e0dac50fSopenharmony_ci
25e0dac50fSopenharmony_ciusing namespace testing;
26e0dac50fSopenharmony_ciusing namespace testing::ext;
27e0dac50fSopenharmony_ci
28e0dac50fSopenharmony_cinamespace OHOS {
29e0dac50fSopenharmony_cinamespace Rosen {
30e0dac50fSopenharmony_cinamespace {
31e0dac50fSopenharmony_ciconst std::string IMAGE_PLACE_HOLDER_PNG_PATH = "/etc/window/resources/bg_place_holder.png";
32e0dac50fSopenharmony_ciconst int WAIT_FOR_SYNC_US = 1000 * 500;  // 500ms
33e0dac50fSopenharmony_ci}
34e0dac50fSopenharmony_ciclass SurfaceDrawTest : public testing::Test {
35e0dac50fSopenharmony_cipublic:
36e0dac50fSopenharmony_ci    static void SetUpTestCase();
37e0dac50fSopenharmony_ci    static void TearDownTestCase();
38e0dac50fSopenharmony_ci    void SetUp() override;
39e0dac50fSopenharmony_ci    void TearDown() override;
40e0dac50fSopenharmony_ci
41e0dac50fSopenharmony_cipublic:
42e0dac50fSopenharmony_ci    struct WindowTestInfo {
43e0dac50fSopenharmony_ci        std::string name;
44e0dac50fSopenharmony_ci        Rect rect;
45e0dac50fSopenharmony_ci        WindowType type;
46e0dac50fSopenharmony_ci        WindowMode mode;
47e0dac50fSopenharmony_ci        bool needAvoid;
48e0dac50fSopenharmony_ci        bool parentLimit;
49e0dac50fSopenharmony_ci        bool forbidSplitMove {false};
50e0dac50fSopenharmony_ci        bool showWhenLocked;
51e0dac50fSopenharmony_ci        uint32_t parentId;
52e0dac50fSopenharmony_ci    };
53e0dac50fSopenharmony_ci    sptr<Window> CreateTestWindow(const std::string& name);
54e0dac50fSopenharmony_ci
55e0dac50fSopenharmony_ci    static inline DisplayId displayId_;
56e0dac50fSopenharmony_ci    static inline int32_t displayWidth_;
57e0dac50fSopenharmony_ci    static inline int32_t displayHeight_;
58e0dac50fSopenharmony_ci    WindowTestInfo windowInfo_;
59e0dac50fSopenharmony_ci};
60e0dac50fSopenharmony_ci
61e0dac50fSopenharmony_civoid SurfaceDrawTest::SetUpTestCase()
62e0dac50fSopenharmony_ci{
63e0dac50fSopenharmony_ci    displayId_ = DisplayManager::GetInstance().GetDefaultDisplayId();
64e0dac50fSopenharmony_ci    sptr<Display> display = DisplayManager::GetInstance().GetDefaultDisplay();
65e0dac50fSopenharmony_ci    if (display == nullptr) {
66e0dac50fSopenharmony_ci        return;
67e0dac50fSopenharmony_ci    }
68e0dac50fSopenharmony_ci    displayWidth_ = display->GetWidth();
69e0dac50fSopenharmony_ci    displayHeight_ = display->GetHeight();
70e0dac50fSopenharmony_ci}
71e0dac50fSopenharmony_ci
72e0dac50fSopenharmony_civoid SurfaceDrawTest::TearDownTestCase()
73e0dac50fSopenharmony_ci{
74e0dac50fSopenharmony_ci}
75e0dac50fSopenharmony_ci
76e0dac50fSopenharmony_civoid SurfaceDrawTest::SetUp()
77e0dac50fSopenharmony_ci{
78e0dac50fSopenharmony_ci    windowInfo_ = {
79e0dac50fSopenharmony_ci        .name = "main",
80e0dac50fSopenharmony_ci        .rect = {100, 100, 250, 300},
81e0dac50fSopenharmony_ci        .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW,
82e0dac50fSopenharmony_ci        .mode = WindowMode::WINDOW_MODE_FLOATING,
83e0dac50fSopenharmony_ci        .needAvoid = true,
84e0dac50fSopenharmony_ci        .parentLimit = false,
85e0dac50fSopenharmony_ci        .parentId = INVALID_WINDOW_ID,
86e0dac50fSopenharmony_ci    };
87e0dac50fSopenharmony_ci}
88e0dac50fSopenharmony_ci
89e0dac50fSopenharmony_civoid SurfaceDrawTest::TearDown()
90e0dac50fSopenharmony_ci{
91e0dac50fSopenharmony_ci}
92e0dac50fSopenharmony_ci
93e0dac50fSopenharmony_cisptr<Window> SurfaceDrawTest::CreateTestWindow(const std::string& name)
94e0dac50fSopenharmony_ci{
95e0dac50fSopenharmony_ci    sptr<WindowOption> option = new (std::nothrow)WindowOption();
96e0dac50fSopenharmony_ci    if (option == nullptr) {
97e0dac50fSopenharmony_ci        return nullptr;
98e0dac50fSopenharmony_ci    }
99e0dac50fSopenharmony_ci    option->SetDisplayId(displayId_);
100e0dac50fSopenharmony_ci    option->SetWindowType(windowInfo_.type);
101e0dac50fSopenharmony_ci    option->SetWindowRect(windowInfo_.rect);
102e0dac50fSopenharmony_ci    option->SetWindowMode(windowInfo_.mode);
103e0dac50fSopenharmony_ci    option->SetWindowName(name);
104e0dac50fSopenharmony_ci    sptr<Window> window = Window::Create(option->GetWindowName(), option);
105e0dac50fSopenharmony_ci    if (window == nullptr) {
106e0dac50fSopenharmony_ci        return nullptr;
107e0dac50fSopenharmony_ci    }
108e0dac50fSopenharmony_ci    window->AddWindowFlag(WindowFlag::WINDOW_FLAG_SHOW_WHEN_LOCKED);
109e0dac50fSopenharmony_ci    return window;
110e0dac50fSopenharmony_ci}
111e0dac50fSopenharmony_ci
112e0dac50fSopenharmony_cinamespace {
113e0dac50fSopenharmony_ci/**
114e0dac50fSopenharmony_ci * @tc.name: DrawImage
115e0dac50fSopenharmony_ci * @tc.desc: SurfaceDraw::DrawImage test
116e0dac50fSopenharmony_ci * @tc.type: FUNC
117e0dac50fSopenharmony_ci */
118e0dac50fSopenharmony_ciHWTEST_F(SurfaceDrawTest, DrawImage01, Function | SmallTest | Level1)
119e0dac50fSopenharmony_ci{
120e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::DrawImage(nullptr, 0, 0, ""));
121e0dac50fSopenharmony_ci    sptr<Window> window = CreateTestWindow("testDrawImage");
122e0dac50fSopenharmony_ci    if (window == nullptr) {
123e0dac50fSopenharmony_ci        return;
124e0dac50fSopenharmony_ci    }
125e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, window);
126e0dac50fSopenharmony_ci    window->Show();
127e0dac50fSopenharmony_ci    usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated
128e0dac50fSopenharmony_ci
129e0dac50fSopenharmony_ci    auto surfaceNode = window->GetSurfaceNode();
130e0dac50fSopenharmony_ci    ASSERT_NE(surfaceNode, nullptr);
131e0dac50fSopenharmony_ci    usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated
132e0dac50fSopenharmony_ci    uint32_t width = window->GetRect().width_;
133e0dac50fSopenharmony_ci    uint32_t height = window->GetRect().height_;
134e0dac50fSopenharmony_ci    SurfaceDraw::DrawImage(surfaceNode, width, height, IMAGE_PLACE_HOLDER_PNG_PATH);
135e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::DrawImage(surfaceNode, -1, -1, IMAGE_PLACE_HOLDER_PNG_PATH));
136e0dac50fSopenharmony_ci    window->Destroy();
137e0dac50fSopenharmony_ci}
138e0dac50fSopenharmony_ci/**
139e0dac50fSopenharmony_ci * @tc.name: DecodeImageToPixelMap
140e0dac50fSopenharmony_ci * @tc.desc: SurfaceDraw::DecodeImageToPixelMap test
141e0dac50fSopenharmony_ci * @tc.type: FUNC
142e0dac50fSopenharmony_ci */
143e0dac50fSopenharmony_ciHWTEST_F(SurfaceDrawTest, DecodeImageToPixelMap01, Function | SmallTest | Level1)
144e0dac50fSopenharmony_ci{
145e0dac50fSopenharmony_ci    ASSERT_EQ(SurfaceDraw::DecodeImageToPixelMap(""), nullptr);
146e0dac50fSopenharmony_ci    ASSERT_NE(SurfaceDraw::DecodeImageToPixelMap(IMAGE_PLACE_HOLDER_PNG_PATH), nullptr);
147e0dac50fSopenharmony_ci}
148e0dac50fSopenharmony_ci/**
149e0dac50fSopenharmony_ci * @tc.name: DrawMasking
150e0dac50fSopenharmony_ci * @tc.desc: SurfaceDraw::DrawMasking test
151e0dac50fSopenharmony_ci * @tc.type: FUNC
152e0dac50fSopenharmony_ci */
153e0dac50fSopenharmony_ciHWTEST_F(SurfaceDrawTest, DrawMasking01, Function | SmallTest | Level1)
154e0dac50fSopenharmony_ci{
155e0dac50fSopenharmony_ci    OHOS::Rosen::Rect screenRect = {0, 0, 0, 0};
156e0dac50fSopenharmony_ci    OHOS::Rosen::Rect transRect = {0, 0, 0, 0};
157e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::DrawMasking(nullptr, screenRect, transRect));
158e0dac50fSopenharmony_ci
159e0dac50fSopenharmony_ci    sptr<Window> window = CreateTestWindow("testDrawMasking");
160e0dac50fSopenharmony_ci    if (window == nullptr) {
161e0dac50fSopenharmony_ci        return;
162e0dac50fSopenharmony_ci    }
163e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, window);
164e0dac50fSopenharmony_ci    window->Show();
165e0dac50fSopenharmony_ci    usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated
166e0dac50fSopenharmony_ci
167e0dac50fSopenharmony_ci    auto surfaceNode = window->GetSurfaceNode();
168e0dac50fSopenharmony_ci    ASSERT_NE(surfaceNode, nullptr);
169e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::DrawMasking(surfaceNode, screenRect, transRect));
170e0dac50fSopenharmony_ci
171e0dac50fSopenharmony_ci    screenRect.width_ = displayWidth_;
172e0dac50fSopenharmony_ci    screenRect.height_ = displayHeight_;
173e0dac50fSopenharmony_ci    transRect.width_ = displayWidth_;
174e0dac50fSopenharmony_ci    transRect.height_ = displayHeight_;
175e0dac50fSopenharmony_ci    SurfaceDraw::DrawMasking(surfaceNode, screenRect, transRect);
176e0dac50fSopenharmony_ci    window->Destroy();
177e0dac50fSopenharmony_ci}
178e0dac50fSopenharmony_ci/**
179e0dac50fSopenharmony_ci * @tc.name: DoDrawImageRect
180e0dac50fSopenharmony_ci * @tc.desc: SurfaceDraw::DoDrawImageRect test
181e0dac50fSopenharmony_ci * @tc.type: FUNC
182e0dac50fSopenharmony_ci */
183e0dac50fSopenharmony_ciHWTEST_F(SurfaceDrawTest, DoDrawImageRect01, Function | SmallTest | Level1)
184e0dac50fSopenharmony_ci{
185e0dac50fSopenharmony_ci    sptr<Window> window = CreateTestWindow("testDoDrawImageRect");
186e0dac50fSopenharmony_ci    if (window == nullptr) {
187e0dac50fSopenharmony_ci        return;
188e0dac50fSopenharmony_ci    }
189e0dac50fSopenharmony_ci    ASSERT_NE(window, nullptr);
190e0dac50fSopenharmony_ci    window->Show();
191e0dac50fSopenharmony_ci    usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated
192e0dac50fSopenharmony_ci
193e0dac50fSopenharmony_ci    OHOS::Rosen::Rect rect = window->GetRect();
194e0dac50fSopenharmony_ci    uint32_t color = 0x00660000;
195e0dac50fSopenharmony_ci
196e0dac50fSopenharmony_ci    auto surfaceNode = window->GetSurfaceNode();
197e0dac50fSopenharmony_ci    ASSERT_NE(surfaceNode, nullptr);
198e0dac50fSopenharmony_ci    sptr<OHOS::Surface> layer = SurfaceDraw::GetLayer(surfaceNode);
199e0dac50fSopenharmony_ci    ASSERT_NE(layer, nullptr);
200e0dac50fSopenharmony_ci    sptr<OHOS::SurfaceBuffer> buffer = SurfaceDraw::GetSurfaceBuffer(layer, rect.width_, rect.height_);
201e0dac50fSopenharmony_ci    if (buffer == nullptr) {
202e0dac50fSopenharmony_ci        return;
203e0dac50fSopenharmony_ci    }
204e0dac50fSopenharmony_ci
205e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::DoDrawImageRect(buffer, rect, nullptr, color, false));
206e0dac50fSopenharmony_ci
207e0dac50fSopenharmony_ci    std::shared_ptr<Media::PixelMap> pixelMap = SurfaceDraw::DecodeImageToPixelMap(IMAGE_PLACE_HOLDER_PNG_PATH);
208e0dac50fSopenharmony_ci    ASSERT_NE(pixelMap, nullptr);
209e0dac50fSopenharmony_ci
210e0dac50fSopenharmony_ci    ASSERT_TRUE(SurfaceDraw::DoDrawImageRect(buffer, rect, pixelMap, color, false));
211e0dac50fSopenharmony_ci    window->Destroy();
212e0dac50fSopenharmony_ci}
213e0dac50fSopenharmony_ci/**
214e0dac50fSopenharmony_ci * @tc.name: GetSurfaceSnapshot
215e0dac50fSopenharmony_ci * @tc.desc: SurfaceDraw::GetSurfaceSnapshot test
216e0dac50fSopenharmony_ci * @tc.type: FUNC
217e0dac50fSopenharmony_ci */
218e0dac50fSopenharmony_ciHWTEST_F(SurfaceDrawTest, GetSurfaceSnapshot01, Function | SmallTest | Level1)
219e0dac50fSopenharmony_ci{
220e0dac50fSopenharmony_ci    sptr<Window> window = CreateTestWindow("testDoDrawImageRect");
221e0dac50fSopenharmony_ci    if (window == nullptr) {
222e0dac50fSopenharmony_ci        return;
223e0dac50fSopenharmony_ci    }
224e0dac50fSopenharmony_ci    ASSERT_NE(window, nullptr);
225e0dac50fSopenharmony_ci    window->Show();
226e0dac50fSopenharmony_ci    usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated
227e0dac50fSopenharmony_ci
228e0dac50fSopenharmony_ci    auto surfaceNode = window->GetSurfaceNode();
229e0dac50fSopenharmony_ci    ASSERT_NE(surfaceNode, nullptr);
230e0dac50fSopenharmony_ci
231e0dac50fSopenharmony_ci    std::shared_ptr<Media::PixelMap> pixelMap = SurfaceDraw::DecodeImageToPixelMap(IMAGE_PLACE_HOLDER_PNG_PATH);
232e0dac50fSopenharmony_ci    ASSERT_NE(pixelMap, nullptr);
233e0dac50fSopenharmony_ci
234e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::GetSurfaceSnapshot(nullptr, pixelMap, 0, 0, 0));
235e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::GetSurfaceSnapshot(surfaceNode, pixelMap, 0, 0, 0));
236e0dac50fSopenharmony_ci    window->Destroy();
237e0dac50fSopenharmony_ci}
238e0dac50fSopenharmony_ci
239e0dac50fSopenharmony_ci/**
240e0dac50fSopenharmony_ci * @tc.name: DrawColor
241e0dac50fSopenharmony_ci * @tc.desc: SurfaceDraw::DrawColor test
242e0dac50fSopenharmony_ci * @tc.type: FUNC
243e0dac50fSopenharmony_ci */
244e0dac50fSopenharmony_ciHWTEST_F(SurfaceDrawTest, DrawColor01, Function | SmallTest | Level1)
245e0dac50fSopenharmony_ci{
246e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::DrawColor(nullptr, 0, 0, 0));
247e0dac50fSopenharmony_ci    sptr<Window> window = CreateTestWindow("DrawColor");
248e0dac50fSopenharmony_ci    if (window == nullptr) {
249e0dac50fSopenharmony_ci        return;
250e0dac50fSopenharmony_ci    }
251e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, window);
252e0dac50fSopenharmony_ci    window->Show();
253e0dac50fSopenharmony_ci    usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated
254e0dac50fSopenharmony_ci    auto surfaceNode = window->GetSurfaceNode();
255e0dac50fSopenharmony_ci    ASSERT_NE(surfaceNode, nullptr);
256e0dac50fSopenharmony_ci    uint32_t width = window->GetRect().width_;
257e0dac50fSopenharmony_ci    uint32_t height = window->GetRect().height_;
258e0dac50fSopenharmony_ci    uint32_t color = 0x00660000;
259e0dac50fSopenharmony_ci    SurfaceDraw::DrawColor(surfaceNode, width, height, color);
260e0dac50fSopenharmony_ci    SurfaceDraw::DrawColor(surfaceNode, -1, -1, color);
261e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, window->Destroy());
262e0dac50fSopenharmony_ci}
263e0dac50fSopenharmony_ci
264e0dac50fSopenharmony_ci/**
265e0dac50fSopenharmony_ci * @tc.name: DoDraw
266e0dac50fSopenharmony_ci * @tc.desc: SurfaceDraw::DoDraw test
267e0dac50fSopenharmony_ci * @tc.type: FUNC
268e0dac50fSopenharmony_ci */
269e0dac50fSopenharmony_ciHWTEST_F(SurfaceDrawTest, DoDraw01, Function | SmallTest | Level1)
270e0dac50fSopenharmony_ci{
271e0dac50fSopenharmony_ci    sptr<Window> window = CreateTestWindow("DoDrawTest01");
272e0dac50fSopenharmony_ci    if (window == nullptr) {
273e0dac50fSopenharmony_ci        return;
274e0dac50fSopenharmony_ci    }
275e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, window);
276e0dac50fSopenharmony_ci    window->Show();
277e0dac50fSopenharmony_ci    usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated
278e0dac50fSopenharmony_ci    OHOS::Rosen::Rect rect = window->GetRect();
279e0dac50fSopenharmony_ci    auto surfaceNode = window->GetSurfaceNode();
280e0dac50fSopenharmony_ci    ASSERT_NE(surfaceNode, nullptr);
281e0dac50fSopenharmony_ci    sptr<OHOS::Surface> layer = SurfaceDraw::GetLayer(surfaceNode);
282e0dac50fSopenharmony_ci    ASSERT_NE(layer, nullptr);
283e0dac50fSopenharmony_ci    sptr<OHOS::SurfaceBuffer> buffer = SurfaceDraw::GetSurfaceBuffer(layer, rect.width_, rect.height_);
284e0dac50fSopenharmony_ci    ASSERT_NE(buffer, nullptr);
285e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::DoDraw(nullptr, 0, 0, ""));
286e0dac50fSopenharmony_ci    window->Destroy();
287e0dac50fSopenharmony_ci}
288e0dac50fSopenharmony_ci
289e0dac50fSopenharmony_ci/**
290e0dac50fSopenharmony_ci * @tc.name: DoDraw
291e0dac50fSopenharmony_ci * @tc.desc: SurfaceDraw::DoDraw02 test
292e0dac50fSopenharmony_ci * @tc.type: FUNC
293e0dac50fSopenharmony_ci */
294e0dac50fSopenharmony_ciHWTEST_F(SurfaceDrawTest, DoDraw02, Function | SmallTest | Level1)
295e0dac50fSopenharmony_ci{
296e0dac50fSopenharmony_ci    sptr<Window> window = CreateTestWindow("DoDraw02");
297e0dac50fSopenharmony_ci    if (window == nullptr) {
298e0dac50fSopenharmony_ci        return;
299e0dac50fSopenharmony_ci    }
300e0dac50fSopenharmony_ci    ASSERT_NE(window, nullptr);
301e0dac50fSopenharmony_ci    window->Show();
302e0dac50fSopenharmony_ci    usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated
303e0dac50fSopenharmony_ci    OHOS::Rosen::Rect rect = window->GetRect();
304e0dac50fSopenharmony_ci    auto surfaceNode = window->GetSurfaceNode();
305e0dac50fSopenharmony_ci    ASSERT_NE(surfaceNode, nullptr);
306e0dac50fSopenharmony_ci    sptr<OHOS::Surface> layer = SurfaceDraw::GetLayer(surfaceNode);
307e0dac50fSopenharmony_ci    ASSERT_NE(layer, nullptr);
308e0dac50fSopenharmony_ci    sptr<OHOS::SurfaceBuffer> buffer = SurfaceDraw::GetSurfaceBuffer(layer, rect.width_, rect.height_);
309e0dac50fSopenharmony_ci    if (buffer == nullptr) {
310e0dac50fSopenharmony_ci        return;
311e0dac50fSopenharmony_ci    }
312e0dac50fSopenharmony_ci    std::shared_ptr<Media::PixelMap> pixelMap = SurfaceDraw::DecodeImageToPixelMap(IMAGE_PLACE_HOLDER_PNG_PATH);
313e0dac50fSopenharmony_ci    ASSERT_NE(pixelMap, nullptr);
314e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::DoDraw(nullptr, 0, 0, pixelMap));
315e0dac50fSopenharmony_ci    window->Destroy();
316e0dac50fSopenharmony_ci}
317e0dac50fSopenharmony_ci
318e0dac50fSopenharmony_ci/**
319e0dac50fSopenharmony_ci * @tc.name: DoDraw03
320e0dac50fSopenharmony_ci * @tc.desc: SurfaceDraw::DoDraw03 test
321e0dac50fSopenharmony_ci * @tc.type: FUNC
322e0dac50fSopenharmony_ci */
323e0dac50fSopenharmony_ciHWTEST_F(SurfaceDrawTest, DoDraw03, Function | SmallTest | Level1)
324e0dac50fSopenharmony_ci{
325e0dac50fSopenharmony_ci    sptr<Window> window = CreateTestWindow("DoDrawTest03");
326e0dac50fSopenharmony_ci    if (window == nullptr) {
327e0dac50fSopenharmony_ci        return;
328e0dac50fSopenharmony_ci    }
329e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, window);
330e0dac50fSopenharmony_ci    window->Show();
331e0dac50fSopenharmony_ci    usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated
332e0dac50fSopenharmony_ci    OHOS::Rosen::Rect rect = window->GetRect();
333e0dac50fSopenharmony_ci    uint32_t color = 0x00660000;
334e0dac50fSopenharmony_ci    auto surfaceNode = window->GetSurfaceNode();
335e0dac50fSopenharmony_ci    ASSERT_NE(surfaceNode, nullptr);
336e0dac50fSopenharmony_ci    sptr<OHOS::Surface> layer = SurfaceDraw::GetLayer(surfaceNode);
337e0dac50fSopenharmony_ci    ASSERT_NE(layer, nullptr);
338e0dac50fSopenharmony_ci    sptr<OHOS::SurfaceBuffer> buffer = SurfaceDraw::GetSurfaceBuffer(layer, rect.width_, rect.height_);
339e0dac50fSopenharmony_ci    if (buffer == nullptr) {
340e0dac50fSopenharmony_ci        return;
341e0dac50fSopenharmony_ci    }
342e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::DoDraw(nullptr, 0, 0, color));
343e0dac50fSopenharmony_ci    window->Destroy();
344e0dac50fSopenharmony_ci}
345e0dac50fSopenharmony_ci
346e0dac50fSopenharmony_ci/**
347e0dac50fSopenharmony_ci * @tc.name: DrawImageRect
348e0dac50fSopenharmony_ci * @tc.desc: SurfaceDraw::DoDrawImageRect test
349e0dac50fSopenharmony_ci * @tc.type: FUNC
350e0dac50fSopenharmony_ci */
351e0dac50fSopenharmony_ciHWTEST_F(SurfaceDrawTest, DrawImageRect01, Function | SmallTest | Level1)
352e0dac50fSopenharmony_ci{
353e0dac50fSopenharmony_ci    sptr<Window> window = CreateTestWindow("DrawImageRect");
354e0dac50fSopenharmony_ci    if (window == nullptr) {
355e0dac50fSopenharmony_ci        return;
356e0dac50fSopenharmony_ci    }
357e0dac50fSopenharmony_ci    ASSERT_NE(window, nullptr);
358e0dac50fSopenharmony_ci    window->Show();
359e0dac50fSopenharmony_ci    usleep(WAIT_FOR_SYNC_US / 20); // wait for rect updated
360e0dac50fSopenharmony_ci    OHOS::Rosen::Rect rect = window->GetRect();
361e0dac50fSopenharmony_ci    uint32_t color = 0x00660000;
362e0dac50fSopenharmony_ci    auto surfaceNode = window->GetSurfaceNode();
363e0dac50fSopenharmony_ci    ASSERT_NE(surfaceNode, nullptr);
364e0dac50fSopenharmony_ci    ASSERT_FALSE(SurfaceDraw::DrawImageRect(surfaceNode, rect, nullptr, color, false));
365e0dac50fSopenharmony_ci    std::shared_ptr<Media::PixelMap> pixelMap = SurfaceDraw::DecodeImageToPixelMap(IMAGE_PLACE_HOLDER_PNG_PATH);
366e0dac50fSopenharmony_ci    ASSERT_NE(pixelMap, nullptr);
367e0dac50fSopenharmony_ci    SurfaceDraw::DrawImageRect(surfaceNode, rect, pixelMap, color, false);
368e0dac50fSopenharmony_ci    window->Destroy();
369e0dac50fSopenharmony_ci}
370e0dac50fSopenharmony_ci}
371e0dac50fSopenharmony_ci} // namespace Rosen
372e0dac50fSopenharmony_ci} // namespace OHOS