llvm-project/clang-tools-extra/unittests/clang-modernize/PerfSupportTest.cpp

98 lines
3.1 KiB
C++

//===- clang-modernize/PerfSupportTest.cpp - PerfSupport unit tests -------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "gtest/gtest.h"
#include "Core/PerfSupport.h"
using namespace llvm;
using namespace clang;
class TransformA : public Transform {
public:
TransformA(const TransformOptions &Options)
: Transform("TransformA", Options) {}
virtual int apply(const tooling::CompilationDatabase &,
const std::vector<std::string> &) {
return 0;
}
void addTiming(StringRef Label, TimeRecord Duration) {
Transform::addTiming(Label, Duration);
}
};
class TransformB : public Transform {
public:
TransformB(const TransformOptions &Options)
: Transform("TransformB", Options) {}
virtual int apply(const tooling::CompilationDatabase &,
const std::vector<std::string> &) {
return 0;
}
void addTiming(StringRef Label, TimeRecord Duration) {
Transform::addTiming(Label, Duration);
}
};
struct ExpectedResults {
const char *SourceName;
unsigned DataCount;
struct Datum {
const char *Label;
float Duration;
} Data[2];
};
TEST(PerfSupport, collectSourcePerfData) {
TransformOptions Options;
TransformA A(Options);
TransformB B(Options);
// The actual durations don't matter. Below only their relative ordering is
// tested to ensure times, labels, and sources all stay together properly.
A.addTiming("FileA.cpp", TimeRecord::getCurrentTime(/*Start=*/true));
A.addTiming("FileC.cpp", TimeRecord::getCurrentTime(/*Start=*/true));
B.addTiming("FileC.cpp", TimeRecord::getCurrentTime(/*Start=*/true));
B.addTiming("FileB.cpp", TimeRecord::getCurrentTime(/*Start=*/true));
SourcePerfData PerfData;
collectSourcePerfData(A, PerfData);
SourcePerfData::const_iterator FileAI = PerfData.find("FileA.cpp");
EXPECT_NE(FileAI, PerfData.end());
SourcePerfData::const_iterator FileCI = PerfData.find("FileC.cpp");
EXPECT_NE(FileCI, PerfData.end());
EXPECT_EQ(2u, PerfData.size());
EXPECT_EQ(1u, FileAI->second.size());
EXPECT_EQ("TransformA", FileAI->second[0].Label);
EXPECT_EQ(1u, FileCI->second.size());
EXPECT_EQ("TransformA", FileCI->second[0].Label);
EXPECT_LE(FileAI->second[0].Duration, FileCI->second[0].Duration);
collectSourcePerfData(B, PerfData);
SourcePerfData::const_iterator FileBI = PerfData.find("FileB.cpp");
EXPECT_NE(FileBI, PerfData.end());
EXPECT_EQ(3u, PerfData.size());
EXPECT_EQ(1u, FileAI->second.size());
EXPECT_EQ("TransformA", FileAI->second[0].Label);
EXPECT_EQ(2u, FileCI->second.size());
EXPECT_EQ("TransformA", FileCI->second[0].Label);
EXPECT_EQ("TransformB", FileCI->second[1].Label);
EXPECT_LE(FileCI->second[0].Duration, FileCI->second[1].Duration);
EXPECT_EQ(1u, FileBI->second.size());
EXPECT_EQ("TransformB", FileBI->second[0].Label);
EXPECT_LE(FileCI->second[1].Duration, FileBI->second[0].Duration);
}