//===- unittests/AST/DeclTest.cpp --- Declaration tests -------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// Unit tests for the ASTVector container.
//
//===----------------------------------------------------------------------===//

#include "clang/AST/ASTVector.h"
#include "clang/AST/ASTContext.h"
#include "clang/Basic/Builtins.h"
#include "clang/Basic/FileManager.h"
#include "clang/Basic/SourceManager.h"
#include "gtest/gtest.h"

using namespace clang;

namespace clang {
namespace ast {

namespace {
class ASTVectorTest : public ::testing::Test {
protected:
  ASTVectorTest()
      : FileMgr(FileMgrOpts), DiagID(new DiagnosticIDs()),
        Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
        SourceMgr(Diags, FileMgr), Idents(LangOpts, nullptr),
        Ctxt(LangOpts, SourceMgr, Idents, Sels, Builtins) {}

  FileSystemOptions FileMgrOpts;
  FileManager FileMgr;
  IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
  DiagnosticsEngine Diags;
  SourceManager SourceMgr;
  LangOptions LangOpts;
  IdentifierTable Idents;
  SelectorTable Sels;
  Builtin::Context Builtins;
  ASTContext Ctxt;
};
} // unnamed namespace

TEST_F(ASTVectorTest, Compile) {
  ASTVector<int> V;
  V.insert(Ctxt, V.begin(), 0);
}

TEST_F(ASTVectorTest, InsertFill) {
  ASTVector<double> V;

  // Ensure returned iterator points to first of inserted elements
  auto I = V.insert(Ctxt, V.begin(), 5, 1.0);
  ASSERT_EQ(V.begin(), I);

  // Check non-empty case as well
  I = V.insert(Ctxt, V.begin() + 1, 5, 1.0);
  ASSERT_EQ(V.begin() + 1, I);

  // And insert-at-end
  I = V.insert(Ctxt, V.end(), 5, 1.0);
  ASSERT_EQ(V.end() - 5, I);
}

TEST_F(ASTVectorTest, InsertEmpty) {
  ASTVector<double> V;

  // Ensure no pointer overflow when inserting empty range
  int Values[] = { 0, 1, 2, 3 };
  ArrayRef<int> IntVec(Values);
  auto I = V.insert(Ctxt, V.begin(), IntVec.begin(), IntVec.begin());
  ASSERT_EQ(V.begin(), I);
  ASSERT_TRUE(V.empty());

  // Non-empty range
  I = V.insert(Ctxt, V.begin(), IntVec.begin(), IntVec.end());
  ASSERT_EQ(V.begin(), I);

  // Non-Empty Vector, empty range
  I = V.insert(Ctxt, V.end(), IntVec.begin(), IntVec.begin());
  ASSERT_EQ(V.begin() + IntVec.size(), I);

  // Non-Empty Vector, non-empty range
  I = V.insert(Ctxt, V.end(), IntVec.begin(), IntVec.end());
  ASSERT_EQ(V.begin() + IntVec.size(), I);
}

} // end namespace ast
} // end namespace clang
