//===- unittests/Tooling/ReplacementsYamlTest.cpp - Serialization 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
//
//===----------------------------------------------------------------------===//
//
// Tests for serialization of Replacements.
//
//===----------------------------------------------------------------------===//

#include "clang/Tooling/ReplacementsYaml.h"
#include "gtest/gtest.h"

using namespace llvm;
using namespace clang::tooling;

TEST(ReplacementsYamlTest, serializesReplacements) {

  TranslationUnitReplacements Doc;

  Doc.MainSourceFile = "/path/to/source.cpp";
  Doc.Replacements.emplace_back("/path/to/file1.h", 232, 56, "replacement #1");
  Doc.Replacements.emplace_back("/path/to/file2.h", 301, 2, "replacement #2");

  std::string YamlContent;
  llvm::raw_string_ostream YamlContentStream(YamlContent);

  yaml::Output YAML(YamlContentStream);
  YAML << Doc;

  // NOTE: If this test starts to fail for no obvious reason, check whitespace.
  ASSERT_STREQ("---\n"
               "MainSourceFile:  '/path/to/source.cpp'\n"
               "Replacements:\n"
               "  - FilePath:        '/path/to/file1.h'\n"
               "    Offset:          232\n"
               "    Length:          56\n"
               "    ReplacementText: 'replacement #1'\n"
               "  - FilePath:        '/path/to/file2.h'\n"
               "    Offset:          301\n"
               "    Length:          2\n"
               "    ReplacementText: 'replacement #2'\n"
               "...\n",
               YamlContentStream.str().c_str());
}

TEST(ReplacementsYamlTest, serializesNewLines) {
  TranslationUnitReplacements Doc;

  Doc.MainSourceFile = "/path/to/source.cpp";
  Doc.Replacements.emplace_back("/path/to/file1.h", 0, 0, "#include <utility>\n");

  std::string YamlContent;
  llvm::raw_string_ostream YamlContentStream(YamlContent);

  yaml::Output YAML(YamlContentStream);
  YAML << Doc;

  // NOTE: If this test starts to fail for no obvious reason, check whitespace.
  ASSERT_STREQ("---\n"
               "MainSourceFile:  '/path/to/source.cpp'\n"
               "Replacements:\n"
               "  - FilePath:        '/path/to/file1.h'\n"
               "    Offset:          0\n"
               "    Length:          0\n"
               "    ReplacementText: \"#include <utility>\\n\"\n"
               "...\n",
               YamlContentStream.str().c_str());
}

TEST(ReplacementsYamlTest, deserializesReplacements) {
  std::string YamlContent = "---\n"
                            "MainSourceFile:      /path/to/source.cpp\n"
                            "Replacements:\n"
                            "  - FilePath:        /path/to/file1.h\n"
                            "    Offset:          232\n"
                            "    Length:          56\n"
                            "    ReplacementText: 'replacement #1'\n"
                            "  - FilePath:        /path/to/file2.h\n"
                            "    Offset:          301\n"
                            "    Length:          2\n"
                            "    ReplacementText: 'replacement #2'\n"
                            "...\n";
  TranslationUnitReplacements DocActual;
  yaml::Input YAML(YamlContent);
  YAML >> DocActual;
  ASSERT_FALSE(YAML.error());
  ASSERT_EQ(2u, DocActual.Replacements.size());
  ASSERT_EQ("/path/to/source.cpp", DocActual.MainSourceFile);
  ASSERT_EQ("/path/to/file1.h", DocActual.Replacements[0].getFilePath());
  ASSERT_EQ(232u, DocActual.Replacements[0].getOffset());
  ASSERT_EQ(56u, DocActual.Replacements[0].getLength());
  ASSERT_EQ("replacement #1", DocActual.Replacements[0].getReplacementText());
  ASSERT_EQ("/path/to/file2.h", DocActual.Replacements[1].getFilePath());
  ASSERT_EQ(301u, DocActual.Replacements[1].getOffset());
  ASSERT_EQ(2u, DocActual.Replacements[1].getLength());
  ASSERT_EQ("replacement #2", DocActual.Replacements[1].getReplacementText());
}

TEST(ReplacementsYamlTest, deserializesWithoutContext) {
  // Make sure a doc can be read without the context field.
  std::string YamlContent = "---\n"
                            "MainSourceFile:      /path/to/source.cpp\n"
                            "Replacements:\n"
                            "  - FilePath:        target_file.h\n"
                            "    Offset:          1\n"
                            "    Length:          10\n"
                            "    ReplacementText: replacement\n"
                            "...\n";
  TranslationUnitReplacements DocActual;
  yaml::Input YAML(YamlContent);
  YAML >> DocActual;
  ASSERT_FALSE(YAML.error());
  ASSERT_EQ("/path/to/source.cpp", DocActual.MainSourceFile);
  ASSERT_EQ(1u, DocActual.Replacements.size());
  ASSERT_EQ("target_file.h", DocActual.Replacements[0].getFilePath());
  ASSERT_EQ(1u, DocActual.Replacements[0].getOffset());
  ASSERT_EQ(10u, DocActual.Replacements[0].getLength());
  ASSERT_EQ("replacement", DocActual.Replacements[0].getReplacementText());
}
