1 /*
2  * Copyright (c) 2021 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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_ANIMATION_TEST_MOCK_ANIMATION_UTILS_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_ANIMATION_TEST_MOCK_ANIMATION_UTILS_H
18 
19 #include <cstdint>
20 
21 #include "adapter/aosp/entrance/java/jni/ace_application_info.h"
22 #include "base/json/json_util.h"
23 #include "core/common/platform_window.h"
24 #include "core/common/window.h"
25 #include "core/components/box/render_box.h"
26 #include "core/components/display/render_display.h"
27 #include "core/components/root/render_root.h"
28 #include "core/components/stack/render_stack.h"
29 #include "core/components/transform/render_transform.h"
30 #include "core/pipeline/base/render_context.h"
31 
32 namespace OHOS::Ace {
33 
34 class MockPlatformWindow final : public PlatformWindow {
35 public:
36     MockPlatformWindow() = default;
37     ~MockPlatformWindow() override = default;
38 
39     // Request next vsync.
RequestFrame()40     void RequestFrame() override
41     {
42         requestFrameCnt_++;
43     }
44 
GetRequestFrameCnt()45     int32_t GetRequestFrameCnt() const
46     {
47         return requestFrameCnt_;
48     }
49 
ResetRequestFrameCnt()50     void ResetRequestFrameCnt()
51     {
52         requestFrameCnt_ = 0;
53     }
54 
TriggerOneFrame()55     void TriggerOneFrame()
56     {
57         TriggerFrame(nanoFrameTime_, 1);
58     }
59 
TriggerFrames(int32_t frameCount)60     void TriggerFrames(int32_t frameCount)
61     {
62         for (int32_t loop = 0; loop < frameCount; loop++) {
63             TriggerOneFrame();
64         }
65     }
66 
GetCurrentTimestampNano()67     uint64_t GetCurrentTimestampNano() const
68     {
69         return nanoTimestamp_;
70     }
71 
TriggerFrame(uint64_t deltaNanoTimestamp,uint32_t deltaFrameCount)72     void TriggerFrame(uint64_t deltaNanoTimestamp, uint32_t deltaFrameCount)
73     {
74         nanoTimestamp_ += deltaNanoTimestamp;
75         frameCount_ += deltaFrameCount;
76         if (callback_) {
77             callback_(nanoTimestamp_, frameCount_);
78         }
79     }
80 
81     // Register Vsync callback.
RegisterVsyncCallback(AceVsyncCallback && callback)82     void RegisterVsyncCallback(AceVsyncCallback&& callback) override
83     {
84         callback_ = std::move(callback);
85     }
86 
87     // Attach root render node to container
SetRootRenderNode(const RefPtr<RenderNode> & root)88     void SetRootRenderNode(const RefPtr<RenderNode>& root) override {}
89 
SetNanoFrameTime(uint64_t nanoFrameTime)90     void SetNanoFrameTime(uint64_t nanoFrameTime)
91     {
92         nanoFrameTime_ = nanoFrameTime;
93     }
94 
95 private:
96     static constexpr uint16_t SCREEN_FREQUENCY = 60;
97     static constexpr uint64_t NANO_FRAME_TIME = static_cast<const uint64_t>(1e9 / SCREEN_FREQUENCY);
98     uint32_t frameCount_ = 0;
99     uint32_t requestFrameCnt_ = 0;
100     uint64_t nanoFrameTime_ = NANO_FRAME_TIME;
101     uint64_t nanoTimestamp_ = 0;
102     AceVsyncCallback callback_;
103 };
104 
105 class MockRenderContext : public RenderContext {
106 public:
Repaint(const RefPtr<RenderNode> & node)107     void Repaint(const RefPtr<RenderNode>& node) override {};
PaintChild(const RefPtr<RenderNode> & child,const Offset & offset)108     void PaintChild(const RefPtr<RenderNode>& child, const Offset& offset) override {};
Restore()109     void Restore() override {};
110 };
111 
Create()112 RefPtr<RenderContext> RenderContext::Create()
113 {
114     return AceType::MakeRefPtr<MockRenderContext>();
115 }
116 
117 class MockRenderRoot : public RenderRoot {};
118 class MockRenderStack : public RenderStack {};
119 class MockRenderDisplay : public RenderDisplay {};
120 class MockRenderPositioned : public RenderPositioned {};
121 class MockRenderTransform : public RenderTransform {};
122 class MockRenderBox : public RenderBox {};
123 class MockRenderBoxBase : public RenderBoxBase {};
124 class MockRenderImage : public RenderImage {
125 public:
Measure()126     Size Measure() override
127     {
128         return Size();
129     }
130 };
131 
Create()132 RefPtr<RenderNode> RenderRoot::Create()
133 {
134     return AceType::MakeRefPtr<MockRenderRoot>();
135 }
136 
Create()137 RefPtr<RenderNode> RenderStack::Create()
138 {
139     return AceType::MakeRefPtr<MockRenderStack>();
140 }
141 
Create()142 RefPtr<RenderNode> RenderDisplay::Create()
143 {
144     return AceType::MakeRefPtr<MockRenderDisplay>();
145 }
146 
Create()147 RefPtr<RenderNode> RenderTransform::Create()
148 {
149     return AceType::MakeRefPtr<MockRenderTransform>();
150 }
151 
Create()152 RefPtr<RenderNode> RenderBox::Create()
153 {
154     return AceType::MakeRefPtr<MockRenderBox>();
155 }
156 
Create()157 RefPtr<RenderNode> RenderImage::Create()
158 {
159     return AceType::MakeRefPtr<MockRenderImage>();
160 }
161 
162 class AnimationTestUtils {
163 public:
164     AnimationTestUtils() = delete;
165     ~AnimationTestUtils() = delete;
166 
CreatePlatformWindow()167     static std::unique_ptr<PlatformWindow> CreatePlatformWindow()
168     {
169         return std::make_unique<MockPlatformWindow>();
170     }
171 
CreateWindow(std::unique_ptr<PlatformWindow> platformWindow)172     static std::unique_ptr<Window> CreateWindow(std::unique_ptr<PlatformWindow> platformWindow)
173     {
174         return std::make_unique<Window>(std::move(platformWindow));
175     }
176 };
177 } // namespace OHOS::Ace
178 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_ANIMATION_TEST_MOCK_ANIMATION_UTILS_H
179