xref: /llvm-project/llvm/unittests/CGData/OutlinedHashTreeRecordTest.cpp (revision 9bb555688caf6ae4ba89fee5baa3dc29fec6a9b1)
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/CGData/OutlinedHashTreeRecord.h"
10 #include "gmock/gmock.h"
11 #include "gtest/gtest.h"
12 
13 using namespace llvm;
14 
15 namespace {
16 
17 TEST(OutlinedHashTreeRecordTest, Empty) {
18   OutlinedHashTreeRecord HashTreeRecord;
19   ASSERT_TRUE(HashTreeRecord.empty());
20 }
21 
22 TEST(OutlinedHashTreeRecordTest, Print) {
23   OutlinedHashTreeRecord HashTreeRecord;
24   HashTreeRecord.HashTree->insert({{1, 2}, 3});
25 
26   const char *ExpectedTreeStr = R"(---
27 0:
28   Hash:            0x0
29   Terminals:       0
30   SuccessorIds:    [ 1 ]
31 1:
32   Hash:            0x1
33   Terminals:       0
34   SuccessorIds:    [ 2 ]
35 2:
36   Hash:            0x2
37   Terminals:       3
38   SuccessorIds:    [  ]
39 ...
40 )";
41   std::string TreeDump;
42   raw_string_ostream OS(TreeDump);
43   HashTreeRecord.print(OS);
44   EXPECT_EQ(ExpectedTreeStr, TreeDump);
45 }
46 
47 TEST(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 
67 TEST(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 
92 TEST(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 namespace
119