* Copyright (c) 2025 Huawei Technologies Co., Ltd.
* This program is free software, you can redistribute it and/or modify it under the terms and conditions of
* CANN Open Software License Agreement Version 2.0 (the "License").
* Please refer to the License for details. You may not use this file except in compliance with the License.
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
* See LICENSE in the root of the software repository for the full text of the License.
*/
#include <gtest/gtest.h>
#include <memory>
#include <vector>
#define private public
#define protected public
#include "sk_candidate_heap.h"
#include "sk_graph.h"
#include "sk_node.h"
#include "sk_types.h"
class SkCandidateHeapTest : public testing::Test {
protected:
void SetUp() override
{
graph = std::make_unique<SuperKernelGraph>();
}
void TearDown() override
{
graph.reset();
}
uint64_t CreateKernelNode(uint64_t nodeId, uint32_t streamIdx = 0,
SkKernelType kernelType = SkKernelType::AIC_ONLY)
{
auto node = std::make_unique<SuperKernelKernelNode>(
nullptr, ACL_MODEL_RI_TASK_KERNEL, 0, streamIdx, INVALID_STREAM_ID, INVALID_TASK_ID);
node->SetNodeType(SkNodeType::NODE_KERNEL);
node->SetNodeId(nodeId);
node->nodeInfos.kernelInfos.kernelType = kernelType;
node->nodeInfos.kernelInfos.numBlocks = 1;
node->nodeInfos.kernelInfos.funcName = "test_kernel";
graph->graphMap[nodeId] = std::move(node);
return nodeId;
}
uint64_t CreateNotifyNode(uint64_t nodeId, uint32_t streamIdx = 0)
{
auto node = std::make_unique<SuperKernelMemoryNode>(
nullptr, ACL_MODEL_RI_TASK_EVENT_RECORD, 0, streamIdx, INVALID_STREAM_ID, INVALID_TASK_ID);
node->SetNodeType(SkNodeType::NODE_NOTIFY);
node->SetNodeId(nodeId);
node->nodeInfos.syncInfos.eventId = nodeId * 10;
graph->graphMap[nodeId] = std::move(node);
return nodeId;
}
uint64_t CreateWaitNode(uint64_t nodeId, uint32_t streamIdx = 0)
{
auto node = std::make_unique<SuperKernelMemoryNode>(
nullptr, ACL_MODEL_RI_TASK_EVENT_WAIT, 0, streamIdx, INVALID_STREAM_ID, INVALID_TASK_ID);
node->SetNodeType(SkNodeType::NODE_WAIT);
node->SetNodeId(nodeId);
node->nodeInfos.syncInfos.eventId = nodeId * 10;
graph->graphMap[nodeId] = std::move(node);
return nodeId;
}
uint64_t CreateResetNode(uint64_t nodeId, uint32_t streamIdx = 0)
{
auto node = std::make_unique<SuperKernelMemoryNode>(
nullptr, ACL_MODEL_RI_TASK_EVENT_RESET, 0, streamIdx, INVALID_STREAM_ID, INVALID_TASK_ID);
node->SetNodeType(SkNodeType::NODE_RESET);
node->SetNodeId(nodeId);
node->nodeInfos.syncInfos.eventId = nodeId * 10;
graph->graphMap[nodeId] = std::move(node);
return nodeId;
}
std::unique_ptr<SuperKernelGraph> graph;
};
TEST_F(SkCandidateHeapTest, Empty_InitiallyTrue)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
EXPECT_TRUE(heap.empty());
EXPECT_EQ(heap.size(), 0U);
EXPECT_FALSE(heap.HasKernelNodes());
}
TEST_F(SkCandidateHeapTest, Push_SingleKernelNode)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t nodeId = CreateKernelNode(1);
heap.push(nodeId);
EXPECT_FALSE(heap.empty());
EXPECT_EQ(heap.size(), 1U);
EXPECT_TRUE(heap.HasKernelNodes());
}
TEST_F(SkCandidateHeapTest, Push_InvalidNodeId_Ignored)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
heap.push(999);
EXPECT_TRUE(heap.empty());
}
TEST_F(SkCandidateHeapTest, Pop_EmptyHeap_ReturnZero)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
EXPECT_EQ(heap.pop(), 0U);
}
TEST_F(SkCandidateHeapTest, PushPop_SingleKernelNode)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t nodeId = CreateKernelNode(1);
heap.push(nodeId);
uint64_t poppedId = heap.pop();
EXPECT_EQ(poppedId, nodeId);
EXPECT_TRUE(heap.empty());
}
TEST_F(SkCandidateHeapTest, HeapMode0_BasicOperations)
{
SkCandidateHeap heap(*graph, SkHeapType::PRIORITY_QUEUE);
heap.push(5);
heap.push(2);
heap.push(8);
EXPECT_FALSE(heap.empty());
EXPECT_EQ(heap.size(), 3U);
EXPECT_EQ(heap.pop(), 2U);
EXPECT_EQ(heap.pop(), 5U);
EXPECT_EQ(heap.pop(), 8U);
EXPECT_TRUE(heap.empty());
}
TEST_F(SkCandidateHeapTest, HeapMode0_Clear)
{
SkCandidateHeap heap(*graph, SkHeapType::PRIORITY_QUEUE);
heap.push(1);
heap.push(2);
heap.push(3);
heap.clear();
EXPECT_TRUE(heap.empty());
EXPECT_EQ(heap.size(), 0U);
}
TEST_F(SkCandidateHeapTest, HeapMode0_Reset)
{
SkCandidateHeap heap(*graph, SkHeapType::PRIORITY_QUEUE);
heap.push(1);
heap.push(2);
heap.push(3);
heap.reset();
EXPECT_TRUE(heap.empty());
EXPECT_EQ(heap.size(), 0U);
}
TEST_F(SkCandidateHeapTest, Push_NotifyNode)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t nodeId = CreateNotifyNode(1);
heap.push(nodeId);
EXPECT_FALSE(heap.empty());
EXPECT_EQ(heap.size(), 1U);
EXPECT_FALSE(heap.HasKernelNodes());
}
TEST_F(SkCandidateHeapTest, Push_WaitNode)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t nodeId = CreateWaitNode(1);
heap.push(nodeId);
EXPECT_FALSE(heap.empty());
EXPECT_EQ(heap.size(), 1U);
EXPECT_FALSE(heap.HasKernelNodes());
}
TEST_F(SkCandidateHeapTest, Push_ResetNode)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t nodeId = CreateResetNode(1);
heap.push(nodeId);
EXPECT_FALSE(heap.empty());
EXPECT_EQ(heap.size(), 1U);
EXPECT_FALSE(heap.HasKernelNodes());
}
TEST_F(SkCandidateHeapTest, Pop_NonKernelNodes_SortedByNodeId)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t notify3 = CreateNotifyNode(3);
uint64_t wait1 = CreateWaitNode(1);
uint64_t reset2 = CreateResetNode(2);
heap.push(notify3);
heap.push(wait1);
heap.push(reset2);
EXPECT_EQ(heap.pop(), 1U);
EXPECT_EQ(heap.pop(), 2U);
EXPECT_EQ(heap.pop(), 3U);
EXPECT_TRUE(heap.empty());
}
TEST_F(SkCandidateHeapTest, Pop_NonKernelPrioritizedOverKernel)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t notify1 = CreateNotifyNode(1);
uint64_t kernel2 = CreateKernelNode(2);
uint64_t wait3 = CreateWaitNode(3);
heap.push(notify1);
heap.push(kernel2);
heap.push(wait3);
uint64_t poppedId = heap.pop();
EXPECT_EQ(poppedId, notify1);
}
TEST_F(SkCandidateHeapTest, Pop_MixedNodes_NonKernelFirst)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t notify1 = CreateNotifyNode(1);
uint64_t kernel2 = CreateKernelNode(2);
uint64_t kernel3 = CreateKernelNode(3);
uint64_t wait4 = CreateWaitNode(4);
heap.push(notify1);
heap.push(kernel2);
heap.push(kernel3);
heap.push(wait4);
EXPECT_EQ(heap.pop(), 1U);
EXPECT_EQ(heap.pop(), 4U);
EXPECT_EQ(heap.pop(), 2U);
EXPECT_EQ(heap.pop(), 3U);
EXPECT_TRUE(heap.empty());
}
TEST_F(SkCandidateHeapTest, Pop_FirstSelection_NoMix_SmallestNodeId)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t kernel3 = CreateKernelNode(3);
uint64_t kernel1 = CreateKernelNode(1);
uint64_t kernel2 = CreateKernelNode(2);
heap.push(kernel3);
heap.push(kernel1);
heap.push(kernel2);
EXPECT_EQ(heap.pop(), 1U);
}
TEST_F(SkCandidateHeapTest, Pop_FirstSelection_PreferMix)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t kernel1 = CreateKernelNode(1, 0, SkKernelType::AIC_ONLY);
uint64_t kernel2 = CreateKernelNode(2, 0, SkKernelType::MIX_AIC_1_1);
uint64_t kernel3 = CreateKernelNode(3, 0, SkKernelType::AIV_ONLY);
heap.push(kernel1);
heap.push(kernel2);
heap.push(kernel3);
EXPECT_EQ(heap.pop(), 2U);
}
TEST_F(SkCandidateHeapTest, Pop_FirstSelection_MultipleMix_SmallestId)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t kernel1 = CreateKernelNode(1, 0, SkKernelType::AIC_ONLY);
uint64_t kernel2 = CreateKernelNode(2, 1, SkKernelType::MIX_AIC_1_1);
uint64_t kernel3 = CreateKernelNode(3, 0, SkKernelType::MIX_AIC_1_2);
uint64_t kernel4 = CreateKernelNode(4, 0, SkKernelType::AIV_ONLY);
heap.push(kernel1);
heap.push(kernel2);
heap.push(kernel3);
heap.push(kernel4);
EXPECT_EQ(heap.pop(), 2U);
}
TEST_F(SkCandidateHeapTest, Pop_AfterMix_PrioritizeMix)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t mixNode = CreateKernelNode(1, 0, SkKernelType::MIX_AIC_1_1);
uint64_t vecNode = CreateKernelNode(2, 0, SkKernelType::AIV_ONLY);
uint64_t anotherMix = CreateKernelNode(3, 1, SkKernelType::MIX_AIC_1_2);
heap.push(mixNode);
heap.push(vecNode);
heap.push(anotherMix);
EXPECT_EQ(heap.pop(), 1U);
EXPECT_EQ(heap.pop(), 3U);
}
TEST_F(SkCandidateHeapTest, Pop_AfterVec_PrioritizeCube)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t vecNode = CreateKernelNode(1, 0, SkKernelType::AIV_ONLY);
uint64_t anotherVec = CreateKernelNode(2, 0, SkKernelType::AIV_ONLY);
uint64_t cubeNode = CreateKernelNode(3, 1, SkKernelType::AIC_ONLY);
heap.push(vecNode);
heap.push(anotherVec);
heap.push(cubeNode);
EXPECT_EQ(heap.pop(), 1U);
EXPECT_EQ(heap.pop(), 3U);
}
TEST_F(SkCandidateHeapTest, Pop_AfterCube_PrioritizeVec)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t cubeNode = CreateKernelNode(1, 0, SkKernelType::AIC_ONLY);
uint64_t anotherCube = CreateKernelNode(2, 0, SkKernelType::AIC_ONLY);
uint64_t vecNode = CreateKernelNode(3, 1, SkKernelType::AIV_ONLY);
heap.push(cubeNode);
heap.push(anotherCube);
heap.push(vecNode);
EXPECT_EQ(heap.pop(), 1U);
EXPECT_EQ(heap.pop(), 3U);
}
TEST_F(SkCandidateHeapTest, Pop_PrioritizeDifferentStream)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t node1 = CreateKernelNode(1, 0);
uint64_t node2 = CreateKernelNode(2, 0);
uint64_t node3 = CreateKernelNode(3, 1);
heap.push(node1);
heap.push(node2);
heap.push(node3);
EXPECT_EQ(heap.pop(), 1U);
EXPECT_EQ(heap.pop(), 3U);
}
TEST_F(SkCandidateHeapTest, Clear_EmptiesHeap)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
CreateKernelNode(1);
CreateNotifyNode(2);
heap.push(1);
heap.push(2);
heap.clear();
EXPECT_TRUE(heap.empty());
EXPECT_EQ(heap.size(), 0U);
EXPECT_FALSE(heap.HasKernelNodes());
}
TEST_F(SkCandidateHeapTest, Reset_InitializesAllVariablesAndState)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t kernel1 = CreateKernelNode(1, 0, SkKernelType::AIV_ONLY);
uint64_t notify2 = CreateNotifyNode(2);
uint64_t kernel3 = CreateKernelNode(3, 1, SkKernelType::AIC_ONLY);
heap.push(kernel1);
heap.push(notify2);
heap.push(kernel3);
heap.pop();
heap.pop();
heap.pop();
EXPECT_EQ(heap.GetPrevKernelTypeClass(), SkCandidateHeap::KernelTypeClass::CUBE);
EXPECT_EQ(heap.GetPrevStreamIdx(), 1U);
EXPECT_TRUE(heap.empty());
heap.reset();
EXPECT_TRUE(heap.empty());
EXPECT_EQ(heap.size(), 0U);
EXPECT_FALSE(heap.HasKernelNodes());
EXPECT_EQ(heap.GetPrevKernelTypeClass(), SkCandidateHeap::KernelTypeClass::OTHER);
EXPECT_EQ(heap.GetPrevStreamIdx(), 0U);
}
TEST_F(SkCandidateHeapTest, Reset_CanReuseAfterReset)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
CreateKernelNode(1, 0, SkKernelType::AIC_ONLY);
CreateNotifyNode(2);
heap.push(1);
heap.push(2);
heap.pop();
heap.pop();
heap.reset();
uint64_t kernel3 = CreateKernelNode(3, 1, SkKernelType::AIV_ONLY);
uint64_t wait4 = CreateWaitNode(4);
heap.push(kernel3);
heap.push(wait4);
EXPECT_FALSE(heap.empty());
EXPECT_EQ(heap.size(), 2U);
EXPECT_TRUE(heap.HasKernelNodes());
uint64_t poppedId = heap.pop();
EXPECT_EQ(poppedId, wait4);
poppedId = heap.pop();
EXPECT_EQ(poppedId, kernel3);
EXPECT_EQ(heap.GetPrevKernelTypeClass(), SkCandidateHeap::KernelTypeClass::VEC);
}
TEST_F(SkCandidateHeapTest, ResetSelectionState_ResetsState)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
CreateKernelNode(1, 0, SkKernelType::AIV_ONLY);
heap.push(1);
heap.pop();
EXPECT_EQ(heap.GetPrevKernelTypeClass(), SkCandidateHeap::KernelTypeClass::VEC);
EXPECT_EQ(heap.GetPrevStreamIdx(), 0U);
heap.ResetSelectionState();
EXPECT_EQ(heap.GetPrevKernelTypeClass(), SkCandidateHeap::KernelTypeClass::OTHER);
}
TEST_F(SkCandidateHeapTest, SetPrevKernelTypeClass)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
heap.SetPrevKernelTypeClass(SkCandidateHeap::KernelTypeClass::MIX);
EXPECT_EQ(heap.GetPrevKernelTypeClass(), SkCandidateHeap::KernelTypeClass::MIX);
}
TEST_F(SkCandidateHeapTest, SetPrevStreamIdx)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
heap.SetPrevStreamIdx(5);
EXPECT_EQ(heap.GetPrevStreamIdx(), 5U);
}
TEST_F(SkCandidateHeapTest, IsMixKernelType_ValidTypes_ReturnTrue)
{
EXPECT_TRUE(SkCandidateHeap::IsMixKernelType(SkKernelType::MIX_AIC_1_1));
EXPECT_TRUE(SkCandidateHeap::IsMixKernelType(SkKernelType::MIX_AIC_1_2));
}
TEST_F(SkCandidateHeapTest, IsMixKernelType_InvalidTypes_ReturnFalse)
{
EXPECT_FALSE(SkCandidateHeap::IsMixKernelType(SkKernelType::AIC_ONLY));
EXPECT_FALSE(SkCandidateHeap::IsMixKernelType(SkKernelType::AIV_ONLY));
EXPECT_FALSE(SkCandidateHeap::IsMixKernelType(SkKernelType::MIX_AIV_1_0));
EXPECT_FALSE(SkCandidateHeap::IsMixKernelType(SkKernelType::MIX_AIC_1_0));
EXPECT_FALSE(SkCandidateHeap::IsMixKernelType(SkKernelType::DEFAULT));
}
TEST_F(SkCandidateHeapTest, IsVecKernelType_ValidTypes_ReturnTrue)
{
EXPECT_TRUE(SkCandidateHeap::IsVecKernelType(SkKernelType::AIV_ONLY));
EXPECT_TRUE(SkCandidateHeap::IsVecKernelType(SkKernelType::MIX_AIV_1_0));
}
TEST_F(SkCandidateHeapTest, IsVecKernelType_InvalidTypes_ReturnFalse)
{
EXPECT_FALSE(SkCandidateHeap::IsVecKernelType(SkKernelType::AIC_ONLY));
EXPECT_FALSE(SkCandidateHeap::IsVecKernelType(SkKernelType::MIX_AIC_1_0));
EXPECT_FALSE(SkCandidateHeap::IsVecKernelType(SkKernelType::MIX_AIC_1_1));
EXPECT_FALSE(SkCandidateHeap::IsVecKernelType(SkKernelType::MIX_AIC_1_2));
EXPECT_FALSE(SkCandidateHeap::IsVecKernelType(SkKernelType::DEFAULT));
}
TEST_F(SkCandidateHeapTest, IsCubeKernelType_ValidTypes_ReturnTrue)
{
EXPECT_TRUE(SkCandidateHeap::IsCubeKernelType(SkKernelType::AIC_ONLY));
EXPECT_TRUE(SkCandidateHeap::IsCubeKernelType(SkKernelType::MIX_AIC_1_0));
}
TEST_F(SkCandidateHeapTest, IsCubeKernelType_InvalidTypes_ReturnFalse)
{
EXPECT_FALSE(SkCandidateHeap::IsCubeKernelType(SkKernelType::AIV_ONLY));
EXPECT_FALSE(SkCandidateHeap::IsCubeKernelType(SkKernelType::MIX_AIV_1_0));
EXPECT_FALSE(SkCandidateHeap::IsCubeKernelType(SkKernelType::MIX_AIC_1_1));
EXPECT_FALSE(SkCandidateHeap::IsCubeKernelType(SkKernelType::MIX_AIC_1_2));
EXPECT_FALSE(SkCandidateHeap::IsCubeKernelType(SkKernelType::DEFAULT));
}
TEST_F(SkCandidateHeapTest, GetKernelTypeClass_MixTypes_ReturnMix)
{
EXPECT_EQ(static_cast<int>(SkCandidateHeap::GetKernelTypeClass(SkKernelType::MIX_AIC_1_1)),
static_cast<int>(SkCandidateHeap::KernelTypeClass::MIX));
EXPECT_EQ(static_cast<int>(SkCandidateHeap::GetKernelTypeClass(SkKernelType::MIX_AIC_1_2)),
static_cast<int>(SkCandidateHeap::KernelTypeClass::MIX));
}
TEST_F(SkCandidateHeapTest, GetKernelTypeClass_VecTypes_ReturnVec)
{
EXPECT_EQ(static_cast<int>(SkCandidateHeap::GetKernelTypeClass(SkKernelType::AIV_ONLY)),
static_cast<int>(SkCandidateHeap::KernelTypeClass::VEC));
EXPECT_EQ(static_cast<int>(SkCandidateHeap::GetKernelTypeClass(SkKernelType::MIX_AIV_1_0)),
static_cast<int>(SkCandidateHeap::KernelTypeClass::VEC));
}
TEST_F(SkCandidateHeapTest, GetKernelTypeClass_CubeTypes_ReturnCube)
{
EXPECT_EQ(static_cast<int>(SkCandidateHeap::GetKernelTypeClass(SkKernelType::AIC_ONLY)),
static_cast<int>(SkCandidateHeap::KernelTypeClass::CUBE));
EXPECT_EQ(static_cast<int>(SkCandidateHeap::GetKernelTypeClass(SkKernelType::MIX_AIC_1_0)),
static_cast<int>(SkCandidateHeap::KernelTypeClass::CUBE));
}
TEST_F(SkCandidateHeapTest, GetKernelTypeClass_DefaultType_ReturnOther)
{
EXPECT_EQ(static_cast<int>(SkCandidateHeap::GetKernelTypeClass(SkKernelType::DEFAULT)),
static_cast<int>(SkCandidateHeap::KernelTypeClass::OTHER));
}
TEST_F(SkCandidateHeapTest, ComplexScenario_MixedNodeTypes)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t kernel1 = CreateKernelNode(1, 0, SkKernelType::AIV_ONLY);
uint64_t kernel2 = CreateKernelNode(2, 1, SkKernelType::AIC_ONLY);
uint64_t kernel3 = CreateKernelNode(3, 0, SkKernelType::AIV_ONLY);
uint64_t notify4 = CreateNotifyNode(4, 0);
uint64_t wait5 = CreateWaitNode(5, 1);
uint64_t kernel6 = CreateKernelNode(6, 1, SkKernelType::AIC_ONLY);
heap.push(kernel1);
heap.push(kernel2);
heap.push(kernel3);
heap.push(notify4);
heap.push(wait5);
heap.push(kernel6);
EXPECT_EQ(heap.pop(), 4U);
EXPECT_EQ(heap.pop(), 5U);
EXPECT_EQ(heap.pop(), 1U);
EXPECT_EQ(heap.pop(), 2U);
EXPECT_EQ(heap.pop(), 3U);
EXPECT_EQ(heap.pop(), 6U);
EXPECT_TRUE(heap.empty());
}
TEST_F(SkCandidateHeapTest, AllSameStream_SelectByRuleThenNodeId)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t kernel1 = CreateKernelNode(1, 0, SkKernelType::AIV_ONLY);
uint64_t kernel2 = CreateKernelNode(2, 0, SkKernelType::AIC_ONLY);
uint64_t kernel3 = CreateKernelNode(3, 0, SkKernelType::AIV_ONLY);
heap.push(kernel1);
heap.push(kernel2);
heap.push(kernel3);
EXPECT_EQ(heap.pop(), 1U);
EXPECT_EQ(heap.pop(), 2U);
EXPECT_EQ(heap.pop(), 3U);
}
TEST_F(SkCandidateHeapTest, Constructor_InitializesState)
{
SkCandidateHeap heap(*graph, SkHeapType::CUSTOMIZE_QUEUE);
EXPECT_EQ(heap.GetPrevKernelTypeClass(), SkCandidateHeap::KernelTypeClass::OTHER);
EXPECT_EQ(heap.GetPrevStreamIdx(), 0U);
}
TEST_F(SkCandidateHeapTest, MoveConstructor_Works)
{
SkCandidateHeap heap1(*graph, SkHeapType::CUSTOMIZE_QUEUE);
uint64_t kernel1 = CreateKernelNode(1);
heap1.push(kernel1);
heap1.pop();
SkCandidateHeap heap2(std::move(heap1));
EXPECT_TRUE(heap2.empty());
EXPECT_EQ(heap2.GetPrevKernelTypeClass(), SkCandidateHeap::KernelTypeClass::CUBE);
}