/* * Copyright (c) 2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "event_log_helper.h" #include "input_handler_type.h" #include "key_command_handler.h" #include "input_event_handler.h" #include "mmi_log.h" #include "multimodal_event_handler.h" #include "system_info.h" #include "util.h" namespace OHOS { namespace MMI { namespace { using namespace testing::ext; constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "KeyCommandHandlerTest" }; constexpr int32_t NANOSECOND_TO_MILLISECOND = 1000000; constexpr int32_t SEC_TO_NANOSEC = 1000000000; constexpr int32_t COMMON_PARAMETER_ERROR = 401; constexpr int32_t NONE_CLICK_STATE = 0; constexpr int32_t CLICK_STATE = 1; } // namespace class KeyCommandHandlerTest : public testing::Test { public: static void SetUpTestCase(void) {} static void TearDownTestCase(void) {} std::shared_ptr SetupKeyEvent(); #ifdef OHOS_BUILD_ENABLE_TOUCH std::shared_ptr SetupDoubleFingerDownEvent(); std::shared_ptr SetupSingleKnuckleDownEvent(); std::shared_ptr SetupDoubleKnuckleDownEvent(); #endif // OHOS_BUILD_ENABLE_TOUCH }; int64_t GetNanoTime() { struct timespec time = { 0 }; clock_gettime(CLOCK_MONOTONIC, &time); return static_cast(time.tv_sec) * SEC_TO_NANOSEC + time.tv_nsec; } std::shared_ptr KeyCommandHandlerTest::SetupKeyEvent() { std::shared_ptr keyEvent = KeyEvent::Create(); CHKPP(keyEvent); int64_t downTime = GetNanoTime() / NANOSECOND_TO_MILLISECOND; KeyEvent::KeyItem kitDown; kitDown.SetKeyCode(KeyEvent::KEYCODE_HOME); kitDown.SetPressed(true); kitDown.SetDownTime(downTime); keyEvent->SetKeyCode(KeyEvent::KEYCODE_HOME); keyEvent->SetKeyAction(KeyEvent::KEY_ACTION_DOWN); keyEvent->AddPressedKeyItems(kitDown); return keyEvent; } #ifdef OHOS_BUILD_ENABLE_TOUCH std::shared_ptr KeyCommandHandlerTest::SetupDoubleFingerDownEvent() { std::shared_ptr pointerEvent = PointerEvent::Create(); CHKPP(pointerEvent); PointerEvent::PointerItem item; PointerEvent::PointerItem item2; item.SetPointerId(0); item.SetToolType(PointerEvent::TOOL_TYPE_FINGER); int32_t downX = 100; int32_t downY = 200; item.SetDisplayX(downX); item.SetDisplayY(downY); item.SetPressed(true); pointerEvent->SetPointerId(0); pointerEvent->AddPointerItem(item); item2.SetPointerId(1); item2.SetToolType(PointerEvent::TOOL_TYPE_FINGER); int32_t secondDownX = 120; int32_t secondDownY = 220; item2.SetDisplayX(secondDownX); item2.SetDisplayY(secondDownY); item2.SetPressed(true); pointerEvent->SetPointerId(1); pointerEvent->AddPointerItem(item2); pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN); pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN); return pointerEvent; } std::shared_ptr KeyCommandHandlerTest::SetupSingleKnuckleDownEvent() { std::shared_ptr pointerEvent = PointerEvent::Create(); CHKPP(pointerEvent); PointerEvent::PointerItem item; item.SetPointerId(0); item.SetToolType(PointerEvent::TOOL_TYPE_KNUCKLE); int32_t downX = 100; int32_t downY = 200; item.SetDisplayX(downX); item.SetDisplayY(downY); item.SetPressed(true); pointerEvent->SetPointerId(0); pointerEvent->AddPointerItem(item); pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN); pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN); return pointerEvent; } std::shared_ptr KeyCommandHandlerTest::SetupDoubleKnuckleDownEvent() { std::shared_ptr pointerEvent = PointerEvent::Create(); CHKPP(pointerEvent); PointerEvent::PointerItem item; PointerEvent::PointerItem item2; item.SetPointerId(0); item.SetToolType(PointerEvent::TOOL_TYPE_KNUCKLE); int32_t downX = 100; int32_t downY = 200; item.SetDisplayX(downX); item.SetDisplayY(downY); item.SetPressed(true); pointerEvent->SetPointerId(0); pointerEvent->AddPointerItem(item); item2.SetPointerId(1); item2.SetToolType(PointerEvent::TOOL_TYPE_KNUCKLE); int32_t secondDownX = 120; int32_t secondDownY = 220; item2.SetDisplayX(secondDownX); item2.SetDisplayY(secondDownY); item2.SetPressed(true); pointerEvent->SetPointerId(1); pointerEvent->AddPointerItem(item2); pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN); pointerEvent->SetSourceType(PointerEvent::SOURCE_TYPE_TOUCHSCREEN); return pointerEvent; } #endif // OHOS_BUILD_ENABLE_TOUCH /** * @tc.name: KeyCommandHandlerTest_001 * @tc.desc: Test update key down duration 0, 100, 4000 * @tc.type: FUNC * @tc.require: */ HWTEST_F(KeyCommandHandlerTest, KeyCommandHandlerTest_001, TestSize.Level1) { KeyCommandHandler eventKeyCommandHandler; std::string businessId = "aaa"; int32_t delay = 0; ASSERT_EQ(COMMON_PARAMETER_ERROR, eventKeyCommandHandler.UpdateSettingsXml(businessId, delay)); delay = 100; ASSERT_EQ(COMMON_PARAMETER_ERROR, eventKeyCommandHandler.UpdateSettingsXml(businessId, delay)); delay = 4000; ASSERT_EQ(COMMON_PARAMETER_ERROR, eventKeyCommandHandler.UpdateSettingsXml(businessId, delay)); } /** * @tc.name: KeyCommandHandlerTest_002 * @tc.desc: Test update key down duration -1 and 4001 * @tc.type: FUNC * @tc.require: */ HWTEST_F(KeyCommandHandlerTest, KeyCommandHandlerTest_002, TestSize.Level1) { KeyCommandHandler eventKeyCommandHandler; std::string businessId = "com.ohos.camera"; int32_t delay = -1; ASSERT_EQ(COMMON_PARAMETER_ERROR, eventKeyCommandHandler.UpdateSettingsXml(businessId, delay)); delay = 4001; ASSERT_EQ(COMMON_PARAMETER_ERROR, eventKeyCommandHandler.UpdateSettingsXml(businessId, delay)); } /** * @tc.name: KeyCommandHandlerTest_003 * @tc.desc: Test businessId is "" * @tc.type: FUNC * @tc.require: */ HWTEST_F(KeyCommandHandlerTest, KeyCommandHandlerTest_003, TestSize.Level1) { KeyCommandHandler eventKeyCommandHandler; std::string businessId = ""; int32_t delay = 100; ASSERT_EQ(COMMON_PARAMETER_ERROR, eventKeyCommandHandler.UpdateSettingsXml(businessId, delay)); } /** * @tc.name: KeyCommandHandlerTest_004 * @tc.desc: Test key event * @tc.type: FUNC * @tc.require: */ HWTEST_F(KeyCommandHandlerTest, KeyCommandHandlerTest_004, TestSize.Level1) { CALL_TEST_DEBUG; auto keyEvent = SetupKeyEvent(); ASSERT_TRUE(keyEvent != nullptr); KeyCommandHandler eventKeyCommandHandler; ASSERT_FALSE(eventKeyCommandHandler.OnHandleEvent(keyEvent)); } #ifdef OHOS_BUILD_ENABLE_TOUCH /** * @tc.name: KeyCommandHandlerTest_TouchTest_001 * @tc.desc: Test key event * @tc.type: FUNC * @tc.require: */ HWTEST_F(KeyCommandHandlerTest, KeyCommandHandlerTest_TouchTest_001, TestSize.Level1) { CALL_DEBUG_ENTER; auto pointerEvent = SetupDoubleFingerDownEvent(); ASSERT_TRUE(pointerEvent != nullptr); KeyCommandHandler keyCommandHandler; keyCommandHandler.HandlePointerActionDownEvent(pointerEvent); pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE); keyCommandHandler.HandlePointerActionMoveEvent(pointerEvent); pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_UP); keyCommandHandler.HandlePointerActionUpEvent(pointerEvent); ASSERT_EQ(NONE_CLICK_STATE, keyCommandHandler.GetSingleKnuckleGesture().state); ASSERT_EQ(NONE_CLICK_STATE, keyCommandHandler.GetDoubleKnuckleGesture().state); } /** * @tc.name: KeyCommandHandlerTest_KnuckleTest_001 * @tc.desc: Test key event * @tc.type: FUNC * @tc.require: */ HWTEST_F(KeyCommandHandlerTest, KeyCommandHandlerTest_KnuckleTest_001, TestSize.Level1) { CALL_DEBUG_ENTER; auto pointerEvent = SetupSingleKnuckleDownEvent(); ASSERT_TRUE(pointerEvent != nullptr); KeyCommandHandler keyCommandHandler; keyCommandHandler.HandlePointerActionDownEvent(pointerEvent); ASSERT_EQ(CLICK_STATE, keyCommandHandler.GetSingleKnuckleGesture().state); ASSERT_EQ(NONE_CLICK_STATE, keyCommandHandler.GetDoubleKnuckleGesture().state); pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_UP); keyCommandHandler.HandlePointerActionUpEvent(pointerEvent); pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN); keyCommandHandler.HandlePointerActionDownEvent(pointerEvent); ASSERT_EQ(NONE_CLICK_STATE, keyCommandHandler.GetSingleKnuckleGesture().state); ASSERT_EQ(NONE_CLICK_STATE, keyCommandHandler.GetDoubleKnuckleGesture().state); pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_UP); keyCommandHandler.HandlePointerActionUpEvent(pointerEvent); } /** * @tc.name: KeyCommandHandlerTest_KnuckleTest_002 * @tc.desc: Test key event * @tc.type: FUNC * @tc.require: */ HWTEST_F(KeyCommandHandlerTest, KeyCommandHandlerTest_KnuckleTest_002, TestSize.Level1) { CALL_DEBUG_ENTER; auto pointerEvent = SetupDoubleKnuckleDownEvent(); ASSERT_TRUE(pointerEvent != nullptr); KeyCommandHandler keyCommandHandler; keyCommandHandler.HandlePointerActionDownEvent(pointerEvent); ASSERT_EQ(NONE_CLICK_STATE, keyCommandHandler.GetSingleKnuckleGesture().state); ASSERT_EQ(CLICK_STATE, keyCommandHandler.GetDoubleKnuckleGesture().state); pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_UP); keyCommandHandler.HandlePointerActionUpEvent(pointerEvent); pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN); keyCommandHandler.HandlePointerActionDownEvent(pointerEvent); ASSERT_EQ(NONE_CLICK_STATE, keyCommandHandler.GetSingleKnuckleGesture().state); ASSERT_EQ(NONE_CLICK_STATE, keyCommandHandler.GetDoubleKnuckleGesture().state); } /** * @tc.name: KeyCommandHandlerTest_KnuckleTest_003 * @tc.desc: Test key event * @tc.type: FUNC * @tc.require: */ HWTEST_F(KeyCommandHandlerTest, KeyCommandHandlerTest_KnuckleTest_003, TestSize.Level1) { CALL_DEBUG_ENTER; auto singlePointerEvent = SetupSingleKnuckleDownEvent(); ASSERT_TRUE(singlePointerEvent != nullptr); auto pointerEvent = SetupDoubleKnuckleDownEvent(); ASSERT_TRUE(pointerEvent != nullptr); KeyCommandHandler keyCommandHandler; keyCommandHandler.HandlePointerActionDownEvent(singlePointerEvent); ASSERT_EQ(CLICK_STATE, keyCommandHandler.GetSingleKnuckleGesture().state); singlePointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_UP); keyCommandHandler.HandlePointerActionUpEvent(singlePointerEvent); keyCommandHandler.HandlePointerActionDownEvent(pointerEvent); ASSERT_EQ(NONE_CLICK_STATE, keyCommandHandler.GetSingleKnuckleGesture().state); ASSERT_EQ(CLICK_STATE, keyCommandHandler.GetDoubleKnuckleGesture().state); } #endif // OHOS_BUILD_ENABLE_TOUCH } // namespace MMI } // namespace OHOS