//===-- ClusteringTest.cpp --------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#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;

TEST(ClusteringTest, Clusters3D) {
  std::vector<InstructionBenchmark> Points(6);

  // Cluster around (x=0, y=1, z=2): points {0, 3}.
  Points[0].Measurements = {
      {"x", 0.01, 0.0}, {"y", 1.02, 0.0}, {"z", 1.98, 0.0}};
  Points[3].Measurements = {
      {"x", -0.01, 0.0}, {"y", 1.02, 0.0}, {"z", 1.98, 0.0}};
  // Cluster around (x=1, y=1, z=2): points {1, 4}.
  Points[1].Measurements = {
      {"x", 1.01, 0.0}, {"y", 1.02, 0.0}, {"z", 1.98, 0.0}};
  Points[4].Measurements = {
      {"x", 0.99, 0.0}, {"y", 1.02, 0.0}, {"z", 1.98, 0.0}};
  // Cluster around (x=0, y=0, z=0): points {5}, marked as noise.
  Points[5].Measurements = {
      {"x", 0.0, 0.0}, {"y", 0.01, 0.0}, {"z", -0.02, 0.0}};
  // Error cluster: points {2}
  Points[2].Error = "oops";

  auto HasPoints = [](const std::vector<int> &Indices) {
    return Field(&InstructionBenchmarkClustering::Cluster::PointIndices,
                 UnorderedElementsAreArray(Indices));
  };

  auto Clustering = InstructionBenchmarkClustering::create(Points, 2, 0.25);
  ASSERT_TRUE((bool)Clustering);
  EXPECT_THAT(Clustering.get().getValidClusters(),
              UnorderedElementsAre(HasPoints({0, 3}), HasPoints({1, 4})));
  EXPECT_THAT(Clustering.get().getCluster(
                  InstructionBenchmarkClustering::ClusterId::noise()),
              HasPoints({5}));
  EXPECT_THAT(Clustering.get().getCluster(
                  InstructionBenchmarkClustering::ClusterId::error()),
              HasPoints({2}));

  EXPECT_EQ(Clustering.get().getClusterIdForPoint(2),
            InstructionBenchmarkClustering::ClusterId::error());
  EXPECT_EQ(Clustering.get().getClusterIdForPoint(5),
            InstructionBenchmarkClustering::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<InstructionBenchmark> Points(6);
  Points[0].Measurements = {
      {"x", 0.01, 0.0}, {"y", 1.02, 0.0}, {"z", 1.98, 0.0}};
  Points[1].Measurements = {{"y", 1.02, 0.0}, {"z", 1.98, 0.0}};
  auto Error =
      InstructionBenchmarkClustering::create(Points, 2, 0.25).takeError();
  ASSERT_TRUE((bool)Error);
  consumeError(std::move(Error));
}

TEST(ClusteringTest, Clusters3D_InvalidOrder) {
  std::vector<InstructionBenchmark> Points(6);
  Points[0].Measurements = {{"x", 0.01, 0.0}, {"y", 1.02, 0.0}};
  Points[1].Measurements = {{"y", 1.02, 0.0}, {"x", 1.98, 0.0}};
  auto Error =
      InstructionBenchmarkClustering::create(Points, 2, 0.25).takeError();
  ASSERT_TRUE((bool)Error);
  consumeError(std::move(Error));
}

TEST(ClusteringTest, Ordering) {
  ASSERT_LT(InstructionBenchmarkClustering::ClusterId::makeValid(1),
            InstructionBenchmarkClustering::ClusterId::makeValid(2));

  ASSERT_LT(InstructionBenchmarkClustering::ClusterId::makeValid(2),
            InstructionBenchmarkClustering::ClusterId::noise());

  ASSERT_LT(InstructionBenchmarkClustering::ClusterId::makeValid(2),
            InstructionBenchmarkClustering::ClusterId::error());

  ASSERT_LT(InstructionBenchmarkClustering::ClusterId::noise(),
            InstructionBenchmarkClustering::ClusterId::error());
}

} // namespace
} // namespace exegesis
} // namespace llvm
