/*
 * -------------------------------------------------------------------------
 * This file is part of the MindStudio project.
 * Copyright (c) 2025 Huawei Technologies Co.,Ltd.
 *
 * MindStudio is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------
 */
#include <gtest/gtest.h>
#include <string>
#include "KernelDetailTable.h"
#include "TestCaseDatabaseUtil.h"
using namespace Dic::Protocol;
using namespace Dic::TimeLine::TestCaseUtil;
class KernelDetailTableTest : public ::testing::Test {};

TEST_F(KernelDetailTableTest, testMstxEventsTableColumnMaping) {
    sqlite3 *db = nullptr;
    std::string sql = "CREATE TABLE kernel_detail (id INTEGER PRIMARY KEY AUTOINCREMENT, deviceId TEXT, step_id TEXT, "
                      "name TEXT, op_type TEXT, accelerator_core TEXT, start_time INTEGER, duration INTEGER, wait_time "
                      "INTEGER, block_dim INTEGER, input_shapes TEXT, input_data_types TEXT, input_formats TEXT, "
                      "output_shapes TEXT, output_data_types TEXT, output_formats TEXT);";
    TestCaseDatabaseUtil::CreateDatabse(db, sql);
    std::string sqlInsert =
        "INSERT INTO \"main\".\"kernel_detail\" (\"id\", \"deviceId\", \"step_id\", \"name\", \"op_type\", "
        "\"accelerator_core\", \"start_time\", \"duration\", \"wait_time\", \"block_dim\", \"input_shapes\", "
        "\"input_data_types\", \"input_formats\", \"output_shapes\", \"output_data_types\", \"output_formats\") VALUES "
        "(1, '0', '1', 'aclnnInplaceZero_ZerosLikeAiCore_ZerosLike', 'ZerosLike', 'AI_VECTOR_CORE', "
        "1724670453431688024, 2339.007, 0, 48, '\"1903865856\"', 'FLOAT16', 'FORMAT_ND', '\"1903865856\"', 'FLOAT16', "
        "'FORMAT_ND');";
    TestCaseDatabaseUtil::InsertData(db, sqlInsert);
    std::vector<KernelDetailPO> kernelDetailPOS;
    Dic::Module::Timeline::KernelDetailTable kernelDetailTable;
    const uint64_t expectSize = 1;
    uint64_t expectId = 1;
    const uint64_t expectStartTime = 1724670453431688024;
    const uint64_t expectduration = 2339;
    const uint64_t expectBlockdim = 48;
    const uint64_t index = 0;
    kernelDetailTable.Select(KernelDetailColumn::ID, KernelDetailColumn::RANK_ID)
        .Select(KernelDetailColumn::STEP_ID, KernelDetailColumn::NAME)
        .Select(KernelDetailColumn::OP_TYPE, KernelDetailColumn::ACCELERATOR_CORE)
        .Select(KernelDetailColumn::START_TIME, KernelDetailColumn::DURATION)
        .Select(KernelDetailColumn::WAIT_TIME, KernelDetailColumn::BLOCK_DIM)
        .Select(KernelDetailColumn::INPUT_SHAPES, KernelDetailColumn::INPUT_DATA_TYPES)
        .Select(KernelDetailColumn::INPUT_FORMATS, KernelDetailColumn::OUTPUT_DATA_TYPES)
        .Select(KernelDetailColumn::OUTPUT_SHAPES, KernelDetailColumn::OUTPUT_FORMATS)
        .ExcuteQuery(db, kernelDetailPOS);
    EXPECT_EQ(kernelDetailPOS.size(), expectSize);
    EXPECT_EQ(kernelDetailPOS[index].id, expectId);
    EXPECT_EQ(kernelDetailPOS[index].rankId, "0");
    EXPECT_EQ(kernelDetailPOS[index].stepId, "1");
    EXPECT_EQ(kernelDetailPOS[index].name, "aclnnInplaceZero_ZerosLikeAiCore_ZerosLike");
    EXPECT_EQ(kernelDetailPOS[index].opType, "ZerosLike");
    EXPECT_EQ(kernelDetailPOS[index].acceleratorCore, "AI_VECTOR_CORE");
    EXPECT_EQ(kernelDetailPOS[index].startTime, expectStartTime);
    EXPECT_EQ(kernelDetailPOS[index].duration, expectduration);
    EXPECT_EQ(kernelDetailPOS[index].waitTime, 0);
    EXPECT_EQ(kernelDetailPOS[index].blockDim, expectBlockdim);
    EXPECT_EQ(kernelDetailPOS[index].inputShapes, "\"1903865856\"");
    EXPECT_EQ(kernelDetailPOS[index].inputDataTypes, "FLOAT16");
    EXPECT_EQ(kernelDetailPOS[index].inputFormats, "FORMAT_ND");
    EXPECT_EQ(kernelDetailPOS[index].outputFormats, "FORMAT_ND");
    EXPECT_EQ(kernelDetailPOS[index].outputShapes, "\"1903865856\"");
    EXPECT_EQ(kernelDetailPOS[index].outputDataTypes, "FLOAT16");
}