119 lines · cpp
1//===- OutlinedHashTreeRecordTest.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 "llvm/CGData/OutlinedHashTreeRecord.h"10#include "gmock/gmock.h"11#include "gtest/gtest.h"12 13using namespace llvm;14 15namespace {16 17TEST(OutlinedHashTreeRecordTest, Empty) {18 OutlinedHashTreeRecord HashTreeRecord;19 ASSERT_TRUE(HashTreeRecord.empty());20}21 22TEST(OutlinedHashTreeRecordTest, Print) {23 OutlinedHashTreeRecord HashTreeRecord;24 HashTreeRecord.HashTree->insert({{1, 2}, 3});25 26 const char *ExpectedTreeStr = R"(---270:28 Hash: 0x029 Terminals: 030 SuccessorIds: [ 1 ]311:32 Hash: 0x133 Terminals: 034 SuccessorIds: [ 2 ]352:36 Hash: 0x237 Terminals: 338 SuccessorIds: [ ]39...40)";41 std::string TreeDump;42 raw_string_ostream OS(TreeDump);43 HashTreeRecord.print(OS);44 EXPECT_EQ(ExpectedTreeStr, TreeDump);45}46 47TEST(OutlinedHashTreeRecordTest, Stable) {48 OutlinedHashTreeRecord HashTreeRecord1;49 HashTreeRecord1.HashTree->insert({{1, 2}, 4});50 HashTreeRecord1.HashTree->insert({{1, 3}, 5});51 52 OutlinedHashTreeRecord HashTreeRecord2;53 HashTreeRecord2.HashTree->insert({{1, 3}, 5});54 HashTreeRecord2.HashTree->insert({{1, 2}, 4});55 56 // Output is stable regardless of insertion order.57 std::string TreeDump1;58 raw_string_ostream OS1(TreeDump1);59 HashTreeRecord1.print(OS1);60 std::string TreeDump2;61 raw_string_ostream OS2(TreeDump2);62 HashTreeRecord2.print(OS2);63 64 EXPECT_EQ(TreeDump1, TreeDump2);65}66 67TEST(OutlinedHashTreeRecordTest, Serialize) {68 OutlinedHashTreeRecord HashTreeRecord1;69 HashTreeRecord1.HashTree->insert({{1, 2}, 4});70 HashTreeRecord1.HashTree->insert({{1, 3}, 5});71 72 // Serialize and deserialize the tree.73 SmallVector<char> Out;74 raw_svector_ostream OS(Out);75 HashTreeRecord1.serialize(OS);76 77 OutlinedHashTreeRecord HashTreeRecord2;78 const uint8_t *Data = reinterpret_cast<const uint8_t *>(Out.data());79 HashTreeRecord2.deserialize(Data);80 81 // Two trees should be identical.82 std::string TreeDump1;83 raw_string_ostream OS1(TreeDump1);84 HashTreeRecord1.print(OS1);85 std::string TreeDump2;86 raw_string_ostream OS2(TreeDump2);87 HashTreeRecord2.print(OS2);88 89 EXPECT_EQ(TreeDump1, TreeDump2);90}91 92TEST(OutlinedHashTreeRecordTest, SerializeYAML) {93 OutlinedHashTreeRecord HashTreeRecord1;94 HashTreeRecord1.HashTree->insert({{1, 2}, 4});95 HashTreeRecord1.HashTree->insert({{1, 3}, 5});96 97 // Serialize and deserialize the tree in a YAML format.98 std::string Out;99 raw_string_ostream OS(Out);100 yaml::Output YOS(OS);101 HashTreeRecord1.serializeYAML(YOS);102 103 OutlinedHashTreeRecord HashTreeRecord2;104 yaml::Input YIS(StringRef(Out.data(), Out.size()));105 HashTreeRecord2.deserializeYAML(YIS);106 107 // Two trees should be identical.108 std::string TreeDump1;109 raw_string_ostream OS1(TreeDump1);110 HashTreeRecord1.print(OS1);111 std::string TreeDump2;112 raw_string_ostream OS2(TreeDump2);113 HashTreeRecord2.print(OS2);114 115 EXPECT_EQ(TreeDump1, TreeDump2);116}117 118} // end namespace119