//===- BuildNamespaceTest.cpp ---------------------------------------------===//
//
// 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 "clang/ScalableStaticAnalysis/Core/Model/BuildNamespace.h"
#include "clang/ScalableStaticAnalysis/Core/Support/FormatProviders.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/raw_ostream.h"
#include "gtest/gtest.h"

namespace clang::ssaf {
namespace {

TEST(BuildNamespaceTest, Equality) {
  auto BN1 = BuildNamespace::makeCompilationUnit("test.cpp");
  auto BN2 = BuildNamespace::makeCompilationUnit("test.cpp");
  auto BN3 = BuildNamespace::makeCompilationUnit("other.cpp");

  EXPECT_EQ(BN1, BN2);
  EXPECT_NE(BN1, BN3);
}

TEST(BuildNamespaceTest, DifferentKinds) {
  BuildNamespace CU(BuildNamespaceKind::CompilationUnit, "test");
  BuildNamespace LU(BuildNamespaceKind::LinkUnit, "test");

  EXPECT_NE(CU, LU);
}

// NestedBuildNamespace Tests

TEST(NestedBuildNamespaceTest, DefaultConstruction) {
  NestedBuildNamespace NBN;
  EXPECT_TRUE(NBN.empty());
}

TEST(NestedBuildNamespaceTest, SingleNamespaceConstruction) {
  auto BN = BuildNamespace::makeCompilationUnit("test.cpp");
  NestedBuildNamespace NBN(BN);

  EXPECT_FALSE(NBN.empty());
}

TEST(NestedBuildNamespaceTest, MakeTU) {
  auto NBN = NestedBuildNamespace::makeCompilationUnit("test.cpp");
  EXPECT_FALSE(NBN.empty());
}

TEST(NestedBuildNamespaceTest, Equality) {
  auto NBN1 = NestedBuildNamespace::makeCompilationUnit("test.cpp");
  auto NBN2 = NestedBuildNamespace::makeCompilationUnit("test.cpp");
  auto NBN3 = NestedBuildNamespace::makeCompilationUnit("other.cpp");

  EXPECT_EQ(NBN1, NBN2);
  EXPECT_NE(NBN1, NBN3);
}

TEST(NestedBuildNamespaceTest, MakeQualified) {
  auto NBN1 = NestedBuildNamespace::makeCompilationUnit("test.cpp");
  BuildNamespace LinkNS(BuildNamespaceKind::LinkUnit, "app");
  NestedBuildNamespace NBN2(LinkNS);

  auto Qualified = NBN1.makeQualified(NBN2);

  EXPECT_NE(Qualified, NBN1);
  EXPECT_NE(Qualified, NBN2);
}

TEST(NestedBuildNamespaceTest, EmptyQualified) {
  NestedBuildNamespace Empty;
  auto NBN = NestedBuildNamespace::makeCompilationUnit("test.cpp");

  auto Qualified = Empty.makeQualified(NBN);
  EXPECT_EQ(Qualified, NBN);
}

TEST(BuildNamespaceKindTest, FormatProvider) {
  EXPECT_EQ(llvm::formatv("{0}", BuildNamespaceKind::CompilationUnit).str(),
            "CompilationUnit");
  EXPECT_EQ(llvm::formatv("{0}", BuildNamespaceKind::LinkUnit).str(),
            "LinkUnit");
  EXPECT_EQ(llvm::formatv("{0}", BuildNamespaceKind::StaticLibrary).str(),
            "StaticLibrary");
}

TEST(BuildNamespaceKindTest, StreamOutputCompilationUnit) {
  std::string S;
  llvm::raw_string_ostream(S) << BuildNamespaceKind::CompilationUnit;
  EXPECT_EQ(S, "CompilationUnit");
}

TEST(BuildNamespaceKindTest, StreamOutputLinkUnit) {
  std::string S;
  llvm::raw_string_ostream(S) << BuildNamespaceKind::LinkUnit;
  EXPECT_EQ(S, "LinkUnit");
}

TEST(BuildNamespaceKindTest, StreamOutputStaticLibrary) {
  std::string S;
  llvm::raw_string_ostream(S) << BuildNamespaceKind::StaticLibrary;
  EXPECT_EQ(S, "StaticLibrary");
}

TEST(BuildNamespaceTest, FormatProvider) {
  EXPECT_EQ(
      llvm::formatv("{0}", BuildNamespace(BuildNamespaceKind::CompilationUnit,
                                          "test.cpp"))
          .str(),
      "BuildNamespace(CompilationUnit, test.cpp)");
}

TEST(NestedBuildNamespaceTest, FormatProvider) {
  NestedBuildNamespace NBN(
      BuildNamespace(BuildNamespaceKind::CompilationUnit, "test.cpp"));
  EXPECT_EQ(
      llvm::formatv("{0}", NBN).str(),
      "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)])");
}

TEST(BuildNamespaceTest, StreamOutputCompilationUnit) {
  BuildNamespace BN(BuildNamespaceKind::CompilationUnit, "test.cpp");
  std::string S;
  llvm::raw_string_ostream(S) << BN;
  EXPECT_EQ(S, "BuildNamespace(CompilationUnit, test.cpp)");
}

TEST(BuildNamespaceTest, StreamOutputLinkUnit) {
  BuildNamespace BN(BuildNamespaceKind::LinkUnit, "app");
  std::string S;
  llvm::raw_string_ostream(S) << BN;
  EXPECT_EQ(S, "BuildNamespace(LinkUnit, app)");
}

TEST(NestedBuildNamespaceTest, StreamOutputEmpty) {
  NestedBuildNamespace NBN;
  std::string S;
  llvm::raw_string_ostream(S) << NBN;
  EXPECT_EQ(S, "NestedBuildNamespace([])");
}

TEST(NestedBuildNamespaceTest, StreamOutputSingle) {
  NestedBuildNamespace NBN(
      BuildNamespace(BuildNamespaceKind::CompilationUnit, "test.cpp"));
  std::string S;
  llvm::raw_string_ostream(S) << NBN;
  EXPECT_EQ(
      S, "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)])");
}

TEST(NestedBuildNamespaceTest, StreamOutputMultiple) {
  NestedBuildNamespace NBN(
      BuildNamespace(BuildNamespaceKind::CompilationUnit, "test.cpp"));
  NBN = NBN.makeQualified(NestedBuildNamespace(
      BuildNamespace(BuildNamespaceKind::LinkUnit, "app")));
  std::string S;
  llvm::raw_string_ostream(S) << NBN;
  EXPECT_EQ(S, "NestedBuildNamespace([BuildNamespace(CompilationUnit, "
               "test.cpp), BuildNamespace(LinkUnit, app)])");
}

} // namespace
} // namespace clang::ssaf
