/*
 * Copyright (c) 2026 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 "gtest/gtest.h"
#include "error_code.h"
#include "node/event_converter.h"
#include "node_model.h"

using namespace testing;
using namespace testing::ext;
using namespace OHOS::Ace::NodeModel;

class EventConverterErrorTest : public testing::Test {
public:
    static void SetUpTestCase()
    {
        InitialFullImpl();
    }
    static void TearDownTestCase() {}
};

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_GetNumberValue_NullEvent_001
 * @tc.desc: Test OH_ArkUI_NodeEvent_GetNumberValue with null event parameter.
 *           Verifies SET_ERROR_MESSAGE triggers and returns ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_GetNumberValue_NullEvent_001, TestSize.Level1)
{
    ArkUI_NumberValue value;
    int32_t result = OH_ArkUI_NodeEvent_GetNumberValue(nullptr, 0, &value);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_GetNumberValue_InvalidCategory_002
 * @tc.desc: Test OH_ArkUI_NodeEvent_GetNumberValue with invalid event category.
 *           Verifies SET_ERROR_MESSAGE triggers for category mismatch.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_GetNumberValue_InvalidCategory_002, TestSize.Level1)
{
    ArkUI_NodeEvent event;
    event.category = static_cast<int32_t>(NODE_EVENT_CATEGORY_COMPONENT_EVENT);
    event.origin = nullptr;
    ArkUI_NumberValue value;
    int32_t result = OH_ArkUI_NodeEvent_GetNumberValue(&event, 0, &value);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_GetNumberValue_NullOriginEvent_003
 * @tc.desc: Test OH_ArkUI_NodeEvent_GetNumberValue with null originNodeEvent.
 *           Verifies SET_ERROR_MESSAGE triggers when event->origin is null.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_GetNumberValue_NullOriginEvent_003, TestSize.Level1)
{
    ArkUI_NodeEvent event;
    event.category = static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT);
    event.origin = nullptr;
    ArkUI_NumberValue value;
    int32_t result = OH_ArkUI_NodeEvent_GetNumberValue(&event, 0, &value);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_GetNumberValue_IndexOutOfRange_004
 * @tc.desc: Test OH_ArkUI_NodeEvent_GetNumberValue with index out of range.
 *           Verifies SET_ERROR_MESSAGE triggers for invalid index.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_GetNumberValue_IndexOutOfRange_004, TestSize.Level1)
{
    ArkUINodeEvent originEvent;
    originEvent.mixedEvent.numberDataLength = 2;
    ArkUI_NodeEvent event;
    event.category = static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT);
    event.origin = &originEvent;
    ArkUI_NumberValue value;
    int32_t result = OH_ArkUI_NodeEvent_GetNumberValue(&event, 5, &value);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INDEX_OUT_OF_RANGE);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_GetNumberValue_NegativeIndex_005
 * @tc.desc: Test OH_ArkUI_NodeEvent_GetNumberValue with negative index.
 *           Verifies SET_ERROR_MESSAGE triggers for negative index.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_GetNumberValue_NegativeIndex_005, TestSize.Level1)
{
    ArkUINodeEvent originEvent;
    originEvent.mixedEvent.numberDataLength = 2;
    ArkUI_NodeEvent event;
    event.category = static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT);
    event.origin = &originEvent;
    ArkUI_NumberValue value;
    int32_t result = OH_ArkUI_NodeEvent_GetNumberValue(&event, -1, &value);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INDEX_OUT_OF_RANGE);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_GetStringValue_NullEvent_001
 * @tc.desc: Test OH_ArkUI_NodeEvent_GetStringValue with null event parameter.
 *           Verifies SET_ERROR_MESSAGE triggers and returns ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_GetStringValue_NullEvent_001, TestSize.Level1)
{
    char* string = nullptr;
    int32_t stringSize = 0;
    int32_t result = OH_ArkUI_NodeEvent_GetStringValue(nullptr, 0, &string, &stringSize);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_GetStringValue_InvalidCategory_002
 * @tc.desc: Test OH_ArkUI_NodeEvent_GetStringValue with invalid event category.
 *           Verifies SET_ERROR_MESSAGE triggers for category mismatch.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_GetStringValue_InvalidCategory_002, TestSize.Level1)
{
    ArkUI_NodeEvent event;
    event.category = static_cast<int32_t>(NODE_EVENT_CATEGORY_COMPONENT_EVENT);
    event.origin = nullptr;
    char* string = nullptr;
    int32_t stringSize = 0;
    int32_t result = OH_ArkUI_NodeEvent_GetStringValue(&event, 0, &string, &stringSize);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_GetStringValue_NullOriginEvent_003
 * @tc.desc: Test OH_ArkUI_NodeEvent_GetStringValue with null originNodeEvent.
 *           Verifies SET_ERROR_MESSAGE triggers when event->origin is null.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_GetStringValue_NullOriginEvent_003, TestSize.Level1)
{
    ArkUI_NodeEvent event;
    event.category = static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT);
    event.origin = nullptr;
    char* string = nullptr;
    int32_t stringSize = 0;
    int32_t result = OH_ArkUI_NodeEvent_GetStringValue(&event, 0, &string, &stringSize);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_GetStringValue_IndexOutOfRange_004
 * @tc.desc: Test OH_ArkUI_NodeEvent_GetStringValue with index out of range.
 *           Verifies SET_ERROR_MESSAGE triggers for invalid index.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_GetStringValue_IndexOutOfRange_004, TestSize.Level1)
{
    ArkUINodeEvent originEvent;
    originEvent.mixedEvent.stringPtrDataLength = 2;
    ArkUI_NodeEvent event;
    event.category = static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT);
    event.origin = &originEvent;
    char* string = nullptr;
    int32_t stringSize = 0;
    int32_t result = OH_ArkUI_NodeEvent_GetStringValue(&event, 5, &string, &stringSize);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INDEX_OUT_OF_RANGE);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_GetStringValue_NullStringData_005
 * @tc.desc: Test OH_ArkUI_NodeEvent_GetStringValue with null string data at index.
 *           Verifies SET_ERROR_MESSAGE triggers when string data is null.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_GetStringValue_NullStringData_005, TestSize.Level1)
{
    ArkUINodeEvent originEvent;
    originEvent.mixedEvent.stringPtrDataLength = 2;
    originEvent.mixedEvent.stringPtrData[0] = 0;
    ArkUI_NodeEvent event;
    event.category = static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT);
    event.origin = &originEvent;
    char* string = nullptr;
    int32_t stringSize = 10;
    int32_t result = OH_ArkUI_NodeEvent_GetStringValue(&event, 0, &string, &stringSize);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_GetStringValue_InvalidStringSize_006
 * @tc.desc: Test OH_ArkUI_NodeEvent_GetStringValue with invalid string size (<= 0).
 *           Verifies SET_ERROR_MESSAGE triggers for invalid buffer size.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_GetStringValue_InvalidStringSize_006, TestSize.Level1)
{
    const char* testString = "test";
    ArkUINodeEvent originEvent;
    originEvent.mixedEvent.stringPtrDataLength = 2;
    originEvent.mixedEvent.stringPtrData[0] = reinterpret_cast<ArkUI_Int64>(const_cast<char*>(testString));
    ArkUI_NodeEvent event;
    event.category = static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT);
    event.origin = &originEvent;
    char* string = nullptr;
    int32_t stringSize = 0;
    int32_t result = OH_ArkUI_NodeEvent_GetStringValue(&event, 0, &string, &stringSize);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_SetReturnNumberValue_NullEvent_001
 * @tc.desc: Test OH_ArkUI_NodeEvent_SetReturnNumberValue with null event parameter.
 *           Verifies SET_ERROR_MESSAGE triggers and returns ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_SetReturnNumberValue_NullEvent_001, TestSize.Level1)
{
    ArkUI_NumberValue value;
    int32_t result = OH_ArkUI_NodeEvent_SetReturnNumberValue(nullptr, &value, 1);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_SetReturnNumberValue_InvalidCategory_002
 * @tc.desc: Test OH_ArkUI_NodeEvent_SetReturnNumberValue with invalid event category.
 *           Verifies SET_ERROR_MESSAGE triggers for category mismatch.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_SetReturnNumberValue_InvalidCategory_002, TestSize.Level1)
{
    ArkUI_NodeEvent event;
    event.category = static_cast<int32_t>(NODE_EVENT_CATEGORY_INPUT_EVENT);
    event.origin = nullptr;
    ArkUI_NumberValue value;
    int32_t result = OH_ArkUI_NodeEvent_SetReturnNumberValue(&event, &value, 1);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID);
}

/**
 * @tc.name: EventConverterErrorTest_NodeEvent_SetReturnNumberValue_NullOriginEvent_003
 * @tc.desc: Test OH_ArkUI_NodeEvent_SetReturnNumberValue with null originNodeEvent.
 *           Verifies SET_ERROR_MESSAGE triggers when event->origin is null.
 * @tc.type: FUNC
 */
HWTEST_F(EventConverterErrorTest, NodeEvent_SetReturnNumberValue_NullOriginEvent_003, TestSize.Level1)
{
    ArkUI_NodeEvent event;
    event.category = static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT);
    event.kind = 0;
    event.origin = nullptr;
    ArkUI_NumberValue value;
    int32_t result = OH_ArkUI_NodeEvent_SetReturnNumberValue(&event, &value, 1);
    EXPECT_EQ(result, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID);
}