/*
 * Copyright (c) 2024 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.
 */

#define LOG_TAG "UtdTest"

#include <gtest/gtest.h>
#include <unistd.h>
#include <map>

#include "token_setproc.h"
#include "accesstoken_kit.h"
#include "nativetoken_kit.h"

#include "logger.h"
#include "utd.h"
#include "udmf_capi_common.h"
#include "udmf_meta.h"

using namespace testing::ext;
using namespace OHOS::Security::AccessToken;
using namespace OHOS::UDMF;
using namespace OHOS;

constexpr const char *REFERENCE_URL = "https://gitee.com/openharmony/docs/blob/master/en/application-dev/reference/"\
                                      "apis/js-apis-data-uniformTypeDescriptor.md#uniformdatatype";

namespace OHOS::Test {

OH_Utd* utd = nullptr;

class UtdTest : public testing::Test {
public:
    static void SetUpTestCase(void);
    static void TearDownTestCase(void);
    void SetUp();
    void TearDown();
};

void UtdTest::SetUpTestCase(void) {}

void UtdTest::TearDownTestCase(void) {}

void UtdTest::SetUp(void)
{
    LOG_INFO(UDMF_TEST, "test case will be start");
    utd = OH_Utd_Create(UDMF_META_PLAIN_TEXT);
}

void UtdTest::TearDown(void)
{
    OH_Utd_Destroy(utd);
    utd = nullptr;
    LOG_INFO(UDMF_TEST, "test case is complete");
}

/**
 * @tc.name: OH_Utd_Create_001
 * @tc.desc: Normal testcase of OH_Utd_Create
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_Create_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_Create_001 begin.");
    EXPECT_EQ(utd->typeId, UDMF_META_PLAIN_TEXT);
    EXPECT_EQ(utd->belongingToTypesCount, 1);
    std::string belongingToType((utd->belongingToTypes)[0]);
    EXPECT_EQ(belongingToType, UDMF_META_TEXT);
    EXPECT_EQ(utd->description, "Text of unspecified encoding, with no markup.");

    char* typeId = nullptr;
    OH_Utd* utdNullptr = OH_Utd_Create(typeId);
    EXPECT_EQ(nullptr, utdNullptr);
    LOG_INFO(UDMF_TEST, "OH_Utd_Create_001 end.");
}

/**
 * @tc.name: OH_Utd_GetTypeId_001
 * @tc.desc: Normal testcase of OH_Utd_GetTypeId
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_GetTypeId_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_GetTypeId_001 begin.");
    std::string actualTypeId(OH_Utd_GetTypeId(utd));
    EXPECT_EQ(UDMF_META_PLAIN_TEXT, actualTypeId);

    OH_Utd* utdNullptr = nullptr;
    const char* typeIdNullptr = OH_Utd_GetTypeId(utdNullptr);
    EXPECT_EQ(nullptr, typeIdNullptr);
    LOG_INFO(UDMF_TEST, "OH_Utd_GetTypeId_001 end.");
}

/**
 * @tc.name: OH_Utd_GetDescription_001
 * @tc.desc: Normal testcase of OH_Utd_GetDescription
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_GetDescription_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_GetDescription_001 begin.");
    std::string description(OH_Utd_GetDescription(utd));
    EXPECT_EQ("Text of unspecified encoding, with no markup.", description);

    OH_Utd* utdNullptr = nullptr;
    const char* descriptionNullptr = OH_Utd_GetDescription(utdNullptr);
    EXPECT_EQ(nullptr, descriptionNullptr);
    LOG_INFO(UDMF_TEST, "OH_Utd_GetDescription_001 end.");
}

/**
 * @tc.name: OH_Utd_GetReferenceUrl_001
 * @tc.desc: Normal testcase of OH_Utd_GetReferenceUrl
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_GetReferenceUrl_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_GetReferenceUrl_001 begin.");
    std::string url(OH_Utd_GetReferenceUrl(utd));
    EXPECT_EQ(REFERENCE_URL, url);

    OH_Utd* utdNullptr = nullptr;
    const char* urlNullptr = OH_Utd_GetReferenceUrl(utdNullptr);
    EXPECT_EQ(nullptr, urlNullptr);
    LOG_INFO(UDMF_TEST, "OH_Utd_GetReferenceUrl_001 end.");
}

/**
 * @tc.name: OH_Utd_GetIconFile_001
 * @tc.desc: Normal testcase of OH_Utd_GetIconFile
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_GetIconFile_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_GetIconFile_001 begin.");
    std::string iconFile(OH_Utd_GetIconFile(utd));
    EXPECT_EQ("sys.media.ohos_ic_normal_white_grid_txt", iconFile);

    OH_Utd* utdNullptr = nullptr;
    const char* iconFileNullptr = OH_Utd_GetIconFile(utdNullptr);
    EXPECT_EQ(nullptr, iconFileNullptr);
    LOG_INFO(UDMF_TEST, "OH_Utd_GetIconFile_001 end.");
}

/**
 * @tc.name: OH_Utd_GetBelongingToTypes_001
 * @tc.desc: Normal testcase of OH_Utd_GetBelongingToTypes
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_GetBelongingToTypes_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_GetBelongingToTypes_001 begin.");
    unsigned int count = 0;
    auto belongingToTypes = OH_Utd_GetBelongingToTypes(utd, &count);
    std::string belongingToType(belongingToTypes[0]);
    EXPECT_EQ(UDMF_META_TEXT, belongingToType);
    EXPECT_EQ(1, count);

    OH_Utd* utdNullptr = nullptr;
    auto belongingToTypeNullptr = OH_Utd_GetBelongingToTypes(utdNullptr, &count);
    EXPECT_EQ(nullptr, belongingToTypeNullptr);

    unsigned int* countNullptr = nullptr;
    auto belongingToTypeNullptr2 = OH_Utd_GetBelongingToTypes(utd, countNullptr);
    EXPECT_EQ(nullptr, belongingToTypeNullptr2);
    LOG_INFO(UDMF_TEST, "OH_Utd_GetBelongingToTypes_001 end.");
}

/**
 * @tc.name: OH_Utd_GetFilenameExtensions_001
 * @tc.desc: Normal testcase of OH_Utd_GetFilenameExtensions
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_GetFilenameExtensions_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_GetFilenameExtensions_001 begin.");
    unsigned int count = 0;
    auto filenameExtensions = OH_Utd_GetFilenameExtensions(utd, &count);
    std::string filenameExtension(filenameExtensions[0]);
    EXPECT_EQ(".txt", filenameExtension);
    EXPECT_EQ(2, count);

    OH_Utd* utdNullptr = nullptr;
    auto filenameExtensionsNullptr = OH_Utd_GetFilenameExtensions(utdNullptr, &count);
    EXPECT_EQ(nullptr, filenameExtensionsNullptr);

    unsigned int* countNullptr = nullptr;
    auto filenameExtensionsNullptr2 = OH_Utd_GetFilenameExtensions(utd, countNullptr);
    EXPECT_EQ(nullptr, filenameExtensionsNullptr2);
    LOG_INFO(UDMF_TEST, "OH_Utd_GetFilenameExtensions_001 end.");
}

/**
 * @tc.name: OH_Utd_GetMimeTypes_001
 * @tc.desc: Normal testcase of OH_Utd_GetMimeTypes
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_GetMimeTypes_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_GetMimeTypes_001 begin.");
    unsigned int count = 0;
    auto mimeTypes = OH_Utd_GetMimeTypes(utd, &count);
    std::string mimeType(mimeTypes[0]);
    EXPECT_EQ("text/plain", mimeType);
    EXPECT_EQ(1, count);

    OH_Utd* utdNullptr = nullptr;
    auto mimeTypeNullptr = OH_Utd_GetMimeTypes(utdNullptr, &count);
    EXPECT_EQ(nullptr, mimeTypeNullptr);

    unsigned int* countNullptr = nullptr;
    auto mimeTypeNullptr2 = OH_Utd_GetMimeTypes(utd, countNullptr);
    EXPECT_EQ(nullptr, mimeTypeNullptr2);
    LOG_INFO(UDMF_TEST, "OH_Utd_GetMimeTypes_001 end.");
}

/**
 * @tc.name: OH_Utd_GetTypesByFilenameExtension_001
 * @tc.desc: Normal testcase of OH_Utd_GetTypesByFilenameExtension
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_GetTypesByFilenameExtension_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_GetTypesByFilenameExtension_001 begin.");
    unsigned int count = 0;
    auto typeIds = OH_Utd_GetTypesByFilenameExtension(".txt", &count);
    std::string typeId(typeIds[0]);
    EXPECT_EQ(UDMF_META_PLAIN_TEXT, typeId);
    EXPECT_EQ(1, count);
    OH_Utd_DestroyStringList(typeIds, count);

    const char* extensionNullptr = nullptr;
    auto typeIdsNullptr = OH_Utd_GetTypesByFilenameExtension(extensionNullptr, &count);
    EXPECT_EQ(nullptr, typeIdsNullptr);

    unsigned int* countNullptr = nullptr;
    typeIds = OH_Utd_GetTypesByFilenameExtension(".txt", countNullptr);
    EXPECT_EQ(nullptr, typeIds);
    LOG_INFO(UDMF_TEST, "OH_Utd_GetTypesByFilenameExtension_001 end.");
}

/**
 * @tc.name: OH_Utd_GetTypesByMimeType_001
 * @tc.desc: Normal testcase of OH_Utd_GetTypesByMimeType
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_GetTypesByMimeType_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_GetTypesByMimeType_001 begin.");
    unsigned int count = 0;
    auto typeIds = OH_Utd_GetTypesByMimeType("text/plain", &count);
    std::string typeId(typeIds[0]);
    EXPECT_EQ(UDMF_META_PLAIN_TEXT, typeId);
    EXPECT_EQ(1, count);
    OH_Utd_DestroyStringList(typeIds, count);

    const char* extensionNullptr = nullptr;
    auto typeIdsNullptr = OH_Utd_GetTypesByMimeType(extensionNullptr, &count);
    EXPECT_EQ(nullptr, typeIdsNullptr);

    unsigned int* countNullptr = nullptr;
    auto typeIdsNullptr2 = OH_Utd_GetTypesByMimeType("text/plain", countNullptr);
    EXPECT_EQ(nullptr, typeIdsNullptr2);
    LOG_INFO(UDMF_TEST, "OH_Utd_GetTypesByMimeType_001 end.");
}

/**
 * @tc.name: OH_Utd_BelongsTo_001
 * @tc.desc: test typeId1 belong to typeId2
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_BelongsTo_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_BelongsTo_001 begin.");
    EXPECT_TRUE(OH_Utd_BelongsTo(UDMF_META_PLAIN_TEXT, UDMF_META_TEXT));
    LOG_INFO(UDMF_TEST, "OH_Utd_BelongsTo_001 end.");
}

/**
 * @tc.name: OH_Utd_BelongsTo_002
 * @tc.desc: test typeId1 don't belong to typeId2
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_BelongsTo_002, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_BelongsTo_002 begin.");
    EXPECT_FALSE(OH_Utd_BelongsTo(UDMF_META_PLAIN_TEXT, UDMF_META_HTML));
    LOG_INFO(UDMF_TEST, "OH_Utd_BelongsTo_002 end.");
}

/**
 * @tc.name: OH_Utd_BelongsTo_003
 * @tc.desc: test param is nullptr
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_BelongsTo_003, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_BelongsTo_003 begin.");
    EXPECT_FALSE(OH_Utd_BelongsTo(UDMF_META_PLAIN_TEXT, nullptr));
    EXPECT_FALSE(OH_Utd_BelongsTo(nullptr, UDMF_META_PLAIN_TEXT));
    LOG_INFO(UDMF_TEST, "OH_Utd_BelongsTo_003 end.");
}

/**
 * @tc.name: OH_Utd_IsLower_001
 * @tc.desc: test typeId1 is lower level of typeId2
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_IsLower_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_IsLower_001 begin.");
    EXPECT_TRUE(OH_Utd_IsLower(UDMF_META_PLAIN_TEXT, UDMF_META_TEXT));
    LOG_INFO(UDMF_TEST, "OH_Utd_IsLower_001 end.");
}

/**
 * @tc.name: OH_Utd_IsLower_002
 * @tc.desc: test typeId1 isn't lower level of typeId2
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_IsLower_002, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_IsLower_002 begin.");
    EXPECT_FALSE(OH_Utd_IsLower(UDMF_META_PLAIN_TEXT, UDMF_META_HTML));
    LOG_INFO(UDMF_TEST, "OH_Utd_IsLower_002 end.");
}

/**
 * @tc.name: OH_Utd_IsLower_003
 * @tc.desc: test param is nullptr
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_IsLower_003, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_IsLower_003 begin.");
    EXPECT_FALSE(OH_Utd_IsLower(UDMF_META_PLAIN_TEXT, nullptr));
    EXPECT_FALSE(OH_Utd_IsLower(nullptr, UDMF_META_PLAIN_TEXT));
    LOG_INFO(UDMF_TEST, "OH_Utd_IsLower_003 end.");
}

/**
 * @tc.name: OH_Utd_IsHigher_001
 * @tc.desc: test typeId1 is higher level of typeId2
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_IsHigher_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_IsHigher_001 begin.");
    EXPECT_TRUE(OH_Utd_IsHigher(UDMF_META_TEXT, UDMF_META_PLAIN_TEXT));
    LOG_INFO(UDMF_TEST, "OH_Utd_IsHigher_001 end.");
}

/**
 * @tc.name: OH_Utd_IsHigher_002
 * @tc.desc: test typeId1 isn't higher level of typeId2
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_IsHigher_002, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_IsHigher_002 begin.");
    EXPECT_FALSE(OH_Utd_IsHigher(UDMF_META_PLAIN_TEXT, UDMF_META_HTML));
    LOG_INFO(UDMF_TEST, "OH_Utd_IsHigher_002 end.");
}

/**
 * @tc.name: OH_Utd_IsHigher_003
 * @tc.desc: test param is nullptr
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_IsHigher_003, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_IsHigher_003 begin.");
    EXPECT_FALSE(OH_Utd_IsHigher(UDMF_META_PLAIN_TEXT, nullptr));
    EXPECT_FALSE(OH_Utd_IsHigher(nullptr, UDMF_META_PLAIN_TEXT));
    LOG_INFO(UDMF_TEST, "OH_Utd_IsHigher_003 end.");
}

/**
 * @tc.name: OH_Utd_Equals_001
 * @tc.desc: test case1 is equals case2
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_Equals_001, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_Equals_001 begin.");
    auto utd2 = OH_Utd_Create(UDMF_META_PLAIN_TEXT);
    EXPECT_TRUE(OH_Utd_Equals(utd, utd2));
    OH_Utd_Destroy(utd2);
    utd2 = nullptr;
    LOG_INFO(UDMF_TEST, "OH_Utd_Equals_001 end.");
}

/**
 * @tc.name: OH_Utd_Equals_002
 * @tc.desc: test case1 is not equals case2
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_Equals_002, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_Equals_002 begin.");
    auto utd2 = OH_Utd_Create(UDMF_META_TEXT);
    EXPECT_FALSE(OH_Utd_Equals(utd, utd2));
    OH_Utd_Destroy(utd2);
    utd2 = nullptr;
    LOG_INFO(UDMF_TEST, "OH_Utd_Equals_002 end.");
}

/**
 * @tc.name: OH_Utd_Equals_003
 * @tc.desc: test param is nullptr
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_Equals_003, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_Equals_003 begin.");
    EXPECT_FALSE(OH_Utd_Equals(utd, nullptr));
    EXPECT_FALSE(OH_Utd_Equals(nullptr, utd));
    LOG_INFO(UDMF_TEST, "OH_Utd_Equals_003 end.");
}

std::map<std::string, std::string> typeIdMap = {
    {UDMF_META_ENTITY, "general.entity"},
    {UDMF_META_OBJECT, "general.object"},
    {UDMF_META_COMPOSITE_OBJECT, "general.composite-object"},
    {UDMF_META_TEXT, "general.text"},
    {UDMF_META_PLAIN_TEXT, "general.plain-text"},
    {UDMF_META_HTML, "general.html"},
    {UDMF_META_HYPERLINK, "general.hyperlink"},
    {UDMF_META_XML, "general.xml"},
    {UDMF_META_SOURCE_CODE, "general.source-code"},
    {UDMF_META_SCRIPT, "general.script"},
    {UDMF_META_SHELL_SCRIPT, "general.shell-script"},
    {UDMF_META_CSH_SCRIPT, "general.csh-script"},
    {UDMF_META_PERL_SCRIPT, "general.perl-script"},
    {UDMF_META_PHP_SCRIPT, "general.php-script"},
    {UDMF_META_PYTHON_SCRIPT, "general.python-script"},
    {UDMF_META_RUBY_SCRIPT, "general.ruby-script"},
    {UDMF_META_TYPE_SCRIPT, "general.type-script"},
    {UDMF_META_JAVA_SCRIPT, "general.java-script"},
    {UDMF_META_C_HEADER, "general.c-header"},
    {UDMF_META_C_SOURCE, "general.c-source"},
    {UDMF_META_C_PLUS_PLUS_HEADER, "general.c-plus-plus-header"},
    {UDMF_META_C_PLUS_PLUS_SOURCE, "general.c-plus-plus-source"},
    {UDMF_META_JAVA_SOURCE, "general.java-source"},
    {UDMF_META_EBOOK, "general.ebook"},
    {UDMF_META_EPUB, "general.epub"},
    {UDMF_META_AZW, "com.amazon.azw"},
    {UDMF_META_AZW3, "com.amazon.azw3"},
    {UDMF_META_KFX, "com.amazon.kfx"},
    {UDMF_META_MOBI, "com.amazon.mobi"},
    {UDMF_META_MEDIA, "general.media"},
    {UDMF_META_IMAGE, "general.image"},
    {UDMF_META_JPEG, "general.jpeg"},
    {UDMF_META_PNG, "general.png"},
    {UDMF_META_RAW_IMAGE, "general.raw-image"},
    {UDMF_META_TIFF, "general.tiff"},
    {UDMF_META_BMP, "com.microsoft.bmp"},
    {UDMF_META_ICO, "com.microsoft.ico"},
    {UDMF_META_PHOTOSHOP_IMAGE, "com.adobe.photoshop-image"},
    {UDMF_META_AI_IMAGE, "com.adobe.illustrator.ai-image"},
    {UDMF_META_WORD_DOC, "com.microsoft.word.doc"},
    {UDMF_META_EXCEL, "com.microsoft.excel.xls"},
    {UDMF_META_PPT, "com.microsoft.powerpoint.ppt"},
    {UDMF_META_PDF, "com.adobe.pdf"},
    {UDMF_META_POSTSCRIPT, "com.adobe.postscript"},
    {UDMF_META_ENCAPSULATED_POSTSCRIPT, "com.adobe.encapsulated-postscript"},
    {UDMF_META_VIDEO, "general.video"},
    {UDMF_META_AVI, "general.avi"},
    {UDMF_META_MPEG, "general.mpeg"},
    {UDMF_META_MPEG4, "general.mpeg-4"},
    {UDMF_META_VIDEO_3GPP, "general.3gpp"},
    {UDMF_META_VIDEO_3GPP2, "general.3gpp2"},
    {UDMF_META_WINDOWS_MEDIA_WM, "com.microsoft.windows-media-wm"},
    {UDMF_META_WINDOWS_MEDIA_WMV, "com.microsoft.windows-media-wmv"},
    {UDMF_META_WINDOWS_MEDIA_WMP, "com.microsoft.windows-media-wmp"},
    {UDMF_META_AUDIO, "general.audio"},
    {UDMF_META_AAC, "general.aac"},
    {UDMF_META_AIFF, "general.aiff"},
    {UDMF_META_ALAC, "general.alac"},
    {UDMF_META_FLAC, "general.flac"},
    {UDMF_META_MP3, "general.mp3"},
    {UDMF_META_OGG, "general.ogg"},
    {UDMF_META_PCM, "general.pcm"},
    {UDMF_META_WINDOWS_MEDIA_WMA, "com.microsoft.windows-media-wma"},
    {UDMF_META_WAVEFORM_AUDIO, "com.microsoft.waveform-audio"},
    {UDMF_META_WINDOWS_MEDIA_WMX, "com.microsoft.windows-media-wmx"},
    {UDMF_META_WINDOWS_MEDIA_WVX, "com.microsoft.windows-media-wvx"},
    {UDMF_META_WINDOWS_MEDIA_WAX, "com.microsoft.windows-media-wax"},
    {UDMF_META_GENERAL_FILE, "general.file"},
    {UDMF_META_DIRECTORY, "general.directory"},
    {UDMF_META_FOLDER, "general.folder"},
    {UDMF_META_SYMLINK, "general.symlink"},
    {UDMF_META_ARCHIVE, "general.archive"},
    {UDMF_META_BZ2_ARCHIVE, "general.bz2-archive"},
    {UDMF_META_DISK_IMAGE, "general.disk-image"},
    {UDMF_META_TAR_ARCHIVE, "general.tar-archive"},
    {UDMF_META_ZIP_ARCHIVE, "general.zip-archive"},
    {UDMF_META_JAVA_ARCHIVE, "com.sun.java-archive"},
    {UDMF_META_GNU_TAR_ARCHIVE, "org.gnu.gnu-tar-archive"},
    {UDMF_META_GNU_ZIP_ARCHIVE, "org.gnu.gnu-zip-archive"},
    {UDMF_META_GNU_ZIP_TAR_ARCHIVE, "org.gnu.gnu-zip-tar-archive"},
    {UDMF_META_CALENDAR, "general.calendar"},
    {UDMF_META_CONTACT, "general.contact"},
    {UDMF_META_DATABASE, "general.database"},
    {UDMF_META_MESSAGE, "general.message"},
    {UDMF_META_VCARD, "general.vcard"},
    {UDMF_META_NAVIGATION, "general.navigation"},
    {UDMF_META_LOCATION, "general.location"},
    {UDMF_META_OPENHARMONY_FORM, "openharmony.form"},
    {UDMF_META_OPENHARMONY_APP_ITEM, "openharmony.app-item"},
    {UDMF_META_OPENHARMONY_PIXEL_MAP, "openharmony.pixel-map"},
    {UDMF_META_OPENHARMONY_ATOMIC_SERVICE, "openharmony.atomic-service"},
    {UDMF_META_OPENHARMONY_PACKAGE, "openharmony.package"},
    {UDMF_META_OPENHARMONY_HAP, "openharmony.hap"},
    {UDMF_META_SMIL, "com.real.smil"},
    {UDMF_META_MARKDOWN, "general.markdown"},
    {UDMF_META_FAX, "general.fax"},
    {UDMF_META_JFX_FAX, "com.j2.jfx-fax"},
    {UDMF_META_EFX_FAX, "com.js.efx-fax"},
    {UDMF_META_XBITMAP_IMAGE, "general.xbitmap-image"},
    {UDMF_META_TGA_IMAGE, "com.truevision.tga-image"},
    {UDMF_META_SGI_IMAGE, "com.sgi.sgi-image"},
    {UDMF_META_OPENEXR_IMAGE, "com.ilm.openexr-image"},
    {UDMF_META_FLASHPIX_IMAGE, "com.kodak.flashpix.image"},
    {UDMF_META_REALMEDIA, "com.real.realmedia"},
    {UDMF_META_AU_AUDIO, "general.au-audio"},
    {UDMF_META_AIFC_AUDIO, "general.aifc-audio"},
    {UDMF_META_SD2_AUDIO, "com.digidesign.sd2-audio"},
    {UDMF_META_REALAUDIO, "com.real.realaudio"},
    {UDMF_META_OPENXML, "org.openxmlformats.openxml"},
    {UDMF_META_WORDPROCESSINGML_DOCUMENT, "org.openxmlformats.wordprocessingml.document"},
    {UDMF_META_SPREADSHEETML_SHEET, "org.openxmlformats.spreadsheetml.sheet"},
    {UDMF_META_PRESENTATIONML_PRESENTATION, "org.openxmlformats.presentationml.presentation"},
    {UDMF_META_OPENDOCUMENT, "org.oasis.opendocument"},
    {UDMF_META_OPENDOCUMENT_TEXT, "org.oasis.opendocument.text"},
    {UDMF_META_OPENDOCUMENT_SPREADSHEET, "org.oasis.opendocument.spreadsheet"},
    {UDMF_META_OPENDOCUMENT_PRESENTATION, "org.oasis.opendocument.presentation"},
    {UDMF_META_OPENDOCUMENT_GRAPHICS, "org.oasis.opendocument.graphics"},
    {UDMF_META_OPENDOCUMENT_FORMULA, "org.oasis.opendocument.formula"},
    {UDMF_META_STUFFIT_ARCHIVE, "com.allume.stuffit-archive"},
    {UDMF_META_VCS, "general.vcs"},
    {UDMF_META_ICS, "general.ics"},
    {UDMF_META_EXECUTABLE, "general.executable"},
    {UDMF_META_PORTABLE_EXECUTABLE, "com.microsoft.portable-executable"},
    {UDMF_META_SUN_JAVA_CLASS, "com.sun.java-class"},
    {UDMF_META_FONT, "general.font"},
    {UDMF_META_TRUETYPE_FONT, "general.truetype-font"},
    {UDMF_META_TRUETYPE_COLLECTION_FONT, "general.truetype-collection-font"},
    {UDMF_META_OPENTYPE_FONT, "general.opentype-font"},
    {UDMF_META_POSTSCRIPT_FONT, "com.adobe.postscript-font"},
    {UDMF_META_POSTSCRIPT_PFB_FONT, "com.adobe.postscript-pfb-font"},
    {UDMF_META_POSTSCRIPT_PFA_FONT, "com.adobe.postscript-pfa-font"},
    {UDMF_META_OPENHARMONY_HDOC, "openharmony.hdoc"},
    {UDMF_META_OPENHARMONY_HINOTE, "openharmony.hinote"},
    {UDMF_META_OPENHARMONY_STYLED_STRING, "openharmony.styled-string"},
    {UDMF_META_OPENHARMONY_WANT, "openharmony.want"}
};

/**
 * @tc.name: OH_Utd_Create_002
 * @tc.desc: traverse enum for UTD
 * @tc.type: FUNC
 */
HWTEST_F(UtdTest, OH_Utd_Create_002, TestSize.Level1)
{
    LOG_INFO(UDMF_TEST, "OH_Utd_Create_002 begin.");
    OH_Utd* utd1;
    for (const auto& pair : typeIdMap) {
        utd1 = OH_Utd_Create(pair.first.c_str());
        std::string typeId(OH_Utd_GetTypeId(utd1));
        EXPECT_EQ(pair.second, typeId);
        OH_Utd_Destroy(utd1);
    }
    LOG_INFO(UDMF_TEST, "OH_Utd_Create_002 end.");
}

}