#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/DebugInfo/CodeView/Formatters.h"
#include "llvm/DebugInfo/CodeView/GUID.h"
#include "llvm/Support/FormatVariadic.h"
#include "gtest/gtest.h"
using namespace llvm;
using namespace llvm::codeview;
namespace {
using GuidPair = std::pair<StringRef, GUID>;
using GuidData = SmallVector<GuidPair>;
void checkData(GuidData &Data) {
for (auto Item : Data) {
std::string GuidText(formatv("{0}", Item.second).str());
StringRef Scalar(GuidText);
EXPECT_EQ(Scalar.size(), size_t(38));
EXPECT_EQ(Scalar.front(), '{');
EXPECT_EQ(Scalar.back(), '}');
Scalar = Scalar.substr(1, Scalar.size() - 2);
SmallVector<StringRef, 6> Component;
Scalar.split(Component, '-', 5);
EXPECT_EQ(Component.size(), size_t(5));
EXPECT_EQ(Scalar[8], '-');
EXPECT_EQ(Scalar[13], '-');
EXPECT_EQ(Scalar[18], '-');
EXPECT_EQ(Scalar[23], '-');
struct {
support::ulittle32_t Data0;
support::ulittle16_t Data1;
support::ulittle16_t Data2;
support::ubig16_t Data3;
support::ubig64_t Data4;
} G = {};
EXPECT_TRUE(to_integer(Component[0], G.Data0, 16));
EXPECT_TRUE(to_integer(Component[1], G.Data1, 16));
EXPECT_TRUE(to_integer(Component[2], G.Data2, 16));
EXPECT_TRUE(to_integer(Component[3], G.Data3, 16));
EXPECT_TRUE(to_integer(Component[4], G.Data4, 16));
EXPECT_EQ(Scalar, Item.first);
}
}
TEST(GUIDFormatTest, ValidateFormat) {
GuidData Data = {
{"11223344-5566-7788-99AA-BBCCDDEEFFAA",
{0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
0xdd, 0xee, 0xff, 0xaa}},
{"00000000-0000-0000-0000-000000000000",
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00}},
{"00003344-5566-7788-99AA-BBCCDDEEFFAA",
{0x44, 0x33, 0x00, 0x00, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
0xdd, 0xee, 0xff, 0xaa}},
{"11000044-5566-7788-99AA-BBCCDDEEFFAA",
{0x44, 0x00, 0x00, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
0xdd, 0xee, 0xff, 0xaa}},
{"11220000-5566-7788-99AA-BBCCDDEEFFAA",
{0x00, 0x00, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
0xdd, 0xee, 0xff, 0xaa}},
{"11223300-0066-7788-99AA-BBCCDDEEFFAA",
{0x00, 0x33, 0x22, 0x11, 0x66, 0x00, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
0xdd, 0xee, 0xff, 0xaa}},
{"11223344-0000-7788-99AA-BBCCDDEEFFAA",
{0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
0xdd, 0xee, 0xff, 0xaa}},
{"11223344-5500-0088-99AA-BBCCDDEEFFAA",
{0x44, 0x33, 0x22, 0x11, 0x00, 0x55, 0x88, 0x00, 0x99, 0xaa, 0xbb, 0xcc,
0xdd, 0xee, 0xff, 0xaa}},
{"11223344-5566-0000-99AA-BBCCDDEEFFAA",
{0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x00, 0x00, 0x99, 0xaa, 0xbb, 0xcc,
0xdd, 0xee, 0xff, 0xaa}},
{"11223344-5566-7700-00AA-BBCCDDEEFFAA",
{0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x00, 0x77, 0x00, 0xaa, 0xbb, 0xcc,
0xdd, 0xee, 0xff, 0xaa}},
{"11223344-5566-7788-0000-BBCCDDEEFFAA",
{0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x00, 0x00, 0xbb, 0xcc,
0xdd, 0xee, 0xff, 0xaa}},
{"11223344-5566-7788-9900-00CCDDEEFFAA",
{0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0x00, 0x00, 0xcc,
0xdd, 0xee, 0xff, 0xaa}},
{"11223344-5566-7788-99AA-0000DDEEFFAA",
{0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0x00, 0x00,
0xdd, 0xee, 0xff, 0xaa}},
{"11223344-5566-7788-99AA-BB0000EEFFAA",
{0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0x00,
0x00, 0xee, 0xff, 0xaa}},
{"11223344-5566-7788-99AA-BBCC0000FFAA",
{0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
0x00, 0x00, 0xff, 0xaa}},
{"11223344-5566-7788-99AA-BBCCDD0000AA",
{0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
0xdd, 0x00, 0x00, 0xaa}},
{"11223344-5566-7788-99AA-BBCCDDEE0000",
{0x44, 0x33, 0x22, 0x11, 0x66, 0x55, 0x88, 0x77, 0x99, 0xaa, 0xbb, 0xcc,
0xdd, 0xee, 0x00, 0x00}},
};
checkData(Data);
}
}