//===- llvm/unittest/MC/MCInstPrinter.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/MC/MCInstPrinter.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCInstrInfo.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include "gtest/gtest.h"

using namespace llvm;

namespace {
class MCInstPrinterTest : public ::testing::Test {
public:
  std::unique_ptr<MCRegisterInfo> MRI;
  std::unique_ptr<MCAsmInfo> MAI;
  std::unique_ptr<const MCInstrInfo> MII;
  std::unique_ptr<MCInstPrinter> Printer;

  MCInstPrinterTest() {
    llvm::InitializeAllTargetInfos();
    llvm::InitializeAllTargetMCs();

    std::string TripleName = "x86_64-pc-linux";
    std::string ErrorStr;

    const Target *TheTarget =
        TargetRegistry::lookupTarget(TripleName, ErrorStr);

    // If we didn't build x86, do not run the test.
    if (!TheTarget)
      return;

    MRI.reset(TheTarget->createMCRegInfo(TripleName));
    MAI.reset(TheTarget->createMCAsmInfo(*MRI, TripleName));
    MII.reset(TheTarget->createMCInstrInfo());
    Printer.reset(TheTarget->createMCInstPrinter(
        Triple(TripleName), MAI->getAssemblerDialect(), *MAI, *MII, *MRI));
  }

  template <typename T> std::string formatHex(T i) {
    std::string Buffer;
    raw_string_ostream OS(Buffer);
    OS << Printer->formatHex(i);
    OS.flush();
    return Buffer;
  }
};
} // namespace

TEST_F(MCInstPrinterTest, formatHex) {
  if (!Printer)
    return;

  EXPECT_EQ("0x1", formatHex<int64_t>(1));
  EXPECT_EQ("0x7fffffffffffffff",
            formatHex(std::numeric_limits<int64_t>::max()));
  EXPECT_EQ("-0x8000000000000000",
            formatHex(std::numeric_limits<int64_t>::min()));
}
