Aiden Grossman c1a155bf78 [llvm-exegesis] Refactor BenchmarkMeasure instantiation in tests
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.
2024-01-26 17:00:57 -08:00

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