
This patch refactors the instantiation of BenchmarkMeasure within all the unit tests to use BenchmarkMeasure::Create rather than through direct struct instantialization. This allows us to change what values are stored in BenchmarkMeasure without getting compiler warnings on every instantiation in the unit tests, and is also just a cleanup in general as the Create function didn't seem to exist at the time the unit tests were originally written.
150 lines
5.9 KiB
C++
150 lines
5.9 KiB
C++
//===-- ClusteringTest.cpp --------------------------------------*- C++ -*-===//
|
|
//
|
|
// 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 "Clustering.h"
|
|
#include "BenchmarkResult.h"
|
|
#include "llvm/Support/Error.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include "gmock/gmock.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
namespace llvm {
|
|
namespace exegesis {
|
|
|
|
namespace {
|
|
|
|
using testing::Field;
|
|
using testing::UnorderedElementsAre;
|
|
using testing::UnorderedElementsAreArray;
|
|
|
|
static const auto HasPoints = [](const std::vector<int> &Indices) {
|
|
return Field(&BenchmarkClustering::Cluster::PointIndices,
|
|
UnorderedElementsAreArray(Indices));
|
|
};
|
|
|
|
TEST(ClusteringTest, Clusters3D) {
|
|
std::vector<Benchmark> Points(6);
|
|
|
|
// Cluster around (x=0, y=1, z=2): points {0, 3}.
|
|
Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.01, {}),
|
|
BenchmarkMeasure::Create("y", 1.02, {}),
|
|
BenchmarkMeasure::Create("z", 1.98, {})};
|
|
Points[3].Measurements = {BenchmarkMeasure::Create("x", -0.01, {}),
|
|
BenchmarkMeasure::Create("y", 1.02, {}),
|
|
BenchmarkMeasure::Create("z", 1.98, {})};
|
|
// Cluster around (x=1, y=1, z=2): points {1, 4}.
|
|
Points[1].Measurements = {BenchmarkMeasure::Create("x", 1.01, {}),
|
|
BenchmarkMeasure::Create("y", 1.02, {}),
|
|
BenchmarkMeasure::Create("z", 1.98, {})};
|
|
Points[4].Measurements = {BenchmarkMeasure::Create("x", 0.99, {}),
|
|
BenchmarkMeasure::Create("y", 1.02, {}),
|
|
BenchmarkMeasure::Create("z", 1.98, {})};
|
|
// Cluster around (x=0, y=0, z=0): points {5}, marked as noise.
|
|
Points[5].Measurements = {BenchmarkMeasure::Create("x", 0.0, {}),
|
|
BenchmarkMeasure::Create("y", 0.01, {}),
|
|
BenchmarkMeasure::Create("z", -0.02, {})};
|
|
// Error cluster: points {2}
|
|
Points[2].Error = "oops";
|
|
|
|
auto Clustering = BenchmarkClustering::create(
|
|
Points, BenchmarkClustering::ModeE::Dbscan, 2, 0.25);
|
|
ASSERT_TRUE((bool)Clustering);
|
|
EXPECT_THAT(Clustering.get().getValidClusters(),
|
|
UnorderedElementsAre(HasPoints({0, 3}), HasPoints({1, 4})));
|
|
EXPECT_THAT(Clustering.get().getCluster(
|
|
BenchmarkClustering::ClusterId::noise()),
|
|
HasPoints({5}));
|
|
EXPECT_THAT(Clustering.get().getCluster(
|
|
BenchmarkClustering::ClusterId::error()),
|
|
HasPoints({2}));
|
|
|
|
EXPECT_EQ(Clustering.get().getClusterIdForPoint(2),
|
|
BenchmarkClustering::ClusterId::error());
|
|
EXPECT_EQ(Clustering.get().getClusterIdForPoint(5),
|
|
BenchmarkClustering::ClusterId::noise());
|
|
EXPECT_EQ(Clustering.get().getClusterIdForPoint(0),
|
|
Clustering.get().getClusterIdForPoint(3));
|
|
EXPECT_EQ(Clustering.get().getClusterIdForPoint(1),
|
|
Clustering.get().getClusterIdForPoint(4));
|
|
}
|
|
|
|
TEST(ClusteringTest, Clusters3D_InvalidSize) {
|
|
std::vector<Benchmark> Points(6);
|
|
Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.01, {}),
|
|
BenchmarkMeasure::Create("y", 1.02, {}),
|
|
BenchmarkMeasure::Create("z", 1.98, {})};
|
|
Points[1].Measurements = {BenchmarkMeasure::Create("y", 1.02, {}),
|
|
BenchmarkMeasure::Create("z", 1.98, {})};
|
|
auto Error =
|
|
BenchmarkClustering::create(
|
|
Points, BenchmarkClustering::ModeE::Dbscan, 2, 0.25)
|
|
.takeError();
|
|
ASSERT_TRUE((bool)Error);
|
|
consumeError(std::move(Error));
|
|
}
|
|
|
|
TEST(ClusteringTest, Clusters3D_InvalidOrder) {
|
|
std::vector<Benchmark> Points(6);
|
|
Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.01, {}),
|
|
BenchmarkMeasure::Create("y", 1.02, {})};
|
|
Points[1].Measurements = {BenchmarkMeasure::Create("y", 1.02, {}),
|
|
BenchmarkMeasure::Create("x", 1.98, {})};
|
|
auto Error =
|
|
BenchmarkClustering::create(
|
|
Points, BenchmarkClustering::ModeE::Dbscan, 2, 0.25)
|
|
.takeError();
|
|
ASSERT_TRUE((bool)Error);
|
|
consumeError(std::move(Error));
|
|
}
|
|
|
|
TEST(ClusteringTest, Ordering) {
|
|
ASSERT_LT(BenchmarkClustering::ClusterId::makeValid(1),
|
|
BenchmarkClustering::ClusterId::makeValid(2));
|
|
|
|
ASSERT_LT(BenchmarkClustering::ClusterId::makeValid(2),
|
|
BenchmarkClustering::ClusterId::noise());
|
|
|
|
ASSERT_LT(BenchmarkClustering::ClusterId::makeValid(2),
|
|
BenchmarkClustering::ClusterId::error());
|
|
|
|
ASSERT_LT(BenchmarkClustering::ClusterId::noise(),
|
|
BenchmarkClustering::ClusterId::error());
|
|
}
|
|
|
|
TEST(ClusteringTest, Ordering1) {
|
|
std::vector<Benchmark> Points(3);
|
|
|
|
Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.0, {})};
|
|
Points[1].Measurements = {BenchmarkMeasure::Create("x", 1.0, {})};
|
|
Points[2].Measurements = {BenchmarkMeasure::Create("x", 2.0, {})};
|
|
|
|
auto Clustering = BenchmarkClustering::create(
|
|
Points, BenchmarkClustering::ModeE::Dbscan, 2, 1.1);
|
|
ASSERT_TRUE((bool)Clustering);
|
|
EXPECT_THAT(Clustering.get().getValidClusters(),
|
|
UnorderedElementsAre(HasPoints({0, 1, 2})));
|
|
}
|
|
|
|
TEST(ClusteringTest, Ordering2) {
|
|
std::vector<Benchmark> Points(3);
|
|
|
|
Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.0, {})};
|
|
Points[1].Measurements = {BenchmarkMeasure::Create("x", 2.0, {})};
|
|
Points[2].Measurements = {BenchmarkMeasure::Create("x", 1.0, {})};
|
|
|
|
auto Clustering = BenchmarkClustering::create(
|
|
Points, BenchmarkClustering::ModeE::Dbscan, 2, 1.1);
|
|
ASSERT_TRUE((bool)Clustering);
|
|
EXPECT_THAT(Clustering.get().getValidClusters(),
|
|
UnorderedElementsAre(HasPoints({0, 1, 2})));
|
|
}
|
|
|
|
} // namespace
|
|
} // namespace exegesis
|
|
} // namespace llvm
|