summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/unittests/cpp11-migrate/PerfSupportTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/unittests/cpp11-migrate/PerfSupportTest.cpp')
-rw-r--r--clang-tools-extra/unittests/cpp11-migrate/PerfSupportTest.cpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/clang-tools-extra/unittests/cpp11-migrate/PerfSupportTest.cpp b/clang-tools-extra/unittests/cpp11-migrate/PerfSupportTest.cpp
new file mode 100644
index 00000000000..8c362fd1a73
--- /dev/null
+++ b/clang-tools-extra/unittests/cpp11-migrate/PerfSupportTest.cpp
@@ -0,0 +1,89 @@
+#include "gtest/gtest.h"
+#include "Core/PerfSupport.h"
+
+using namespace llvm;
+using namespace clang;
+
+class TransformA : public Transform {
+public:
+ TransformA()
+ : Transform("TransformA", false) {}
+
+ virtual int apply(const FileContentsByPath &, RiskLevel,
+ const tooling::CompilationDatabase &,
+ const std::vector<std::string> &, FileContentsByPath &) {
+ return 0;
+ }
+
+ void addTiming(StringRef Label, TimeRecord Duration) {
+ Transform::addTiming(Label, Duration);
+ }
+};
+
+class TransformB : public Transform {
+public:
+ TransformB()
+ : Transform("TransformB", false) {}
+
+ virtual int apply(const FileContentsByPath &, RiskLevel,
+ const tooling::CompilationDatabase &,
+ const std::vector<std::string> &, FileContentsByPath &) {
+ 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) {
+ TransformA A;
+ TransformB B;
+
+ // 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);
+}
OpenPOWER on IntegriCloud