//===- OutlinedHashTreeRecordTest.cpp -------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/CGData/OutlinedHashTreeRecord.h" #include "gmock/gmock.h" #include "gtest/gtest.h" using namespace llvm; namespace { TEST(OutlinedHashTreeRecordTest, Empty) { OutlinedHashTreeRecord HashTreeRecord; ASSERT_TRUE(HashTreeRecord.empty()); } TEST(OutlinedHashTreeRecordTest, Print) { OutlinedHashTreeRecord HashTreeRecord; HashTreeRecord.HashTree->insert({{1, 2}, 3}); const char *ExpectedTreeStr = R"(--- 0: Hash: 0x0 Terminals: 0 SuccessorIds: [ 1 ] 1: Hash: 0x1 Terminals: 0 SuccessorIds: [ 2 ] 2: Hash: 0x2 Terminals: 3 SuccessorIds: [ ] ... )"; std::string TreeDump; raw_string_ostream OS(TreeDump); HashTreeRecord.print(OS); EXPECT_EQ(ExpectedTreeStr, TreeDump); } TEST(OutlinedHashTreeRecordTest, Stable) { OutlinedHashTreeRecord HashTreeRecord1; HashTreeRecord1.HashTree->insert({{1, 2}, 4}); HashTreeRecord1.HashTree->insert({{1, 3}, 5}); OutlinedHashTreeRecord HashTreeRecord2; HashTreeRecord2.HashTree->insert({{1, 3}, 5}); HashTreeRecord2.HashTree->insert({{1, 2}, 4}); // Output is stable regardless of insertion order. std::string TreeDump1; raw_string_ostream OS1(TreeDump1); HashTreeRecord1.print(OS1); std::string TreeDump2; raw_string_ostream OS2(TreeDump2); HashTreeRecord2.print(OS2); EXPECT_EQ(TreeDump1, TreeDump2); } TEST(OutlinedHashTreeRecordTest, Serialize) { OutlinedHashTreeRecord HashTreeRecord1; HashTreeRecord1.HashTree->insert({{1, 2}, 4}); HashTreeRecord1.HashTree->insert({{1, 3}, 5}); // Serialize and deserialize the tree. SmallVector Out; raw_svector_ostream OS(Out); HashTreeRecord1.serialize(OS); OutlinedHashTreeRecord HashTreeRecord2; const uint8_t *Data = reinterpret_cast(Out.data()); HashTreeRecord2.deserialize(Data); // Two trees should be identical. std::string TreeDump1; raw_string_ostream OS1(TreeDump1); HashTreeRecord1.print(OS1); std::string TreeDump2; raw_string_ostream OS2(TreeDump2); HashTreeRecord2.print(OS2); EXPECT_EQ(TreeDump1, TreeDump2); } TEST(OutlinedHashTreeRecordTest, SerializeYAML) { OutlinedHashTreeRecord HashTreeRecord1; HashTreeRecord1.HashTree->insert({{1, 2}, 4}); HashTreeRecord1.HashTree->insert({{1, 3}, 5}); // Serialize and deserialize the tree in a YAML format. std::string Out; raw_string_ostream OS(Out); yaml::Output YOS(OS); HashTreeRecord1.serializeYAML(YOS); OutlinedHashTreeRecord HashTreeRecord2; yaml::Input YIS(StringRef(Out.data(), Out.size())); HashTreeRecord2.deserializeYAML(YIS); // Two trees should be identical. std::string TreeDump1; raw_string_ostream OS1(TreeDump1); HashTreeRecord1.print(OS1); std::string TreeDump2; raw_string_ostream OS2(TreeDump2); HashTreeRecord2.print(OS2); EXPECT_EQ(TreeDump1, TreeDump2); } } // end namespace