//===- llvm/unittest/CodeGen/DwarfStringPoolEntryRefTest.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 "llvm/CodeGen/DwarfStringPoolEntry.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Testing/Support/Error.h"

#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include <string>

using namespace llvm;

TEST(DwarfStringPoolEntryRefTest, TestFullEntry) {
  BumpPtrAllocator Allocator;
  StringMapEntry<DwarfStringPoolEntry> *StringEntry1 =
      StringMapEntry<DwarfStringPoolEntry>::Create(
          "Key1", Allocator, DwarfStringPoolEntry{nullptr, 0, 0});

  EXPECT_TRUE(StringEntry1->getKey() == "Key1");
  EXPECT_TRUE(StringEntry1->second.Symbol == nullptr);
  EXPECT_TRUE(StringEntry1->second.Offset == 0);
  EXPECT_TRUE(StringEntry1->second.Index == 0);

  DwarfStringPoolEntryRef Ref1(*StringEntry1);
  EXPECT_TRUE(Ref1.getString() == "Key1");
  EXPECT_TRUE(Ref1.getOffset() == 0);
  EXPECT_TRUE(Ref1.getIndex() == 0);

  DwarfStringPoolEntryRef Ref2(*StringEntry1);
  EXPECT_TRUE(Ref2.getString() == "Key1");
  EXPECT_TRUE(Ref2.getOffset() == 0);
  EXPECT_TRUE(Ref2.getIndex() == 0);
  EXPECT_TRUE(Ref1 == Ref2);
  EXPECT_FALSE(Ref1 != Ref2);

  StringMapEntry<DwarfStringPoolEntry> *StringEntry2 =
      StringMapEntry<DwarfStringPoolEntry>::Create(
          "Key2", Allocator, DwarfStringPoolEntry{nullptr, 0x1000, 1});
  EXPECT_TRUE(StringEntry2->getKey() == "Key2");
  EXPECT_TRUE(StringEntry2->second.Symbol == nullptr);
  EXPECT_TRUE(StringEntry2->second.Offset == 0x1000);
  EXPECT_TRUE(StringEntry2->second.Index == 1);

  DwarfStringPoolEntryRef Ref3(*StringEntry2);
  EXPECT_TRUE(Ref3.getString() == "Key2");
  EXPECT_TRUE(Ref3.getOffset() == 0x1000);
  EXPECT_TRUE(Ref3.getIndex() == 1);
  EXPECT_TRUE(Ref1 != Ref3);
}

bool isEntryEqual(const DwarfStringPoolEntry &LHS,
                  const DwarfStringPoolEntry &RHS) {
  return LHS.Symbol == RHS.Symbol && LHS.Offset == RHS.Offset &&
         LHS.Index == RHS.Index;
}

TEST(DwarfStringPoolEntryRefTest, TestShortEntry) {
  BumpPtrAllocator Allocator;
  DwarfStringPoolEntry DwarfEntry1 = {nullptr, 0, 0};
  StringMapEntry<DwarfStringPoolEntry *> *StringEntry1 =
      StringMapEntry<DwarfStringPoolEntry *>::Create("Key1", Allocator,
                                                     &DwarfEntry1);

  EXPECT_TRUE(StringEntry1->getKey() == "Key1");
  EXPECT_TRUE(StringEntry1->second->Symbol == nullptr);
  EXPECT_TRUE(StringEntry1->second->Offset == 0);
  EXPECT_TRUE(StringEntry1->second->Index == 0);

  DwarfStringPoolEntryRef Ref1(*StringEntry1);
  EXPECT_TRUE(Ref1.getString() == "Key1");
  EXPECT_TRUE(Ref1.getOffset() == 0);
  EXPECT_TRUE(Ref1.getIndex() == 0);
  EXPECT_TRUE(isEntryEqual(Ref1.getEntry(), DwarfEntry1));

  DwarfStringPoolEntryRef Ref2(*StringEntry1);
  EXPECT_TRUE(Ref2.getString() == "Key1");
  EXPECT_TRUE(Ref2.getOffset() == 0);
  EXPECT_TRUE(isEntryEqual(Ref2.getEntry(), DwarfEntry1));
  EXPECT_TRUE(Ref1 == Ref2);
  EXPECT_FALSE(Ref1 != Ref2);

  DwarfStringPoolEntry DwarfEntry2 = {nullptr, 0x1000, 1};
  StringMapEntry<DwarfStringPoolEntry *> *StringEntry2 =
      StringMapEntry<DwarfStringPoolEntry *>::Create("Key2", Allocator,
                                                     &DwarfEntry2);
  EXPECT_TRUE(StringEntry2->getKey() == "Key2");
  EXPECT_TRUE(StringEntry2->second->Symbol == nullptr);
  EXPECT_TRUE(StringEntry2->second->Offset == 0x1000);
  EXPECT_TRUE(StringEntry2->second->Index == 1);

  DwarfStringPoolEntryRef Ref3(*StringEntry2);
  EXPECT_TRUE(Ref3.getString() == "Key2");
  EXPECT_TRUE(Ref3.getOffset() == 0x1000);
  EXPECT_TRUE(Ref3.getIndex() == 1);
  EXPECT_TRUE(isEntryEqual(Ref3.getEntry(), DwarfEntry2));
  EXPECT_TRUE(Ref1 != Ref3);
}

TEST(DwarfStringPoolEntryRefTest, CompareFullAndShort) {
  BumpPtrAllocator Allocator;

  DwarfStringPoolEntry DwarfEntry1 = {nullptr, 0, 0};
  StringMapEntry<DwarfStringPoolEntry *> *StringEntry1 =
      StringMapEntry<DwarfStringPoolEntry *>::Create("Key1", Allocator,
                                                     &DwarfEntry1);
  DwarfStringPoolEntryRef Ref1(*StringEntry1);

  StringMapEntry<DwarfStringPoolEntry> *StringEntry2 =
      StringMapEntry<DwarfStringPoolEntry>::Create(
          "Key1", Allocator, DwarfStringPoolEntry{nullptr, 0, 0});
  DwarfStringPoolEntryRef Ref2(*StringEntry2);

  EXPECT_FALSE(Ref1 == Ref2);
}
