
Reland [CGData] llvm-cgdata #89884 using `Opt` instead of `cl` - Action options are required, `--convert`, `--show`, `--merge`. This was similar to sub-commands previously implemented, but having a prefix `--`. - `--format` option is added, which specifies `text` or `binary`. --------- Co-authored-by: Kyungwoo Lee <kyulee@fb.com>
119 lines
3.2 KiB
C++
119 lines
3.2 KiB
C++
//===- 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<char> Out;
|
|
raw_svector_ostream OS(Out);
|
|
HashTreeRecord1.serialize(OS);
|
|
|
|
OutlinedHashTreeRecord HashTreeRecord2;
|
|
const uint8_t *Data = reinterpret_cast<const uint8_t *>(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
|