1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#include <gtest/gtest.h>
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#include <queue>
19c29fa5a6Sopenharmony_ci#include <vector>
20c29fa5a6Sopenharmony_ci
21c29fa5a6Sopenharmony_ci#include "event_resample.h"
22c29fa5a6Sopenharmony_ci#include "input_event.h"
23c29fa5a6Sopenharmony_ci#include "mmi_log.h"
24c29fa5a6Sopenharmony_ci#include "window_info.h"
25c29fa5a6Sopenharmony_ci
26c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG
27c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "EventResampleTest"
28c29fa5a6Sopenharmony_ci
29c29fa5a6Sopenharmony_cinamespace OHOS {
30c29fa5a6Sopenharmony_cinamespace MMI {
31c29fa5a6Sopenharmony_ci
32c29fa5a6Sopenharmony_cinamespace {
33c29fa5a6Sopenharmony_ciusing namespace testing::ext;
34c29fa5a6Sopenharmony_ciconstexpr int64_t START_TIME = 10000;
35c29fa5a6Sopenharmony_ciconstexpr int64_t TIME_DELTA = 2500;
36c29fa5a6Sopenharmony_ciconstexpr uint32_t INITIAL_COORDS = 10;
37c29fa5a6Sopenharmony_ciconstexpr uint32_t COORDS_DELTA = 10;
38c29fa5a6Sopenharmony_ciconstexpr int64_t FRAME_TIME = 8000;
39c29fa5a6Sopenharmony_ci} // namespace
40c29fa5a6Sopenharmony_ci
41c29fa5a6Sopenharmony_ciclass EventResampleTest : public testing::Test {
42c29fa5a6Sopenharmony_cipublic:
43c29fa5a6Sopenharmony_ci    static void SetUpTestCase(void) {}
44c29fa5a6Sopenharmony_ci    static void TearDownTestCase(void) {}
45c29fa5a6Sopenharmony_ci
46c29fa5a6Sopenharmony_ci    struct TestData {
47c29fa5a6Sopenharmony_ci        uint32_t framesNum { 10 };
48c29fa5a6Sopenharmony_ci        uint32_t pointerId { 0 };
49c29fa5a6Sopenharmony_ci        uint32_t fingerNum { 1 };
50c29fa5a6Sopenharmony_ci        uint32_t evtNum { 0 };
51c29fa5a6Sopenharmony_ci        int64_t timeDelta { TIME_DELTA };
52c29fa5a6Sopenharmony_ci        uint32_t coordsDelta { COORDS_DELTA };
53c29fa5a6Sopenharmony_ci    };
54c29fa5a6Sopenharmony_ci
55c29fa5a6Sopenharmony_ci    struct Context {
56c29fa5a6Sopenharmony_ci        int32_t lastDispX { INITIAL_COORDS };
57c29fa5a6Sopenharmony_ci        int32_t lastDispY { INITIAL_COORDS };
58c29fa5a6Sopenharmony_ci        int64_t lastTime { START_TIME };
59c29fa5a6Sopenharmony_ci        int64_t frameTime { START_TIME };
60c29fa5a6Sopenharmony_ci        int64_t lastFrameTime { START_TIME };
61c29fa5a6Sopenharmony_ci
62c29fa5a6Sopenharmony_ci        void Reset(void)
63c29fa5a6Sopenharmony_ci        {
64c29fa5a6Sopenharmony_ci            lastDispX = INITIAL_COORDS;
65c29fa5a6Sopenharmony_ci            lastDispY = INITIAL_COORDS;
66c29fa5a6Sopenharmony_ci            lastTime = START_TIME;
67c29fa5a6Sopenharmony_ci            frameTime = START_TIME;
68c29fa5a6Sopenharmony_ci            lastFrameTime = START_TIME;
69c29fa5a6Sopenharmony_ci        }
70c29fa5a6Sopenharmony_ci    };
71c29fa5a6Sopenharmony_ci
72c29fa5a6Sopenharmony_ci    struct InputEvt {
73c29fa5a6Sopenharmony_ci        int32_t action { PointerEvent::POINTER_ACTION_UNKNOWN };
74c29fa5a6Sopenharmony_ci        int64_t actionTime { START_TIME };
75c29fa5a6Sopenharmony_ci        int32_t dispX { INITIAL_COORDS };
76c29fa5a6Sopenharmony_ci        int32_t dispY { INITIAL_COORDS };
77c29fa5a6Sopenharmony_ci        int32_t id { 0 };
78c29fa5a6Sopenharmony_ci
79c29fa5a6Sopenharmony_ci        void Initialize(int32_t action, TestData &testData, Context &context)
80c29fa5a6Sopenharmony_ci        {
81c29fa5a6Sopenharmony_ci            this->action = action;
82c29fa5a6Sopenharmony_ci            dispX = context.lastDispX + testData.coordsDelta;
83c29fa5a6Sopenharmony_ci            context.lastDispX = dispX;
84c29fa5a6Sopenharmony_ci            dispY = context.lastDispY + testData.coordsDelta;
85c29fa5a6Sopenharmony_ci            context.lastDispY = dispY;
86c29fa5a6Sopenharmony_ci            id = testData.pointerId;
87c29fa5a6Sopenharmony_ci
88c29fa5a6Sopenharmony_ci            if (action == PointerEvent::POINTER_ACTION_DOWN) {
89c29fa5a6Sopenharmony_ci                actionTime = context.lastFrameTime;
90c29fa5a6Sopenharmony_ci                context.lastTime = 0;
91c29fa5a6Sopenharmony_ci            } else {
92c29fa5a6Sopenharmony_ci                actionTime = context.lastFrameTime + context.lastTime + testData.timeDelta;
93c29fa5a6Sopenharmony_ci                context.lastTime = actionTime - context.lastFrameTime;
94c29fa5a6Sopenharmony_ci            }
95c29fa5a6Sopenharmony_ci        }
96c29fa5a6Sopenharmony_ci
97c29fa5a6Sopenharmony_ci        void InitializeFrom(InputEvt &event)
98c29fa5a6Sopenharmony_ci        {
99c29fa5a6Sopenharmony_ci            action = event.action;
100c29fa5a6Sopenharmony_ci            actionTime = event.actionTime;
101c29fa5a6Sopenharmony_ci            dispX = event.dispX;
102c29fa5a6Sopenharmony_ci            dispY = event.dispY;
103c29fa5a6Sopenharmony_ci            id = event.id;
104c29fa5a6Sopenharmony_ci        };
105c29fa5a6Sopenharmony_ci    };
106c29fa5a6Sopenharmony_ci
107c29fa5a6Sopenharmony_ci    struct ExpectedData {
108c29fa5a6Sopenharmony_ci        int64_t actionTime { 0 };
109c29fa5a6Sopenharmony_ci        int32_t dispX { 0 };
110c29fa5a6Sopenharmony_ci        int32_t dispY { 0 };
111c29fa5a6Sopenharmony_ci        int64_t touchUpTime { 0 };
112c29fa5a6Sopenharmony_ci        int32_t touchUpX { 0 };
113c29fa5a6Sopenharmony_ci        int32_t touchUpY { 0 };
114c29fa5a6Sopenharmony_ci        int32_t id { 0 };
115c29fa5a6Sopenharmony_ci
116c29fa5a6Sopenharmony_ci        ExpectedData() {}
117c29fa5a6Sopenharmony_ci
118c29fa5a6Sopenharmony_ci        void Reset(int32_t id)
119c29fa5a6Sopenharmony_ci        {
120c29fa5a6Sopenharmony_ci            this->id = id;
121c29fa5a6Sopenharmony_ci            actionTime = 0;
122c29fa5a6Sopenharmony_ci            dispX = 0;
123c29fa5a6Sopenharmony_ci            dispY = 0;
124c29fa5a6Sopenharmony_ci            touchUpTime = 0;
125c29fa5a6Sopenharmony_ci            touchUpX = 0;
126c29fa5a6Sopenharmony_ci            touchUpY = 0;
127c29fa5a6Sopenharmony_ci        }
128c29fa5a6Sopenharmony_ci
129c29fa5a6Sopenharmony_ci        void UpdateTouchState(InputEvt &event)
130c29fa5a6Sopenharmony_ci        {
131c29fa5a6Sopenharmony_ci            if (id != event.id) {
132c29fa5a6Sopenharmony_ci                return;
133c29fa5a6Sopenharmony_ci            }
134c29fa5a6Sopenharmony_ci
135c29fa5a6Sopenharmony_ci            switch (event.action) {
136c29fa5a6Sopenharmony_ci                case PointerEvent::POINTER_ACTION_DOWN : {
137c29fa5a6Sopenharmony_ci                    touchState.clear();
138c29fa5a6Sopenharmony_ci                    eventBatch.clear();
139c29fa5a6Sopenharmony_ci                    InputEvt evt;
140c29fa5a6Sopenharmony_ci                    evt.InitializeFrom(event);
141c29fa5a6Sopenharmony_ci                    touchState.insert(touchState.begin(), std::move(evt));
142c29fa5a6Sopenharmony_ci                    actionTime = event.actionTime;
143c29fa5a6Sopenharmony_ci                    dispX = event.dispX;
144c29fa5a6Sopenharmony_ci                    dispY = event.dispY;
145c29fa5a6Sopenharmony_ci                    break;
146c29fa5a6Sopenharmony_ci                }
147c29fa5a6Sopenharmony_ci                case PointerEvent::POINTER_ACTION_UP : {
148c29fa5a6Sopenharmony_ci                    touchState.clear();
149c29fa5a6Sopenharmony_ci                    eventBatch.clear();
150c29fa5a6Sopenharmony_ci                    touchUpTime = event.actionTime;
151c29fa5a6Sopenharmony_ci                    touchUpX = event.dispX;
152c29fa5a6Sopenharmony_ci                    touchUpY = event.dispY;
153c29fa5a6Sopenharmony_ci                    break;
154c29fa5a6Sopenharmony_ci                }
155c29fa5a6Sopenharmony_ci                case PointerEvent::POINTER_ACTION_MOVE : {
156c29fa5a6Sopenharmony_ci                    while (touchState.size() > 1) {
157c29fa5a6Sopenharmony_ci                        touchState.pop_back();
158c29fa5a6Sopenharmony_ci                    }
159c29fa5a6Sopenharmony_ci                    InputEvt evt;
160c29fa5a6Sopenharmony_ci                    evt.InitializeFrom(event);
161c29fa5a6Sopenharmony_ci                    touchState.insert(touchState.begin(), std::move(evt));
162c29fa5a6Sopenharmony_ci                    actionTime = event.actionTime;
163c29fa5a6Sopenharmony_ci                    dispX = event.dispX;
164c29fa5a6Sopenharmony_ci                    dispY = event.dispY;
165c29fa5a6Sopenharmony_ci                    break;
166c29fa5a6Sopenharmony_ci                }
167c29fa5a6Sopenharmony_ci            }
168c29fa5a6Sopenharmony_ci        }
169c29fa5a6Sopenharmony_ci
170c29fa5a6Sopenharmony_ci        void AddEvent(InputEvt &event)
171c29fa5a6Sopenharmony_ci        {
172c29fa5a6Sopenharmony_ci            if (id != event.id) {
173c29fa5a6Sopenharmony_ci                return;
174c29fa5a6Sopenharmony_ci            }
175c29fa5a6Sopenharmony_ci
176c29fa5a6Sopenharmony_ci            if (event.action == PointerEvent::POINTER_ACTION_MOVE) {
177c29fa5a6Sopenharmony_ci                InputEvt evt;
178c29fa5a6Sopenharmony_ci                evt.InitializeFrom(event);
179c29fa5a6Sopenharmony_ci                eventBatch.push_back(std::move(evt));
180c29fa5a6Sopenharmony_ci            } else {
181c29fa5a6Sopenharmony_ci                if ((event.action == PointerEvent::POINTER_ACTION_UP) && (!eventBatch.empty())) {
182c29fa5a6Sopenharmony_ci                    for (size_t i = 0; i < eventBatch.size(); i++) {
183c29fa5a6Sopenharmony_ci                        InputEvt& event = eventBatch.at(i);
184c29fa5a6Sopenharmony_ci                        UpdateTouchState(event);
185c29fa5a6Sopenharmony_ci                    }
186c29fa5a6Sopenharmony_ci                    eventBatch.erase(eventBatch.begin(), eventBatch.begin() + eventBatch.size() - 1);
187c29fa5a6Sopenharmony_ci                }
188c29fa5a6Sopenharmony_ci                UpdateTouchState(event);
189c29fa5a6Sopenharmony_ci            }
190c29fa5a6Sopenharmony_ci        }
191c29fa5a6Sopenharmony_ci
192c29fa5a6Sopenharmony_ci        int32_t CalculateExpected(int64_t frameTime)
193c29fa5a6Sopenharmony_ci        {
194c29fa5a6Sopenharmony_ci            int64_t sampleTime = frameTime - EventResample::RESAMPLE_LATENCY;
195c29fa5a6Sopenharmony_ci            InputEvt current;
196c29fa5a6Sopenharmony_ci
197c29fa5a6Sopenharmony_ci            if (eventBatch.empty()) {
198c29fa5a6Sopenharmony_ci                MMI_HILOGD("Event Batch empty");
199c29fa5a6Sopenharmony_ci                return ERR_WOULD_BLOCK;
200c29fa5a6Sopenharmony_ci            }
201c29fa5a6Sopenharmony_ci
202c29fa5a6Sopenharmony_ci            size_t numSamples = eventBatch.size();
203c29fa5a6Sopenharmony_ci            size_t idx = 0;
204c29fa5a6Sopenharmony_ci            while ((idx < numSamples) && (eventBatch.at(idx).actionTime <= sampleTime)) {
205c29fa5a6Sopenharmony_ci                idx += 1;
206c29fa5a6Sopenharmony_ci            }
207c29fa5a6Sopenharmony_ci            ssize_t split = ssize_t(idx) - 1;
208c29fa5a6Sopenharmony_ci            if (split < 0) {
209c29fa5a6Sopenharmony_ci                MMI_HILOGD("Negative split value");
210c29fa5a6Sopenharmony_ci                return ERR_WOULD_BLOCK;
211c29fa5a6Sopenharmony_ci            }
212c29fa5a6Sopenharmony_ci            size_t count = split + 1;
213c29fa5a6Sopenharmony_ci
214c29fa5a6Sopenharmony_ci            // Consume samples in batch
215c29fa5a6Sopenharmony_ci            for (size_t i = 0; i < count; i++) {
216c29fa5a6Sopenharmony_ci                InputEvt& event = eventBatch.at(i);
217c29fa5a6Sopenharmony_ci                UpdateTouchState(event);
218c29fa5a6Sopenharmony_ci            }
219c29fa5a6Sopenharmony_ci            eventBatch.erase(eventBatch.begin(), eventBatch.begin() + count);
220c29fa5a6Sopenharmony_ci
221c29fa5a6Sopenharmony_ci            current.InitializeFrom(touchState[0]);
222c29fa5a6Sopenharmony_ci
223c29fa5a6Sopenharmony_ci            return ResampleCoord(sampleTime, current);
224c29fa5a6Sopenharmony_ci        }
225c29fa5a6Sopenharmony_ci
226c29fa5a6Sopenharmony_ci        int32_t ResampleCoord(int64_t sampleTime, InputEvt &current)
227c29fa5a6Sopenharmony_ci        {
228c29fa5a6Sopenharmony_ci            float alpha = 0.0;
229c29fa5a6Sopenharmony_ci            InputEvt other;
230c29fa5a6Sopenharmony_ci
231c29fa5a6Sopenharmony_ci            if (eventBatch.empty()) {
232c29fa5a6Sopenharmony_ci                // Coordinates extrapolation
233c29fa5a6Sopenharmony_ci                MMI_HILOGD("Extrapolation");
234c29fa5a6Sopenharmony_ci                if (touchState.size() < EventResample::HISTORY_SIZE_MAX) {
235c29fa5a6Sopenharmony_ci                    return ERR_OK;
236c29fa5a6Sopenharmony_ci                }
237c29fa5a6Sopenharmony_ci                other.InitializeFrom(touchState[1]);
238c29fa5a6Sopenharmony_ci                int64_t delta = touchState[0].actionTime - touchState[1].actionTime;
239c29fa5a6Sopenharmony_ci                if (delta < EventResample::RESAMPLE_MIN_DELTA) {
240c29fa5a6Sopenharmony_ci                    return ERR_OK;
241c29fa5a6Sopenharmony_ci                } else if (delta > EventResample::RESAMPLE_MAX_DELTA) {
242c29fa5a6Sopenharmony_ci                    return ERR_OK;
243c29fa5a6Sopenharmony_ci                }
244c29fa5a6Sopenharmony_ci                int64_t maxPredict = touchState[0].actionTime +
245c29fa5a6Sopenharmony_ci                                     std::min(delta / 2, EventResample::RESAMPLE_MAX_PREDICTION);
246c29fa5a6Sopenharmony_ci                if (sampleTime > maxPredict) {
247c29fa5a6Sopenharmony_ci                    sampleTime = maxPredict;
248c29fa5a6Sopenharmony_ci                }
249c29fa5a6Sopenharmony_ci                alpha = static_cast<float>(touchState[0].actionTime - sampleTime) / delta;
250c29fa5a6Sopenharmony_ci            } else {
251c29fa5a6Sopenharmony_ci                // Coordinates interpolation
252c29fa5a6Sopenharmony_ci                MMI_HILOGD("Interpolation");
253c29fa5a6Sopenharmony_ci                InputEvt &next = eventBatch.front();
254c29fa5a6Sopenharmony_ci                other.InitializeFrom(next);
255c29fa5a6Sopenharmony_ci                int64_t delta = next.actionTime - touchState[0].actionTime;
256c29fa5a6Sopenharmony_ci                if (delta < EventResample::RESAMPLE_MIN_DELTA) {
257c29fa5a6Sopenharmony_ci                    MMI_HILOGD("RESAMPLE_MIN_DELTA = %{public}" PRId64 ", next_x = %{public}d, ts0_x = %{public}d",
258c29fa5a6Sopenharmony_ci                               delta, next.dispX, touchState[0].dispX);
259c29fa5a6Sopenharmony_ci                    return ERR_OK;
260c29fa5a6Sopenharmony_ci                }
261c29fa5a6Sopenharmony_ci                alpha = static_cast<float>(sampleTime - touchState[0].actionTime) / delta;
262c29fa5a6Sopenharmony_ci            }
263c29fa5a6Sopenharmony_ci
264c29fa5a6Sopenharmony_ci            dispX = CalcCoord(current.dispX, other.dispX, alpha);
265c29fa5a6Sopenharmony_ci            dispY = CalcCoord(current.dispY, other.dispY, alpha);
266c29fa5a6Sopenharmony_ci            actionTime = sampleTime;
267c29fa5a6Sopenharmony_ci
268c29fa5a6Sopenharmony_ci            return ERR_OK;
269c29fa5a6Sopenharmony_ci        }
270c29fa5a6Sopenharmony_ci
271c29fa5a6Sopenharmony_ci    protected:
272c29fa5a6Sopenharmony_ci        std::vector<InputEvt> touchState;
273c29fa5a6Sopenharmony_ci        std::vector<InputEvt> eventBatch;
274c29fa5a6Sopenharmony_ci    };
275c29fa5a6Sopenharmony_ci
276c29fa5a6Sopenharmony_ci    EventResampleTest();
277c29fa5a6Sopenharmony_ci    ~EventResampleTest();
278c29fa5a6Sopenharmony_ci
279c29fa5a6Sopenharmony_ci    bool SetupPointerEvent(InputEvt &event, TestData &testData);
280c29fa5a6Sopenharmony_ci    int32_t CheckResults(std::shared_ptr<PointerEvent> outEvent,
281c29fa5a6Sopenharmony_ci                         std::vector<ExpectedData> &expected, Context &context);
282c29fa5a6Sopenharmony_ci    bool DoTest(TestData &testData, int32_t testId);
283c29fa5a6Sopenharmony_ci    void ReadQueue(TestData &testData, Context &ctx, std::vector<ExpectedData> &expected);
284c29fa5a6Sopenharmony_ci    void SendTouchUp(TestData &testData, Context &ctx, std::vector<ExpectedData> &expected);
285c29fa5a6Sopenharmony_ci
286c29fa5a6Sopenharmony_ci    std::shared_ptr<PointerEvent> pointerEvent_ = nullptr;
287c29fa5a6Sopenharmony_ci    std::queue<InputEvt> eventQueue_;
288c29fa5a6Sopenharmony_ci    uint32_t failCount_ = 0;
289c29fa5a6Sopenharmony_ci};
290c29fa5a6Sopenharmony_ci
291c29fa5a6Sopenharmony_ciEventResampleTest::EventResampleTest()
292c29fa5a6Sopenharmony_ci{
293c29fa5a6Sopenharmony_ci    pointerEvent_ = PointerEvent::Create();
294c29fa5a6Sopenharmony_ci}
295c29fa5a6Sopenharmony_ci
296c29fa5a6Sopenharmony_ciEventResampleTest::~EventResampleTest()
297c29fa5a6Sopenharmony_ci{
298c29fa5a6Sopenharmony_ci}
299c29fa5a6Sopenharmony_ci
300c29fa5a6Sopenharmony_cibool EventResampleTest::SetupPointerEvent(InputEvt &event, TestData &testData)
301c29fa5a6Sopenharmony_ci{
302c29fa5a6Sopenharmony_ci    pointerEvent_->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN);
303c29fa5a6Sopenharmony_ci    pointerEvent_->SetPointerAction(event.action);
304c29fa5a6Sopenharmony_ci    pointerEvent_->SetPointerId(event.id);
305c29fa5a6Sopenharmony_ci    pointerEvent_->SetDeviceId(0);
306c29fa5a6Sopenharmony_ci
307c29fa5a6Sopenharmony_ci    auto pointIds = pointerEvent_->GetPointerIds();
308c29fa5a6Sopenharmony_ci    int64_t time = event.actionTime;
309c29fa5a6Sopenharmony_ci    if (pointIds.empty()) {
310c29fa5a6Sopenharmony_ci        pointerEvent_->SetActionStartTime(time);
311c29fa5a6Sopenharmony_ci    }
312c29fa5a6Sopenharmony_ci    pointerEvent_->SetActionTime(time);
313c29fa5a6Sopenharmony_ci
314c29fa5a6Sopenharmony_ci    for (uint32_t idx = 0; idx < testData.fingerNum; idx++) {
315c29fa5a6Sopenharmony_ci        PointerEvent::PointerItem item;
316c29fa5a6Sopenharmony_ci        if (pointerEvent_->GetPointerItem(idx, item)) {
317c29fa5a6Sopenharmony_ci            item.SetPointerId(idx);
318c29fa5a6Sopenharmony_ci            item.SetDisplayX(event.dispX);
319c29fa5a6Sopenharmony_ci            item.SetDisplayY(event.dispY);
320c29fa5a6Sopenharmony_ci            item.SetToolType(PointerEvent::TOOL_TYPE_FINGER);
321c29fa5a6Sopenharmony_ci            item.SetDeviceId(0);
322c29fa5a6Sopenharmony_ci            pointerEvent_->UpdatePointerItem(idx, item);
323c29fa5a6Sopenharmony_ci        } else {
324c29fa5a6Sopenharmony_ci            item.SetPointerId(idx);
325c29fa5a6Sopenharmony_ci            item.SetDisplayX(event.dispX);
326c29fa5a6Sopenharmony_ci            item.SetDisplayY(event.dispY);
327c29fa5a6Sopenharmony_ci            item.SetToolType(PointerEvent::TOOL_TYPE_FINGER);
328c29fa5a6Sopenharmony_ci            item.SetDeviceId(0);
329c29fa5a6Sopenharmony_ci            pointerEvent_->AddPointerItem(item);
330c29fa5a6Sopenharmony_ci        }
331c29fa5a6Sopenharmony_ci    }
332c29fa5a6Sopenharmony_ci
333c29fa5a6Sopenharmony_ci    return true;
334c29fa5a6Sopenharmony_ci}
335c29fa5a6Sopenharmony_ci
336c29fa5a6Sopenharmony_ciint32_t EventResampleTest::CheckResults(std::shared_ptr<PointerEvent> outEvent,
337c29fa5a6Sopenharmony_ci                                        std::vector<ExpectedData> &expected, Context &context)
338c29fa5a6Sopenharmony_ci{
339c29fa5a6Sopenharmony_ci    bool ret = ERR_OK;
340c29fa5a6Sopenharmony_ci    int32_t failCount = 0;
341c29fa5a6Sopenharmony_ci    int64_t actionTime = 0;
342c29fa5a6Sopenharmony_ci    int32_t dispX = 0;
343c29fa5a6Sopenharmony_ci    int32_t dispY = 0;
344c29fa5a6Sopenharmony_ci
345c29fa5a6Sopenharmony_ci    for (auto &it : expected) {
346c29fa5a6Sopenharmony_ci        PointerEvent::PointerItem pointerItem;
347c29fa5a6Sopenharmony_ci        if (!outEvent->GetPointerItem(it.id, pointerItem)) {
348c29fa5a6Sopenharmony_ci            EXPECT_TRUE(false);
349c29fa5a6Sopenharmony_ci            ret = ERR_INVALID_VALUE;
350c29fa5a6Sopenharmony_ci            break;
351c29fa5a6Sopenharmony_ci        }
352c29fa5a6Sopenharmony_ci
353c29fa5a6Sopenharmony_ci        if (outEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_DOWN) {
354c29fa5a6Sopenharmony_ci            actionTime = expected[it.id].actionTime;
355c29fa5a6Sopenharmony_ci            dispX = expected[it.id].dispX;
356c29fa5a6Sopenharmony_ci            dispY = expected[it.id].dispY;
357c29fa5a6Sopenharmony_ci        } else if (outEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_MOVE) {
358c29fa5a6Sopenharmony_ci            expected[it.id].CalculateExpected(context.frameTime);
359c29fa5a6Sopenharmony_ci            actionTime = expected[it.id].actionTime;
360c29fa5a6Sopenharmony_ci            dispX = expected[it.id].dispX;
361c29fa5a6Sopenharmony_ci            dispY = expected[it.id].dispY;
362c29fa5a6Sopenharmony_ci        } else if (outEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_UP) {
363c29fa5a6Sopenharmony_ci            actionTime = expected[it.id].touchUpTime;
364c29fa5a6Sopenharmony_ci            dispX = expected[it.id].touchUpX;
365c29fa5a6Sopenharmony_ci            dispY = expected[it.id].touchUpY;
366c29fa5a6Sopenharmony_ci        }
367c29fa5a6Sopenharmony_ci
368c29fa5a6Sopenharmony_ci        MMI_HILOGD("OutEvent: x=%{public}d y=%{public}d t=%{public}" PRId64 " f=%{public}" PRId64 " (%{public}d)",
369c29fa5a6Sopenharmony_ci                   pointerItem.GetDisplayX(), pointerItem.GetDisplayY(), outEvent->GetActionTime(),
370c29fa5a6Sopenharmony_ci                   context.frameTime, outEvent->GetPointerAction());
371c29fa5a6Sopenharmony_ci        MMI_HILOGD("Expected: x=%{public}d y=%{public}d t=%{public}" PRId64, dispX, dispY, actionTime);
372c29fa5a6Sopenharmony_ci
373c29fa5a6Sopenharmony_ci        if (pointerItem.GetDisplayX() != dispX) {
374c29fa5a6Sopenharmony_ci            failCount++;
375c29fa5a6Sopenharmony_ci            EXPECT_EQ(pointerItem.GetDisplayX(), dispX);
376c29fa5a6Sopenharmony_ci        }
377c29fa5a6Sopenharmony_ci        if (pointerItem.GetDisplayY() != dispY) {
378c29fa5a6Sopenharmony_ci            failCount++;
379c29fa5a6Sopenharmony_ci            EXPECT_EQ(pointerItem.GetDisplayY(), dispY);
380c29fa5a6Sopenharmony_ci        }
381c29fa5a6Sopenharmony_ci        if (outEvent->GetActionTime() != actionTime) {
382c29fa5a6Sopenharmony_ci            failCount++;
383c29fa5a6Sopenharmony_ci            EXPECT_EQ(outEvent->GetActionTime(), actionTime);
384c29fa5a6Sopenharmony_ci        }
385c29fa5a6Sopenharmony_ci
386c29fa5a6Sopenharmony_ci        if (failCount != 0) {
387c29fa5a6Sopenharmony_ci            MMI_HILOGD("Test Failed");
388c29fa5a6Sopenharmony_ci        }
389c29fa5a6Sopenharmony_ci        failCount_ += failCount;
390c29fa5a6Sopenharmony_ci    }
391c29fa5a6Sopenharmony_ci
392c29fa5a6Sopenharmony_ci    return ret;
393c29fa5a6Sopenharmony_ci}
394c29fa5a6Sopenharmony_ci
395c29fa5a6Sopenharmony_cibool EventResampleTest::DoTest(TestData &testData, int32_t testId)
396c29fa5a6Sopenharmony_ci{
397c29fa5a6Sopenharmony_ci    CHKPF(pointerEvent_);
398c29fa5a6Sopenharmony_ci    pointerEvent_->Reset();
399c29fa5a6Sopenharmony_ci    Context ctx;
400c29fa5a6Sopenharmony_ci    std::shared_ptr<PointerEvent> outEvent = nullptr;
401c29fa5a6Sopenharmony_ci    std::vector<ExpectedData> expected(testData.fingerNum);
402c29fa5a6Sopenharmony_ci
403c29fa5a6Sopenharmony_ci    MMI_HILOGD("Start test %{public}d", testId);
404c29fa5a6Sopenharmony_ci
405c29fa5a6Sopenharmony_ci    for (uint32_t idx = 0; idx < testData.fingerNum; idx++) {
406c29fa5a6Sopenharmony_ci        expected[idx].Reset(idx);
407c29fa5a6Sopenharmony_ci    }
408c29fa5a6Sopenharmony_ci
409c29fa5a6Sopenharmony_ci    failCount_ = 0;
410c29fa5a6Sopenharmony_ci    ctx.Reset();
411c29fa5a6Sopenharmony_ci
412c29fa5a6Sopenharmony_ci    // Send touch down event
413c29fa5a6Sopenharmony_ci    InputEvt touchDown;
414c29fa5a6Sopenharmony_ci    touchDown.Initialize(PointerEvent::POINTER_ACTION_DOWN, testData, ctx);
415c29fa5a6Sopenharmony_ci    eventQueue_.push(std::move(touchDown));
416c29fa5a6Sopenharmony_ci
417c29fa5a6Sopenharmony_ci    // Send touch moving events
418c29fa5a6Sopenharmony_ci    for (uint32_t idx = 0; idx < testData.framesNum; idx++) {
419c29fa5a6Sopenharmony_ci        ctx.lastFrameTime = ctx.frameTime;
420c29fa5a6Sopenharmony_ci        ctx.frameTime += FRAME_TIME;
421c29fa5a6Sopenharmony_ci        ctx.lastTime = 0;
422c29fa5a6Sopenharmony_ci        MMI_HILOGD("Frame %{public}d: lf = %{public}" PRId64 " f = %{public}" PRId64,
423c29fa5a6Sopenharmony_ci                   idx, ctx.lastFrameTime, ctx.frameTime);
424c29fa5a6Sopenharmony_ci
425c29fa5a6Sopenharmony_ci        for (uint32_t eidx = 0; eidx < testData.evtNum; eidx++) {
426c29fa5a6Sopenharmony_ci            InputEvt touchMove;
427c29fa5a6Sopenharmony_ci            touchMove.Initialize(PointerEvent::POINTER_ACTION_MOVE, testData, ctx);
428c29fa5a6Sopenharmony_ci            eventQueue_.push(std::move(touchMove));
429c29fa5a6Sopenharmony_ci        }
430c29fa5a6Sopenharmony_ci
431c29fa5a6Sopenharmony_ci        // Read data from queue and check results
432c29fa5a6Sopenharmony_ci        ReadQueue(testData, ctx, expected);
433c29fa5a6Sopenharmony_ci    }
434c29fa5a6Sopenharmony_ci
435c29fa5a6Sopenharmony_ci    // Send touch up event
436c29fa5a6Sopenharmony_ci    SendTouchUp(testData, ctx, expected);
437c29fa5a6Sopenharmony_ci
438c29fa5a6Sopenharmony_ci    return (failCount_ != 0) ? false : true;
439c29fa5a6Sopenharmony_ci}
440c29fa5a6Sopenharmony_ci
441c29fa5a6Sopenharmony_civoid EventResampleTest::ReadQueue(TestData &testData, Context &ctx, std::vector<ExpectedData> &expected)
442c29fa5a6Sopenharmony_ci{
443c29fa5a6Sopenharmony_ci    std::shared_ptr<PointerEvent> outEvent = nullptr;
444c29fa5a6Sopenharmony_ci    ErrCode status = RET_OK;
445c29fa5a6Sopenharmony_ci
446c29fa5a6Sopenharmony_ci    while (!eventQueue_.empty()) {
447c29fa5a6Sopenharmony_ci        InputEvt &event = eventQueue_.front();
448c29fa5a6Sopenharmony_ci        expected[event.id].AddEvent(event);
449c29fa5a6Sopenharmony_ci        SetupPointerEvent(event, testData);
450c29fa5a6Sopenharmony_ci
451c29fa5a6Sopenharmony_ci        PointerEvent::PointerItem pointerItem;
452c29fa5a6Sopenharmony_ci        pointerEvent_->GetPointerItem(0, pointerItem);
453c29fa5a6Sopenharmony_ci        MMI_HILOGD("pointerEvent_: x = %{public}d y = %{public}d t = %{public}" PRId64,
454c29fa5a6Sopenharmony_ci                   pointerItem.GetDisplayX(), pointerItem.GetDisplayY(), pointerEvent_->GetActionTime());
455c29fa5a6Sopenharmony_ci
456c29fa5a6Sopenharmony_ci        outEvent = EventResampleHdr->OnEventConsume(pointerEvent_, ctx.frameTime, status);
457c29fa5a6Sopenharmony_ci        if ((outEvent != nullptr) && (PointerEvent::POINTER_ACTION_DOWN != outEvent->GetPointerAction())) {
458c29fa5a6Sopenharmony_ci            MMI_HILOGE("Unexpected pointer action: %{public}d while %{public}d expected",
459c29fa5a6Sopenharmony_ci                       outEvent->GetPointerAction(), PointerEvent::POINTER_ACTION_DOWN);
460c29fa5a6Sopenharmony_ci            failCount_++;
461c29fa5a6Sopenharmony_ci        } else if (outEvent != nullptr) {
462c29fa5a6Sopenharmony_ci            EXPECT_EQ(ERR_OK, CheckResults(outEvent, expected, ctx));
463c29fa5a6Sopenharmony_ci            EXPECT_EQ(ERR_OK, status);
464c29fa5a6Sopenharmony_ci        }
465c29fa5a6Sopenharmony_ci        eventQueue_.pop();
466c29fa5a6Sopenharmony_ci    }
467c29fa5a6Sopenharmony_ci
468c29fa5a6Sopenharmony_ci    outEvent = EventResampleHdr->OnEventConsume(nullptr, ctx.frameTime, status);
469c29fa5a6Sopenharmony_ci    if (outEvent != nullptr) {
470c29fa5a6Sopenharmony_ci        EXPECT_EQ(ERR_OK, CheckResults(outEvent, expected, ctx));
471c29fa5a6Sopenharmony_ci        EXPECT_EQ(ERR_OK, status);
472c29fa5a6Sopenharmony_ci    } else {
473c29fa5a6Sopenharmony_ci        MMI_HILOGD("NULL Event_: status = %{public}d", status);
474c29fa5a6Sopenharmony_ci    }
475c29fa5a6Sopenharmony_ci}
476c29fa5a6Sopenharmony_ci
477c29fa5a6Sopenharmony_civoid EventResampleTest::SendTouchUp(TestData &testData, Context &ctx, std::vector<ExpectedData> &expected)
478c29fa5a6Sopenharmony_ci{
479c29fa5a6Sopenharmony_ci    std::shared_ptr<PointerEvent> outEvent = nullptr;
480c29fa5a6Sopenharmony_ci    ErrCode status = RET_OK;
481c29fa5a6Sopenharmony_ci    InputEvt touchUp;
482c29fa5a6Sopenharmony_ci
483c29fa5a6Sopenharmony_ci    touchUp.Initialize(PointerEvent::POINTER_ACTION_UP, testData, ctx);
484c29fa5a6Sopenharmony_ci    expected[touchUp.id].AddEvent(touchUp);
485c29fa5a6Sopenharmony_ci    SetupPointerEvent(touchUp, testData);
486c29fa5a6Sopenharmony_ci    outEvent = EventResampleHdr->OnEventConsume(pointerEvent_, ctx.frameTime, status);
487c29fa5a6Sopenharmony_ci    if (outEvent != nullptr) {
488c29fa5a6Sopenharmony_ci        MMI_HILOGD("Pointer Action: %{public}d", outEvent->GetPointerAction());
489c29fa5a6Sopenharmony_ci        EXPECT_EQ(ERR_OK, CheckResults(outEvent, expected, ctx));
490c29fa5a6Sopenharmony_ci        EXPECT_EQ(ERR_OK, status);
491c29fa5a6Sopenharmony_ci    } else {
492c29fa5a6Sopenharmony_ci        MMI_HILOGD("NULL Event_: status = %{public}d", status);
493c29fa5a6Sopenharmony_ci    }
494c29fa5a6Sopenharmony_ci}
495c29fa5a6Sopenharmony_ci
496c29fa5a6Sopenharmony_ci/**
497c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_001
498c29fa5a6Sopenharmony_ci * @tc.desc: Test to check single touch without moving events
499c29fa5a6Sopenharmony_ci * @tc.type: FUNC
500c29fa5a6Sopenharmony_ci * @tc.require:
501c29fa5a6Sopenharmony_ci */
502c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_001, TestSize.Level1)
503c29fa5a6Sopenharmony_ci{
504c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
505c29fa5a6Sopenharmony_ci    TestData testData = {.framesNum = 5, .fingerNum = 1, .evtNum = 0};
506c29fa5a6Sopenharmony_ci    EXPECT_EQ(EventResampleHdr->GetPointerEvent(), nullptr);
507c29fa5a6Sopenharmony_ci    EXPECT_TRUE(DoTest(testData, 1));
508c29fa5a6Sopenharmony_ci    EXPECT_NE(EventResampleHdr->GetPointerEvent(), nullptr);
509c29fa5a6Sopenharmony_ci}
510c29fa5a6Sopenharmony_ci
511c29fa5a6Sopenharmony_ci/**
512c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_002
513c29fa5a6Sopenharmony_ci * @tc.desc: Basic test to check events interpolation
514c29fa5a6Sopenharmony_ci * @tc.type: FUNC
515c29fa5a6Sopenharmony_ci * @tc.require:
516c29fa5a6Sopenharmony_ci */
517c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_002, TestSize.Level1)
518c29fa5a6Sopenharmony_ci{
519c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
520c29fa5a6Sopenharmony_ci    TestData testData = {.framesNum = 5, .fingerNum = 1, .evtNum = 2};
521c29fa5a6Sopenharmony_ci    EXPECT_TRUE(DoTest(testData, 2));
522c29fa5a6Sopenharmony_ci}
523c29fa5a6Sopenharmony_ci
524c29fa5a6Sopenharmony_ci/**
525c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_003
526c29fa5a6Sopenharmony_ci * @tc.desc: Basic test to check events extrapolation
527c29fa5a6Sopenharmony_ci * @tc.type: FUNC
528c29fa5a6Sopenharmony_ci * @tc.require:
529c29fa5a6Sopenharmony_ci */
530c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_003, TestSize.Level1)
531c29fa5a6Sopenharmony_ci{
532c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
533c29fa5a6Sopenharmony_ci    TestData testData = {.framesNum = 5, .fingerNum = 1, .evtNum = 1};
534c29fa5a6Sopenharmony_ci    EXPECT_TRUE(DoTest(testData, 3));
535c29fa5a6Sopenharmony_ci}
536c29fa5a6Sopenharmony_ci
537c29fa5a6Sopenharmony_ci/**
538c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_004
539c29fa5a6Sopenharmony_ci * @tc.desc: Test to check interpolation behavior when event received later then latency time
540c29fa5a6Sopenharmony_ci * @tc.type: FUNC
541c29fa5a6Sopenharmony_ci * @tc.require:
542c29fa5a6Sopenharmony_ci */
543c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_004, TestSize.Level1)
544c29fa5a6Sopenharmony_ci{
545c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
546c29fa5a6Sopenharmony_ci    TestData testData = {.framesNum = 5, .fingerNum = 1, .evtNum = 1, .timeDelta = 6000};
547c29fa5a6Sopenharmony_ci    EXPECT_TRUE(DoTest(testData, 4));
548c29fa5a6Sopenharmony_ci}
549c29fa5a6Sopenharmony_ci
550c29fa5a6Sopenharmony_ci/**
551c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_005
552c29fa5a6Sopenharmony_ci * @tc.desc: Test to check case when events intervals less than minimal delta value
553c29fa5a6Sopenharmony_ci * @tc.type: FUNC
554c29fa5a6Sopenharmony_ci * @tc.require:
555c29fa5a6Sopenharmony_ci */
556c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_005, TestSize.Level1)
557c29fa5a6Sopenharmony_ci{
558c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
559c29fa5a6Sopenharmony_ci    TestData testData = {.framesNum = 5, .fingerNum = 1, .evtNum = 5, .timeDelta = 1000};
560c29fa5a6Sopenharmony_ci    EXPECT_TRUE(DoTest(testData, 5));
561c29fa5a6Sopenharmony_ci}
562c29fa5a6Sopenharmony_ci
563c29fa5a6Sopenharmony_ci/**
564c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_006
565c29fa5a6Sopenharmony_ci * @tc.desc: Test to check case when many events are received during time frame
566c29fa5a6Sopenharmony_ci * @tc.type: FUNC
567c29fa5a6Sopenharmony_ci * @tc.require:
568c29fa5a6Sopenharmony_ci */
569c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_006, TestSize.Level1)
570c29fa5a6Sopenharmony_ci{
571c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
572c29fa5a6Sopenharmony_ci    TestData testData = {.framesNum = 5, .fingerNum = 1, .evtNum = 3};
573c29fa5a6Sopenharmony_ci    EXPECT_TRUE(DoTest(testData, 6));
574c29fa5a6Sopenharmony_ci}
575c29fa5a6Sopenharmony_ci
576c29fa5a6Sopenharmony_ci/**
577c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_OnEventConsume
578c29fa5a6Sopenharmony_ci * @tc.desc: Test OnEventConsume
579c29fa5a6Sopenharmony_ci * @tc.type: FUNC
580c29fa5a6Sopenharmony_ci * @tc.require:
581c29fa5a6Sopenharmony_ci */
582c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_OnEventConsume, TestSize.Level1)
583c29fa5a6Sopenharmony_ci{
584c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
585c29fa5a6Sopenharmony_ci    std::shared_ptr<PointerEvent> pointerEvent = PointerEvent::Create();
586c29fa5a6Sopenharmony_ci    ASSERT_NE(pointerEvent, nullptr);
587c29fa5a6Sopenharmony_ci    int64_t frameTime = 0;
588c29fa5a6Sopenharmony_ci    ErrCode status = ERR_OK;
589c29fa5a6Sopenharmony_ci    EventResampleHdr->frameTime_ = 0;
590c29fa5a6Sopenharmony_ci    pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_CANCEL);
591c29fa5a6Sopenharmony_ci    ASSERT_NE(EventResampleHdr->OnEventConsume(pointerEvent, frameTime, status), nullptr);
592c29fa5a6Sopenharmony_ci}
593c29fa5a6Sopenharmony_ci
594c29fa5a6Sopenharmony_ci/**
595c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_InitializeInputEvent
596c29fa5a6Sopenharmony_ci * @tc.desc: Test InitializeInputEvent
597c29fa5a6Sopenharmony_ci * @tc.type: FUNC
598c29fa5a6Sopenharmony_ci * @tc.require:
599c29fa5a6Sopenharmony_ci */
600c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_InitializeInputEvent, TestSize.Level1)
601c29fa5a6Sopenharmony_ci{
602c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
603c29fa5a6Sopenharmony_ci    std::shared_ptr<PointerEvent> pointerEvent = nullptr;
604c29fa5a6Sopenharmony_ci    int64_t frameTime = 0;
605c29fa5a6Sopenharmony_ci    EventResampleHdr->frameTime_ = 0;
606c29fa5a6Sopenharmony_ci    ASSERT_EQ(EventResampleHdr->InitializeInputEvent(pointerEvent, frameTime), ERR_OK);
607c29fa5a6Sopenharmony_ci}
608c29fa5a6Sopenharmony_ci
609c29fa5a6Sopenharmony_ci/**
610c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_TransformSampleWindowXY
611c29fa5a6Sopenharmony_ci * @tc.desc: Test TransformSampleWindowXY
612c29fa5a6Sopenharmony_ci * @tc.type: FUNC
613c29fa5a6Sopenharmony_ci * @tc.require:
614c29fa5a6Sopenharmony_ci */
615c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_TransformSampleWindowXY, TestSize.Level1)
616c29fa5a6Sopenharmony_ci{
617c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
618c29fa5a6Sopenharmony_ci    std::shared_ptr<PointerEvent> pointerEvent = nullptr;
619c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem item;
620c29fa5a6Sopenharmony_ci    int32_t logicX = 100;
621c29fa5a6Sopenharmony_ci    int32_t logicY = 100;
622c29fa5a6Sopenharmony_ci    std::pair<int32_t, int32_t> pair { logicX, logicY };
623c29fa5a6Sopenharmony_ci    ASSERT_EQ(EventResampleHdr->TransformSampleWindowXY(pointerEvent, item, logicX, logicY), pair);
624c29fa5a6Sopenharmony_ci}
625c29fa5a6Sopenharmony_ci
626c29fa5a6Sopenharmony_ci/**
627c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_UpdatePointerEvent_001
628c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation UpdatePointerEvent
629c29fa5a6Sopenharmony_ci * @tc.type: FUNC
630c29fa5a6Sopenharmony_ci * @tc.require:
631c29fa5a6Sopenharmony_ci */
632c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_UpdatePointerEvent_001, TestSize.Level1)
633c29fa5a6Sopenharmony_ci{
634c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
635c29fa5a6Sopenharmony_ci    EventResample::MotionEvent outEvent;
636c29fa5a6Sopenharmony_ci    outEvent.actionTime = 100;
637c29fa5a6Sopenharmony_ci    outEvent.pointerAction = PointerEvent::POINTER_ACTION_MOVE;
638c29fa5a6Sopenharmony_ci    outEvent.actionTime = 5;
639c29fa5a6Sopenharmony_ci    outEvent.eventId = 6;
640c29fa5a6Sopenharmony_ci    EventResample::Pointer p;
641c29fa5a6Sopenharmony_ci    p.coordX = 100;
642c29fa5a6Sopenharmony_ci    p.coordY = 10;
643c29fa5a6Sopenharmony_ci    p.toolType = 1;
644c29fa5a6Sopenharmony_ci    p.id = 6;
645c29fa5a6Sopenharmony_ci    outEvent.pointers.insert(std::make_pair(1, p));
646c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->UpdatePointerEvent(&outEvent));
647c29fa5a6Sopenharmony_ci    outEvent.pointerAction = PointerEvent::POINTER_ACTION_UP;
648c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->UpdatePointerEvent(&outEvent));
649c29fa5a6Sopenharmony_ci    outEvent.pointerAction = PointerEvent::POINTER_ACTION_DOWN;
650c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->UpdatePointerEvent(&outEvent));
651c29fa5a6Sopenharmony_ci}
652c29fa5a6Sopenharmony_ci
653c29fa5a6Sopenharmony_ci/**
654c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_UpdatePointerEvent_002
655c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation UpdatePointerEvent
656c29fa5a6Sopenharmony_ci * @tc.type: FUNC
657c29fa5a6Sopenharmony_ci * @tc.require:
658c29fa5a6Sopenharmony_ci */
659c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_UpdatePointerEvent_002, TestSize.Level1)
660c29fa5a6Sopenharmony_ci{
661c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
662c29fa5a6Sopenharmony_ci    EventResample::MotionEvent outEvent;
663c29fa5a6Sopenharmony_ci    outEvent.actionTime = 20;
664c29fa5a6Sopenharmony_ci    outEvent.pointerAction = 10;
665c29fa5a6Sopenharmony_ci    outEvent.actionTime = 2;
666c29fa5a6Sopenharmony_ci    outEvent.eventId = 6;
667c29fa5a6Sopenharmony_ci    EventResample::Pointer p;
668c29fa5a6Sopenharmony_ci    p.coordX = 20;
669c29fa5a6Sopenharmony_ci    p.coordY = 30;
670c29fa5a6Sopenharmony_ci    p.toolType = 2;
671c29fa5a6Sopenharmony_ci    p.id = 3;
672c29fa5a6Sopenharmony_ci    outEvent.pointers.insert(std::make_pair(1, p));
673c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->UpdatePointerEvent(&outEvent));
674c29fa5a6Sopenharmony_ci}
675c29fa5a6Sopenharmony_ci
676c29fa5a6Sopenharmony_ci/**
677c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_TransformSampleWindowXY_001
678c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation TransformSampleWindowXY
679c29fa5a6Sopenharmony_ci * @tc.type: FUNC
680c29fa5a6Sopenharmony_ci * @tc.require:
681c29fa5a6Sopenharmony_ci */
682c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_TransformSampleWindowXY_001, TestSize.Level1)
683c29fa5a6Sopenharmony_ci{
684c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
685c29fa5a6Sopenharmony_ci    std::shared_ptr<PointerEvent> pointerEvent = PointerEvent::Create();
686c29fa5a6Sopenharmony_ci    ASSERT_NE(pointerEvent, nullptr);
687c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem item;
688c29fa5a6Sopenharmony_ci    item.SetPointerId(0);
689c29fa5a6Sopenharmony_ci    item.SetDownTime(100);
690c29fa5a6Sopenharmony_ci    item.SetToolDisplayX(90);
691c29fa5a6Sopenharmony_ci    item.SetToolDisplayY(90);
692c29fa5a6Sopenharmony_ci    item.SetToolWindowX(50);
693c29fa5a6Sopenharmony_ci    item.SetToolWindowY(50);
694c29fa5a6Sopenharmony_ci    item.SetToolWidth(30);
695c29fa5a6Sopenharmony_ci    item.SetToolHeight(30);
696c29fa5a6Sopenharmony_ci    item.SetLongAxis(100);
697c29fa5a6Sopenharmony_ci    item.SetShortAxis(20);
698c29fa5a6Sopenharmony_ci    item.SetToolType(2);
699c29fa5a6Sopenharmony_ci    item.SetTargetWindowId(0);
700c29fa5a6Sopenharmony_ci    pointerEvent->AddPointerItem(item);
701c29fa5a6Sopenharmony_ci    int32_t logicX = 100;
702c29fa5a6Sopenharmony_ci    int32_t logicY = 100;
703c29fa5a6Sopenharmony_ci    std::shared_ptr<InputEvent> inputEvent = InputEvent::Create();
704c29fa5a6Sopenharmony_ci    EXPECT_NE(inputEvent, nullptr);
705c29fa5a6Sopenharmony_ci    inputEvent->targetDisplayId_ = 10;
706c29fa5a6Sopenharmony_ci    inputEvent->targetWindowId_ = 10;
707c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->TransformSampleWindowXY(pointerEvent, item, logicX, logicY));
708c29fa5a6Sopenharmony_ci    WindowInfo window;
709c29fa5a6Sopenharmony_ci    window.transform.push_back(1.0f);
710c29fa5a6Sopenharmony_ci    window.transform.push_back(2.0f);
711c29fa5a6Sopenharmony_ci    window.transform.push_back(3.0f);
712c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->TransformSampleWindowXY(pointerEvent, item, logicX, logicY));
713c29fa5a6Sopenharmony_ci}
714c29fa5a6Sopenharmony_ci
715c29fa5a6Sopenharmony_ci/**
716c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_TransformSampleWindowXY_002
717c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation TransformSampleWindowXY
718c29fa5a6Sopenharmony_ci * @tc.type: FUNC
719c29fa5a6Sopenharmony_ci * @tc.require:
720c29fa5a6Sopenharmony_ci */
721c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_TransformSampleWindowXY_002, TestSize.Level1)
722c29fa5a6Sopenharmony_ci{
723c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
724c29fa5a6Sopenharmony_ci    std::shared_ptr<PointerEvent> pointerEvent = PointerEvent::Create();
725c29fa5a6Sopenharmony_ci    ASSERT_NE(pointerEvent, nullptr);
726c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem item;
727c29fa5a6Sopenharmony_ci    item.SetPointerId(1);
728c29fa5a6Sopenharmony_ci    item.SetDownTime(10);
729c29fa5a6Sopenharmony_ci    item.SetToolDisplayX(9);
730c29fa5a6Sopenharmony_ci    item.SetToolDisplayY(8);
731c29fa5a6Sopenharmony_ci    item.SetToolWindowX(7);
732c29fa5a6Sopenharmony_ci    item.SetToolWindowY(6);
733c29fa5a6Sopenharmony_ci    item.SetToolWidth(5);
734c29fa5a6Sopenharmony_ci    item.SetToolHeight(4);
735c29fa5a6Sopenharmony_ci    item.SetLongAxis(3);
736c29fa5a6Sopenharmony_ci    item.SetShortAxis(2);
737c29fa5a6Sopenharmony_ci    item.SetToolType(1);
738c29fa5a6Sopenharmony_ci    item.SetTargetWindowId(0);
739c29fa5a6Sopenharmony_ci    pointerEvent->AddPointerItem(item);
740c29fa5a6Sopenharmony_ci    int32_t logicX = 10;
741c29fa5a6Sopenharmony_ci    int32_t logicY = 20;
742c29fa5a6Sopenharmony_ci    std::shared_ptr<InputEvent> inputEvent = InputEvent::Create();
743c29fa5a6Sopenharmony_ci    EXPECT_NE(inputEvent, nullptr);
744c29fa5a6Sopenharmony_ci    inputEvent->targetDisplayId_ = 20;
745c29fa5a6Sopenharmony_ci    inputEvent->targetWindowId_ = 10;
746c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->TransformSampleWindowXY(pointerEvent, item, logicX, logicY));
747c29fa5a6Sopenharmony_ci}
748c29fa5a6Sopenharmony_ci
749c29fa5a6Sopenharmony_ci/**
750c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_ConsumeBatch_001
751c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation ConsumeBatch
752c29fa5a6Sopenharmony_ci * @tc.type: FUNC
753c29fa5a6Sopenharmony_ci * @tc.require:
754c29fa5a6Sopenharmony_ci */
755c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_ConsumeBatch_001, TestSize.Level1)
756c29fa5a6Sopenharmony_ci{
757c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
758c29fa5a6Sopenharmony_ci    int64_t frameTime = 5;
759c29fa5a6Sopenharmony_ci    EventResample::MotionEvent** outEvent = new EventResample::MotionEvent*[3];
760c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->ConsumeBatch(frameTime, outEvent));
761c29fa5a6Sopenharmony_ci    frameTime = -4;
762c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->ConsumeBatch(frameTime, outEvent));
763c29fa5a6Sopenharmony_ci}
764c29fa5a6Sopenharmony_ci
765c29fa5a6Sopenharmony_ci/**
766c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_ResampleTouchState_001
767c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation ResampleTouchState
768c29fa5a6Sopenharmony_ci * @tc.type: FUNC
769c29fa5a6Sopenharmony_ci * @tc.require:
770c29fa5a6Sopenharmony_ci */
771c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_ResampleTouchState_001, TestSize.Level1)
772c29fa5a6Sopenharmony_ci{
773c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
774c29fa5a6Sopenharmony_ci    int64_t sampleTime = 5;
775c29fa5a6Sopenharmony_ci    EventResample::MotionEvent event;
776c29fa5a6Sopenharmony_ci    EventResample::MotionEvent next;
777c29fa5a6Sopenharmony_ci    event.actionTime = 10;
778c29fa5a6Sopenharmony_ci    event.pointerAction = 20;
779c29fa5a6Sopenharmony_ci    event.actionTime = 5;
780c29fa5a6Sopenharmony_ci    event.eventId = 6;
781c29fa5a6Sopenharmony_ci    next.actionTime = 20;
782c29fa5a6Sopenharmony_ci    next.pointerAction = 30;
783c29fa5a6Sopenharmony_ci    next.actionTime = 8;
784c29fa5a6Sopenharmony_ci    next.eventId = 9;
785c29fa5a6Sopenharmony_ci    EventResampleHdr->resampleTouch_ = false;
786c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->ResampleTouchState(sampleTime, &event, &next));
787c29fa5a6Sopenharmony_ci    EventResampleHdr->resampleTouch_ = true;
788c29fa5a6Sopenharmony_ci    event.sourceType = PointerEvent::SOURCE_TYPE_TOUCHPAD;
789c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->ResampleTouchState(sampleTime, &event, &next));
790c29fa5a6Sopenharmony_ci    event.sourceType = PointerEvent::SOURCE_TYPE_TOUCHSCREEN;
791c29fa5a6Sopenharmony_ci    event.pointerAction = PointerEvent::POINTER_ACTION_UP;
792c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->ResampleTouchState(sampleTime, &event, &next));
793c29fa5a6Sopenharmony_ci    event.pointerAction = PointerEvent::POINTER_ACTION_MOVE;
794c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->ResampleTouchState(sampleTime, &event, &next));
795c29fa5a6Sopenharmony_ci}
796c29fa5a6Sopenharmony_ci
797c29fa5a6Sopenharmony_ci/**
798c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_ResampleTouchState_002
799c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation ResampleTouchState
800c29fa5a6Sopenharmony_ci * @tc.type: FUNC
801c29fa5a6Sopenharmony_ci * @tc.require:
802c29fa5a6Sopenharmony_ci */
803c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_ResampleTouchState_002, TestSize.Level1)
804c29fa5a6Sopenharmony_ci{
805c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
806c29fa5a6Sopenharmony_ci    int64_t sampleTime = 7;
807c29fa5a6Sopenharmony_ci    EventResample::MotionEvent event;
808c29fa5a6Sopenharmony_ci    EventResample::MotionEvent next;
809c29fa5a6Sopenharmony_ci    event.actionTime = 1;
810c29fa5a6Sopenharmony_ci    event.pointerAction = 2;
811c29fa5a6Sopenharmony_ci    event.actionTime = 2;
812c29fa5a6Sopenharmony_ci    event.eventId = 4;
813c29fa5a6Sopenharmony_ci    next.actionTime = 5;
814c29fa5a6Sopenharmony_ci    next.pointerAction = 6;
815c29fa5a6Sopenharmony_ci    next.actionTime = 7;
816c29fa5a6Sopenharmony_ci    next.eventId = 8;
817c29fa5a6Sopenharmony_ci    EventResampleHdr->resampleTouch_ = true;
818c29fa5a6Sopenharmony_ci    event.sourceType = PointerEvent::SOURCE_TYPE_TOUCHSCREEN;
819c29fa5a6Sopenharmony_ci    event.pointerAction = PointerEvent::POINTER_ACTION_MOVE;
820c29fa5a6Sopenharmony_ci    int32_t deviceId = 9;
821c29fa5a6Sopenharmony_ci    int32_t source = 8;
822c29fa5a6Sopenharmony_ci    EventResample::TouchState ts;
823c29fa5a6Sopenharmony_ci    ts.deviceId = 9;
824c29fa5a6Sopenharmony_ci    ts.source = 8;
825c29fa5a6Sopenharmony_ci    ts.historyCurrent = 3;
826c29fa5a6Sopenharmony_ci    ts.historySize = 4;
827c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->ResampleTouchState(sampleTime, &event, &next));
828c29fa5a6Sopenharmony_ci    deviceId = 15;
829c29fa5a6Sopenharmony_ci    source = 13;
830c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->ResampleTouchState(sampleTime, &event, &next));
831c29fa5a6Sopenharmony_ci}
832c29fa5a6Sopenharmony_ci
833c29fa5a6Sopenharmony_ci/**
834c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_ResampleCoordinates_001
835c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation ResampleCoordinates
836c29fa5a6Sopenharmony_ci * @tc.type: FUNC
837c29fa5a6Sopenharmony_ci * @tc.require:
838c29fa5a6Sopenharmony_ci */
839c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_ResampleCoordinates_001, TestSize.Level1)
840c29fa5a6Sopenharmony_ci{
841c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
842c29fa5a6Sopenharmony_ci    int64_t sampleTime = 6;
843c29fa5a6Sopenharmony_ci    EventResample::MotionEvent event;
844c29fa5a6Sopenharmony_ci    EventResample::TouchState touchState;
845c29fa5a6Sopenharmony_ci    EventResample::History current;
846c29fa5a6Sopenharmony_ci    EventResample::History other;
847c29fa5a6Sopenharmony_ci    float alpha = 1.0;
848c29fa5a6Sopenharmony_ci    EventResample::Pointer p;
849c29fa5a6Sopenharmony_ci    p.coordX = 20;
850c29fa5a6Sopenharmony_ci    p.coordY = 30;
851c29fa5a6Sopenharmony_ci    p.toolType = 2;
852c29fa5a6Sopenharmony_ci    p.id = 5;
853c29fa5a6Sopenharmony_ci    event.pointers.insert(std::make_pair(1, p));
854c29fa5a6Sopenharmony_ci    EventResample::TouchState ts;
855c29fa5a6Sopenharmony_ci    ts.deviceId = 5;
856c29fa5a6Sopenharmony_ci    ts.source = 2;
857c29fa5a6Sopenharmony_ci    ts.historyCurrent = 3;
858c29fa5a6Sopenharmony_ci    ts.historySize = 4;
859c29fa5a6Sopenharmony_ci    EventResampleHdr->touchStates_.push_back(ts);
860c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->ResampleCoordinates(sampleTime, &event, touchState, &current,
861c29fa5a6Sopenharmony_ci        &other, alpha));
862c29fa5a6Sopenharmony_ci}
863c29fa5a6Sopenharmony_ci
864c29fa5a6Sopenharmony_ci/**
865c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_ResampleCoordinates_002
866c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation ResampleCoordinates
867c29fa5a6Sopenharmony_ci * @tc.type: FUNC
868c29fa5a6Sopenharmony_ci * @tc.require:
869c29fa5a6Sopenharmony_ci */
870c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_ResampleCoordinates_002, TestSize.Level1)
871c29fa5a6Sopenharmony_ci{
872c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
873c29fa5a6Sopenharmony_ci    int64_t sampleTime = 2;
874c29fa5a6Sopenharmony_ci    EventResample::MotionEvent event;
875c29fa5a6Sopenharmony_ci    EventResample::TouchState touchState;
876c29fa5a6Sopenharmony_ci    EventResample::History current;
877c29fa5a6Sopenharmony_ci    EventResample::History other;
878c29fa5a6Sopenharmony_ci    float alpha = 5.0;
879c29fa5a6Sopenharmony_ci    EventResample::Pointer p;
880c29fa5a6Sopenharmony_ci    p.coordX = 5;
881c29fa5a6Sopenharmony_ci    p.coordY = 8;
882c29fa5a6Sopenharmony_ci    p.toolType = 9;
883c29fa5a6Sopenharmony_ci    p.id = 2;
884c29fa5a6Sopenharmony_ci    event.pointers.insert(std::make_pair(1, p));
885c29fa5a6Sopenharmony_ci    EventResample::TouchState ts;
886c29fa5a6Sopenharmony_ci    ts.deviceId = 3;
887c29fa5a6Sopenharmony_ci    ts.source = 4;
888c29fa5a6Sopenharmony_ci    ts.historyCurrent = 7;
889c29fa5a6Sopenharmony_ci    ts.historySize = 5;
890c29fa5a6Sopenharmony_ci    EventResampleHdr->touchStates_.push_back(ts);
891c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->ResampleCoordinates(sampleTime, &event, touchState, &current,
892c29fa5a6Sopenharmony_ci        &other, alpha));
893c29fa5a6Sopenharmony_ci}
894c29fa5a6Sopenharmony_ci
895c29fa5a6Sopenharmony_ci/**
896c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_FindBatch_001
897c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation FindBatch
898c29fa5a6Sopenharmony_ci * @tc.type: FUNC
899c29fa5a6Sopenharmony_ci * @tc.require:
900c29fa5a6Sopenharmony_ci */
901c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_FindBatch_001, TestSize.Level1)
902c29fa5a6Sopenharmony_ci{
903c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
904c29fa5a6Sopenharmony_ci    int32_t deviceId = 1;
905c29fa5a6Sopenharmony_ci    int32_t source = 3;
906c29fa5a6Sopenharmony_ci    EventResample::MotionEvent motionEvent;
907c29fa5a6Sopenharmony_ci    motionEvent.deviceId = 1;
908c29fa5a6Sopenharmony_ci    motionEvent.sourceType = 3;
909c29fa5a6Sopenharmony_ci    EventResample::Batch batch;
910c29fa5a6Sopenharmony_ci    batch.samples.push_back(motionEvent);
911c29fa5a6Sopenharmony_ci    EventResampleHdr->batches_.push_back(batch);
912c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->FindBatch(deviceId, source));
913c29fa5a6Sopenharmony_ci    deviceId = 5;
914c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->FindBatch(deviceId, source));
915c29fa5a6Sopenharmony_ci    source = 6;
916c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->FindBatch(deviceId, source));
917c29fa5a6Sopenharmony_ci}
918c29fa5a6Sopenharmony_ci
919c29fa5a6Sopenharmony_ci/**
920c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_FindTouchState_001
921c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation FindTouchState
922c29fa5a6Sopenharmony_ci * @tc.type: FUNC
923c29fa5a6Sopenharmony_ci * @tc.require:
924c29fa5a6Sopenharmony_ci */
925c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_FindTouchState_001, TestSize.Level1)
926c29fa5a6Sopenharmony_ci{
927c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
928c29fa5a6Sopenharmony_ci    int32_t deviceId = 1;
929c29fa5a6Sopenharmony_ci    int32_t source = 2;
930c29fa5a6Sopenharmony_ci    EventResample::TouchState ts;
931c29fa5a6Sopenharmony_ci    ts.deviceId = 1;
932c29fa5a6Sopenharmony_ci    ts.source = 2;
933c29fa5a6Sopenharmony_ci    ts.historyCurrent = 3;
934c29fa5a6Sopenharmony_ci    ts.historySize = 4;
935c29fa5a6Sopenharmony_ci    EventResampleHdr->touchStates_.push_back(ts);
936c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->FindTouchState(deviceId, source));
937c29fa5a6Sopenharmony_ci    deviceId = 5;
938c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->FindTouchState(deviceId, source));
939c29fa5a6Sopenharmony_ci    source = 6;
940c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->FindTouchState(deviceId, source));
941c29fa5a6Sopenharmony_ci}
942c29fa5a6Sopenharmony_ci
943c29fa5a6Sopenharmony_ci/**
944c29fa5a6Sopenharmony_ci * @tc.name: EventResampleTest_RewriteMessage_001
945c29fa5a6Sopenharmony_ci * @tc.desc: Test the funcation RewriteMessage
946c29fa5a6Sopenharmony_ci * @tc.type: FUNC
947c29fa5a6Sopenharmony_ci * @tc.require:
948c29fa5a6Sopenharmony_ci */
949c29fa5a6Sopenharmony_ciHWTEST_F(EventResampleTest, EventResampleTest_RewriteMessage_001, TestSize.Level1)
950c29fa5a6Sopenharmony_ci{
951c29fa5a6Sopenharmony_ci    CALL_TEST_DEBUG;
952c29fa5a6Sopenharmony_ci    EventResample::TouchState state;
953c29fa5a6Sopenharmony_ci    EventResample::MotionEvent event;
954c29fa5a6Sopenharmony_ci    EventResample::Pointer p;
955c29fa5a6Sopenharmony_ci    p.coordX = 20;
956c29fa5a6Sopenharmony_ci    p.coordY = 30;
957c29fa5a6Sopenharmony_ci    p.toolType = 2;
958c29fa5a6Sopenharmony_ci    p.id = 5;
959c29fa5a6Sopenharmony_ci    event.pointers.insert(std::make_pair(1, p));
960c29fa5a6Sopenharmony_ci    EventResample::TouchState ts;
961c29fa5a6Sopenharmony_ci    ts.deviceId = 3;
962c29fa5a6Sopenharmony_ci    ts.source = 2;
963c29fa5a6Sopenharmony_ci    ts.historyCurrent = 3;
964c29fa5a6Sopenharmony_ci    ts.historySize = 4;
965c29fa5a6Sopenharmony_ci    EventResampleHdr->touchStates_.push_back(ts);
966c29fa5a6Sopenharmony_ci    event.actionTime = 10;
967c29fa5a6Sopenharmony_ci    state.lastResample.actionTime = 5;
968c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->RewriteMessage(state, event));
969c29fa5a6Sopenharmony_ci    event.actionTime = 5;
970c29fa5a6Sopenharmony_ci    state.lastResample.actionTime = 10;
971c29fa5a6Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(EventResampleHdr->RewriteMessage(state, event));
972c29fa5a6Sopenharmony_ci}
973c29fa5a6Sopenharmony_ci} // namespace MMI
974c29fa5a6Sopenharmony_ci} // namespace OHOS
975