/*
 * Copyright (c) 2025 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 "UTTest_dm_discovery_service_param.h"

namespace OHOS {
namespace DistributedHardware {

void DmDiscoveryServiceParamTest::SetUpTestCase()
{
}

void DmDiscoveryServiceParamTest::TearDownTestCase()
{
}

void DmDiscoveryServiceParamTest::SetUp()
{
}

void DmDiscoveryServiceParamTest::TearDown()
{
}

/**
 * @tc.name: OperatorEqual_001
 * @tc.desc: Test operator== with identical DmDiscoveryServiceParam objects
 *           Step 1: Prepare two DmDiscoveryServiceParam objects with same values
 *           Step 2: Compare using operator==
 *           Step 3: Verify result is true
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, OperatorEqual_001, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param1;
    param1.serviceType = "testType";
    param1.serviceName = "testName";
    param1.serviceDisplayName = "Test Display";
    param1.freq = DM_LOW;
    param1.medium = SERVICE_MEDIUM_TYPE_BLE;
    param1.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    DmDiscoveryServiceParam param2;
    param2.serviceType = "testType";
    param2.serviceName = "testName";
    param2.serviceDisplayName = "Test Display";
    param2.freq = DM_LOW;
    param2.medium = SERVICE_MEDIUM_TYPE_BLE;
    param2.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    bool result = (param1 == param2);
    EXPECT_TRUE(result);
}

/**
 * @tc.name: OperatorEqual_002
 * @tc.desc: Test operator== with different serviceType
 *           Step 1: Prepare two DmDiscoveryServiceParam objects with different serviceType
 *           Step 2: Compare using operator==
 *           Step 3: Verify result is false
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, OperatorEqual_002, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param1;
    param1.serviceType = "type1";
    param1.serviceName = "testName";
    param1.serviceDisplayName = "Test Display";
    param1.freq = DM_LOW;
    param1.medium = SERVICE_MEDIUM_TYPE_BLE;
    param1.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    DmDiscoveryServiceParam param2;
    param2.serviceType = "type2";
    param2.serviceName = "testName";
    param2.serviceDisplayName = "Test Display";
    param2.freq = DM_LOW;
    param2.medium = SERVICE_MEDIUM_TYPE_BLE;
    param2.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    bool result = (param1 == param2);
    EXPECT_FALSE(result);
}

/**
 * @tc.name: OperatorEqual_003
 * @tc.desc: Test operator== with different serviceName
 *           Step 1: Prepare two DmDiscoveryServiceParam objects with different serviceName
 *           Step 2: Compare using operator==
 *           Step 3: Verify result is false
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, OperatorEqual_003, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param1;
    param1.serviceType = "testType";
    param1.serviceName = "name1";
    param1.serviceDisplayName = "Test Display";
    param1.freq = DM_LOW;
    param1.medium = SERVICE_MEDIUM_TYPE_BLE;
    param1.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    DmDiscoveryServiceParam param2;
    param2.serviceType = "testType";
    param2.serviceName = "name2";
    param2.serviceDisplayName = "Test Display";
    param2.freq = DM_LOW;
    param2.medium = SERVICE_MEDIUM_TYPE_BLE;
    param2.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    bool result = (param1 == param2);
    EXPECT_FALSE(result);
}

/**
 * @tc.name: OperatorEqual_004
 * @tc.desc: Test operator== with different serviceDisplayName
 *           Step 1: Prepare two DmDiscoveryServiceParam objects with different serviceDisplayName
 *           Step 2: Compare using operator==
 *           Step 3: Verify result is false
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, OperatorEqual_004, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param1;
    param1.serviceType = "testType";
    param1.serviceName = "testName";
    param1.serviceDisplayName = "Display 1";
    param1.freq = DM_LOW;
    param1.medium = SERVICE_MEDIUM_TYPE_BLE;
    param1.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    DmDiscoveryServiceParam param2;
    param2.serviceType = "testType";
    param2.serviceName = "testName";
    param2.serviceDisplayName = "Display 2";
    param2.freq = DM_LOW;
    param2.medium = SERVICE_MEDIUM_TYPE_BLE;
    param2.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    bool result = (param1 == param2);
    EXPECT_FALSE(result);
}

/**
 * @tc.name: OperatorEqual_005
 * @tc.desc: Test operator== with different freq
 *           Step 1: Prepare two DmDiscoveryServiceParam objects with different freq
 *           Step 2: Compare using operator==
 *           Step 3: Verify result is false
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, OperatorEqual_005, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param1;
    param1.serviceType = "testType";
    param1.serviceName = "testName";
    param1.serviceDisplayName = "Test Display";
    param1.freq = DM_LOW;
    param1.medium = SERVICE_MEDIUM_TYPE_BLE;
    param1.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    DmDiscoveryServiceParam param2;
    param2.serviceType = "testType";
    param2.serviceName = "testName";
    param2.serviceDisplayName = "Test Display";
    param2.freq = DM_HIGH;
    param2.medium = SERVICE_MEDIUM_TYPE_BLE;
    param2.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    bool result = (param1 == param2);
    EXPECT_FALSE(result);
}

/**
 * @tc.name: OperatorEqual_006
 * @tc.desc: Test operator== with different medium
 *           Step 1: Prepare two DmDiscoveryServiceParam objects with different medium
 *           Step 2: Compare using operator==
 *           Step 3: Verify result is false
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, OperatorEqual_006, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param1;
    param1.serviceType = "testType";
    param1.serviceName = "testName";
    param1.serviceDisplayName = "Test Display";
    param1.freq = DM_LOW;
    param1.medium = SERVICE_MEDIUM_TYPE_BLE;
    param1.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    DmDiscoveryServiceParam param2;
    param2.serviceType = "testType";
    param2.serviceName = "testName";
    param2.serviceDisplayName = "Test Display";
    param2.freq = DM_LOW;
    param2.medium = SERVICE_MEDIUM_TYPE_MDNS;
    param2.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    bool result = (param1 == param2);
    EXPECT_FALSE(result);
}

/**
 * @tc.name: OperatorEqual_007
 * @tc.desc: Test operator== with different mode
 *           Step 1: Prepare two DmDiscoveryServiceParam objects with different mode
 *           Step 2: Compare using operator==
 *           Step 3: Verify result is false
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, OperatorEqual_007, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param1;
    param1.serviceType = "testType";
    param1.serviceName = "testName";
    param1.serviceDisplayName = "Test Display";
    param1.freq = DM_LOW;
    param1.medium = SERVICE_MEDIUM_TYPE_BLE;
    param1.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    DmDiscoveryServiceParam param2;
    param2.serviceType = "testType";
    param2.serviceName = "testName";
    param2.serviceDisplayName = "Test Display";
    param2.freq = DM_LOW;
    param2.medium = SERVICE_MEDIUM_TYPE_BLE;
    param2.mode = SERVICE_PUBLISH_MODE_PASSIVE;

    bool result = (param1 == param2);
    EXPECT_FALSE(result);
}

/**
 * @tc.name: OperatorEqual_008
 * @tc.desc: Test operator== with empty strings
 *           Step 1: Prepare two DmDiscoveryServiceParam objects with empty string fields
 *           Step 2: Compare using operator==
 *           Step 3: Verify result is true when all fields are empty
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, OperatorEqual_008, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param1;
    param1.serviceType = "";
    param1.serviceName = "";
    param1.serviceDisplayName = "";
    param1.freq = DM_LOW;
    param1.medium = SERVICE_MEDIUM_TYPE_AUTO;
    param1.mode = SERVICE_PUBLISH_MODE_PASSIVE;

    DmDiscoveryServiceParam param2;
    param2.serviceType = "";
    param2.serviceName = "";
    param2.serviceDisplayName = "";
    param2.freq = DM_LOW;
    param2.medium = SERVICE_MEDIUM_TYPE_AUTO;
    param2.mode = SERVICE_PUBLISH_MODE_PASSIVE;

    bool result = (param1 == param2);
    EXPECT_TRUE(result);
}

/**
 * @tc.name: DefaultConstructor_001
 * @tc.desc: Test default constructor initializes string fields to empty
 *           Step 1: Create default DmDiscoveryServiceParam object
 *           Step 2: Check string field default values
 *           Step 3: Verify string fields are empty
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, DefaultConstructor_001, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param;
    EXPECT_TRUE(param.serviceType.empty());
    EXPECT_TRUE(param.serviceName.empty());
    EXPECT_TRUE(param.serviceDisplayName.empty());
}

/**
 * @tc.name: DefaultConstructor_002
 * @tc.desc: Test default constructor initializes enum fields
 *           Step 1: Create default DmDiscoveryServiceParam object
 *           Step 2: Check enum field default values
 *           Step 3: Verify enum fields are initialized to default values
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, DefaultConstructor_002, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param;
    EXPECT_EQ(param.freq, static_cast<int>(0));
    EXPECT_EQ(param.medium, static_cast<int>(0));
    EXPECT_EQ(param.mode, static_cast<int>(0));
}

/**
 * @tc.name: FieldAssignment_001
 * @tc.desc: Test assigning values to string fields
 *           Step 1: Create DmDiscoveryServiceParam and assign string values
 *           Step 2: Read back the values
 *           Step 3: Verify all values match assigned values
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, FieldAssignment_001, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param;
    param.serviceType = "com.test.service";
    param.serviceName = "TestService";
    param.serviceDisplayName = "Test Service Display";

    EXPECT_EQ(param.serviceType, "com.test.service");
    EXPECT_EQ(param.serviceName, "TestService");
    EXPECT_EQ(param.serviceDisplayName, "Test Service Display");
}

/**
 * @tc.name: FieldAssignment_002
 * @tc.desc: Test assigning values to enum fields
 *           Step 1: Create DmDiscoveryServiceParam and assign enum values
 *           Step 2: Read back the values
 *           Step 3: Verify all values match assigned values
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, FieldAssignment_002, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param;
    param.freq = DM_MID;
    param.medium = SERVICE_MEDIUM_TYPE_BLE_TRIGGER;
    param.mode = SERVICE_PUBLISH_MODE_PASSIVE;

    EXPECT_EQ(param.freq, DM_MID);
    EXPECT_EQ(param.medium, SERVICE_MEDIUM_TYPE_BLE_TRIGGER);
    EXPECT_EQ(param.mode, SERVICE_PUBLISH_MODE_PASSIVE);
}

/**
 * @tc.name: FreqEnum_001
 * @tc.desc: Test DmExchangeFreq enum values can be assigned
 *           Step 1: Create DmDiscoveryServiceParam with different DmExchangeFreq values
 *           Step 2: Assign various enum values
 *           Step 3: Verify enum values are stored correctly
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, FreqEnum_001, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param;
    param.freq = DM_LOW;
    EXPECT_EQ(param.freq, DM_LOW);

    param.freq = DM_MID;
    EXPECT_EQ(param.freq, DM_MID);

    param.freq = DM_HIGH;
    EXPECT_EQ(param.freq, DM_HIGH);
}

/**
 * @tc.name: MediumEnum_001
 * @tc.desc: Test DMSrvMediumType enum values can be assigned
 *           Step 1: Create DmDiscoveryServiceParam with different DMSrvMediumType values
 *           Step 2: Assign various enum values
 *           Step 3: Verify enum values are stored correctly
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, MediumEnum_001, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param;
    param.medium = SERVICE_MEDIUM_TYPE_AUTO;
    EXPECT_EQ(param.medium, SERVICE_MEDIUM_TYPE_AUTO);

    param.medium = SERVICE_MEDIUM_TYPE_BLE;
    EXPECT_EQ(param.medium, SERVICE_MEDIUM_TYPE_BLE);

    param.medium = SERVICE_MEDIUM_TYPE_BLE_TRIGGER;
    EXPECT_EQ(param.medium, SERVICE_MEDIUM_TYPE_BLE_TRIGGER);

    param.medium = SERVICE_MEDIUM_TYPE_MDNS;
    EXPECT_EQ(param.medium, SERVICE_MEDIUM_TYPE_MDNS);
}

/**
 * @tc.name: ModeEnum_001
 * @tc.desc: Test DMSrvDiscoveryMode enum values can be assigned
 *           Step 1: Create DmDiscoveryServiceParam with different DMSrvDiscoveryMode values
 *           Step 2: Assign various enum values
 *           Step 3: Verify enum values are stored correctly
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, ModeEnum_001, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param;
    param.mode = SERVICE_PUBLISH_MODE_PASSIVE;
    EXPECT_EQ(param.mode, SERVICE_PUBLISH_MODE_PASSIVE);

    param.mode = SERVICE_PUBLISH_MODE_ACTIVE;
    EXPECT_EQ(param.mode, SERVICE_PUBLISH_MODE_ACTIVE);
}

/**
 * @tc.name: CopyAssignment_001
 * @tc.desc: Test copy assignment operator
 *           Step 1: Create and populate a DmDiscoveryServiceParam object
 *           Step 2: Copy to another object using assignment
 *           Step 3: Verify all fields are copied correctly
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, CopyAssignment_001, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param1;
    param1.serviceType = "copyType";
    param1.serviceName = "copyName";
    param1.serviceDisplayName = "Copy Display";
    param1.freq = DM_HIGH;
    param1.medium = SERVICE_MEDIUM_TYPE_MDNS;
    param1.mode = SERVICE_PUBLISH_MODE_PASSIVE;

    DmDiscoveryServiceParam param2;
    param2 = param1;

    EXPECT_EQ(param2.serviceType, "copyType");
    EXPECT_EQ(param2.serviceName, "copyName");
    EXPECT_EQ(param2.serviceDisplayName, "Copy Display");
    EXPECT_EQ(param2.freq, DM_HIGH);
    EXPECT_EQ(param2.medium, SERVICE_MEDIUM_TYPE_MDNS);
    EXPECT_EQ(param2.mode, SERVICE_PUBLISH_MODE_PASSIVE);
}

/**
 * @tc.name: OperatorEqual_009
 * @tc.desc: Test operator== with same object
 *           Step 1: Create a DmDiscoveryServiceParam object
 *           Step 2: Compare object with itself
 *           Step 3: Verify result is true
 * @tc.type: FUNC
 */
HWTEST_F(DmDiscoveryServiceParamTest, OperatorEqual_009, testing::ext::TestSize.Level1)
{
    DmDiscoveryServiceParam param;
    param.serviceType = "testType";
    param.serviceName = "testName";
    param.serviceDisplayName = "Test Display";
    param.freq = DM_LOW;
    param.medium = SERVICE_MEDIUM_TYPE_BLE;
    param.mode = SERVICE_PUBLISH_MODE_ACTIVE;

    bool result = (param == param);
    EXPECT_TRUE(result);
}

} // namespace DistributedHardware
} // namespace OHOS