142 lines · cpp
1//===- bolt/unittest/Core/ClusteredRows.cpp ------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "bolt/Core/DebugData.h"10#include "llvm/Support/SMLoc.h"11#include "gtest/gtest.h"12#include <vector>13 14using namespace llvm;15using namespace llvm::bolt;16 17namespace {18 19class ClusteredRowsTest : public ::testing::Test {20protected:21 void SetUp() override {22 Container = std::make_unique<ClusteredRowsContainer>();23 }24 25 std::unique_ptr<ClusteredRowsContainer> Container;26};27 28TEST_F(ClusteredRowsTest, CreateSingleElement) {29 ClusteredRows *CR = Container->createClusteredRows(1);30 ASSERT_NE(CR, nullptr);31 EXPECT_EQ(CR->size(), 1u);32 33 // Test population with single element34 std::vector<DebugLineTableRowRef> TestRefs = {{42, 100}};35 CR->populate(TestRefs);36 37 ArrayRef<DebugLineTableRowRef> Rows = CR->getRows();38 EXPECT_EQ(Rows.size(), 1u);39 EXPECT_EQ(Rows[0].DwCompileUnitIndex, 42u);40 EXPECT_EQ(Rows[0].RowIndex, 100u);41}42 43TEST_F(ClusteredRowsTest, CreateMultipleElements) {44 ClusteredRows *CR = Container->createClusteredRows(3);45 ASSERT_NE(CR, nullptr);46 EXPECT_EQ(CR->size(), 3u);47 48 // Test population with multiple elements49 std::vector<DebugLineTableRowRef> TestRefs = {{10, 20}, {30, 40}, {50, 60}};50 CR->populate(TestRefs);51 52 ArrayRef<DebugLineTableRowRef> Rows = CR->getRows();53 EXPECT_EQ(Rows.size(), 3u);54 55 EXPECT_EQ(Rows[0].DwCompileUnitIndex, 10u);56 EXPECT_EQ(Rows[0].RowIndex, 20u);57 58 EXPECT_EQ(Rows[1].DwCompileUnitIndex, 30u);59 EXPECT_EQ(Rows[1].RowIndex, 40u);60 61 EXPECT_EQ(Rows[2].DwCompileUnitIndex, 50u);62 EXPECT_EQ(Rows[2].RowIndex, 60u);63}64 65TEST_F(ClusteredRowsTest, SMLoc_Conversion) {66 ClusteredRows *CR = Container->createClusteredRows(2);67 ASSERT_NE(CR, nullptr);68 69 // Test SMLoc conversion70 SMLoc Loc = CR->toSMLoc();71 EXPECT_TRUE(Loc.isValid());72 73 // Test round-trip conversion74 const ClusteredRows *CR2 = ClusteredRows::fromSMLoc(Loc);75 EXPECT_EQ(CR, CR2);76 EXPECT_EQ(CR2->size(), 2u);77}78 79TEST_F(ClusteredRowsTest, PopulateWithArrayRef) {80 ClusteredRows *CR = Container->createClusteredRows(4);81 ASSERT_NE(CR, nullptr);82 83 // Test population with ArrayRef84 DebugLineTableRowRef TestArray[] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}};85 ArrayRef<DebugLineTableRowRef> TestRefs(TestArray, 4);86 CR->populate(TestRefs);87 88 ArrayRef<DebugLineTableRowRef> Rows = CR->getRows();89 EXPECT_EQ(Rows.size(), 4u);90 91 for (size_t i = 0; i < 4; ++i) {92 EXPECT_EQ(Rows[i].DwCompileUnitIndex, TestArray[i].DwCompileUnitIndex);93 EXPECT_EQ(Rows[i].RowIndex, TestArray[i].RowIndex);94 }95}96 97TEST_F(ClusteredRowsTest, MultipleClusteredRows) {98 // Test creating multiple ClusteredRows objects99 ClusteredRows *CR1 = Container->createClusteredRows(2);100 ClusteredRows *CR2 = Container->createClusteredRows(3);101 ClusteredRows *CR3 = Container->createClusteredRows(1);102 103 ASSERT_NE(CR1, nullptr);104 ASSERT_NE(CR2, nullptr);105 ASSERT_NE(CR3, nullptr);106 107 // Ensure they are different objects108 EXPECT_NE(CR1, CR2);109 EXPECT_NE(CR2, CR3);110 EXPECT_NE(CR1, CR3);111 112 // Verify sizes113 EXPECT_EQ(CR1->size(), 2u);114 EXPECT_EQ(CR2->size(), 3u);115 EXPECT_EQ(CR3->size(), 1u);116 117 // Populate each with different data118 std::vector<DebugLineTableRowRef> TestRefs1 = {{100, 200}, {300, 400}};119 std::vector<DebugLineTableRowRef> TestRefs2 = {{10, 20}, {30, 40}, {50, 60}};120 std::vector<DebugLineTableRowRef> TestRefs3 = {{999, 888}};121 122 CR1->populate(TestRefs1);123 CR2->populate(TestRefs2);124 CR3->populate(TestRefs3);125 126 // Verify data integrity127 ArrayRef<DebugLineTableRowRef> Rows1 = CR1->getRows();128 ArrayRef<DebugLineTableRowRef> Rows2 = CR2->getRows();129 ArrayRef<DebugLineTableRowRef> Rows3 = CR3->getRows();130 131 EXPECT_EQ(Rows1[0].DwCompileUnitIndex, 100u);132 EXPECT_EQ(Rows1[1].RowIndex, 400u);133 134 EXPECT_EQ(Rows2[1].DwCompileUnitIndex, 30u);135 EXPECT_EQ(Rows2[2].RowIndex, 60u);136 137 EXPECT_EQ(Rows3[0].DwCompileUnitIndex, 999u);138 EXPECT_EQ(Rows3[0].RowIndex, 888u);139}140 141} // namespace142