//===- unittests/Support/SymbolRemappingReaderTest.cpp --------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "llvm/Support/SymbolRemappingReader.h"
#include "llvm/Support/MemoryBuffer.h"
#include "gtest/gtest.h"

using namespace llvm;

namespace {
class SymbolRemappingReaderTest : public testing::Test {
public:
  std::unique_ptr<MemoryBuffer> Buffer;
  SymbolRemappingReader Reader;

  std::string readWithErrors(StringRef Text, StringRef BufferName) {
    Buffer = MemoryBuffer::getMemBuffer(Text, BufferName);
    Error E = Reader.read(*Buffer);
    EXPECT_TRUE((bool)E);
    return toString(std::move(E));
  }

  void read(StringRef Text, StringRef BufferName) {
    Buffer = MemoryBuffer::getMemBuffer(Text, BufferName);
    Error E = Reader.read(*Buffer);
    EXPECT_FALSE((bool)E);
  }
};
} // unnamed namespace

TEST_F(SymbolRemappingReaderTest, ParseErrors) {
  EXPECT_EQ(readWithErrors("error", "foo.map"),
            "foo.map:1: Expected 'kind mangled_name mangled_name', "
            "found 'error'");

  EXPECT_EQ(readWithErrors("error m1 m2", "foo.map"),
            "foo.map:1: Invalid kind, expected 'name', 'type', or 'encoding', "
            "found 'error'");
}

TEST_F(SymbolRemappingReaderTest, DemanglingErrors) {
  EXPECT_EQ(readWithErrors("type i banana", "foo.map"),
            "foo.map:1: Could not demangle 'banana' as a <type>; "
            "invalid mangling?");
  EXPECT_EQ(readWithErrors("name i 1X", "foo.map"),
            "foo.map:1: Could not demangle 'i' as a <name>; "
            "invalid mangling?");
  EXPECT_EQ(readWithErrors("name 1X 1fv", "foo.map"),
            "foo.map:1: Could not demangle '1fv' as a <name>; "
            "invalid mangling?");
  EXPECT_EQ(readWithErrors("encoding 1fv 1f1gE", "foo.map"),
            "foo.map:1: Could not demangle '1f1gE' as a <encoding>; "
            "invalid mangling?");
}

TEST_F(SymbolRemappingReaderTest, BadMappingOrder) {
  StringRef Map = R"(
    # N::foo == M::bar
    name N1N3fooE N1M3barE

    # N:: == M::
    name 1N 1M
  )";
  EXPECT_EQ(readWithErrors(Map, "foo.map"),
            "foo.map:6: Manglings '1N' and '1M' have both been used in prior "
            "remappings. Move this remapping earlier in the file.");
}

TEST_F(SymbolRemappingReaderTest, RemappingsAdded) {
  StringRef Map = R"(
    # A::foo == B::bar
    name N1A3fooE N1B3barE

    # int == long
    type i l

    # void f<int>() = void g<int>()
    encoding 1fIiEvv 1gIiEvv
  )";

  read(Map, "foo.map");
  auto Key = Reader.insert("_ZN1B3bar3bazIiEEvv");
  EXPECT_NE(Key, SymbolRemappingReader::Key());
  EXPECT_EQ(Key, Reader.lookup("_ZN1A3foo3bazIlEEvv"));
  EXPECT_NE(Key, Reader.lookup("_ZN1C3foo3bazIlEEvv"));

  Key = Reader.insert("_Z1fIiEvv");
  EXPECT_NE(Key, SymbolRemappingReader::Key());
  EXPECT_EQ(Key, Reader.lookup("_Z1gIlEvv"));
}
